1、基于单片机的数字温度计设计与仿真 盘桂云(吉首大学物理科学与信息工程学院,湖南 吉首 416000) 摘 要本课题以单片机为控制核心,设计了一款数字温度计。该系统由51单片机、DS18B20温度传感器以及1602 LCD液晶显示屏等部件组成。系统上电后进入实时温度显示状态,此时将DS18B20中的温度值读到单片机中并将其显示在LCD液晶显示屏上。系统可以设置上下限报警温度值,当测得结果超过设定值时进行相应的报警,提供一个接口可以将温度值传送给其它控制器或计算机,测量准确且误差小,其误差在0.02。关键词:单片机;温度采集;LCD显示;温度传感器;数字温度计; Emluater and Desi
2、gn of Digital Thermometer Based on Microcomputer ControlPanguiyun (College of Physics Science and Information Engineering,Jishou University,Jishou,Hunan 416000)AbstractThis topic with the microcontroller as control core , and design a digital thermometer. It consists of 51 single -chip microcomputer
3、, 18B20 temperature sensor and 1602 LCD screen display etc. After power on, the system into real-time temperature display state, then the temperature 18B20 will read in the single-chip microcomputer and displayed in the LCD screen. System can set upper temperature alarm, when the alarm measured resu
4、lts than the setting measured corresponding alarm, System can provide an interface which sends the temperature to other controller or computer. There is little measuring error, measuring error at 0.02. Key words:Microcontroller;Temperature acquisition;LCD display;Temperatere sensor;Digital thermomet
5、er目 录第一章 绪 论 11.1 系统背景 11.2 系统概述 11.2.1 系统功能 11.2.2 系统所用器件及其作用 1第二章 系统总体设计21 系统硬件电路总体设计322系统软件的总体设计 423主程序的流程设计与实现程序 63.2.1 主程序的流程设计63.2.2 主程序的实现程序 7第三章 主要器件介绍31 18B20温度传感器 832 1602液晶显示器 8第四章 系统详细设计41控制模块电路设计 104.1.1晶振电路设计 104.1.2复位电路设计 1042温度传感器模块 114.2.1温度传感器模块电路设计 114.2.2温度传感器模块程序设计 1243 液晶显示模块 1
6、64.3.1液晶显示模块电路设计 164.3.2液晶显示模块程序设计 174.4 键盘输入模块174.4.1键盘输入模块电路设计 174.4.2键盘输入模块程序设计 184. 5报警模块 194.5.1报警模块电路设计 194.5.1报警模块程序设计 204. 6串行输出模块20第五章 软件仿真与测试5.1软件的仿真分析与仿真结果 21结束语 25参考文献 26致谢 27附录1:系统电路图 28附录2:源程序清单292基于单片机的数字温度计设计与仿真 绪论 第一章 绪 论1.1 系统背景在工农业生产和日常生活中,对温度的测量占据着极其重要地位。冰箱、空调、烘干机中均用了温度控制系统。目前,我国
7、单片机的开发应用正在兴起,单片机在机电一体化、智能仪表、工业控制、家用电器等方面的应用成果尤为显著。本课题基于单片机设计了一款数字温度计。1.2 系统概述本设计以单片机为控制核心。其设计通过18B20进行温度采集,采用1602液晶来进行温度显示,有键盘输入和LED二极管进行温度报警功能。其温度通过MAX232通信方式传送出去,可给另一控制器或计算机进行其它操作用。硬件总的包括单片机及相应单片机小系统相关元件、18B20温度传感、1602液晶显示屏、三个按键,MAX232电平转换器件和两个LED二极管。1.2.1 系统的功能本数字温度计系统主要完成的功能是对测量温度进行显示,其中包括过温报警功能
8、。具体的功能如下所述:(1)能够实时的测得温度并进行显示,显示的误差在0.02;(2)可以通过键盘输入相应的上下限温度;(3)数字温度计测得的温度值和我们设定的上下限温度都可以在LCD上显示出来。其中在主界面下是实时显示测得的温度值;(4)当系统测得的温度低于最低温度或高于最高温度时会进行相应的报警;(5)测得温度通过MAX232传送出去,可供其它器件操作。本数字温度计的工作过程如下:首先通过18B20温度传感器进行温度采集,然后将采集到的数据传送给单片机,单片机将收到的数据进行相应的处理后通过1602液晶显示给用户。在此过程中如果测得的温度超过了上下限温度时系统会启动报警。其中上下限温度值可
9、由用户进行设定,如未设定则为系统初始值。系统还可将温度通过MAX232传送给计算机等进行相应的操作。1.2.2 系统所用器件及其作用在数字温度计系统中所使用的器件及其作用如下所述:(1) 单片机:系统的控制部分,能对采集的温度进行相应处理。(2) 18B20温度传感器:用来采集温度。(3) 1602液晶显示屏:用来显示单片机控制器处理的相应结显。(4) LED发光二极管:用来进行报警的模拟。(5) 按键:用来输入相应的上下限温度值。(6)MAX232:进行串行通信的电平转换。基于单片机的数字温度计设计与仿真 系统总体设计 第二章 系统总体设计2.1系统硬件电路总体设计数字温度计系统硬件电路按功
10、能可以分为以下几个模块电路:控制模块电路、温度传感器模块电路、液晶显示模块电路、键盘输入模块电路、报警模块、串行通信模块电路。系统硬件电路总体设计方框图,如图2.1所示:液晶显示模块电路控制模块电路即单片机小系统键盘输入模块电路报警模块温度传感器模块电路图2.1.1数字温度计系统硬件电路总体图2.1.2 系统的电路图2.2系统软件的总体设计软件部分即程序编写部分。为了程序的可读性和独立性,程序的书写分模块书写,且同一个模块放在同一个文件下。根据此思路,程序分为主程序模块部分、1602液晶显示驱动模块部分、按键模块部分、DS18B20驱动模块部分、报警模块部分、串行输出程序模块和组合程序模块部分
11、。各部分的联系都通过组合程序模块部分进行组合,而组合程序只给主程序调用。主程序部分对应mian.c文件按键模块程序部对应key_scanf.c文件中1602液晶驱动程序部分对应1602.c报警程序模块部分对应baoji.c文件中DS18B20驱动程序部分对应18B20.C中图2.2.1程序各模块之间的关系图组合程序部分 对应unite.c文件串行通信模块对应usart.c文件中各程序部分的相关关系如图:各个程序模块设计之间的关系如上图,且在它们的对应关系中还有一个文件名为head .h,此文件用来定义IO端口和进行相关的外部变量和外部函数的声明。每一个C文件前面都会有:include“head
12、.h”来包含些头文件各文件的联接通过外部函数和外部变量。其各部分的外部函数和外部变量声明在head.h文件中。各程序模块对应的外部函数及外部变量如下:DS18B20驱动程序部分: extern void get_temperature();extern int temperature;1602液晶驱动程序部分:extern void lcd_prints(uchar *strint,uchar x,uchar y);按键模块程序部分:extern void key_scanf();extern uchar key1,key2,key3;报警程序模块部分:extern void compare_
13、temperature();extern void deal_compare_temperature();extern uchar low_flag,high_flag;串行通信模块部分:extern void usart();组合程序部分:externvoid dis_temperature(int temp_temperature);extern void main_init();extern void main_scanf_deal();以上列出的各外部函数与外部变量是各个.C文件相互联接的基础,其关系如图2.2.1所示.其中这些外部函数与IO定义都放在head.h文件中.IO定义列出如
14、下:/*IO口的定义*/ /*/*sbitrs =P20;sbit rw =P21;sbit en=P22;sbit busy_f=P07;#define dc_portP1#define lcd_com0 / Command#define lcd_data1 / Data#definekeyP2/按键IO定义sbit B20_IO =P37; /温度输入口sbitbeer=P32;/报警IO口1sbitbeer1=P33;/报警IO口2/*/*2.3主程序的流程设计与实现程序2.3.1主程序的流程设计由于各个程序都是模块化的设计,因此主程序的工作量就很少且思路也很清析。它的调用程序都在uni
15、te.c文件中。其程序设计思路如下:开始调用初始化程序调用获得测量的温度程序调用显示温度程序在液晶上显示调用键盘扫描程序调用按键处理程序调用三个温度比较程序调用报警程序对比较结果处理调用串行通信程序图2.3.1主程序流程图2.3.2主程序的实现程序/*函数名称:void main()功能说明:主函数入口参数:void*/void main()main_init();/主程序的初始化部分程序while(1)get_temperature();/获得温度lcd_write(lcd_com,0x01);/清屏lcd_prints( now temperature,0,0);/第一行的显示dis_te
16、mperature(temperature);/显示温度(第二行中)key_scanf();/扫描按键main_scanf_deal();/按键处理compare_temperature();/三个温度比较处理deal_compare_temperature();/处理比较结果进行报警usart();/串行数据传出52基于单片机的数字温度计设计与仿真 结束语 第三章 主要器件介绍3.1 18B20温度传感器DS18B20最大的特点是单总线数据传输方式,DS18B20的数据I/O均由同一条线来完成。其引脚图如下:图3.1.1 18B20引脚图DS18B20的功能是测量环境的温度。测温范围-55_
17、+125,其温度数字量转换时间为200MS在此系统中使用的命令只有三个。其命令列出如下:0xCC/跳过ROM0x44/温度转换0xBE/Read Scratchpad 命令对18B20的时序操作参考18B20程序设计部分说明。3.2 1602液晶显示器1602液晶显示器具有功耗低,寿命长的特点。其数据以八位并行方式传输。其引脚图如下:图3.2.1 1602液晶引脚图如图3.2.1,其各引脚如下图表:表3.2.2 1602液晶引脚功能图表1602液晶是工业字符型液晶,能够同时显示16x02即32个字符。使用的命令列出如下:0X38 /设置8位数据方式,无光标0x0c/开显示0x06/设置地址指针
18、加10x01/清屏 0x02/AC自增第四章 系统详细设计4.1 控制模块电路设计MCU控制模块电路是数字温度计系统的控制核心部分,主要由晶振电路、复位电路、MCU单片机芯片组成。晶振电路,它产生整个系统的时钟脉冲,时钟是12Mhz;复位电路,可进行单片机的复位操作;MCU单片机芯片,是数字温度计系统的控制核心芯片,它负责各种数据处理和控制。4.1.1晶振电路设计 晶振电路采用11.0592MHz的晶振。其电路如下:图4.1.1晶振电路的电路图其中C1,C2取27PF。4.1.2复位电路设计 51系列单片机的复位是高脉冲复位。其电路设计如下:图4.1.2复位电路的电路图复位原理:当按键按下时r
19、eset从低电平变为高电平,且C3电容完全放电;当按键释放,电容开始冲电。此时电容相当一条导线,reset保持高电平;当C3冲完成后,reset变为低电平。此过程中只要高电平保持时间达到系统要求即可进行一次复位动作。图4.1.3reset的电平变化示意图4.2 温度传感器模块4.2.1温度传感器模块电路设计 温度传感器部分是数字温度计的核心部分。它用来采集温度。本系统采用的温度传感器是DS18B20 。 DS18B20最大的特点是单总线数据传输方式,DS18B20的数据I/O均由同一条线来完成。18B20总共三个接线端口,一个VCC,一个GND,还有一个DQ,VCC和GND是一般电子器件的电源
20、与地,接法固定。DQ是单线数据端口。由于在释放DQ时要保证在高电平,因此采用一个上拉电阻接在VCC上。DQ接MCU中的P3.7接法电路图:图4.2.1 温度传感器模块的电路图4.2.2 温度传感器模块程序设计采集数据处理方法及程序实现:温度传感器部分采用的是18B20。由于从18B20中读得的数据并不是真实的温度值,因此得进行相应的算法计算。为了简便程序并让读出的温度更精确,采用18B20系统默认的设置,即12bit模式。典型对应的温度值表如表4.2.2所示:表4.2.2 DS18B20典型对应的温度值表温度/二进制表示十六进制表示+125 +25.0625+10.125+0.50-0.5-1
21、0.125-25.0625-5500000111 1101000000000001 1001000100000000 1010001000000000 0000100000000000 0000000011111111 1111100011111111 0101111011111110 0110111111111100 1001000007D0H0191H00A2H0008H0000HFFF8HFF5EHFE6FHFC90H从图表与相关资料中都可以看出,每单位十六进制对应的温度是0.0625。这个十六进制数的值保存在两个寄存器中,如图:图4.2.3温度寄存器图由上表和图:我们得到要想在程序中计
22、算出温度,得分两个部分来算,一个部分是温度为正值时,另一个部分是温度为负值时。因此我们得到了两个公式当温度为正值时:temperature=(MSB*256+LSB)*0.0625当温度为负值时:temperature= -( MSB*256+LSB)+1)*0.0625从上面分析出来计算温度的公式了。但是在单片机中小数的处理特别麻烦,要怎样才能让程序写得简节点呢?由于有效位为小数点后两位,因此如果把温度值扩大100倍那样就更简单了,只要在输出显示时小数点的位置处理下就行了。以下是本系统在写计算过程中的部分程序:if(tem2&0x80)=0x80)/如果温度是负值tmp_tmp=(tem2*
23、256+tem1)+1)*6.25/此处将温度扩大了100倍flag1=1;Elsetmp_tmp=(tem2*256+tem1)*6.25; /此处将温度扩大了100倍temperature=(int)tmp_tmp;if(flag1)temperature|=0x8000;flag1=0;/表示负数,因负数运算时丢失了符号位,在此给它加上在此部分程序中计算采用了分析出来的公式,处理方法采用了乘100扩大数值的方法。在之后的显示中做了相应的显示处理。datasheet分析及程序实现:DS18B20是一颗数字型芯片,对其操作要按照芯片资料介绍进行。从datasheet中看其操作包括很多,包括多
24、颗DS18B20同总线操作方法,包括不同位数的操作法。我们采用12bit模式即默认模式,这样就少写了程序同时也满足要求。这此设计中只用到一颗故部分datasheet可不理。在程序中我们要对18B20进行写命令,还要对它读数据,芯片的启动要有个初始化程序。1. 初始化18B20部分:图4.2.4初始化18B20时序图如图4.2.3中所示对18B20的初始化只要先将数据线从高电平拉低,等待480us左右释放数据总线,等待15us左右如得到一个低电平(60240us)说明初始化成功,此时可以对它操作。程序如下:/*函数名称:void 18B20_init()功能说明:18B20初始化入口参数: vo
25、id*/void B20_init()bit flag=1;while(flag)B20_IO=1;B20_delay(1);B20_IO=0;B20_delay(44);/下拉总线 B20_IO=1;B20_delay(2);/释放总线 if(B20_IO)/等待释放总线 flag=1;else/等待应答信号 flag=0;B20_delay(50);B20_IO=1;/拉高挂起2.写程序部分:写程序部分用来对18B20进行写命令,发相应的操作指令用。图4.2.5写18B20时序图如上图所示,对18B20的写过程很简单。首先将数据总线从高电平拉低,等待15us,如果写的是0则保持数据总线为低
26、,如果写的是1则此时把数据总线拉高即可。3.读程序部分:读程序部分用来对18B20读出相应的温度值。图4.2.6读18B20时序图如上图所示,首先将数据总线从高电平拉低,等待15us,如果读的是低电平则为0,如果读的是高电平则为1.在程序实现中,目的是得到一个温度值,故在18B20程序模块中有一个函数get_temperature(),用来得到一个温度值即可。以上初始化等程序都为此程序服务,在调用此程序后就得到了个temperature。这就是18B20程序模块的最终目的。18B20程序模块程序全部放在18B20.c文件中。4.3 液晶显示模块4.3.1液晶显示模块电路设计 液晶显示模块是人机
27、接口中的一个重要部分。它是用来显示测得的温度及相关提示信息的。本数字温度计的液晶显示采用的是1602液晶。因为这两种液晶的操作是一样的,而在proutes中又没1602液晶,所以在proutes中采用LMO16L来进行代替, 在常规设计中数据口一般接P0口,考虑到P0口无上拉电阻,这样我们就得在P0口上拉电阻或使用锁存器来代替,这样的话电路上就会增加硬件从而增加了布线的难度。又因为1602液晶不像ROM和RAM那样操作,因此在液晶显示电路设计中采用数据端口为P1口。RS:数据/命令选择,对应在MCU中的IO端口是:P20RW:读/写选择端,对应在MCU中的IO端口是:P21E:使能信号端,对应
28、在MCU中的端口是:P22图4.3.1 液晶显示模块的电路图4.3.2液晶显示模块的程序设计 1602液晶和18B20一样,操作要根据datasheet进行,在此不一一列出datasheet的细节。1602液晶显示程序部分在1602.文件中,它包括:void check_busy ()/检查忙标志void lcd_write(bit d_c,uchar input_data)/写程序void lcd_initial(void)/初始化程序void lcd_printc(uchar i,uchar x,uchar y)/写一个字符 void lcd_prints(uchar *strint,uc
29、har x,uchar y)/写字符串此5个程序中作为外部函数的是void lcd_prints(uchar *strint,uchar x,uchar y),用时只要把我们的数据转换成一段字符串拿来显示即可。4.4 键盘输入模块4.4.1键盘输入模块电路设计 键盘输入部分是给用户设定上下限温度值。它由三个按键组成,设定功能键KEY1,上下限温度加减按键分别为KEY2、KEY3。由于采用P2口,P2口有上拉电阻,故按键的电路接法比较简单,只需一边接地,另一端直接接在中端口上就可以了。在按键没按下时输入的是高电平,按下后变为低电平。KEY1对应中的端口是:P2.7KEY2对应中的端口是:P2.6
30、KEY3对应中的端口是:P2.5图4.4.1 键盘输入模块的电路图4.4.2键盘输入模块程序设计 键盘扫描部分程序设计充分考虑了按键去斗。即一次按键不会当作多次按键,对系统的稳定性起着相当关键的作用。去斗程序用到了一个延时程序。再就是按键有个释放过程,考虑到点,程序中如果没有释放按键则进行其它操作,即不处理按键功能。因此这样就有个按键判断过程。整个键盘扫描部分程序相当少程序给出如下:#include head.h/*函数名称:void delay(uint z)功能说明:键盘扫描延时程序入口参数:z为延时z*0.020ms(理想)*/void delay(uint z)uint x,y;for
31、(x=z;x0;x-)for(y=20;y0;y-);/*函数名称:void key_scanf()功能说明:键盘扫描子程序入口参数:void*/void key_scanf()key=0xff;delay(30);/去斗key=key&0xff;while(key!=0xff)switch(key)case 0x7f:key1=1;break;case 0xbf:key2=1;break;case 0xdf:key3=1;break;delay(70);/去斗key=key&0xff;以上程序为key_scanf.c文件中的全部程序部分, key_scanf()设定它是外部函数,在这个模块中
32、只有这个函数才能给别个文件用,但用这个函数只能是uniet.c和main.c ,这样用的原因是为了程序的可改性再就是在这个key_scanf.c中有三个外部变量,为key1,key2,key3, 它的使用规则同样和外部函数一样。这就是模块化的在本系统中程序部分的特色,其思路是借鉴了面向对像编程中的思路在其它程序模块中也一样在此键盘模块中目的就是得到三个key值,当有这三个key值时主程序相关程序才做出相应的操作。4.5 报警模块电路4.5.1报警模块电路设计 报警模块,用来在测得的温度超过上下限温度时进行报警,用来提示用户做出相应的措施。报警模块使用了两个发光二极管,一个黄色的,一个绿色。黄色
33、的是当测得的温度超过下限温度时通过发光来提示用户,而绿色的是在测得的温度超过上限温度时通过发光来提示用户。两个发光二级管分别接在的P3.2和P3.3口。图4.5.1 报警模块的电路4.5.2报警模块模块程序设计 报警部分用到的外部硬件是两个二极管模拟的。当温度低于设定的低温时进行报警,当温度高于设定的高温时进行报警。在程序设计中采用low_temp和high_temp进行保存设定的高低温度值,将他们与测得值进行比较进行相应的操作,如果设定的low_temp高于high_temp时将显示error,并其设定无效。报警部分程序放在baoji.c文件中。它包含compare_temperature(
34、)和deal_compare_temperature()两个程序。具体程序见附录。4.6串行输出模块4.6.1串行输出模块电路设计 串行输出模块是将得到的温度值通过串行的方式传送出去。它是用来提供了将温度输入到电脑的一个接口。其电路图如下:图4.6.1 串行输出模块的电4.6.2串行输出模块程序设计 串行输出程序的思路是,当温度的值发生变化时进行一次串行输出操作。由于系统时钟设为11.0592Mhz,串行通信中的波特率的选择就很多,此串行通信设的波特率为9600串行程序中必须注意,要软件清零TI中断标志。因为51单片机中串行的中断标志和T2的中断标志硬件无法自己清除标志位。具体程序见附录。第五
35、章 软件仿真与测试51 软件仿真分析与测试结果1系统实时显示当前温度值。图5.1 实时显示当前温度值2修改上限温度值。图5.2修改上限温度值3修改下限温度值。图5.3 修改下限温度值4小于下限温度值时报警。此时的下限温度是上面设写的5,18B20设4.12.图5.4 低于下限温度值时报警5高于上限温度值时报警。此时的上限温度是上面设的35,18B20设35.12图5.5 高于上限温度值时报警6在设定上限温度时,设定的上限温度要大于下限温度,若出现设的值小于下限温度时会出现error:图5.6 设定的上限温度值小于下限温度值时同样在设定的下限温度若大于上限温度时也会出现error。结束语本论文设
36、计的是基于单片机的数字温度计。整个系统以51单片机为控制核心,采用单总线的DS18B20作为系统的温度采集传感器。用1602液晶作为单片机的IO显示模块。整个系统功能完善。具有实时显示当前温度,设定上下限温度值以及可以对当前温度超出限定的温度值时进行报警提示。系统还具有232通信功能,可将温度实时的传送给计算机等进行相应的处理。本系统在软件上采用了结构化程序设计,使得设计的程序易读易改。例如,在设计本系统起初没有232通信功能,在设计过程中再加上去的。此时设计的程序已写好,要加上通信功能时直接在程序中加入usart.c文件,其文件中的函数功能即是实现232通信的功能,此usart.c就是一个小
37、模块。就此可以看出结构化程序设计的优点来。经过了这次设计后,我学到了很多新的知识。学会了如何去看datasheet,如何做一个系统的分析。更进一步加强了51单片机的运用能力,包括51单片机的程序编写,调试,仿真等。最重要的是提高了我的动手实践能力。在这个系统中,出于条件的原因,只做出了相关仿真,没有去做硬件。在串行通信中只有相关的设计程序而没有将其做出实物与计算机进行相应的通信。虽然通过自己的学习完成了这项设计,但是觉得自己还有很多知识要去学习,比如说传感器,数电,模电等。基于单片机的数字温度计设计与仿真 参考文献 参考文献1阎石数字电子技术基础M北京:高等教育出版社,2001年 2王化祥,张淑英传感器原理及应用M天津:天津大学出版社,2004年3童诗白,华成英模拟电子技术基础M北京:高等教育出版社,1980年4尹建华,张惠群微型计算机原理与接口技术M北京:高等教育出版社,2002年5谭浩强C语言程序设计M北京:清华大学出版,2006年6张友德,赵志英,涂时亮单片微型机原理、应用与实验M上海:复旦大学出版社,2006年7李国洪,曹白杨,陈刚电子CAD实用教程M北京:机械工业出版社,2003年8求是科技单片机典型模块设计实例导航M北京:人民邮电出版社,2004年9彭为,黄科,雷道仲单片机典型系统设计实例精讲M . 北京: 电子工业出版社,2006年10李朝青单片机 & DSP