找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7836|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机的数字温度计 带温度上限设置 文档下载

[复制链接]
跳转到指定楼层
楼主

完整的Word下载地址:
基于单片机的数字温度计.rar (466.01 KB, 下载次数: 34)


下面是的部分内容预览:

基于单片机的数字温度计设计

摘要:随着科技的发展,温度是经常遇到的测量参数。本文介绍了设计温度计的基本方法与测量原理,其组成部分有:AT89C52单片机、温度传感器DS18B20、按键扫描电路、显示电路以及报警电路。它可以实时地测量温度和设置温度上下限,完成对被测对象温度的自动控制。通过测试表明,该设计对温度的控制有方便实用、操作简单的特点,大大提高了被控对象的各种技术指标。


毋庸置疑,随着科学技术的发展和人们生活的需要,近年来单片机的应用领域越来越宽广。一般的度测量不仅设计复杂,而且精确度非常差,而应用单片机使这个问题得到了很好的解决。在现代社会,温度是一个至关重要的数据,而几十年前的测量方法科技含量太低,显然不能满足现代社会对温度高精确度测量的要求。这些年来专家们研究了几种测温技术,这些测温技术不但很好的提高了测量精度,而且使产品的质量更上一层楼。 由于单片机具有集成度高,通用性好,功能强,尤其体积小,重量轻,耗能低等显著的优势,因此在日常生活和工业生产中得到了广泛应用。本课题就是单片机作为核心器件进行设计的。
1.2课题研究的目的和意义 测量温度的基本方法是使用温度计直接读取温度,如我们大家经常使用的体温计。随着工业生产的需要,人们对温度的测量有了的更高的要求。在迅速发展的科学技术中,前沿技术是传感器技术,特别是温度传感技术,已经渗透到我们生活的各个方面,温度测量在工业生产中占有不可或缺的地位,此外在农业生产中也离不开温度的测量。综上所述,测量温度具有举重若轻的作用。
单片机在各个领域的应用广泛,而把它作为数字温度计的核心部件只是具体应用的一个实例。目前,随着在恶劣的工作环境下的对测温技术的要求,单片机的发展越来越受到人们的重视。
1.3国内外测温技术及单片机现状不可否认,跟发达国家相比,我国测温技术仍然处于较低水平。一般的测温技术只能对较平稳的环境温度进行测量,如果用于恶劣的工作环境,我国的某些技术还达不到要求。但是,随着我国成为世界第二大经济体,经济实力直线上升,我国电子企业也在蓬勃发展。
众所周知,单片机是集成在一块芯片上的计算机系统,它拥有计算机系统的主要部件和功能,如 CPU、并行I/O端口、定时与中断系统、A/DD/A转换系统、总线系统。随着科学技术的发展,现在大部分单片机功能也更加强大。单片机还可以连接各种各样的外围电路,如定时器、复位电路、时钟电路、传感器等等,我们应用单片机可以对各种各样的数据进行采集。如连接温度传感器DS18B20等芯片,就可以对被测对象进行温度的测量与检测。
2系统总体方案设计
2.1系统的设计指标
本课题设计的数字温度计要求能够及时准确地对被测对象进行温度测量,并将其测得的温度值显示在LED数码管上,然后与设定的温度范围比较,如果超过温度限制,则通过蜂鸣器报警,同时报警指示灯闪烁,直到温度回到规定的范围为止。另外,还能够通过按键自己设置温度范围。综上所述,系统设计的要求如下:
1.开机启动,检测各元件是否正常工作。
2.正负温度辨别(正温度红灯亮,负温度绿灯亮)。
3.温度测量的基本范围是-30℃~125℃。
4.软件预设上限温度32℃,下限温度10℃。
5.超过温度上下限即实现报警功能,报警灯闪烁,蜂鸣器震动并发声警示,并在负温度时蜂鸣器震动较急促。
6.支持手动按键设置温度上下限。
2.2系统的实现原理本系统使用温度传感器,并与单片机连接组成温度测量系统,从而完成测量温度。温度传感器对温度的变化十分敏感,它能够把测得的温度及时准确的转化为一串的电路信号,这时我们可以通过显示系统将其测得的温度值显示出来,供人们读取和记录。比如,温度传感器DS18B20是一种集成度很高的温度测量器件,它能够根据当前温度环境的变化产生出一串数字信号。显然,不同的温度环境将会有不同的数字信号,通过该信号能够准确的得到当前环境的温度值,从而完成温度的测量。
2.3系统的实现方案分析 我们同样利用温度传感器DS18B20作为测量器件,由于DS18B20的集成度很高,因此该器件需要的外围电路非常简单。并且DS18B20体积小,节省电路板。此外,DS18B20是高封装的温度传感器,能够直接和单片机通信。测温范围-55℃~+125℃,固有测温分辨率0.5℃。抗干扰能力很强。单片机作为主要组成器件,但这里采用LED 7位数码管进行温度值的显示,显示温度值清晰直观,易于分辨。并且LED数码管占用空间小,经济实惠。
3 系统硬件设计3.1 系统总体结构本方案设计的系统模块由单片机系统、温度传感器模块、数码管显示模块和电源模块组成,其总体结构如图1。




图1 系统结构图
该系统是以AT89C52 单片机为核心,在开始运行它向主机先发送初始化命令使DS18B20启动,再发送温度转换命令使数字温度传感器DS18B20 把测得的模拟温度信号转换为数字信号供单片机运算。同时,显示器上显示出当前环境的温度,当温度超出设定的温度上下限范围时,蜂鸣器就会发出警报。
3.2 AT89C52简介单片机经过几十年的蓬勃发展,目前已经是自动控制理论的中流砥柱。对于专业人员来说,掌握单片机原理及其应用已经成为必不可少的一项技能,是专业人员必备的能力和素质之一。单片机的应用十分广泛,在控制领域、家用电器、食品储存等方面,都扮演着一个非常重要的角色。
ATMEL公司采用国际先进的技术手段生产的AT89C52单片机与一般的单片机有所不同,它不仅是一种8位微控制器,具有低功耗和高性能的特点,还拥有非易失性Flash程序存储器。它的主要接口与引脚的特点如下。
其引脚图如图2所示:
P0口:P0口与其他端口不同,它的输出级无上拉电阻。作为通用输出I/O口使用时,输出级是开漏电路,故用其输出去驱动NMOS输入时外接上拉电阻,上拉电阻一般在10KΩ左右即可。这时每一位输出可以驱动4个LS型负载。用作输入时,应先向端口锁存器写1。把P0口用作地址/数据总线时,无需外接上拉电阻。作总线输入时,不需先向端口写1。P0口作总线时,每一位输出可以驱动8个LS型TTL负载。

图2 单片机AT89C52引脚图
P1~P3口:P1~P3口接有上拉负载电阻,它们的每一位输出可以驱动4个LS型TTL负载。用作输出口时,任何TTL或NMOS电路都能以正常的方式驱动89C51系列单片机的P1~P3口。由于它们的输出级接有上拉电阻,因此,在使用时无需外接上拉电阻。由于单片机的端口输出电流一般为几毫安,当用作输出口去驱动一个晶体管的基极时,应在基极和端口之间串联一个电阻,以限制高电平时的输出电流。
              P3口用作第二功能:当使用P3口的第二功能时,8个引脚有不同的意义。当某位用作第二功能输入时,该位的锁存器输出端被内部硬件自动置1,并且W在端口不作第二功能输出时保持为1,则与非门3输出低,所以FET截止,该位引脚为高位输入。因此读引脚信号无效,三台缓冲器无效,这样,从引脚输入的第二个能信号,经缓冲器后被直接送给CPU处理。当P3口的某一引脚用作第二功能时,该引脚不能用作通用I/O端口。
P3口各个引脚的第二功能见下表1


端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
INT0(外中断0)
P3.3
INT1(外中断1)
P3.4
T0(定时/计时器0外部输入)
P3.5
T1(定时/计时器1外部输入)
P3.6
WR(外部数据存储器写选通)
P3.7
RD(外部数据存储器读选通)

                           表1  P3口的第二功能图
RST: RST是复位信号输入端,高电平有效。当单片机正常工作时,该引脚出现两个机器周期的高电平就会使单片机复位;在上电时,由于振荡器需要一定的起振时间,该引脚的高电平必须保持10ms以上才能保证有效复位。
              ALE: ALE是地址锁存器信号,每个机器周期输出两个正脉冲。在访问片外存储器时,下降沿用于控制外接的地址锁存器锁存从P0口输出的低8位地址。在没有接外部存储器时,可以将该引脚的输出作为时钟信号使用,因此它可对外输出时钟或用于定时目的。
PROG:为片内程序存储器的编程脉冲输入端,低电平有效。
              PSEN:片外程序存储器读选通信号输出端,每个机器周期输出两个负脉冲,低电平有效。在访问片外数据存储器时,该信号不出现。            
EA/VPP:EA为片外程序存储器选择输入端,该引脚低电平时,使用外部程序存储器,为高电平时,使用片内程序存储器;VPP为片内程序存储器编程电压输入端。
              XTAL1:该引脚接外部晶振和微调电容的一端,与单片机内振荡电路一起,产生由外部晶振决定的振荡频率。在使用外部时钟时,该引脚输入外部时钟脉冲。
XTAL2:该引脚接外部晶振和微调电容的另一端,XTAL2接内部反向放大器的输出端,因此在使用外部时钟时,该引脚接地。
3.3 DS18B20简介温度传感器是各种传感器中最常用的一种,早期使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也按照一定的函数关系发生线性变化,通过采集电阻两端的电压,再根据某个函数关系式就可以计算出当前环境温度。
DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配置微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。
3.3.1温度传感器DS18B20引脚介绍温度传感器DS18B20有两种封装:三脚TO-92直插式和八脚SOIC贴片式,其中三脚TO-92直插式是使用的最多、最普遍的封装。封装引脚如图3所示。

图3 DS18B20TO-92封装
下表2列出了温度传感器DS18B20的引脚定义
表2 DS18B20的引脚定义
引脚
定义
GND
电源负极
DQ
信号输入输出
VDD
电源正极
NC


引脚功能说明:
GND :接地信号
DQ :数据输入/输出引脚。开漏单总线接口引脚。当被用在寄生电源下,可以向器件提供电源。
VDD :可选VDD引脚,电源电压范围3V~5.5V。当工作于寄生电源时,此引脚必须接地。
3.3.2 DS18B20内部结构与特点 DS18B20的内部结构主要包括:寄生电源,温度传感器,64位ROM和单总线接口,存放中间数据的高速暂存器RAM,用于存储用户设定温度上下限值的TH和TL触发器,存储与控制逻辑,8位循环冗余校验码(CRC)发生器等7部分组成。
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位,12位转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中。DS18B20温度值格式如二进制表2.2所示,其中,前5位是符号位,如果测得的温度大于0,这5位为0,只要将测得的数值乘以0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于 0.0625即可得到实际温度。
图4 DS18B20温度值格式表
      

1、配置寄存器
DS18B20配置寄存器各字节意义如表3下:
表3 DS18B20寄存器中各位内容
BIT7
BIT6
BIT5
BIT4
BIT3
BIT2
BIT1
BIT0
TM
R1
RO
1
1
1
1
1

低五位一直都是"1",其中TM是测试模式位,用于设置温度传感器DS18B20是在工作模式还是在测试模式。温度传感器DS18B20默认该位被设置为0,我们不要去修改。其中,R1和R0作用主要是设置分辨率,具体设置如表4所示:(DS18B20默认设置为12位)。
表4 温度分辨率设置表
RR1
RRO
分辨率
温度最大转换时间
00
00
99位
93.75ms
00
11
110位
187.5ms
11
00
111位
375ms
11
11
112位
750ms

2、高速暂存存储器
该存储器一共有9个字节组成。当温度转换命令发出后,经温度传感器的转换所得的温度值以二进制补码形式存放在该存储器的前两个字节。单片机可通过单线接口读到该数据。读取时低位在前,高位在后。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。其中第9个字节是冗余检验字节。

温度传感器DS18B20暂存寄存器分布如表5所示。

表5 DS18B20暂存寄存器分布
寄存器内容
字节地址
温度值低位(LS Byte)
0
温度值高位(MS Byte)
1
高温限值(TH)
2
低温限值(TL)
3
配置寄存器
4
保留
5
保留
6
保留
7
CRC校验值
8

3.3.3 DS18B20 温度测量通信协议由于DS18B20采用的是1Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片中的数据处理。
DS18B20有严格的通信协议来保证各位数据传输的正确性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从属设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,
DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输,其工作时序包括初始化时序、写时序和读时序。
它们的工作时序如图5 a)(b)(c)所示。

5 (a)初始化时序
DS18B20的初始化过程:
1. 先将数据线置高电平“1”。
2. 延时,尽可能短一点。
3. 数据线拉到低电平“0”。
4. 延时750微秒(该时间的时间范围可以从480960微秒)。
5.数据线拉到高电平“1”。
6. 延时等待。
7. CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
8.将数据线再次拉高到高电平“1”后结束。

5 (b)写时序
DS18B20的写操作过程:
1. 数据线先置低电平“0”。
2. 延时确定的时间为15微秒。
3. 按从低位到高位的顺序发送字节,一次只发送一位。
4. 延时时间为45微秒。
5. 将数据线拉到高电平。
6. 重复上(1)到(6)的操作直到所有的字节全部发送完为止。
7. 最后将数据线拉高。


5 (c)读时序
DS18B20的读操作过程:
1. 将数据线拉高“1”。
2. 延时2微秒。
3. 将数据线拉低“0”。
4. 延时15微秒。
5. 将数据线拉高“1”。
6. 延时15微秒。
7. 读数据线的状态得到1个状态位,并进行数据处理。
8. 延时30微秒。
3.4系统硬件设计3.4.1 复位电路模块本系统采用按键复位电路,按键未按下时,它利用电容来实现复位,在接电瞬间,RST引脚的电位与电源VCC相同,随着充电电流的减少,RST的电位逐渐下降。此时只要保证RST为高电平的时间大于两个机器周期,便可以正常复位;按键按下时,此时电源VCC经两个电阻分压,在RST引脚产生一个复位高电平,从而实现复位。
复位电路如图6所示。

6 复位电路

3.4.2 时钟电路设模块时钟电路作用:单片机外部必须接上振荡器,提供的高频脉冲经过分频处理后,成为单片机内部时钟信号,作为片内各部件协调工作的控制信号。如果没有时钟信号,触发器的状态就不能改变,单片机内部的所有电路在完成一个任务后将最终达到一个稳定状态而不能再继续进行其它任何工作了。
时钟电路如图7所示:

7 时钟电路
3.4.3 报警电路模块当被测环境温度超过温度上下限时,我们需要进行报警处理,这里用到的是蜂鸣器。
蜂鸣器工作电流一般为10mA,而单片机的I/O口只能承受几毫安的电流,因此需要加三极管进行驱动,单片机的I/O口中的P1.4接三极管的基极,当P1.4为低电平时,三极管导通,5V的电压加载到蜂鸣器两端,于是蜂鸣器鸣叫;当P1.4高电平时,三极管截止,蜂鸣器不鸣叫。
报警电路如下图8所示:

8 报警电路
3.4.4显示电路模块显示系统是单片机控制系统的重要组成部分,单片机应用系常采用7段LED数码管作为显示器,这种显示器具有耗电低、线路简单、价格低廉等优点。
LED数码管显示器可以分为共阴极和共阳极两种结构。
(1)共阴极结构:如果所有的发光二极管的阴极接在一起,称为共阴极结构
(2)共阳极结构:如果所有的发光二极管的阳极接在一起,称为共阳极结构

七段LED显示器是由7个LED按—定的图形排列组成,如图9所示,七段LED显示器的各个二极管分别称为a、b、c、d、e、f、g段,有些七段显示器增加一个dp段表示小数点,也称为八段LED显示器。

图9 典型七段LED器件
将数码管的引脚和单片机的数据输出口相连,控制输出的数据可以使数码管显示不同的数字和字符,通常称控制发光二极管的8位字节数据为段选码。7段LED段选码如表6所示。
表6 7段LED段选码
显示字符
共阴极段选码
共阳极段选码
显示字符
共阴极段选码
共阳极段选码
0
3FH
C0H
C
3EH
C6H
1
06H
F9H
D
5EH
AH
2
5BH
A4H
E
79H
86H
3
4FH
B0H
F
71H
8EH
5
6DH
92H
U
3EH
C1H
6
7DH
82H
R
31H
CEH
7
07H
F8H
Y
6EH
91H
8
7FH
80H
8.
FFH
00H
9
6FH
90H
“灭”
00H
FFH
A
77H
88H
B
7CH
83H



    本设计采用四位共阴极动态显示方式,可以直接读取温度值,显示温度可以精确到1℃。
10为显示电路的连接图。

图10 显示电路
3.4.5按键电路模块该电路采用弹性按键。按键电路的作用是手动设置温度的上下限。按下K4,进行上下限报警切换,通过K1和K2调节温度上下限,最后,按下K3确认。
具体的按键电路图如下图11所示:
                  
图11 按键电路
3.4.6温度检测电路模块该电路中温度传感器采用Dallas公司生产的数字温度传感器DS18B20该芯片硬件接口简单,使用方便,且节省大量的导线,具有很好的通用性。该系统中将单片机的P1.1引脚与DS18B20的数据线连接。
具体的温度检测电路图如下图12所示:



图12 温度检测电路
4系统软件设计 4.1系统主程序设计主程序是系统的监控程序,在程序运行的过程中必须先经过初始化,包括开机启动子程序,中断程序,报警函数,按键扫描子程序以及控制端口的初始化工作。系统在初始化完成后就进入温度测量程序,实时的测量当前的温度并通过显示电路在LCD上显示。程序中以中断的方式来重新设定温度的上下限,根据硬件设计完成对温度的控制,系统软件设计的总体流程图如下图13






              图13 系统主程序框图

主程序如下:
void  main()
{            
    TCON=0x01;         //定时器T0工作在01模式下
    TMOD=0X01;            
              TH0=0XD8;          //装入初值
              TL0=0XF0;
              EA=1;               //开总中断
              ET0=1;              //开T0中断
              TR0=1;              //T0开始运行计数
              EX0=1;              //开外部中断0
              for(n=0;n<500;n++)     //显示启动LOGo"- - - -"
              {bell=1;warn=1;logo();}
              Red=0;
              while(1)
              {
                  key();
                            ss=ReadTemperature();
        Show();
                            alarm();          //报警函数
                            if(Flag==1)
                            {bell=!bell;
                            warn=!warn;}     //蜂鸣器滴滴响
                            else {bell=1;
                                  warn=1;}            
              }            
}
4.2 DS18B20初始化子程序DS18B20的初始化相当于DS18B20数据头的作用,DS18B20检测到初始化电平,准备开始接收或发送数据。初始化子程序流程图如下图14所示。



                          图14 DS18B20初始化程序流程图
DS18B20初始化程序如下:
Init_DS18B20(void)              //传感器初始化
{
              uchar x=0;
              DATA = 1;    //DQ复位
              delay(10);    //稍做延时
              DATA = 0;    //单片机将DQ拉低
              delay(80);   //精确延时 大于 480us   
              DATA = 1; //拉高总线
              delay(20);
              x=DATA;    //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
              delay(30);
}
4.3 DS18B20读取温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
DSBl820可以从单总线获取电源,当信号线为高电平时,将能量贮存在内部电容器中;当单信号线为低电平时,将该电源断开,直到信号线变为高电平重新接上寄生(电容)电源为止。DSl8820的供电方式灵活,利用外接电源还可增加系统的稳定性和可靠性。图15为读取数据流程图。



                    图15 DS18B20读取温度子程序流程图
读取温度子程序如下:
int ReadTemperature(void)     //读取温度
{
              uchar a=0;
              uchar b=0;
              int t=0;
              float tt=0;
              Init_DS18B20();
              WriteOneChar(0xCC);    // 跳过读序号列号的操作
              WriteOneChar(0x44);    // 启动温度转换
              Init_DS18B20();
              WriteOneChar(0xCC);   //跳过读序号列号的操作
              WriteOneChar(0xBE);    //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
              a=ReadOneChar();       //低位
              b=ReadOneChar();       //高位
              t=b;
              t<<=8;
              t=t|a;
              tt=t*0.0625;
              t= tt*10+0.5;
              return(t);
}
4.4 显示数据处理子程序读出温度数据后,LOW的低四位为温度的小数部分,LOW的高四位和HIGH的低四位为温度的整数部分,HIGH的高四位全部为1表示负数,全为0表示正数。所以先将数据提取出来,分为三个部分:小数部分、整数部分和符号部分。小数部分进行四舍五入处理:大于0.5℃的话,向个位进1;小于0.5℃的时候,舍去不要。当数据是个负数的时候,显示之前要进行数据转换,将其整数部分取反加一。还因为DS18B20最低温度只能为-55℃,所以可以将整数部分的最高位换成一个“-”,表示为负数。
16为温度数据处理程序的流程图:









                图16 显示数据处理子程序


以下是显示正值子函数的程序:
void  display()
{                          
              buf[1]=temp/1000;           //显示百位
              buf[2]=temp/100%10;        //显示十位
              buf[3]=temp%100/10;        //显示个位
              buf[0]=temp%10;           //小数位
              for(j=0;j<3;j++)
              {
              P2=0xff;                                        // 初始灯为灭的
    P0=0x00;
              P2=0xfd; //显示小数点
              P0=0x80; //显示小数点
              delay(300);                          
    P2=0xff;                                        // 初始灯为灭的
    P0=0x00;
    P2=0xf7;                                         //片选LCD1
    P0=table[buf[1]];
              delay(300);
              P2=0xff;
    P0=0x00;
    P2=0xfb;                 //片选LCD2
    P0=table[buf[2]];
              delay(300);
              P2=0xff;
    P0=0x00;
              P2=0Xfd;                                        //片选LCD3
              P0=table[buf[3]];
              delay(300);
              P2=0xff;
    P0=0x00;
              P2=0Xfe;
              P0=table[buf[0]];                       //片选LCD4            
              delay(300);
              P2=0xff;
              }
}
4.5按键扫描子程序该系统支持手动设置温度上下限,而按键扫描的主要功能就是手动设置温度的上下限。系统默认的温度上下限是10℃~32℃。当被测温度值处于0℃~125℃时,若被测温度没有超过上下限,则蜂鸣器不鸣叫,否则蜂鸣器鸣叫;当被测温度值处于0℃以下时,蜂鸣器鸣叫较急促。
为了防止抖动,按键电路中都要消抖的措施,本设计中是采用的软件消抖,在单片机检测到某个键按下后,延时10ms再监测,如果仍然按下,才确定按下了该键。
按键K4、K1、K2、K3分别与单片机的P2.4-P2.7引脚连接。默认状态设置温度上限,若按下按键K4,也就是使P2.4为低电平时,进入温度下限的设置,再按一次进入温度上限的设置;在每个温度上下限设置里面,按下K1一次增加1℃温度值,按下按键K一次减小1℃温度值,最后按K3确定。
按键扫描子程序的流程图如下图17所示:



                           图17 按键扫描子程序


按键扫描子程序如下:
void key()                           //按键扫描子程序
{   if(k1!=1)
              {
                 delay(20);
                 if(k1!=1)
                 {
                            while(k1!=1)
                              { key_to1();
                                for(n=0;n<8;n++)
                                Show();
                     }
                 }
              }
              if(k2!=1)
              {
                            delay(20);
                            if(k2!=1)
                            {
                              while(k2!=1)
                                          { key_to2();
                                            for(n=0;n<8;n++)
                                  Show();
                                          }
                            }
              }            
              if(k3!=1)
              {              TR0=1;              //复位,开定时
        temp=ReadTemperature();
              }
              if(k4!=1)
              {  delay(20);
                 if(k4!=1)
                 {  while(k4!=1);
                    set=!set;
                               if(set==0)
                               { Red=0;Green=1;}
                               else { Green=0;Red=1;}
                            }
              }
}
5 系统软硬件调试本次设计采用Keil uVision2来编写C语言程序,通过它的编译器进行编译、连接,最后将生成的机器码下载到单片机上。
Keil C51编译器是目前最流行的开发MCS-51系列单片机的软件,它具有C编辑器、宏汇编、链接器、库管理和一个功能强大的仿真调试等在内的功能,并通过一个集成开发环境将这些部份组合在一起。
打开Proteus ISIS,在Proteus ISIS编辑窗口中单击元件列表之上的“P”按钮 ,添加元件及放置元件。
按照正确的方法,合理地布局将各个元器件连线,得到如下界面,如图18所示:


图 18 整体电路图

把刚才产生的可执行hex文件下载到单片机中,单击运行按钮,电路瞬间导通,程序首先进入Logo函数进行开机检测。此时单片机给正负温度指示灯和报警指示灯高电平,给温度上限指示灯低电平,使它们正常发光,给共阴极数码管相应的位高电平,使其动态显示温度为85℃。由于85℃不在默认温度上下限10℃~32℃之间,所以此时正温度指示灯亮,报警指示灯闪烁,蜂鸣器也开始鸣叫。大约200ms后,开机检测结束,温度回到当前环境温度5℃,由于默认的温度上下限是10℃~32℃,所以

正温度指示灯亮,报警指示灯闪烁,蜂鸣器鸣叫。
仿真结果如图19所示。

图19 数字温度计仿真图
我们再次调节环境温度,使环境温度处于15℃,由于此时温度不在温度上下限10℃~32℃之间,因此单片机给正温度指示灯高电平,给报警指示灯低电平,所以正温度指示灯高电平亮,报警指示灯熄灭,蜂鸣器也不鸣叫。
仿真结果如图20所示。


图20 数字温度计仿真图
再次调节温度,使温度在-10℃,此时温度不在温度上下限之间,此时单片机给负温度指示灯高电平,报警指示灯高电平,所以负温度指示灯亮,报警指示灯闪烁,并且蜂鸣器鸣叫较为急促。
仿真结果如图21所示。

图21 数字温度计仿真图
默认情况下设置温度上限,若按下K4进入温度下限设置。通过按键K1和K2增加或减少温度值,最后按下K3确认。比如设置温度上下限为15℃~40℃,当环境温度处于35℃时,而35℃在设置的温度上下限15℃~40℃之间,因此报警电路不工作。
仿真电路如图22所示。

图22 数字温度计仿真图
当环境温度处于12℃时,当温度在温度上下限15℃~40℃之间时,报警电路开始工作,报警指示灯闪烁,蜂鸣器鸣叫。
仿真电路如图23所示。

图23 数字温度计仿真图
结果分析:
本文介绍并设计的数字温度计的基本测量范围是-30℃~125℃,并且具有自动报警功能和默认温度上下限(10℃~32℃),还可以手动设置温度上下限,用4位一体数码管显示设置温度的上下限和当前环境的温度。由于所采用的是DS18B20温度传感器,它的可测量范围是-55℃~125℃,测量温度在-10℃~85℃之间时的可分辨温度是0.5℃,我们将小数位始终显示为0,也即显示的温度精度是1℃。如果当前环境温度在默认的温度上下限之间,主函数不会调用报警子程序,报警电路不会工作,蜂鸣器也不鸣叫;如果当前环境温度在默认的温度上下限之外,主函数就会调用报警子程序,此时单片机送给报警指示灯蜂鸣器高电平,报警指示灯闪烁,蜂鸣器鸣叫,直到环境温度回到默认的温度上下限之间。当然,由于本设计支持手动设置温度上下限,我们也可以手动设置温度上下限。
由仿真结果及设计要求完成的指标可知,该设计基本符合设计要求。




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表