毕 业 设 计( 论 文 )数字温度显示报警系统
毕 业 设 计( 论 文 )
题 目: 数字温度显示报警系统
专 业: 电子信息工程
班 级: 06(2)班
姓 名: 石昊
学 号: 2006654212
指导教师: 叶凡
日 期: 2010年6月5日
目 录
引言. 2
2. 设计要求. 2
2.1基本功能. 2
2.2扩展功能. 2
3. 总体设计方案. 3
3.1数字温度计设计方案论证. 3
3.1.1 方案一. 3
3.1.2 方案二. 3
3.2 总体设计框图. 3
3.3单片机的选择. 3
3.4 温度传感器的选择. 5
3.4.1 DS18B20的介绍. 5
3.5 显示模块选择. 7
3.5.1数码管的分类. 8
3.5.2数码管驱动原理. 8
4. 系统硬件电路设计. 9
4.1系统整体电路图. 9
4.2 单片机最小系统. 10
4.3 温度传感器系统. 10
4.3.1 DS18B20的测温原理. 11
4.4 报警电路设计. 12
4.5 显示电路设计. 12
4.6电源电路设计. 13
5. 系统软件设计. 14
5.1主程序. 14
5.2读出温度子程序. 15
5.3温度转换命令子程序. 15
5.4 计算温度子程序. 15
5.4 键盘扫描流程图. 17
6. 测试与结果分析. 17
6.1仿真软件介绍. 17
6.2 仿真结果. 18
6.2.1 用Keil进行程序编译. 18
6.2.2 在Proteus中仿真. 19
7. 总结与致谢. 22
参考文献:. 23
英文摘要:. 24
附录:源程序. 25
数字温度显示报警系统
摘要:随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计,利用单片机AT89S52设计了一种数字温度计,它由单片机、DS18B20传感器以及LED 数码管等部件组成,本温度计属于多功能温度计,功能较强,可以设置上下限报警温度,且测量准确、误差小。当测量温度超过设定的温度上下限时,启动蜂鸣器和指示灯报警。
关键词:单片机AT89S52;温度计;DS18B20;温度显示
引言
温度是工业控制中主要的被控参数之一,特别是在冶金、化工、建材、食品、机械、石油等工业中,具有举足重轻的作用。对于不同场所、不同工艺、所需温度高低范围不同、精度不同,则采用的测温元件、测温方法以及对温度的控制方法也将不同;产品工艺不同、控制温度的精度不同、时效不同,则对数据采集的精度和采用的控制算法也不同,因而,对温度的测控方法多种多样。随着电子技术和微型计算机的迅速发展,微机测量和控制技术也得到了迅速的发展和广泛的应用[1]。利用微机对温度进行测控的技术,也便随之而生,并得到日益发展和完善,越来越显示出其优越性。
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展[2]。
本设计即用单片机对温度进行实时检测与控制,本文所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S52,测温传感器使用DS18B20,用4位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到设计要求。本温度计属于多功能温度计,功能较强,可以设置上下限报警温度,且测量准确、误差小。当测量温度超过设定的温度上下限时,启动蜂鸣器和指示灯报警。
2. 设计要求
2.1基本功能
■ 基本范围0℃-99℃
■ 精度误差小于0.5℃
■ LED数码直读显示
2.2扩展功能
■ 实现声光报警
■ 可以任意设定温度的上下限报警功能
3. 总体设计方案
3.1数字温度计设计方案论证
3.1.1 方案一
由于本设计是测温电路,根据设计要求可以使用热敏电阻之类的感温器件利用其感温效应,然后将随被测温度变化的电压或电流采集过来,经过A/D转换后,将数据传输到单片机进行数据的处理,然后在显示电路上显示,这样就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
3.1.2 方案二
在单片机电路设计中,大多都是使用传感器,这是非常容易想到利用数字温度传感器,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,然后传输给单片机进行数据处理,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路设计比较简洁,软件设计也比较简单,故采用方案二。
3.2 总体设计框图
温度计电路设计总体设计方框图如图3.2.1所示,控制器采用单片机AT89S52,温度传感器采用DS18B20,用4位LED数码管以串口传送数据实现温度显示。
图3.2.1 总体设计方框图
3.3单片机的选择
方案一:选择Microchip公司的PIC系列单片机
作为世界上最为顶尖的单片机研发与生产企业,微芯公司设计的PIC系列单片机一度风靡全球,其优秀的性能和卓越的品质受到了许多人的青睐,其优点毋庸赘述。但是,高知名度的缺点也显而易见,价格昂贵,性价比不高是其软肋[3]。
方案二:选择德州仪器的MSP430系列单片机
MSP430单片机是一个 16 位的、具有精简指令集的混合型单片机,它具有极低的功耗、丰富的片内外设和方便灵活的开发手段。但是,由于MSP430单片机系列价格较高,比较适合于较为复杂的应用系统[4]。
方案三:选择Atmel公司的AT89S52单片机
AT89S52单片机是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,片上Flash允许程序存储器在系统可编程,亦适于 常规编程器,在功能强大的微型计算机的AT89S52单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案可为许多嵌入式控制应用系统提供高性价比的解决方案[5]。AT89S52引脚结构图如图3.3.1:
图3.3.1 AT89S52结构图
AT89S52 实物图如图3.3.2:
图 3.3.2 AT89S52 实物图
基于对成本和性能的比较,我们选择AT89S52单片机。
3.4 温度传感器的选择
3.4.1 DS18B20的介绍
温度传感器的种类众多,在应用与高精度、高可靠性的场合时 DALLAS(达拉斯)公司生产的 DS18B20 温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得 DS18B20 更受欢迎。
DS18B20 的主要特征:
● 全数字温度转换及输出;
● 最高 12 位分辨率,精度可达土 0.5摄氏度;
● 12 位分辨率时的最大工作周期为 750 毫秒;
● 可选择寄生工作方式;
● 检测温度范围为–55°C~+125°C (–67°F ~+257°F);
● 内置 EEPROM,限温报警功能。用户可定义报警设置 ;
● 64 位光刻 ROM,内置产品序列号,方便多机挂接;
● 多样封装形式,适应不同硬件系统;
● 独特的单线接口仅需要一个端口引脚进行通信;
● 多个DS18B20 可以并联在惟一的三线上,实现多点组网功能;
● 无须外部器件;
● 可通过数据线供电,电压范围为3.0~5.5V;
● 零待机功耗;
● 温度以9 或12 位数字;
● 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
● 负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;
DS18B20它有64 位ROM 的结构开始8 位是产品类型的编号,接着是每个器件的惟一的序号,共有48 位,最后8 位是前面56位的CRC 检验码,这也是多个DS18B20 可以采用一线进行通信的原因。温度报警触发器TH 和TL,可通过软件写入户报警上下限[6]。
另外,由于DS18B20 单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20 的各种操作按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM 功能命令→发存储器操作命令→处理数据。
DS18B20芯片封装结构如图3.4.1:
图 3.4.1 DS18B20芯片封装结构
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图3.4.2所示。
I/O
图 3.4.2 DS18B20内部结构框
DS18B20 工作原理
DS18B20 的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解18B20的内部存储器资源。DS18B20 共有三种形态的存储器资源,它们分别是:
ROM 只读存储器,用于存放 DS18B20ID 编码,其前 8 位是单线系列编码(DS18B20 的编码是19H),后面48 位是芯片唯一的序列号,最后 8位是以上 56的位的 CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20 共 64 位 ROM。
RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20 共9 个字节 RAM,每个字节为 8 位。第1、2 个字节是温度转换后的数据值信息,第 3、4 个字节是用户 EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第 5 个字节则是用户第 3 个 EEPROM的镜像。第 6、7、8 个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第 9 个字节为前 8个字节的 CRC码。
EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在 RAM 都存在镜像,以方便用户操作[7]。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3.4.3所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
温度 LSB
温度 MSB
TH用户字节1
TL用户字节2
配置寄存器
保留
保留
保留
CRC
TM
R1
R0
1
1
1
1
1
图3.4.3 DS18B20字节定义
3.5 显示模块选择
数码管是一种半导体发光器件,其基本单元是发光二极管。
3.5.1数码管的分类
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮[8]。如图3.5.1
图3.5.1 八段数码管事物图
3.5.2数码管驱动原理
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,在有些时候需要做一个简单的显示系统。那么在单片机I/O资源够用的情况下可以直接用单片机的I/O口驱动数码管,也可以根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
(1)静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性[8]。
(2)动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮[9]。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低[10]。
静态驱动方式简单不容易出错,如果电路设计合适,也能够用较少的线完成多个数码管的驱动。但是动态驱动方式省单片机的资源,如今已经有很多这样成熟的基于动态扫描的芯片。
所以能满足本文显示设计要求,采用LG3641BH LED数码管做为显示电路,数码管显示电路采用4位共阳LED数码管从P14,P15,P16,P17串口输出段码。
4. 系统硬件电路设计
4.1系统整体电路图
该系统电路主要包括:单片机最小系统、DS18B20温度传感器系统、报警系统、LED显示模块电路及电源接口和数据下载接口等电路,如图 4.1.1所示。
图中有三个独立式按键可以分别调整温度计的上下限报警设置,图中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值。
图中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。
图 4.1.1 系统整体电路图
4.2 单片机最小系统
最小系统包括晶振电路、复位电路、按键设置部分,AT89S52单片机最小系统的电路如图:4.2.1
单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要[11],很适合便携手持式产品的设计使用系统可用二节电池供电。
图 4.2.1 单片机最小系统电路
4.3 温度传感器系统
DS18B20温度传感器电路,如图 4.3.1。
图 4.3.1 DS18B20温度传感器系统
DS18B20采用单线进行数据传输,外接一个4.7k上拉电阻与单片机的P10口相连进行数据的双向传输[12]。
4.3.1 DS18B20的测温原理
器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值[13]。
由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据[14]。
表1 DS18B20温度转换时间表
R1
R0
分辨率/位
温度最大转向时间/ms
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。
在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。
表2 一部分温度对应值表
温度/℃
二进制表示
十六进制表示
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0000
0191H
+10.125
0000 0000 1010 0001
00A2H
+0.5
0000 0000 0000 0010
0008H
0
0000 0000 0000 1000
0000H
-0.5
1111 1111 1111 0000
FFF8H
-10.125
1111 1111 0101 1110
FF5EH
-25.0625
1111 1110 0110 1111
FE6FH
-55
1111 1100 1001 0000
FC90H
4.4 报警电路设计
报警电路中加一PNP三极管驱动,基极接单片机P11口,当端口变成低电平时,驱动三极管会导通,VCC电压加载到蜂鸣器使其发声、报警发光二极管亮,如图4.4.1。
图 4.4.1 报警电路
4.5 显示电路设计
如图4.5.1,采用LG3641BH LED数码管显示电路采用4位共阳LED数码管从P14,P15,P16,P17串口输出段码。用PNP三极管进行驱动,当相应的端口变成低电平时,驱动相应的三极管会导通,驱动三极管给数码管相应的位供电,这时只要P0口送出数字的显示代码,数码管就能正常显示数字。
图 4.5.1 数码管显示电路
4.6电源电路设计
我们选用的是串联起来的4节1.5v的5号电池,从经济的角度考虑的,干电池比较便宜,但其还有不足之处,干电池存储的是电量。随着电量的消耗,它的供电电压就会不断的下降,所有我们需要使用一个稳压器,来保证电源供给的是标准的5v电压。4节1.5v串联起来产生的和电压最大是6v,而本文的AT89S52单片机工作电压的范围是4v—5.5v,在该系统中我们使用的电压是5v。这时我们可以用LM7805稳压器来产生稳定的5v电压[15]。稳压电路如下图4.6.1所示:
图4.6.1 LM7805稳压电路
在该电路中,C12是极性电容,起到稳压的作用,而C2是非极性电容,它起的作用是滤除输出电压中不是直流的成分,即滤波。
LM7805稳压芯片的稳压压差为2V左右,在实际使用中容易出现电压过低的状态,此时提供的电源达不到系统的电源要求,会出现程序跑飞的现象,而另一款LM2904的稳压压差可以达到40mV,效果比LM7805好很多,但考虑到经济原因我们采用LM7805,只要在稳压前端提供较大的电源供应即可。
5. 系统软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,按键扫描。
5.1主程序
主程序的主要功能是负责读出并处理DS18B20的测量的当前温度值,温度的实时显示,并根据设置的上下限判断是否报警。系统开始运行时,温度传感器测量并计算温度值通过P1.0口传输进单片机里进行处理,经过处理后的数据再通过P0口传输到数码管进行显示。通过按键设置温度报警界限,当超过报警界限时单片机将相应的数据通过P1.1口传输进行声光报警。温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图5.1.1所示。
图5.1.1 主程序流程图
5.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图5.2.1示
图5.2.1读温度流程图
5.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成[16]。温度转换命令子程序流程图如上图,图5.3.1所示
5.4 计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图5.4.1所示。
图 5.3.1 温度转换流程图
图 5.4.1 计算温度流程图
5.4 键盘扫描流程图
图 5.4.1 按键扫描流程图
6. 测试与结果分析
6.1仿真软件介绍
本次仿真用了Proteus软件,Proteus(海神)的ISIS是一款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统[17]。
该软件的特点:
(1)全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。(2)具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS一232动态仿真、1 C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。(3)目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。(4)支持大量的存储器和外围芯片。总之该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大 ,可仿真51、AVR、PIC。
Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验,从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象[18]。
程序编译用Keil软件, Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
6.2 仿真结果
6.2.1 用Keil进行程序编译
运用keil软件编译C语言程序,其结果如下图6.2.1和图6.2.2所示,在结果栏显示“cao cx”—0 Error(s),0 warning(s).说明此程序在软件编译上无语法等错误。将此程序生成*.hex文件调入硬件中用Proteus进行调试仿真。
图6.1.1 Keil编译C语言程序
图6.1.2 Keil编译C语言程序
6.2.2 在Proteus中仿真
将生成的cao.hex文件调入Proteus电路图的单片机中,点击图左下角的开始键运行,程序的开始界面如图6.2.1,数码管显示“— — — —”。
图6.2.1 仿真程序初始化
程序初始化后通过调节DS18B20温度传感器的数值,数码管会显示相应的数值,例如10℃,其结果如图6.2.2所示。
图6.2.2 仿真程序正常运行结果
在设置系统报警温度上下限时,按下按键S1,数码管会显示“H38C”(系统默认上限为38℃),此时进入温度上限设置模式,可通过调节S2和S3分别增加和减小数码管上显示的数字,例如设置上限为39℃,如图6.2.3所示。
接着再次按下键S1,数码管会显示“L05C”(系统默认下限为5℃),此时进入温度下限设置模式,可通过调节S2和S3分别增加和减小数码管上显示的数字,例如设置下限为5℃,如图6.2.4所示。
图6.2.3 仿真设置最高温度报警线
图6.2.4仿真设置温度报警最低线
当温度超过设置的上下限时,系统会进行声光报警,蜂鸣器会发出“滴……滴……滴”蜂鸣声,同时LED灯会闪烁。
当系统未检测的到DS18B20温度传感器或运行错误时,数码管会显示错误的数字“8.8.8.8”,如图6.2.5所示。
图6.2.5 仿真程序出错
7. 总结与致谢
做为对大学四年所学知识的总结,通过本次的毕业论文设计,我学到了很多东西,同时在做的过程中也发现很多的问题,从最初的课题选择到对相关课题资料的搜集与摘选,再到自己论文内容的思路的设计、编写以致最后阶段的修改与完善。在这一过程中,我对我们大学四年所学习的相关电子知识又有了更深一层的学习和理解,让我对自己所学的又有了更深的掌握。虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西而不结合实践是很难理解的,更谈不上掌握。
从这次的毕业设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
在此过程中,我也要感谢对我一直悉心指导和帮助的指导教师——叶爱芹老师。正是在她不厌其烦的指导和对我们的启发中,让我对我的论文设计思路逐渐清晰明朗,每当在我论文设计中遇到困难时充满希望,总能迎刃而解,总之非常感谢她这段时间对我们的鼓励和指导。
参考文献:
[1] 李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,1998
[2] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994
[3] 江力.单片机原理与应用技术 .清华大学出版社 .2006
[4] 蔡美琴等.MCS一51系列单片机系统及其应用[M].北京:高等教育出版社,1999.
[5] 王树勋.MCS一51单片微型计算机原理与开发.北京:机械工业出版社,1995
[6] 何希才.传感器及其应用电路.北京:电子工业出版社,2001
[7] 刘迎春、叶湘滨.传感器原理设计与应用(第三版) [M].长沙:国防科技大学出版社,
1997
[8] 靳达.单片机应用系统开发实例导航.北京:人民邮电出版社,2003.
[9] 潘新民,王燕芳.微型计算机实用系统设计[M].北京:人民邮电出版社,1992.
[10] 胡汉才.单片机原理及接口技术.北京:清华大学出版社,1996
[11] 何力民.MCS一51系列单片机应用系统设计.北京:北京航空航天大学出版社,1993
[12] 江晓安.等数字电子技术 . 编著. 西安电子科技大学出版社 .1993
[13] 阎石.数字电子技术基础(第三版). 北京:高等教育出版社,1989
[14] 廖常初.现场总线概述[J].电工技术,1999.
[15] 靳达.单片机典型模块设计实例导航.北京:人民邮电出版社,2003.
[16] 王松武,于鑫,武思军.电子创新设计与实践.北京:国防工业出版社,2005
[17] Artori S,ZHANG G X. Geometric Error Measurement and Compensation of Machines.
Annals of the CIRP. 1995
[18] Bolton W. Instrumentation&process measurement. Longman Scientific&Technical. 1991
英文摘要:
Digital temperature display alarming system
Abstract: along with the progress of The Times and development, technology has spread to our life, work, scientific research, each domain, has become a more mature technology, this paper introduces a method based on single-chip microcomputer control, the digital thermometer AT89S52 SCM design using a digital thermometer, it by MCU, LED digital sensors and DS18B20 pipe etc components, this thermometer belongs to the multi-function thermometer, function, can install strong upper temperature, and the measurement accuracy alarm and small error. When measuring temperature exceeds the upper limit set temperature, light buzzer and alarm.
Keywords: SCM AT89S52; thermometer; DS18B20; temperature display
附录:源程序
/******************************************************************
程序名称:DS18B20温度测量、报警系统
简要说明:DS18B20温度计,温度测量范围0~99.9摄氏度
可设置上限报警温度、下限报警温度
即高于上限值或者低于下限值时蜂鸣器报警
默认上限报警温度为38℃、默认下限报警温度为5℃
报警值可设置范围:最低上限报警值等于当前下限报警值
最高下限报警值等于当前上限报警值
将下限报警值调为0时为关闭下限报警功能
******************************************************************/
#include <AT89X52.h>
#include "DS18B20.h"
#define uint unsigned int
#define uchar unsigned char //宏定义
#define SET P3_1 //定义调整键
#define DEC P3_2 //定义减少键
#define ADD P3_3 //定义增加键
#define BEEP P3_7 //定义蜂鸣器
bit shanshuo_st; //闪烁间隔标志
bit beep_st; //蜂鸣器间隔标志
sbit DIAN = P2^7; //小数点
uchar x=0; //计数器
signed char m; //温度值全局变量
uchar n; //温度值全局变量
uchar set_st=0; //状态标志
signed char shangxian=38; //上限报警温度,默认值为38
signed char xiaxian=5; //下限报警温度,默认值为5
uchar
code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*****延时子程序*****/
void Delay(uint num)
{
while( --num );
}
/*****初始化定时器0*****/
void InitTimer(void)
{
TMOD=0x1;
TH0=0x3c;
TL0=0xb0; //50ms(晶振12M)
}
/*****定时器0中断服务程序*****/
void timer0(void) interrupt 1
{
TH0=0x3c;
TL0=0xb0;
x++;
}
/*****外部中断0服务程序*****/
void int0(void) interrupt 0
{
EX0=0; //关外部中断0
if(DEC==0&&set_st==1)
{
shangxian--;
if(shangxian<xiaxian)shangxian=xiaxian;
}
else if(DEC==0&&set_st==2)
{
xiaxian--;
if(xiaxian<0)xiaxian=0;
}
}
/*****外部中断1服务程序*****/
void int1(void) interrupt 2
{
EX1=0; //关外部中断1
if(ADD==0&&set_st==1)
{
shangxian++;
if(shangxian>99)shangxian=99;
}
else if(ADD==0&&set_st==2)
{
xiaxian++;
if(xiaxian>shangxian)xiaxian=shangxian;
}
}
/*****读取温度*****/
void check_wendu(void)
{
uint a,b,c;
c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差
a=c/100; //计算得到十位数字
b=c/10-a*10; //计算得到个位数字
m=c/10; //计算得到整数位
n=c-a*100-b*10; //计算得到小数位
if(m<0){m=0;n=0;} //设置温度显示上限
if(m>99){m=99;n=9;} //设置温度显示上限
}
/*****显示开机初始化等待画面*****/
Disp_init()
{
P2 = 0xbf; //显示-
P1 = 0xf7;
Delay(200);
P1 = 0xfb;
Delay(200);
P1 = 0xfd;
Delay(200);
P1 = 0xfe;
Delay(200);
P1 = 0xff; //关闭显示
}
/*****显示温度子程序*****/
Disp_Temperature() //显示温度
{
P2 =0xc6; //显示C
P1 = 0xf7;
Delay(300);
P2 =LEDData[n]; //显示个位
P1 = 0xfb;
Delay(300);
P2 =LEDData[m%10]; //显示十位
DIAN = 0; //显示小数点
P1 = 0xfd;
Delay(300);
P2 =LEDData[m/10]; //显示百位
P1 = 0xfe;
Delay(300);
P1 = 0xff; //关闭显示
}
/*****显示报警温度子程序*****/
Disp_alarm(uchar baojing)
{
P2 =0xc6; //显示C
P1 = 0xf7;
Delay(200);
P2 =LEDData[baojing%10]; //显示十位
P1 = 0xfb;
Delay(200);
P2 =LEDData[baojing/10]; //显示百位
P1 = 0xfd;
Delay(200);
if(set_st==1)P2 =0x89;
else if(set_st==2)P2 =0xc7; //上限H、下限L标示
P1 = 0xfe;
Delay(200);
P1 = 0xff; //关闭显示
}
/*****报警子程序*****/
void Alarm()
{
if(x>=10){beep_st=~beep_st;x=0;}
if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0;
else BEEP=1;
}
/*****主函数*****/
void main(void)
{
uint z;
InitTimer(); //初始化定时器
EA=1; //全局中断开关
TR0=1;
ET0=1; //开启定时器0
IT0=1;
IT1=1;
check_wendu();
check_wendu();
for(z=0;z<300;z++)
{
Disp_init();
}
while(1)
{
if(SET==0)
{
Delay(2000);
do{}while(SET==0);
set_st++;x=0;shanshuo_st=1;
if(set_st>2)set_st=0;
}
if(set_st==0)
{
EX0=0; //关闭外部中断0
EX1=0; //关闭外部中断1
check_wendu();
Disp_Temperature();
Alarm(); //报警检测
}
else if(set_st==1)
{
BEEP=1; //关闭蜂鸣器
EX0=1; //开启外部中断0
EX1=1; //开启外部中断1
if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
if(shanshuo_st) {Disp_alarm(shangxian);}
}
else if(set_st==2)
{
BEEP=1; //关闭蜂鸣器
EX0=1; //开启外部中断0
EX1=1; //开启外部中断1
if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
if(shanshuo_st) {Disp_alarm(xiaxian);}
}
}
}
/*****END*****/
DS18B20.h:
#include <AT89X52.h>
#define DQ P3_6 //定义DS18B20总线I/O
/*****延时子程序*****/
void Delay_DS18B20(int num)
{
while(num--) ;
}
/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
Delay_DS18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay_DS18B20(80); //精确延时,大于480us
DQ = 1; //拉高总线
Delay_DS18B20(14);
x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay_DS18B20(20);
}
/*****读一个字节*****/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay_DS18B20(5);
DQ = 1;
dat>>=1;
}
}
/*****读取温度*****/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
/*****END*****/

