在日常生活中我们经常要对温度进行测量,如室温、冰箱内的温度、水温等的测量。本文介绍一种用AT89C2051单片机制作的电子温度计,和普通的水银和酒精温度计相比,具有测温速度快、读数方便等特点,测温范围为-30~110℃。
电路工作原理电路见图1。电路由单片机电路、温度传感器电路、A/D转换电路、数码显示电路等部分组成。AT89C2051、x1、R1、Cl等组成单片机电路,R1、C1组成单片机的复位电路,接通电源的瞬间,由于电源电压通过R1对C1的充电过程,单片机AT89C205 l的复位端1脚获得一个高电平复位脉冲,使得单片机进入初始状态。
VDl、IC3A等组成温度传感器电路,这里用硅二极管1N4148的PN结做温度传感
器,PN结的结电压随温度的变化而变化,温度每上升1℃,结电压约下降2mV,在-50-150℃的范围内有较好的线性。PN结的结电压由运算放大器IC3A放大12倍后输出到AT89C2051的P1.1口。由于结电压是送到IC3A的反相输入端进行放大,所以温度越高,IC3A的输出电压越高。
AT89C2051在内部构造了一个模拟信号比较器,AT89C2051的P1.0和P1.1除了作I/O口外,还分别是模拟信号比较器的同相输入端和反相输入端,模拟信号比较器的比较结果存入P3.6对应的寄存器,P3.6在AT89C22051外部无引脚。利用这个模拟信号比较器和锯齿波信号发生器电路就可以组成一个A/D转换电路,把P1.1输入的模拟信号转换成数字信号。
VTl、C4、R2~R5、RPl、IC23B等组成锯齿波信号发生器电路,为了获得较好线性的锯齿波,C4由VTl、R2-R5、RPl等组成的恒流源充电。锯齿波开始正程扫描的时刻由P1.2控制,当P1.2=0时C4开始充电,同时单片机内部的定时器1开始计数,当IC3B输出的锯齿波的电压线性递增到超过P1.1输入的待测的模拟信号的电压时,P3.6由0翻转为1,据此定时器1停止计数,并且使P1.2=1,此时计数值就是A/D转换的结果,这里把0℃的计数值确定为40,因此把计数值减去40得到的就是温度值。在P1.2=1后C4通过R5放电,为下一次测温作好准备。
数码管。DSl、DS2、DS3、三极管VT2、VT3、VT4、电阻R12-R21等组成动态扫描数码显示电路,把温度值用数字显示出来。
软件设计程序使用汇编语言编写。程序由主程序、定时中断服务程序、延时子程序等模块组成。
主程序由初始化、数码动态扫描显示等部分组成。主程序流程图见图2,定时中断服务程序流程图见图3。
由于采用了动态扫描显示韵方式,虽然简化了电路,节省了I/O线,但占用CPU的时问多,因此必须采用调用定时中断的方式来测温,以减小CPu负担,定时器0的定时时间为50ms,每过250ms(5次中断)测一次温。延时子程序主要供数码显示程序调用,延时时问为0.
5ms,延时时间决定了数码显示的刷新周期,因为显示数码为三位,所以刷新周期为1.5ms。
字形码的输出用了P3口的P3.1~P3.5、P3.7,P3口输出的数据通过查表获得。因为数码管为共阳型,所以相应的输出位为0时笔段亮。存储器20H、21H、22H单元分别作为个位数、十位数、百位数的存储单元,其数值作为查表的指针。
动态扫描显示由数码显示程序完成,当个位数送到P3口时,P1.3输出低电平,VT4导通,数码管Ds3显示个位数;当十位数送到P3口时,P1.4输出低电平,VT3导通,数码管DS2显示十位数;当百位数送到P3口时,P1.5输出低电平,VT2导通,数码管Dsl显示百位数,如果温度为负值,则百位数显示负号。这样轮流工作即可显示温度值。
在测温结束时,P3.6由0翻转为1,由于程序判断P3.6为高电平要用两个机器周期,关闭定时器1停止计数要用1个机器周期,总共为3个机器周期,这会使定时器1的计数值增加3,因此在程序中对此误差进行了修正,将计数值减去3。
安装与调试ICl用AT89C2051单片机集成电路,x1用12MHz的石英晶体,DSl、DS2、DS3选用共阳LED数码管。温度传感器用玻璃封装的二极管1N4148密封在一个小金属管内制成。C4要选用温度系数小的电容器,如涤纶薄膜电容。其余元器件的参数见图l。
安装前先将汇编源程序编译成目标文件即HEX文件,再用编程器将HEX文件写入AT89C2051芯片。
安装后的调试工作主要是通过对RPl、RP2的调节来校准温度,先把RPl置于调节范围的中间位置,将温度传感器插入冰水混合物中,等温度平衡后,调节RPl使温度显示值为0;将温度传感器插入沸水中,调节RP2使温度显示值为100(由于各地气压不同,沸水的温度不一定是100%℃,可用水银温度同时插入沸水计来校准,使温度显示值和水银温度计的数值相等)。再将温度传感器插入冰水混合物中,看显示是否仍为0,不是的话再调节RPl使其为0;然后再将温度传感器插入沸水中,如果显示不是:100的话再调节使其显示100,经过几次反复调整即可将温度校准。