基于单片机的数字温度计设计与仿真.docx
《基于单片机的数字温度计设计与仿真.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字温度计设计与仿真.docx(50页珍藏版)》请在冰豆网上搜索。
![基于单片机的数字温度计设计与仿真.docx](https://file1.bdocx.com/fileroot1/2023-1/10/6fedd0c9-44a6-44c5-a7d2-b239b6a864f4/6fedd0c9-44a6-44c5-a7d2-b239b6a864f41.gif)
基于单片机的数字温度计设计与仿真
基于单片机的数字温度计设计与仿真
盘桂云
(吉首大学物理科学与信息工程学院,湖南吉首416000)
摘 要
本课题以单片机为控制核心,设计了一款数字温度计。
该系统由51单片机、DS18B20温度传感器以及1602LCD液晶显示屏等部件组成。
系统上电后进入实时温度显示状态,此时将DS18B20中的温度值读到单片机中并将其显示在LCD液晶显示屏上。
系统可以设置上下限报警温度值,当测得结果超过设定值时进行相应的报警,提供一个接口可以将温度值传送给其它控制器或计算机,测量准确且误差小,其误差在±0.02℃。
关键词:
单片机;温度采集;LCD显示;温度传感器;数字温度计;
EmluaterandDesignofDigitalThermometerBasedonMicrocomputerControl
Panguiyun
(CollegeofPhysicsScienceandInformationEngineering,JishouUniversity,Jishou,Hunan416000)
Abstract
Thistopicwiththemicrocontrollerascontrolcore,anddesignadigitalthermometer.Itconsistsof51single-chipmicrocomputer,18B20temperaturesensorand1602LCDscreendisplayetc.Afterpoweron,thesystemintoreal-timetemperaturedisplaystate,thenthetemperature18B20willreadinthesingle-chipmicrocomputeranddisplayedintheLCDscreen.Systemcansetuppertemperaturealarm,whenthealarmmeasuredresultsthanthesettingmeasuredcorrespondingalarm,Systemcanprovideaninterfacewhichsendsthetemperaturetoothercontrollerorcomputer.Thereislittlemeasuringerror,measuringerrorat±0.02℃.
Keywords:
Microcontroller;Temperatureacquisition;LCDdisplay;Temperateresensor;
Digitalthermometer
第一章绪论…………………………………………………………………………1
1.1系统背景………………………………………………………………………1
1.2系统概述………………………………………………………………………1
1.2.1系统功能…………………………………………………………………1
1.2.2系统所用器件及其作用……………………………………………………1
第二章系统总体设计
2.1系统硬件电路总体设计 ………………………………………………………3
2.2系统软件的总体设计……………………………………………………………4
2.3主程序的流程设计与实现程序…………………………………………………6
3.2.1主程序的流程设计…………………………………………………………6
3.2.2主程序的实现程序………………………………………………………7
第三章主要器件介绍
3.118B20温度传感器 ……………………………………………………………8
3.21602液晶显示器 ……………………………………………………………8第四章系统详细设计
4.1控制模块电路设计 …………………………………………………………10
4.1.1晶振电路设计……………………………………………………………10
4.1.2复位电路设计…………………………………………………………10
4.2温度传感器模块 ……………………………………………………………11
4.2.1温度传感器模块电路设计……………………………………………11
4.2.2温度传感器模块程序设计……………………………………………12
4.3液晶显示模块…………………………………………………………16
4.3.1液晶显示模块电路设计………………………………………………16
4.3.2液晶显示模块程序设计………………………………………………17
4.4键盘输入模块 …………………………………………………………………17
4.4.1键盘输入模块电路设计………………………………………………17
4.4.2键盘输入模块程序设计………………………………………………18
4.5报警模块…………………………………………………………………19
4.5.1报警模块电路设计……………………………………………………19
4.5.1报警模块程序设计……………………………………………………20
4.6串行输出模块 ………………………………………………………………20
第五章软件仿真与测试
5.1软件的仿真分析与仿真结果……………………………………………………21
结束语…………………………………………………………………………………25
参考文献………………………………………………………………………………26
致谢……………………………………………………………………………………27
附录1:
系统电路图…………………………………………………………………28
附录2:
源程序清单……………………………………………………………………29
第一章绪论
1.1系统背景
在工农业生产和日常生活中,对温度的测量占据着极其重要地位。
冰箱、空调、烘干机中均用了温度控制系统。
目前,我国单片机的开发应用正在兴起,单片机在机电一体化、智能仪表、工业控制、家用电器等方面的应用成果尤为显著。
本课题基于单片机设计了一款数字温度计。
1.2系统概述
本设计以单片机为控制核心。
其设计通过18B20进行温度采集,采用1602液晶来进行温度显示,有键盘输入和LED二极管进行温度报警功能。
其温度通过MAX232通信方式传送出去,可给另一控制器或计算机进行其它操作用。
硬件总的包括单片机及相应单片机小系统相关元件、18B20温度传感、1602液晶显示屏、三个按键,MAX232电平转换器件和两个LED二极管。
1.2.1系统的功能
本数字温度计系统主要完成的功能是对测量温度进行显示,其中包括过温报警功能。
具体的功能如下所述:
(1)能够实时的测得温度并进行显示,显示的误差在±0.02℃;
(2)可以通过键盘输入相应的上下限温度;
(3)数字温度计测得的温度值和我们设定的上下限温度都可以在LCD上显示出来。
其中在主界面下是实时显示测得的温度值;
(4)当系统测得的温度低于最低温度或高于最高温度时会进行相应的报警;
(5)测得温度通过MAX232传送出去,可供其它器件操作。
本数字温度计的工作过程如下:
首先通过18B20温度传感器进行温度采集,然后将采集到的数据传送给单片机,单片机将收到的数据进行相应的处理后通过1602液晶显示给用户。
在此过程中如果测得的温度超过了上下限温度时系统会启动报警。
其中上下限温度值可由用户进行设定,如未设定则为系统初始值。
系统还可将温度通过MAX232传送给计算机等进行相应的操作。
1.2.2系统所用器件及其作用
在数字温度计系统中所使用的器件及其作用如下所述:
(1)单片机:
系统的控制部分,能对采集的温度进行相应处理。
(2)18B20温度传感器:
用来采集温度。
(3)1602液晶显示屏:
用来显示单片机控制器处理的相应结显。
(4)LED发光二极管:
用来进行报警的模拟。
(5)按键:
用来输入相应的上下限温度值。
(6)MAX232:
进行串行通信的电平转换。
第二章系统总体设计
2.1系统硬件电路总体设计
数字温度计系统硬件电路按功能可以分为以下几个模块电路:
控制模块电路、温度传感器模块电路、液晶显示模块电路、键盘输入模块电路、报警模块、串行通信模块电路。
系统硬件电路总体设计方框图,如图2.1所示:
图2.1.2系统的电路图
2.2系统软件的总体设计
软件部分即程序编写部分。
为了程序的可读性和独立性,程序的书写分模块书写,且同一个模块放在同一个文件下。
根据此思路,程序分为主程序模块部分、1602液晶显示驱动模块部分、按键模块部分、DS18B20驱动模块部分、报警模块部分、串行输出程序模块和组合程序模块部分。
各部分的联系都通过组合程序模块部分进行组合,而组合程序只给主程序调用。
各程序部分的相关关系如图:
各个程序模块设计之间的关系如上图,且在它们的对应关系中还有一个文件名为head.h,此文件用来定义IO端口和进行相关的外部变量和外部函数的声明。
每一个".C"文件前面都会有:
#include“head.h”来包含些头文件.
各文件的联接通过外部函数和外部变量。
其各部分的外部函数和外部变量声明在head.h文件中。
各程序模块对应的外部函数及外部变量如下:
DS18B20驱动程序部分:
externvoidget_temperature();
externinttemperature;
1602液晶驱动程序部分:
externvoidlcd_prints(uchar*strint,ucharx,uchary);
按键模块程序部分:
externvoidkey_scanf();
externucharkey1,key2,key3;
报警程序模块部分:
externvoidcompare_temperature();
externvoiddeal_compare_temperature();
externucharlow_flag,high_flag;
串行通信模块部分:
externvoidusart();
组合程序部分:
externvoiddis_temperature(inttemp_temperature);
externvoidmain_init();
externvoidmain_scanf_deal();
以上列出的各外部函数与外部变量是各个.C文件相互联接的基础,其关系如图2.2.1所示.其中这些外部函数与IO定义都放在head.h文件中.IO定义列出如下:
/*IO口的定义*/
//******************************************************
//******************************************************
sbitrs=P2^0;
sbitrw=P2^1;
sbiten=P2^2;
sbitbusy_f=P0^7;
#definedc_portP1
#definelcd_com0//Command
#definelcd_data1//Data
#definekeyP2//按键IO定义
sbitB20_IO=P3^7;//温度输入口
sbitbeer=P3^2;//报警IO口1
sbitbeer1=P3^3;//报警IO口2
//******************************************************
//******************************************************
2.3主程序的流程设计与实现程序
2.3.1主程序的流程设计
由于各个程序都是模块化的设计,因此主程序的工作量就很少且思路也很清析。
它的调用程序都在unite.c文件中。
其程序设计思路如下:
图2.3.1主程序流程图
2.3.2主程序的实现程序
/******************************************************************
函数名称:
voidmain()
功能说明:
主函数
入口参数:
void
*******************************************************************/
voidmain()
{
main_init();//主程序的初始化部分程序
while
(1)
{
get_temperature();//获得温度
lcd_write(lcd_com,0x01);//清屏
lcd_prints("nowtemperature",0,0);//第一行的显示
dis_temperature(temperature);//显示温度(第二行中)
key_scanf();//扫描按键
main_scanf_deal();//按键处理
compare_temperature();//三个温度比较处理
deal_compare_temperature();//处理比较结果进行报警
usart();//串行数据传出
}
}
第三章主要器件介绍
3.118B20温度传感器
DS18B20最大的特点是单总线数据传输方式,DS18B20的数据I/O均由同一条线来完成。
其引脚图如下:
图3.1.118B20引脚图
DS18B20的功能是测量环境的温度。
测温范围-55℃_+125℃,其温度数字量转换时间为200MS
在此系统中使用的命令只有三个。
其命令列出如下:
0xCC//跳过ROM
0x44//温度转换
0xBE//ReadScratchpad命令
对18B20的时序操作参考18B20程序设计部分说明。
3.21602液晶显示器
1602液晶显示器具有功耗低,寿命长的特点。
其数据以八位并行方式传输。
其引脚图如下:
图3.2.11602液晶引脚图
如图3.2.1,其各引脚如下图表:
表3.2.21602液晶引脚功能图表
1602液晶是工业字符型液晶,能够同时显示16x02即32个字符。
使用的命令列出如下:
0X38//设置8位数据方式,无光标
0x0c//开显示
0x06//设置地址指针加1
0x01//清屏
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复位电路的电路图
复位原理:
当按键按下时reset从低电平变为高电平,且C3电容完全放电;当按键释放,电容开始冲电。
此时电容相当一条导线,reset保持高电平;当C3冲完成后,reset变为低电平。
此过程中只要高电平保持时间达到系统要求即可进行一次复位动作。
图4.1.3reset的电平变化示意图
4.2温度传感器模块
4.2.1温度传感器模块电路设计
温度传感器部分是数字温度计的核心部分。
它用来采集温度。
本系统采用的温度传感器是DS18B20。
DS18B20最大的特点是单总线数据传输方式,DS18B20的数据I/O均由同一条线来完成。
18B20总共三个接线端口,一个VCC,一个GND,还有一个DQ,VCC和GND是一般电子器件的电源与地,接法固定。
DQ是单线数据端口。
由于在释放DQ时要保证在高电平,因此采用一个上拉电阻接在VCC上。
DQ接MCU中的P3.7
接法电路图:
图4.2.1温度传感器模块的电路图
4.2.2温度传感器模块程序设计
采集数据处理方法及程序实现:
温度传感器部分采用的是18B20。
由于MCU从18B20中读得的数据并不是真实的温度值,因此得进行相应的算法计算。
为了简便程序并让读出的温度更精确,采用18B20系统默认的设置,即12bit模式。
典型对应的温度值表如表4.2.2所示:
表4.2.2DS18B20典型对应的温度值表
温度/℃
二进制表示
十六进制表示
+125
+25.0625
+10.125
+0.5
0
-0.5
-10.125
-25.0625
-55
0000011111010000
0000000110010001
0000000010100010
0000000000001000
0000000000000000
1111111111111000
1111111101011110
1111111001101111
1111110010010000
07D0H
0191H
00A2H
0008H
0000H
FFF8H
FF5EH
FE6FH
FC90H
从图表与相关资料中都可以看出,每单位十六进制对应的温度是0.0625℃。
这个十六进制数的值保存在两个寄存器中,如图:
图4.2.3温度寄存器图
由上表和图:
我们得到要想在程序中计算出温度,得分两个部分来算,一个部分是温度为正值时,另一个部分是温度为负值时。
因此我们得到了两个公式.
当温度为正值时:
temperature=(MSB*256+LSB)*0.0625
当温度为负值时:
temperature=-(~(MSB*256+LSB)+1)*0.0625
从上面分析出来计算温度的公式了。
但是在单片机中小数的处理特别麻烦,要怎样才能让程序写得简节点呢?
由于有效位为小数点后两位,因此如果把温度值扩大100倍那样就更简单了,只要在输出显示时小数点的位置处理下就行了。
以下是本系统在写计算过程中的部分程序:
if((tem2&0x80)==0x80)//如果温度是负值
{
tmp_tmp=(~((tem2*256+tem1)+1))*6.25//此处将温度扩大了100倍
flag1=1;
}
Else
tmp_tmp=(tem2*256+tem1)*6.25;//此处将温度扩大了100倍
temperature=(int)tmp_tmp;
if(flag1){temperature|=0x8000;flag1=0;}//表示负数,因负数运算时丢失了符号位,在此给它加上
在此部分程序中计算采用了分析出来的公式,处理方法采用了乘100扩大数值的方法。
在之后的显示中做了相应的显示处理。
datasheet分析及程序实现:
DS18B20是一颗数字型芯片,对其操作要按照芯片资料介绍进行。
从datasheet
中看其操作包括很多,包括多颗DS18B20同总线操作方法,包括不同位数的操作法。
我们采用12bit模式即默认模式,这样就少写了程序同时也满足要求。
这此设计中只用到一颗故部分datasheet可不理。
在程序中我们要对18B20进行写命令,还要对它读数据,芯片的启动要有个初始化程序。
1.初始化18B20部分:
图4.2.4初始化18B20时序图
如图4.2.3中所示对18B20的初始化只要先将数据线从高电平拉低,等待480us左右释放数据总线,等待15us左右如得到一个低电平(60~240us)说明初始化成功,此时可以对它操作。
程序如下:
/**********************************************************
函数名称:
void18B20_init()
功能说明:
18B20初始化
入口参数:
void
***********************************************************/
voidB20_init()
{
bitflag=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则保持数据总线为低,如果写的是1则此时把数据总线拉高即可。
3.读程序部分:
读程序部分用来对18B20读出相应的温度值。
图4.2.6读18B20时序图
如上图所示,首先将数据总线从高电平拉低,等待15us,如果读的是低电平则
为0,如果读的是高电平则为1.
在程序实现中,目的是得到一个温度值,故在18B20程序模块中有一个函数get_temperature(),用来得到一个温度值即可。
以上初始化等程序都为此程序服务,在调用此程序后就得到了个temperature。
这就是18B20程序模块的最终目的。
18B20程序模块程序全部放在18B20.c文件中。
4.3液晶显示模块
4.3.1液晶显示模块电路设计
液晶显示模块是人机接口中的一个重要部分。
它是用来显示测得的温度及相关提示信息的。
本数字温度计的液晶显示采用的是1602液晶。
因为这两种液晶的操作是一样的,而在proutes中又没1602液晶,所以在proutes中采用LMO16L来进行代替,
在常规设计中数据口一般接P0口,考虑到P0口无上拉电阻,这样我们就得在P0口上拉电阻或使用锁存器来代替,这样的话电路上就会增加硬件从而增加了布线的难度。
又因为1602液晶不像ROM和RAM那样操作,因此在液晶显示电路设计中采用数据端口为P1口。
RS:
数据/命令选择,对应在MCU中的IO端口是:
P20
RW:
读/写选择端,对应在MCU中的IO端口是:
P21
E:
使能信号端,对应在MCU中的IO端口是:
P22
图4.3.1液晶显示模块的电路图
4.3.2液晶显示模块的程序设计
1602液晶和18B20一样,操作要根据datasheet进行,在此