实时温度测量电路软硬件设计
2019-09-23王月
王 月
(扬州职业大学, 江苏 扬州 225009)
本文提出并设计了一款实时温度测量电路,该电路能够及时获取当前温度,并通过一个按键轻松实现温度和时间显示的切换。电路选用数字式温度传感器DS18B20将温度转换为一串二进制数,通过一根数据线发送给STC89C52单片机处理,处理后的温度数值再发送给显示设备进行显示。常见的单片机显示设备有数码管、点阵、液晶屏等,本电路选用8位LED共阴数码管作为显示设备。另外在电路中添加了1个独立按键进行时间显示和温度显示的切换。
1 硬件设计
图1为硬件电路图。电路控制核心为STC89C52单片机,外接时钟电路、复位电路以及电源构成了单片机最小系统。在时钟电路中选用振荡频率为12MHz的晶振,可以计算出单片机的一个机器周期为1μs,这样方便电路进行时间的计算。采用数字式温度传感器DS18B20检测温度,8位共阴数码管显示时间以及温度值,按键K1可以切换时间以及温度显示。
图1 硬件电路图
1.1 测温电路
本电路采用DS18B20进行测温,DS18B20的1引脚接电源地,2引脚为数据输入输出端,接单片机P1.3口,3引脚为可选电源引脚,在本电路中采用外部电源给DS18B20供电,3引脚接外部电源Vcc。
DS18B20与单片机之间数据传送只需要通过一根数据线DQ就可以实现,DS18B20将温度值转换为9~12位的数字量经DQ端一位一位地传送给单片机。DS18B20与单片机之间成功实现数据传送,须严格遵守DS18B20的工作时序[1]。
DS18B20初始化时序:单片机拉低数据线电位产生下降沿后至少延时480μs(单片机发复位脉冲),释放数据线电位,DS18B20在检测到数据线电位上升沿后的15~60μs会拉低数据线电位60~240μs(发存在脉冲),单片机检测到该低电平,表示DS18B20初始化成功,否则DS18B20初始化失败。在实际使用时,若事先确定DS18B20与单片机之间的硬件接线无误,在DS18B20器件完好的情况下,也可以跳过检测存在脉冲,在单片机释放数据线电位后,直接延时至少480μs。
写时序:单片机先将数据线电位拉低产生一个下降沿,之后将1位数据发送到数据线(数据由低位到高位一位一位发送),延时60μs等待DS18B20接收数据,之后释放数据线电位,重复前面的步骤发送第2位数据,直至发送完一个完整的字节。
读时序:单片机先将数据线电位拉低延时至少1μs,释放数据线电位准备读数据,延时10μs读数据线的状态得到1位数据,并进行数据处理,之后至少再延时45μs,重复前面步骤,读取第2位数据,直到读完一个字节。
DS18B20将测得的温度转化为2个字节的数字量存储在其内部RAM中,字节0和字节1分别用来存放温度数字量的低8位LSB和高8位MSB,图2为温度寄存器单元的格式,DS18B20上电复位时默认的精度为12位,其中高字节MSB的前5位“S”为温度符号位,若温度大于0,S为0,否则S为1。温度高字节MSB的低3位以及温度低字节LSB均表示温度数值的大小,只要将数值乘以0.0625即可得到实际温度值,需要注意的是当温度小于0℃时,需要将该数值进行取反加1操作后再乘以0.0625计算出实际温度值。
图2 温度寄存器单元格式
单片机每次对DS18B20进行操作都需要遵循以下3个步骤:DS18B20初始化、ROM操作命令和存储器RAM操作命令。这3个步骤必须依次执行,前面的完成了才能进行下一个步骤,DS18B20初始化成功后才能对其内部的ROM进行操作。
每一个DS18B20都有唯一的64位长的ROM编码,开始8位是产品系列编码(DS18B20的编码是10H),接着是48位的唯一的序列号,最后的8位是前56位CRC。
ROM操作命令有五种,分别为读ROM、匹配ROM、搜索ROM、跳过ROM和报警搜索。
本电路中,因为只使用了一个DS18B20进行测温,可以使用跳过读序列号(Skip ROM)命令,代码为0CCH,从而节省测温时间。每次对DS18B20进行操作,都需要执行这五种ROM操作命令之一,之后才能对RAM进行操作。DS18B20内部RAM操作命令具体见表1。
表1 DS18B20内部RAM操作命令
本电路中,需要使用到的RAM命令有:(1)温度变换,代码为44H,用来启动DS18B20进行温度转换;(2)读内部RAM命令,代码为0BEH,读RAM 中 9个字节的内容。在后面的软件程序中会应用到。
1.2 显示电路
数码管显示方式有静态和动态显示两种,在本设计中使用动态显示方式,在较短的一个时间周期里(常用20ms)循环点亮8个数码管,利用视觉残留效应,看起来八个数码管像是同时点亮的[2]。
2 软件设计
从DS18B20启动温度转换到能够读取温度值的数字量,中间需要等待几百毫秒的时间,这段时间可以用来调用若干遍显示子程序。
本设计中通过按键K1来切换温度或时间显示,在按键处理子程序中,当按键按下去一次,位存储单元20H的取值取反一次,在主程序中对位单元20H的取值进行判断,当(20H)为0时调用若干遍温度显示子程序,当(20H)为1时调用若干遍时间显示子程序,这样就实现了温度显示和时间显示的切换,见图3。
图4为T0中断服务程序,本电路采用单片机内部的T0定时器产生时基信号,在主程序参数初始化部分,设置T0工作在方式1,要产生50ms的定时时间,T0初始值设置为(TH0)=3CH,(TL0)=0B0H,开启T0的中断,这样50ms就进入一次T0中断服务程序,在T0中断服务程序中先关闭定时器T0,重新赋初值,之后再开启定时器T0,重新进入下一个50ms计时周期,R7用来记录进入T0中断服务程序的次数,(R7)=20时,1s时间到,将秒单元的内容加1。
图3 主程序流程
图4 T0中断服务程序
3 调试结果
本电路实物调试时可通过按键K1切换时间显示和温度显示。时间显示范围为00-00-00(时分秒)至23-59-59。计时采用定时器T0工作于方式1,每次计时溢出进入 T0中断服务程序,需要重新赋初值后才能进行下一周期的计时,中间就会有几条指令的时间误差,经过计算可知一天累积下来实际时间会比理论时间慢10s。为消除该时间误差,分别在早上7点整以及晚上7点整直接将秒单元值加5s,这样就能保证一天下来时间是准确无误的。
本电路中DS18B20输出的温度为12位数字量,温度最小分辨率可达0.0625℃,温度值仅保留至小数点后1位。在程序中具体处理过程为:取温度低8位LSB中的低4位,将该4位的数字经过乘以10再除以16的运算后,取其整数部分即为温度的小数数值的大小。
表2记载了2019年2月26日当天的一些时间点对应的温度值,从表2中可以看出温度随时间的变化关系,但是这个变化关系不够直观,这是本电路需要改进的地方,后面可以使用LCD12864显示温度的变化曲线从而使得电路测量结果更加直观。
表2 时间与温度的对应值