肖 正 艾 红
(北京信息科技大学自动化学院,北京 100192)
粮食是人类赖以生存的根本,是促进国家稳定发展的重要保障。为了防止粮食发霉变质,按期对粮仓进行温度测量是粮食储备中常用的手段。随着科技的发展和自动化水平的提高,温度自动监测已经成为各行各业进行安全生产和减少损失采取的重要措施之一。为了实现粮情的温度自动监测,笔者采用STC89C516RD单片机作为主控制器,使用数字温度传感器DS18B20,并配合键盘管理及液晶显示等外围电路,设计多点温度监测系统及其实时时间功能。
由于系统由多片数字式单总线DS18B20温度传感器构成温度传感器网络,因此,准确、有效地对每一个温度传感器进行寻址成为系统设计的核心问题。系统设计依据DS18B20 温度传感器的操作指令,首先读取各个传感器的序列号,并确定传感器对应的各点位置关系。在读取温度数值时,发送相应的序列号,再读取匹配的传感器温度数值。有两条命令用于获取传感器序列号:读ROM命令33H和搜索ROM命令F0H。读ROM命令在总线上仅有一个传感器的情况下使用;搜索ROM命令允许总线主机使用一种处理方法识别总线上所有的传感器序列号。为了建立64位ROM代码,即传感器序列号与测量位置点传感器之间的关系,选用读ROM命令33H,通过单总线把各个位置的传感器序列号读取出来,并通过串口调试助手观察每个DS18B20的序列号。现场各温度传感器的序列号存放在单片机的CODE区内,软件设计了10行8列的二维数组来存储温度传感器的64位序列号,具体如下:
code uchar ds[10][8]={0x28,0x3E,0xF0,0xC4,0x00,0x00,0x00,0x71,//第一个传感器序列号
0x28,0xAE,0xD6,0x98,0x00,0x00,0x00,0x6E,//第二个传感器序列号
⋮
0x28,0xE3,0xF1,0xC4,0x00,0x00,0x00,0x32};//第十个传感器序列号
读取温度传感器序列号流程如图1所示。
图1 读取温度传感器序列号流程
在多点温度的采集过程中要考虑通路的选择问题,系统采用两个数据通路,分别由单片机的P1.0和P1.1控制。软件设计中设置了一个选择通路字节DQ_select,通过对DQ_select设定不同的值来决定选择哪条通路。数据通路选择流程如图2所示。
图2 数据通路选择流程
对于传感器序列号数组的选择,定义了一个全局变量m,通过DQ_select的值对m赋相应的值,程序就可以直接通过m值调用相应传感器序列号。对于初始化程序,读写数据时通路的选择也是通过判断DQ_select的值来决定的。
系统设计采用一个3V的锂电池作为备用电源,采用时钟芯片DS1302实现实时时间显示。在整个系统断电后,时钟芯片依然能够工作。当单片机上电后,直接读取时钟芯片DS1302寄存器中的数据,并在液晶屏上显示,不必每次都初始化。在修改时间程序中有对时钟芯片DS1302初始化的程序,只有当修改时间时才会对DS1302进行初始化,如果时间正常,对时钟芯片DS1302的操作只需循环读取它内部寄存器的数值即可[1]。实时时间显示流程如图3所示。
图3 实时时间显示流程
DS1302初始化主要是进行设置运行位及打开电池充电等操作。设置时间数据是将需要显示的时间数据存储到DS1302的存储器内,程序设计如下:
void Set1302(uchar*pClock)
{ uchar i;
uchar ucAddr=0x80;
W1302(0x8e,0x00);//控制命令,WP=0,写保护禁止
W1302(0xC0,0x01);//写RAM寄存器
for(i=7;i>0;i--)
{W1302(ucAddr,*pClock);//秒、分、时、星期、日、月、年
pClock++;
ucAddr+=2;
}
W1302(0x8e,0x80);//控制命令,WP=1,写保护
}
其中,pClock中存储的是需要设置的时间数据,按照DS1302寄存器的顺序,依次存储秒、分、时、星期、日、月和年的BCD码。
读取操作是将DS1302存储器中的数据读出来,并在液晶屏上显示,如果要实现液晶屏显示实时时间数据,则循环执行读取和显示操作,程序设计如下:
while(1){ Get1302(ppClock);//读取DS1302寄存器中的数据
display_1302(ppClock);//在LCD上显示数据
}
Get1302(ppClock)是读取DS1302寄存器中的数据,并存储在ppClock数组中;display_1302(ppClock)是调用液晶显示函数,显示ppClock中的数据。如果要显示当前时间,则在温度监测系统菜单选项上选择“时间显示”功能,按“确认”键后进入时间显示画面(图4)。
图4 时间显示画面
当备用电池没电或时间发生错误后,进入时间设置功能画面修改时间,按照图5上的提示输入数值,如果输入的数值符合相应的时间数值,按“确认”键后,液晶屏上的“?”会消失。时间设置流程如图6所示。
图5 时间设置功能液晶显示画面
程序设计的难点是输入数据和液晶屏显示数据与游标的位置能否相对应,程序的核心是通过flag值决定液晶屏显示的字符。
多点监测系统的温度报警数据采用存储器芯片24C256存储。报警历史数据显示时调出存储在24C256中的报警数据,并将读出的数据在液晶屏上显示。程序设计的难点在于每次报警后存储的数据较多,每一次报警数据都需要在液晶屏上分两屏显示[2]。因此当数据较多时,使用键盘的上下箭头来翻屏会用到大量的显示代码,同时需要许多判断性语句来决定显示的数据,报警历史数据显示流程如图7所示。
图6 时间设置流程
图7 报警历史数据显示流程
显示信息包括报警时间、报警的房间号、报警时的温度、上限报警设定值、下限报警设定值及报警标志等。例如调用一次报警历史数据,在液晶屏上显示画面如图8所示。
报警历史数据显示程序中由于每次可以读出最新的4个报警历史数据,所以必须根据翻屏后flag的值判断要读取的历史报警数据,地址的选择程序如下:
图8 报警历史数据显示画面
if(flag==1|flag==2)addr=0x0000;//写入地址,第一个数据
if(flag==3|flag==4)addr=0x0010;//写入地址,第二个数据
if(flag==5|flag==6)addr=0x0020;//写入地址,第三个数据
if(flag==7|flag==8)addr=0x0030;//写入地址,第四个数据
通过flag的值判断显示画面程序如下:
if(flag==1|flag%2==1)//显示每个报警参数的第一屏信息
{ lcd_clock_word();
W_1byte(0,0,0x98);
for(i=0;string1[i]!=′ ′;i++)
W_1byte(0,1,string1[i]);//写入房间号
addr_24c(addr);
for(i=0;i<7;i++)
{ temp_temp[i]=raddr();
IICACK();
}
II CNoAck();
stop();
delay(700);//延时6ms
display_1302(temp_temp);//写入当时的时间
i=rout(addr+7);//读出房间号
W_1byte(0,0,0x9c);
if(i<5) {W_1byte(0,1,0x31);W_1byte(0,1,0x30);W_1byte(0,1,lcdwendu[i+1]);}
if(i>=5){W_1byte(0,1,0x32);W_1byte(0,1,0x30);W_1byte(0,1,lcdwendu[i-4]);}
}
当flag的值为偶数时,说明要输出的数据是每个报警参数的第二屏数据。程序设计时应使翻屏键与要显示的数据相匹配,每一次按键调用不同的显示画面:在奇数页显示时间画面,偶数页显示温度及报警参数等画面。
多点温度监测系统利用多个数字温度传感器实现了多点温度采集。设计了键盘与液晶显示电路和实时时钟电路,发挥了数字温度传感器DS18B20单总线的优势。硬件设计采用了两路单总线结构,每路挂接5个传感器,并由单片机的P1.0与P1.1分别控制。DS18B20传输数据时采用循环冗余校验码CRC校验数据,读取每个DS18B20内部的64位序列号。在单片机与上位机组成的多点温度监测系统中,单片机作为下位机完成了现场温度数据的采集与处理,上位机提供了人机交互界面,实现了数据的处理和现场数据的实时显示与监测。
[1] 田辉辉,王熙.基于CAN总线的农业温度监测系统设计[J].农机化研究,2013,(6):174~177.
[2] 刘建,黄奇峰,王忠东,等.电能表自动化检定压接端子温升监测系统[J].计算机测量与控制,2014,22(5):1455~1457.