1 系统设计原理
本设计采用飞利浦公司的P87LPC762做为微处理器,温度传感器芯片选用LM70,时钟芯片采用DS1302芯片,它们与单片机全部采用串行通信方式。该电子计时牌系统的硬件原理图如图1所示。图中,数据的串行输出显示分成三部分,分别为:安全天数与温度、年月日与星期、时钟数据。系统首先通过单片机读人温度传感器芯片LM70测得的二进制温度数据,然后进行处理计算以得出相应的BCD温度数据,最后与安全天数数据一同通过单片机扩展的串口送到数码管显示。同时通过单片机与时钟芯片DS1302的通信读入日历时钟数据,再把得到的年月日、星期数据通过单片机扩展的另一个串口输出送到数码管显示,同时把时钟数据通过单片机本身自带的串口输出送至显示。数据的设置与修改可通过与单片机相连的三个按键来完成。显示部分采用74HC164N串行输入并行输出移位寄存器来驱动数码管。秒信号和天气信号则采用发光二极管来显示。综上所述,本设计采用的串行通信方式可有效地节省硬件电路设计的空间,从而使设计更为简捷,具有一定的实用性。
2 温度检测
要完成环境温度的检测与显示,首先要用到温度传感器。本设计选用的是LM70温度传感器芯片,由于LM70采用的是串行通信方式,因此只需三根线与单片机相连即可完成数据的读写。
温度传感芯片的作用就是测取外界的温度值。它首先是把通过热敏电阻从外界感应的模拟温度送入内部的A/D转换器,转换成相应的数字温度值(即二进制温度数据)存放到温度寄存器中,温度传感器LM70所测的温度可通过对其温度寄存器数据的读取来最终将其转化成相应的模拟数据,也就是把二进制数据转换成BCD码数据存放到单片机中。
这里需要注意的是,如果外界环境温度在零度以下(即负温度),那么,同相应温度值的正温度相比,转换后的温度寄存器数据D5~D15位则是正温度的补码。所以,在读出温度寄存器数据后,一定要判断数据的符号位,如果是负温度数据,则要先求补码才能最终将其转换成相应的正确温度值。
3 日历时钟数据的读取
3.1 写程序分析
首先来分析对DS1302的写程序。本设计设置计时的初始时间是2005年1月1日星期六1时0分0秒,即时钟芯片上电后即从这个时间开始走时。那么,要完成初始化时钟,就应当把初始时间写入DS1302芯片中去。图2所示是其写时钟数据流程图。
从图2所示的流程图可以看出,要想把时钟数据写入时钟芯片,首先要写入相应数据的地址,在写入一字节地址后,即可写入一字节相应的数据,依此类推。其具体步骤是首先写入时钟多字节控制寄存器,它的命令字格式如下:
当写入时钟芯片08EH时,同样还要写入允许写操作的命令字00H。写完这两个命令字后,就可以开始写入每个字节时钟数据的地址和相应的时钟数据了。这里需要注意的是:写秒数据地址为80H,分地址为82H,小时地址为84H,依次类推。也就是说,每写完一个字节数据的地址后,其地址应相应加2,以准备下一个字节地址的写入。整个程序可实现七个字节数据的写入,即写一次地址,写一次数据,直到循环计数值为0,便完成了时钟数据的写入。
写入一字节数据时,首先要置循环计数值(这里设为8),一共要串行输入8位数据,每次移入数据前,应先使数据再移一位到C,然后执行以下几条指令:
这几条指令的目的是为了给串行时钟端口输入一个时钟下降沿。只有在下降沿后,一位数据才能写人时钟芯片。这样,循环8次后,一字节的数据就写入到了时钟芯片。整个初始时钟数据写入后,就可以让DS1302自动运行并走时了。
3.2 读程序分析
读一字节子程序同写一字节子程序是一个道理,首先可设置循环计数值为8,以便为读取一个8位字节数据做准备,然后在串行时钟下降沿从P0.2端口读取一位时钟数据到C,以进行带进位的累加器循环右移,这样,循环8次后,即完成了一个字节时钟数据的读取。其结果存放到累加器ACC中。具体读取一字节数据的程序如下:
3.3 安全生产天数的计算
本系统中的一项功能就是显示当前的安全生产天数。要得出安全生产天数值,首先应在单片机的内存单元中设定好安全生产天数的起点日期,同时设定一个基准时间,这样就可以计算出设置的安全生产天数起点日期到这个基准时间的天数,也就是起点的累计天数。然后,当每次读取时钟芯片日历时钟数据时,系统就会计算出当前读到的日期到基准时间的天数,也就是当前日期的累计天数,两个累计天数之差即是要显示的安全生产天数。
4 实时监控系统的设计
本系统的主程序用于完成数据的初始化以及T0定时器的设置等,其它任务均放到定时中断程序中来执行。图3所示为其中断服务程序流程图。中断服务程序首先要判断是否有按键按下,即是否进人数据设置状态?如果不是在设置状态,就要从时钟芯片读取要显示的数据,以及把每一项显示缓冲区的数据送数码管显示。如果是在设置状态下,则设置每0.25 s刷新显示一次数据。
若在设置状态下,则意味着有按键按下,那么就要读取相应的按键。本设计中如果按键在设置状态下,不进行相应的数据调整操作,则保存设置的数据,并退出设置状态。读键时,首先读出其键码并保存。然后判断键码稳定否,如果不稳定,说明按键已经响应,则不进行数据调整。如果键码稳定,则再判断是否是调整键,如果是调整键,则调整修改指针,即每按一次调整键,修改指针加一,并进行下一项数据的修改。修改指针一般从安全天数的千、百、十、个到年、月、日、星期再到小时、分。如果一开始按下的按键不是调整键,则不会进入设置状态。在调整键已经响应的情况下,如果再读到有键按下的信号,那么,当其不是调整键时,进入数据修改状态,以进行相应数据的调整。注意:在设置状态下,每次操作均清除时钟,以便计时退出。调整好相应数据后,即可保存数据并进行数据的显示。
5 数据的显示
本设计中采用16片8位串行输入/并行输出74HC164N和数码管来进行串行移位显示。所用数码管是共阳极的8段数码管。由于分成三组输出来显示数据,因此,设计时把安全生产天数和温度显示部分的74HC164N时钟线连在一起接到单片机的P0.5,而把年月日星期显示部分的74HC164N时钟线连在一起接到单片机的P0.7,另外,把时钟显示部分的74HC164N时钟线连在一起接到单片机的P1.0。
6 结束语
本设计在完成过程中进行了多次的试验,尤其是在对温度的读取方面,得到了很多老师的指导,在此一并感谢。