您的当前位置:首页正文

基于单片机的温度显示报警系统设计

2021-09-16 来源:好走旅游网
基础课程设计(论文)

基于单片机的温度显示报

专 业:电气工程及其自动化指导教师:任守华小组成员:刘春秋(警系统设计

20114073143)

许玖红(20114073159) 王 锐(20114073105) 葛传宇(20114073126) 刘冠兵(20114012006)

信息技术学院电气工程系

2011年11月16

前言

本文主要设计一种基于AT89S52单片机的温度显示报警系统,在此设计中主要从硬件软件两大方面来进行。本文又分为四大设计来进行:系统整体方案,主要介绍了本设计的整体方案思想,即以单片机为核心,根据DS18B20温度传感器检测外界温度并转化为数字信号进行处理,把数据传输到显示模块,实现温度的显示,并对温度实施监测,当温度超过给定的最高温度或者低于给定的最低温度时,通过单片机处理发出报警信号;系统的硬件设计,硬件方面按照单片机最小系统电路、显示硬件电路、键盘硬件电路、温度传感器硬件电路、温度执行控制硬件电路、串行通信接口电路、温度报警电路以及给整个系统供电的开关电源电路等八个模块分别进行设计,各个模块电路通过主机电路控制,协调一致的进行工作,完成对被测物体的温度控制;系统的软件设计,软件方面按照软件模块、主程序模块、数据采集模块、中断处理模块、显示模块、报警模块和温度调节等八部分进行设计,软件的设计在很大程度上决定了测控系统的性能,为了满足系统的要求,编制软件达到易理解性、易维护性、实时性、准确性和可靠性;调试和仿真,从硬件、软件的调试到仿真,完成设计的最终要求,当温度过高或者过低时就进行报警。

作者

2014年10月

II

摘要

温度控制是工业生产过程中经常遇到的过程控制,有些工艺过程对其温度的控制效果直接影响着产品的质量,因而设计一种较为理想的温度控制系统是具有不一般的价值与意义。在现代化的工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。因此,单片机对温度的控制问题是一个工业生产中经常会遇到的问题。将这个问题地解决,能很好地提升生产效率,节约资源,降低生产成本。本文从硬件和软件两方面介绍了MCS-51单片机温度控制系统的设计思路,对硬件原理图和程序框图作了简捷的描述该设计结构简单,控制算法新颖,控制精度高,有较强的通用性。采用MCS-51单片机来对温度进行控制,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大提高产品的质量和数量。

关键词:单片机 温度控制 数字PID控制

III

目录

前言 ................................................. II 摘要 ................................................ III 1 绪论 ............................................ - 1 - 2 系统整体设计方案 ................................ - 1 -

2.1 单片机的选择 ............................... - 2 - 2.2 温度传感器的选择 ........................... - 3 - 2.3液晶的选择 ................................. - 5 - 3 系统硬件设计 .................................... - 6 -

3.1 单片机的最小系统硬件电路的设计 ............ - 6 - 3.2 显示硬件电路的设计 ........................ - 10 - 3.3 键盘硬件电路的设计 ........................ - 13 - 3.4 温度传感器的硬件电路设计 .................. - 13 - 3.5 温度控制执行电路设计 ...................... - 17 - 3.6 串行通信接口电路 ......................... - 18 - 3.7 电源电路的设计 ........................... - 19 - 3.8 温度报警系统电路 .......................... - 20 - 4 系统软件设计 ................................... - 21 -

4.1 软件模块 .................................. - 22 -

IV

4.2主程序软件设计 ............................ - 22 - 4.3 数据采集软件设计 .......................... - 23 - 4.4 中断处理软件设计 .......................... - 24 - 4.5显示软件设计 .............................. - 25 - 4.6 报警的软件设计 ............................ - 26 - 4.7 温度部分软件设计 .......................... - 27 - 4.8软件抗干扰措施 ............................ - 28 - 5 调试和仿真 ..................................... - 29 -

5.1 系统的调试 ................................ - 29 - 5.2 温度报警系统的仿真 ....................... - 29 - 6 总结 ........................................... - 32 - 致谢 ............................................. - 34 - 附录一 程序源代码 ............................... - 35 - 附录二 系统的原理图 ............................. - 46 - 附录三 单片级温度实时监控报警系统流程图 ......... - 47 - 参考文献 ......................................... - 48 -

V

1 绪论

在实际生产、生活等各个领域中,温度是一种最基本的环境参数,是环境因素不可或缺的一部分,与人们的生活环境与温度息息相关,温度测控技术也在各个领域应用越来越广泛。温度及时精确的控制和检测显得尤为重要,要求也越来越高,温度检测并报警在现代的生活、生产特别在设施农业中得到了越来越广泛的应用。比如,农业上土壤各个层面上的温度将会影响植物的生长;在医院的监护中也用到温度的测量。在工业中,料桶里外上限温度要求不一,热处理中工件各个部位的温度对工件形成后的性能至关重要。现代电子工业的飞速发展对自动测试的要求越来越高。

近几年来,许多数字温度传感器相继问世。如AD公司的AD系列温度传感器,Dallas半导体公司的DS18X20系列温度传感器等,这些新型温度传感器的问世大大简化了温度检测装置的设计方案,稳定性高,并且能够直接将温度转换为数字值,便于计算机综合处理。

DSl8B20是美国达拉斯公司生产的一款产品,是一线式数字化传感器。工作电源可在远端引入,也可采用寄生电源方式产生。低功耗、微型化、抗干扰能力很强,可根方式产生。低功耗、微型化、抗干扰能力很强,可根据实际要求通过简单的编程实现数字读数方式,便于与微处理器进行接口。电路简单,实现起来比较容易,几乎适用于所有类型的单片机。本文设计了基于DS18B20单总线数字温度传感器的多点温度检测报警系统。

2 系统整体设计方案

本文介绍了一款由单片机AT89S52和新型的智能集成温度传感器DSl8B20以及LCD显示器等实现的温度测量、显示及报警系统。同时在设计方面做了功能的扩展增加了键盘,键盘是用来调时和温度查询,功能较强,可以设置上下限报警温度,且测量准确、误差小。单片机根据DSl8820,DSl302读来的数据利用软件算法来进行处理,经过转化,从而把数据传输到显示模块,实现温度的显示。对温度实施监测,即当温度超过给定的最高温度或者低于给定的最低温度时,系统通过发光二极管发光和蜂鸣器进行报警提示。

由系统的结构框图,可以看出整个温度控制系统的电路组成主要由数字电路和模拟电路两部分的结合,就可以完成对被测物体的温度控制,进而实现温度显示和报警。

本设计以单片机为核心由主控模块、输入通道、输出通道、保护电路、电源电路组成等。硬件总体结构框图如下图所示。由结构框图可见,温度控制系统以单片机为核心,并扩展外部存储器构成主控模块。被测对象的温度由单片机根据DS18B20温度传感器检测外界温度并转化为数字信号进行处理,经过转化,从而把数据传输到显示模块,实现温度的显示。对温度实施监测,即当温度超过给定的最高温度或者低于给定的最低温度时,通过单片机处理发出报警信号并驱动相应的电机工作,系统通过发光二极管发光和蜂鸣器进行报警提示。其系统框图如

- 1 -

下所示:

图 2.1温度报警系统原理框图

传感器检测转化成数字信号送给单片机处理,一方面将被测对象的温度通过控制面板上的液晶显示器显示出来;另一方面将该温度值与设定的温度值进行比较,根据其偏差值的大小,最后通过控制继电器来驱动电机工作,进而达到对被测物体温度进行控制的目的,如果实际测得的温度值超过或低于系统设定的极限安全温度,保护电路会做出反应同时报警电路报警提示,从而保护被测物体。

单片机快速、准确的进行温度采集、数据处理、显示和控制主要是时钟电路提供的时钟频率,使单片机正常的协调处理各项任务。各个器件工作的电源电压主要有电源电路提供。则温度的设定范围就通过矩阵键盘进行设定,并且温度的设定范围可以人为的重复修改,使被测物体在正常的温度范围下工作,而采集的温度值和设定的温度值要能直观的看到就要通过相应的显示电路显示到相应的界面上,如液晶、数码管、点阵等。其中保护电路就是保护被测物体避免被损坏。 单片机控制模块式式整个设计的核心,而单片机作为单片机控制模块的核心,乃至整个系统设计的核心,它的选择变得尤为重要。

2.1 单片机的选择

选择单片机并不是一味地选择功能越多,价格昂贵的,而是要结合整个设计来进行权衡,保证整个设计进行起来方便、稳定、便宜,争取做到不浪费,从而得到最优的选择。

2.1.1 单片机AT89C52

AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的

可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。

AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控

- 2 -

制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。

2.1.2 单片机AT89S52

AT89S52单片机是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52单片机为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

AT89S52与AT89C52大致相同,但是AT89SXX系列单片机实现了ISP下载功能,故而取代了89CXX系列的下载方式,也是因为这样,ATMEL公司已经停止生产89CXX系列的单片机,现在市面上的AT89CXX多是停产前的库存产品。根据本设计要求,在后来要对其进行调试,需要对单片机多次程序的编写、下载,所以本系统选择AT89S52。

AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

2.2 温度传感器的选择

2.2.1 AD590

AD590是美国ANALOG DEVICES公司的单片集成两端感温电流源,其输出电流

- 3 -

与绝对温度成比例。在4V至30V电源电压范围内,该器件可充当一个高阻抗、恒流调节器,调节系数为1 µA/K。片内薄膜电阻经过激光调整,可用于校准器件,使该器件在298.2K (25°C)时输出298.2 µA电流。

AD590适用于150°C以下、目前采用传统电气温度传感器的任何温度检测应用。低成本的单芯片集成电路及无需支持电路的特点,使它成为许多温度测量应用的一种很有吸引力的备选方案。应用AD590时,无需线性化电路、精密电压放大器、电阻测量电路和冷结补偿。除温度测量外,还可用于分立器件的温度补偿或校正、与绝对温度成比例的偏置、流速测量、液位检测以及风速测定等。AD590可以裸片形式提供,适合受保护环境下的混合电路和快速温度测量。

AD590特别适合远程检测应用。它提供高阻抗电流输出,对长线路上的压降不敏感。任何绝缘良好的双绞线都适用,与接收电路的距离可达到数百英尺。这种输出特性还便于AD590实现多路复用:输出电流可以通过一个CMOS多路复用器切换,或者电源电压可以通过一个逻辑门输出切换。

2.2.2 DS18B20

DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。 (一) 功能特点

DSl8820的特点使它非常适用于远距离多点温度检测系统,特点如下: (1)用户可以自己设定非易失性的报警上下限值。 (2)3.0~5.5V单电源供电。

(3)温度测量范围:-55℃~+125℃。可编程实现9位-12位A/D转换精度。 (4)测温分辨率可达0.0625℃。

(5)被测温度用符号扩展的16位数字量方式串行输出,不需要外部元件。 (6)其工作电源既可在远端引入,也可采用寄生电源方式产生。

(7)多个DSl8820可以并联到2根或3根线上,微处理器CPU只需1根端口线就能与多个DSl8820通信,占用微处理器的端口较少,节省引线和电路。

(8)不同于传统的温度检测热敏电阻,可以在检测点把被测信号数字化。 (二) 外部结构

DSl8820的封装形式有三种:3引脚、6引脚、8引脚。本设计中采用外部具有3个引脚(TO-92封装形式)的元器件。 (三) 内部结构

内部结构主要由64位闪速只读存储器、温度传感器、非挥发的温度报警触发器TH和TL以及配置寄存器组成。64位的闪速只读存储器(光刻ROM)。出厂前被光刻好的64位序列号即地址序列码。光刻的作用是使每一个温度传感器都各不相同。起始8位是产品类型的编号,接着的共48位温度传感器的自身序列号,最后8位则是前56位的循环冗余校验码。即多个DSl8820可以采用一线进行通信。触发器TH(最高检测温度)和,TL(最低检测温度),设计者可自行通过软件设置报警的上限和下限。高速暂存存储器,配置寄存器和8位的循环冗余校验发

- 4 -

生器等组成。配置寄存器为高速暂存器中的第5个字节,由和

决定温度转换的精度位数。

和组成。其中,

(四) 初始化

由于DSl8820单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。总线上的所有操作前都要进行初始化,复位。系统对DS18B20的各种操作必须按协议进行。

本设计中由于不需要远距离不同位置设置温度传感器,DS18B20的转换分辨率均可由用户设定;温度转换所需转换时间较短,最大转换时间为750ms,可以设定温度超标报警的上、下限值,在温度超限时发送报警信号,所以采用DS18B20进行。

采用DALLAS最新单线数字温度传感器DS18B20。新的“一线器件”体积更小、适用电压更宽、更经济。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20“一线总线”数字化温度传感器也支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。DS18B20的特性:DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS18B20的性能是新一代产品中最好的!性能价格比也非常出色!继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。DS18B20使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。

2.3液晶的选择

2.3.1 LCD12864

带中文字库的12864是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16 点汉字,和128个16*8点ASCII字符 集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶 显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。带中文字库的128X64-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围

- 5 -

为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H~9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系。

2.3.1 LCD1206

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符

采用LCD1602液晶显示模块,有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用。目前字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件。它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。

3 系统硬件设计

硬件电路主要有两大部分组成:模拟部分和数字部分;从功能模块上来分有:主机电路、数据采集电路、键盘显示电路、电源电路、控制执行电路以及掉电保护电路。各个模块电路通过主机电路控制,协调一致的进行工作,完成对被测物体的温度控制。

3.1 单片机的最小系统硬件电路的设计

单片机的最小系统由单片机和时钟电路、复位电路以及电源电路组成,

单片机的I/O接相应的处理电路,其原理图如下所示:

- 6 -

图3.1单片机的最小系统

主机选用INTEL公司的MCS-51系列单片机AT89S52来实现,利用单片机

软件编程灵活、自由度大的特点,可擦除下载,力求用软件完善各种控制算法和逻辑控制。本系统选用的AT89S52芯片时时钟可达12MHZ,运算速度快,控制功能完善,完全能满足温度控制系统的要求。其内部具有128字节数据存储器RAM,还可以通过地址、数据线进行外围扩展。而且内部含有8KB的EPROM不需要外扩展存储器,也有数据通信接口,通过TXD、RXD与PC机连接,可以进行人机操作,使得操作更加简单、方便。AT89S52 有6个中断源:两个外部中断(INT0 和INT1),三个定时中断(定时器0、1、2)和一个串行中断。这些中断如图10所示每个中断源都可以通过置位或清除特殊寄存器IE 中的相关中断允许控制位分别使得中断源有效或无效。IE还包括一个中断允许总控制位EA,它能一次禁止所有中断。

3.1.1单片机AT89S52的介绍

AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程

Flash存储器。使用ATMEL 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常

- 7 -

规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32位I/O线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。R8位微控制器8K字节在系统可编程,其管脚功能图如下所示。

图3.2 STC89S52的管脚图

1、功能管脚描述 VCC : 电源 GND: 地

P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程和数据存储器时,P0口也被作为低8位地址在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。

P1口:P1口是一个具有内部上拉电阻的8 位双向I/O 口,P1输出缓冲器能驱动4个TTL 逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0P1.分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器的触发输入(P1.1/T2EX),具体如下表所示。在flash编程和校验时P1口接收低8位地址字节。

引脚号 第二功能 P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出;P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)P1.5 MOSI(在系统编程用);P1.6

- 8 -

MISO(在系统编程用);P1.7 SCK(在系统编程用)

P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2口送出高八位地址。在这种应用中,P2口很强的内部上拉发送1。在使用8位地址(如MOVX @RI)访问外部据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。

P3口:P3口是一个具有内部上拉电阻的8 位双向I/O 口,P2输出缓冲器能驱动4 个TTL 逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。在flash编程和校验时,P3口也接收一些控制信号。

2、引脚第二功能 P3.0 RXD(串行输入);P3.1 TXD(串行输出);P3.2 INT0(外部中断0);P3.3 INT0(外部中断0);P3.4 T0(定时器0外部输入);P3.5 T1(定时器1外部输入);P3.6 WR(外部数据存储器写选通);P3.7 RD(外部数据存储器写选通) RST: 复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,

ALE以晶振六分之一的固定频率输出脉冲,可用作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置 “1”,ALE操作将无效。这一位置 “1”,ALE 仅在执行MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE 使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。

PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。

EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12伏VPP电压。

XTAL1:振荡器反相放大器和内部时钟发生电路的输入端 XTAL2:振荡器反相放大器的输出端

3.1.2 复位电路

复位使单片机处于起始状态,并从该起始状态开始运行。AT89C51的RST引脚为复位端,该引脚连续保持2个机器周期(24个时钟振动周期)以上高电平,则可使单片机复位。内部复位电路在每一个机器周期的S5P2期间采样斯密特触

- 9 -

发器的输出端,该触发器可抑制RST引脚的噪声干扰,并在复位期间不产生ALE信号。

图3.3 复位电路

内部RAM处于不断电状态。其中的数据信息不会丢失,也即复位后,只影响SFR中的内容,内部RAM中的数据不受影响。外部复位有上电复位和按键电平复位。由于单片机运行过程中,其本身的干扰或外界干扰会导致出错,此时我们可按复位键重新开始运行。为了便于本设计运行调试,复位电路采用按键复位方式。

3.1.3 时钟电路

时钟电路是单片机的心脏,它控制着单片机的工作节奏。MCS-51单片机允许的时钟频率是因型号而异的,其典型值为12MHZ。AT89C51内部有一个反相振荡放大器,XTAL1和 XTAL2分别是该反向振荡放大器的输入端和输出端。该反向放大器可配置为片内振荡器,石晶振荡和陶瓷振荡均可采用。本设计采用的晶振频率为12MHZ。51系列单片机还可使用外部时钟。在使用外部时钟时,外部时钟必须从XTAL1输入,而XTAL2悬空。时钟电路如下图所示:

图3.4 时钟电路

3.2 显示硬件电路的设计

显示电路用液晶作为显示电路,字符型液晶显示直观明了,用字符提示不像数码管,显示更加直观。

- 10 -

3.2.1 液晶显示电路

液晶显示电路主要用于当前温度的显示和设定时的温度显示,以便于工作人员的观察。

1、液晶的介绍

a) 、基本操作时序

读状态 输入:RS=L, R/W=H,E=H 输出:D0~D7=状态字 读数据 输入:RS=H, R/W=H,E=H 输出:无

写指令 输入:RS=L, R/W=L,D0~D7=指令码,E=高脉冲 输出:D0~D7=数 写数据 输入:RS=H, R/W=L, ,D0~D7=数据,E=高脉冲 输出:无。 b) 、液晶1602接口信号写操作时序

通过 RS确定是写数据还是写命令。读/写控制端设置为写模式,即低电平。 将数据或命令送达数据线上,给 E 一个高脉冲将数据送入液晶控制器,完成写操作。写操作时序如下图所示:

图3.5 液晶些操作时序

c) 、 液晶1602接口信号如下图:

图3.6 液晶1602接口信号

- 11 -

d) 液晶1602指令

它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)

指令1:清显示,指令码01H,光标复位到地址00H位置 指令2:光标复位,光标返回到地址00H

指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效

指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁

指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标

指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符

指令7:字符发生器RAM地址设置 指令8:DDRAM地址设置

指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

指令10:写数据 指令11:读数据

3.2.2 液晶显示电路的设计

如图所示:液晶的数据线接P0口,用来传输显示数据的信息。而RS、

RW、E分别接单片机的P2.5、P2.6、P2.7口,控制液晶的读写操作。通过单片机的控制显示出租车计费系统的路程和价格。其原理图如下所示:

图3.7 液晶显示硬件电路

- 12 -

3.3 键盘硬件电路的设计

如图所示按键KEY10、KEY11分别与P3.2(INTO)、P2.1相连,采用外部中断方式。当外部中断1响应,就可以进行当前温度的显示与设定温度显示的界面切换,同时兼用温度上限和下限温度的值的设定。

图2.8 键盘电路

3.4 温度传感器的硬件电路设计

3.4.1温度传感器电路设计

温度数据采集电路主要由数字温度传感器DS18B20采集被测物体的温度。温度传感器的单总线(1-Wire)与单片机的 I/O连接,P3.7是单片机的高位地址线。P3端口是一个带内部上拉电阻的8位双向 I/O,每个端口都有第二功能,其输出缓冲级可驱动(吸收或 输出电流)4个TTL逻辑门电路。对该端口写“1”,可通过内部上拉电阻将其端口拉至高电平,此时可作为输入口使用,这是因为内部存在上拉电阻,某一引脚被外部信号拉低时会输出一个电流。

如图3.9所示:温度传感器DS18b20与单片机只用一根线连接即单总线或one_wire总线。数字温度传感器DS18B20只要三个端口,电路连接很简单,一根电源线接电源,一根接地,一根接数据时钟线接单片机的I/O口,数据时钟线上必须接一个4.7k上拉电阻,防止时钟数据高阻悬挂,就会得不到相应的数据信息,因此也得不到准确的温度信息,从而测得的温度也是不准确,所以必须接一个47K上拉电阻,消除高阻悬挂,获取准确的温度信息。

- 13 -

图2.9 温度传感器硬件电路示意图

3.4.2 温度传感器DS18B20的简介

DS18B20 数字温度传感器是 DALLAS 公司生产的 1-Wire,即单总线器件,具有 线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通 信线,可以挂很多这样的数字温度计,十分方便。

一、 DS18B20产品的特点

1、只要求一个端口即可实现通信。

2、在 DS18B20中的每个件上都有独一无二的序列号。 3、实际应用中不需要外部任何元器件即可实现测温。 4、测量温度范围在-55.C到+125.C之间。

5、数字温度计的分辨率用户可以从 9位到 12位选择。 6、内部有温度上、下限告警设置。

7、三个管脚,1脚是接地脚,2脚是单总线、可向电源提供电源 、3脚是电源脚。

8、数据线和时钟线共用一根线传输信息即单总线。 二、 DS18B20的内部结构

DS18B20的内部框图如下图所示。64位RO存储器件独一无二的序列号。暂存器包含两字节(0和1字节)的温度寄存器,用于存储温度传感器的数字输出。暂存器还提供一字节的上线警报触发(TH)和下线警报触发(TL)寄存器(2 和 3字节), 和一字节的配置寄存器 字节)使用者可以通过配置寄存器来设置温度转换的精度。 (4 ,暂存器的 5、6 和 7 字节器件内部保留使用。第八字节含有循环冗余码(CRC)。使用寄生电源时,DS18B20不需额外的供电电源;当总线为高电平时,功率由单总线上的 上拉电阻通过 DQ引脚提供;高电平总线信号同时也向内部电容CPP充电,CPP在总线低电平时为器件供电。其中INTERNAL VDD-内部 VDD 64-BIT ROM AND 1-wire PROT-64位ROM和单线端 MEMORY CONTROL LOGIC- 存储器控制逻辑 SCRATCHPAD暂存器TEMPERATURE SENSOR温度传感器 ALARM HIGH TRIGGER( TH )REGISTER上限温度触发ALARM LOW TRIGGER( TL) REGISTER下限温度触发8-BIT CRC GENERTOR 8位 CRC产生器 POWER SUPPLLY SENSE 电源探测PARASITE POWER CIRCUIT寄生电源电路。

- 14 -

图 2.10 DS18B20 的内部框图

三、 DS18B20 的 4 个主要数据部件

光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20 的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的 48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符 号扩展的二进制补码读数形式提供,以 0.0625℃/LSB 形式表达,其中 S 为符号位这是12位转化后得到的12位数据,存储在18B20的两个8比特的 RAM 中,二进制中的前面 5 位是符号位,如果测得的温度大于0,这5位为 0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625 即可得到实际温度,所以数字温度传感器不需要A/D转化器等外围器件就能获取温度值,集成度高,使用方便,测量精度高。

DS18B20温度传感器的存储器DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦EEPROM,后者存放高温度和低温度触发器TH、TL和结构寄存器。

配置寄存器,五位一直都是\"1\",TM 是测试模式位,用于设置DS18B20在工作模式还是在 测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置 分辨率

四、 DS18B20的工作过程

(1)初始化

DS18B20所有的数据交换都由一个初始化序列开始。由主机发出的复位脉冲和跟 在其后的由DS18B2发出的应答脉冲构成。DS18B20发出响应主机的应答脉冲时, 当 即向主机表明它已处在总线上并且准备工作。

(2) ROM命令

ROM命令通过每个器件64-bit的ROM码,使主机指定某一特定器件(如果有多个器件挂在总线上)与之进行通信DS18B20 ,每个ROM命令都是8 bit 长。

- 15 -

(3)功能命令

主机通过功能命令对DS18B20进行读/写 Scratchpad存储器,或者启动温度转换。

五、DS18B20的信号方式

DS18B20采用严格的单总线通信协议,以保证数据的完整性。该协议定义了几种 信号类型:复位脉冲、应答脉冲、写0、写1、读0 和读1。除了应答脉冲所有这些信 号都由主机发出同步信号。总线上传输的所有数据和命令都是以字节的低位在前。

(1)初始化序列:复位脉冲和应答脉冲

在初始化过程中,主机通过拉低单总线至少480µs,以产生复位脉冲(TX)。然后主机 释放总线并进入接收(RX)模式。当总线被释放后,4.7kΩ的上拉电阻将单总线拉高。DS18B20检测到这个上升沿后,延时15µs~60µs,通过拉低总线 60µs~240µs 产生应答 脉冲。初始化波形如图 3-11 所示。

图 3.11 DS18B20初始化时序图

(2)读和写时序

在写时序期间,主机向DS18B20写入指令,而在读时序期间,主机读入来自 DS18B20的指令。在每一个时序,总线只能传输一位数据。读/写时序如图 3-12 所示。

- 16 -

图 3.12 DS18B20 读/写时序图 控制器采样

写时序:存在两种写时序:“写 1”和“写 0” 。主机在写 1 时序向DS18B20写入逻辑1,而在写0时序向DS18B20写入逻辑0。所有写时序至少需要60µs,且在两次写时序之 间至少需要 1µs 的恢复时间。两种写时序均以主机拉低总线开始。产生写 1 时序:主机拉低总线后,必须在 15µs 内释放总线,然后由上拉电阻将总 线拉至高电平。 产生写\"0\"时序: 主机拉低总线后,必须在整个时序期间保持低电平 (至少60µs)。在写时序开始后的 15µs~60µs 期间,DS18B20采样总线的状态。

读时序 :DS18B20只能在主机发出读时序时才能向主机传送数据。所以主机在发出读数据 命令后,必须马上产生读时序,以便DS18B20能够传送数据。所有读时序至少 60µs, 且在两次独立的读时序之间至少需要 1µs 的恢复时间。

3.5 温度控制执行电路设计

由输出来控制电机工作,电机可以近似建立为具有滞后性的一阶惯性环节数学模型。其传递函数形式为:G(s)=K/(Ts+1)e-ts

电机可以认为是线形环节实现对被测物体温度的控制。为了实现强电和弱电的隔离,要选择光电耦合器,使输出信号要对继电器进行通断控制,以便使电机工作电路导通,此外,当实际温度不在设定的范围内,报警电路将实时报警并作出相相应的处理如(报警信号传到单片机或人,单片机或人就会执行相应的操作),当实际温度低于设定的温度时相应黄色发光二极管点亮并且加热器启动低温的电机转动;高于设定的温度时对应红色二极管亮并且高温的电机转动。

如图2.5所示:继电器的通断通过单片机的I/O的输出控制,从而控制加热器、制冷器的启停,来控制被测物体的温度。

- 17 -

图 3.13 温度控制电路图

如图3.14所示:报警电路也是由单片机的I/O控制,当实际温度不在设定的范围单片机就会执行相应的指令,进行实时报警,提示温度超过或低于设定的温度,以便及时作出处理。

图 3.14 报警电路图

3.6 串行通信接口电路

目前,广泛使用的串行数据接口标准有一,一与一三种。其中一是美国电子工业协会正式公布的串口总线标准,也是目前最为常用的串行接口标准,用来实现计算机与计算机之间,计算机与外设之间的数据通讯。串行通信接口的基本任务是实现数据格式化。来自的是普通的并行数据,接口电路应具有实现不同串行

- 18 -

通信方式下的数据格式化的任务。具体任务是:

1.进行串-并转换; 2.控制数据传输速率; 3.进行错误检测;

4.进行TTL与EIA电平转换;

5.提供一一接口标准所要求的信号线。

由于电平和TTL电平不匹配,因此要实现单片机和机之间的通信,必须在它们之间加接电平转换器。电平转换器有232电平转换和485电平转换,本设计采用232电平转换,系统设计采用公司的一接口芯,这是一种标准的一接口芯片。只需巧电源供电,其内部的电源变化成士电源用于通信。该芯片集成有两路收发器,可将单片机输入的电平转换为电平发送给从机,或将从机接收的电平转换为电平发送给单片机。通过这样的电平转换实现主机和从机的通信,本设计的MAX232为双列直插16脚封装。系统串口通信电路如下图所示。

图3.15 串行通信接口电路

3.7 电源电路的设计

系统所用直流电源由三端集成稳压器组成的串联型直流稳压电源提供。设计中选用了双12V的电源电压变压器和四个三端集成稳压器,分别提供+5V、+8V和一5V、-8V直流电压,输出电流均为1A。LM7805、LM7808和LM7905、LM7908的连接方法都一样。变压器将的市电降压后再通过整流桥整流之后采用了大容量的电解电容进行滤波,以减小输出电压纹波。由于电解电容器在高频下工作存在电感特性,对于来自电源侧的高频干扰不能抑制,导致电流纹波很大,因此在整流电路后加入高频电容改善纹波效果。给各器件提供电源,使其更好的工作。同时还采用了保护电路,在正、负电源两端分别串联了保险管起双重保险,当负载功率过大保险丝就会熔断,三端集成稳压管的输入、输出反接了二极管保护,避免反向电流过大击穿稳压管,起到了很好的保护作用,电源电路如图3-16所示。

- 19 -

图3.16电源电路

3.8 温度报警系统电路

主机电路、数据采集电路、键盘显示电路、电源电路、控制执行电路以及掉电保护电路。各个模块电路通过主机电路控制,协调一致的进行工作。完成对被测物体的温度控制。

- 20 -

图3.17 温度报警电路

4 系统软件设计

在微机测控系统中,软件与硬件同样重要。硬件是系统的躯体,软件则是灵魂,当系统的硬件电路设计好之后,系统的主要功能还是要靠软件来实现,而且软件的设计在很大程度上决定了测控系统的性能。为了满足系统的要求,编制软件时一般要符合以下基本要求:

(1)易理解性、易维护性 在软件的设计方法中,结构化设计是最好的一种设计方法,这种设计方法是由整体到局部,然后再由局部到细节,先考虑整个系统所要实现的功能,确定整体目标,然后把这个目标分成一个个的任务,任务中可以分成若干个子任务,这样逐层细分,逐个实现;

(2)实时性 实时性是电子测量系统的普遍要求

即要求系统及时响应外部事件的发生,并及时给出处理结果。近年来,由于硬件的集成度与运算速度的提高,配合相应的软件,实时性比较容易满足设计要求;

(3)准确性

准确性 准确性对整个系统具有重要意义,尤其是测量系统,系统要进行一定量的运算,算法的正确性和准确性对结果有着直接的影响,因此在算法的选择、计算的精度等方面都要符合设计的要求。

(4)可靠性

可靠性是系统软件最重要的指标之一,作为能够稳定运行的系统,抗干扰技

- 21 -

术的应用是必不可少的,最起码的要求是在软件受到干扰出现异常时,系统还能恢复正常工作。

结合上述编制系统软件的基本要求,首先讨论软件的设计思想。

系统的软件由三大模块组成:主程序模块、功能实现模块和运算控制模。

4.1 软件模块

由于整个系统软件相对比较庞大,为了便于编写、调试、修改和增删,

系统软件的编制采用了模块化的设计。即整个控制软件由许多独立的小模块组成,它们之间通过软件接口连接,遵循模块内部数据关系紧凑,模块之间数据关系松散的原则,按功能形成模块化结构。系统的软件主要由主程序模块、温度数据采集模块、数据处理模块、控制算法模块等组成。主模块的功能是为其余几个模块构建整体框架及初始化工作数

据采集模块的作用是将转换的数字量采集并储存到存储器中数据处理模块是将采集到的数据进行一系列的处理,其中最重要的是数字滤波程序控制算法模块完成控制系统的运输出控制量。下面就介绍本系统几个主要的程序模块。

4.2主程序软件设计

主程序模块要做的主要工作是上电后对系统初始化和构建系统整体软件框架,其中初始化包括对单片机的初始化、芯片初始化和串口初始化等。然后显示当前温度或者温度设定,若温度已经设定好了,判断系统运行键是否按下,若系统运行,则依次调用各个相关模块,循环控制直到系统停止运行。主程序要协调各个模块的工作,要把温度采集、温度设置、温度显示、键盘扫描输入、中断处理等各个模块的子程序统一协调起来,避免混乱打架的现象,要使得温度控制各个模块正常的工作。主程序在整个程序中起着至关重要的作用,是各个子程序联系的枢纽。主程序模块的程序流程图如图4.1所示。在附录中给出了系统初始化源程序。

- 22 -

图 4.1 主程序流程图

4.3 数据采集软件设计

据采集模块的任务是负责温度信号的采集以及将采集到的温度模拟量信号转化为相应的数字量信号提供给单片机。单片机再经过相应的数据处理,数据采集主要通过DS18b20温度传感器采集被测物体的温度。因为数字温度传感器DS18B20能将外界的温度直接转换成数字信号,直接送入单片机处理就行了,就不用在经过A/D转化器将其转化成数字信号,这样就方便了很多而且抗干扰能力强。软件程序也简化了很多,数据采集模块的程序流程:数据采集的程序初始化即DS18b20的程序初始化→采集温度→等待温度转换→读取温度送给单机处理,如图4.2所示:

- 23 -

图 4.2 温度采集流程图

4.4 中断处理软件设计

功能实现模块主要由中断处理子程序、键盘处理子程序、显示子程序等部分组成。中断系统在单片机应用系统中占有非常重要的角色,其中前后台的应用最为实用,中断系统能帮助我们及时处理重要事务,出现故障能进行实时处理,中断还能够节约大量的CPU资源,就比如查询方式来说中断查询方式要比软件查询方式要来得方便,可靠且节约内存等,中断系统对单片机来说是占有不可或缺的地位,限于篇幅,只介绍中断处理子程序。

外部中断INT0是优先级最高,优先级高于其他的四个中断,外部中断0响应用于退出温度设置界面,恢复到当前温度采集界面,进行温度采集、显示以及判断是否越限并是否输出报警等功能,其流程:开始→程序初始化→等待中断→跳出温度设置界面→执行相应的程序。流程图如4.3所示:

- 24 -

图 4.3 外部中断INT0中断程序流程图

4.5显示软件设计

采用技术成熟,价格便宜的1602液晶显示器做为输出显示。显示设定的温度范围和被测物体的当前温度,本次设计使用的1602液晶显示器为5V电压驱动,带背光可调,可显示两行字符,每行16个字符,不能显示汉字,内置 128 个字符的ASCII字符集字库,也可以自定义字符,只有并行接口,无串行接口。液晶显示方便、灵活。其流程:开始→液晶显示初始化→检测忙碌信号→写入显示RAM地址→写入显示的数据→显示在液晶上→结束,其流程图如4.4所示:

- 25 -

图 4.4 液晶显示程序流程图

4.6 报警的软件设计

本文中所设计的报警电路较为简单,由一个自我震荡型的蜂鸣器(只要在蜂鸣器两端加上超过3V的电压,蜂鸣器就会叫个不停)和一个发光二极管组成。在这次设计中蜂鸣器是通过三极管电流放大IC来控制。在我们所要求的温度达到一定的上界或者下界时,报警电路开始工作。程序流程:开始→判断当前温度是否越限→发出报警,流程图如4.5所示,程序主要函数见附录。

- 26 -

图 4.5 报警程序流程图

4.7 温度部分软件设计

DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输。其工作时序包括初始化时序、写时序和读时序。故主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。每次访问单总线器件必须严格遵守这个命令序列如果出现序列混乱则单总线器件不会响应主机但是这个准则对于搜索ROM命令和报警搜索命令例外在执行两者中任何一条命令之后主机不能执行其后的功能命令必须返回至第一步,复位要求主CPU将数据线下拉500微秒,然后释DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。程序主要函数见附录。

获取被测物体的温度主要依靠DS18b20数字温度传感器,获取的数字温度信号直接送给单片机处理,就可以获得当前温度,因为DS18b20是依靠单总线传输数字温度信息,所以要遵守严格的单总线协议,其流程为:开始→程序初始化→等待应答脉冲→发送ROM操作指令→延时、等待温度转化→延时、读取温度→结束。其流程图如4.6所示:

- 27 -

图 4.6 温度获取程序流程图

4.8软件抗干扰措施

本系统中,在软件方面的抗干扰措施主要从以下两个个方面来考虑 (1)按键的软件消抖

按键是一个机械开关,当键按下时,开关闭合;当键松开时,开关断开。其特点之一就是它的抖动性,这是由按键的机械特性所决定的,抖动的时间一般约为10ms一20ms。

对于按键消抖的具体措施目前有两种:一是用硬件电路来实现,即用滤波电路滤除抖动或用触发器消除抖动。另一种是用软件延时的方法来解决,即利用软件的延时避开按键的按下与抬起时都有的抖动期,从而避免检测到干扰信号。本文采用的就是软件延时消抖的方法。附录中给出了延时程序的源程序,同时延时程序还作为通用功能模块被其他模块调用。

(2)滤波消抖

数字滤波是将一组输入数字序列进行一定的运算而转换成另一组输出数字序列的方法,采用软件滤波算法不需要增加硬件设备,可靠性高,功能多样,使用灵活,但是要占用一定的处理器运行时间。在本系统设计中,采用了数字滤波的软件抗干扰措施,所采用的数字滤波算法是去极值平均滤波法。

程序判断滤波法首先要从经验出发,定出一个目标参数最大可能的变化范围。每次采样后都和上次的有效采样值进行比较,如果变化幅度不超过经验值,本次采样有效,否则,本次采样值应视为干扰而放弃,以上次采样值为准。该算

- 28 -

法适用于变化缓慢的物理参数的采样过程。

算术平均滤波法是对目标参数进行连续采样,然后求其算术平均值作为有效采样值。该算法适用于抑制随机千扰。采样次数越大,平滑效果越好,但系统的灵敏度要下降。算术平均滤波不能将明显的脉冲干扰消除,只是将其影响削弱,因此本设计不采用此方法。

5 调试和仿真

5.1 系统的调试

硬件电路调试,先用Proteus仿真之后,在去买好元器件清单,焊接电路。焊接要特别小心,要仔细的对照电路图,既不能使电路短路也不能是电路开路,保持电路的畅通,并在相应的位置装上发光二级管提示电路通电,可以减轻硬件电路的调试困难,还有芯片的焊接要根据芯片资料了解管脚的功能去焊接,不然很容易烧坏芯片,如过芯片的工作不正常先观察芯片管脚有无接触,或者芯片的使能是不是根据相应的要求接的,在用万用表去测试电源管脚是否通电,通电后在去测相应的管脚是否输出相应的电平,如果没有就是芯片有问题,如果相应位置的二极管没有点亮,先观察二级管有没接反,如果没接反就用万用表去测看是否有电压,如果没有电压说明没通电,如果有电压说明二极管坏了,当然也要根据软件结合,测试数码管给以程序,8段数码管一段一段的观察,看是否管脚接错,如果断码接错了等显示数据就会错乱。

系统软件程序调试,程序调试先在KEIL软件里写好各模块程序,在一个个子程序调试,结合Proteus仿真成功后,再将所有的程序拼在一起调试,软件调试注意的主要是定时中的的初始化,算好中断时间,还有按键程序,看是否读取得到相应的电平,其他的就没没什么了吧。

5.2 温度报警系统的仿真

在正常的温度中工作,绿灯亮,电机不工作,如下图所示:

- 29 -

图 5.1 在正常温度范围内工作的仿真图

在高于40℃的环境工作,红灯亮,同时相应的电机转动

图5.2 在高温环境中工作的仿真图

在低于10℃的环境工作,黄灯亮,同时相应的电机转动

- 30 -

图5.3 在低温环境中工作的仿真图

设置工作温度的下限

图 5.4 设置工作温下限的仿真图

设置工作温度的上限

- 31 -

图 5.5 设置工作温上限的仿真图

6 总结

社会是不断变化的、发展的,眼下社会发展迅速,对人才的要求越来越高,要用发展的眼光看社会,要学会习,学会创新,学会适应社会的发展需要。在走出校园,迈向社会之即,把握今天,才学能创造未来。课程设计工作中,在老师的熏陶和教诲下,使我懂得了更多的设计思想,有了一定的创新精神和专研精神。

在完成毕业设计的这段时间里,我收获颇多。本文设计的出租车计费系统具有硬件简单,容易实现,性能稳定可靠,成本低,寿命长等特点。

主要做了下面几点较突出的工作:

一、通过查阅相关资料,详细了解了AT89C51单片机的原理,明确了设计采用的元件,明确了研究目标。

二、本文给出了系统具体的硬件设计方案,硬件结构电路图,设计中采用的编程软件的介绍,电路图模块分析等方面。

三、在这次课程设计的过程中,进一步学习了单片机的基本使用,感到了单片机对复杂电路设计的重要性。

通过本次设计我对单片机有了一定的认识,这是我对专业知识一次实际性检验和巩固。课程设计收获很多,比如学会了查找相关资料,分析数据,提高了自己的绘图能力,让自己的设计思想也不断得到修正和提高。

理论与实际相结合,不仅包括课堂上学习的有关知识要与技能训练相结合,

- 32 -

还要包括了解可接触社会实际的能容。进行课程设计,是在专业知识的指导下,通过各种方式,解决一些实际性的问题。在设计过程中,可以将所学习得理论知识运用到实践中,不仅能加深自己对专业知识的理解,而且能丰富和发展书本上的理论知识,使之转化成更高层次的经验、技能和技巧。

- 33 -

致谢

本课题在选题及进行过程中得到任老师的悉心指导。论文行文过程中,老师多次帮助我分析思路,开拓视角,在我遇到困难想放弃的时候给予我最大的支持和鼓励。老师严谨求实的治学态度,踏实坚韧的工作精神,将使我终生受益。再多华丽的言语也显苍白。在此,谨向任老师致以诚挚的谢意和崇高的敬意。

感谢大学四年来,电气系所有老师对我学习上的帮助和生活上的关怀,正是您们的辛勤工作,才使我得以顺利地完成学业,取得学位。浓浓师恩,终生不忘。

感谢八一农大学党委宣传部的所有老师对我生活和工作的关怀。在你们的帮助和陪伴下走过的大学岁月,给了我最好的锻炼和最快的成长。

感谢已毕业的农电系学长贾琼伟,在我课题研究过程中给予我技术上的极大支持和心理上的鼓励,让我得以顺利的完整这次课程设计。

感谢我的队友们,我们一起经历过的聚散喜悲,一起走过的每一段路,我一生都不会忘记。友情的无私为我们的大学时光重重地写下了无悔。

感谢我的室友们,你们在我无聊的时候,教会了我我英雄联盟。虽然我们在比赛上有过争吵,但是我们也在游戏中成长,通过战队五排,领会会团结的力量,为以后的人生道路铺下垫脚石。

感谢我的家人,养育之恩,无以回报。我将用自己最大的努力给你们欣慰。

大学四年的生活即将随着论文的完成更加完美。最后,我感谢大学几年年以来给过我帮助和关注的所有人,更加感谢给过我挫折的所有人。你们用不同的方式给了我成长,也是你们促使我在走过的大学时光里一直努力,我想在毕业的那一天无愧的说一声:青春无悔。

- 34 -

附录一 程序源代码

#include //头文件 #include //包含NOP空操作指令的头文件 sbit rs = P2^6; //数据命令选择端 sbit rw = P2^5; //读写选择端(H/L? sbit ep = P2^7; //使能信号 sbit DQ = P3^7; //温度数据信号 sbit HT_motor = P1^0; //电机驱动变量 sbit LT_motor = P1^1; //电机驱动变量 sbit H_alarm = P1^2; //高温报警提示 sbit normal = P1^3; //正常温度提示 sbit L_alarm = P1^4; //低温报警提示 sbit key_add1 = P2^0; //温度设置加1 sbit key_add10= P2^1; //温度设置加10 sbit key_dec1 = P2^2; //温度设置减1 sbit key_dec10= P2^3; //温度设置减10 float temper; //DS18B20温度数据 #define delay1us _nop_(); //1微秒延时

#define delay5us {_nop_();_nop_();_nop_();_nop_();_nop_();} //5微秒延时 #define delay15us {delay5us;delay5us;delay5us;} //15微秒延时 #define delay45us {delay15us;delay15us;delay15us;} //45微秒延时 #define delay60us {delay15us;delay15us;delay15us;delay15us;}//60微秒延时 #define delay480us {delay60us;delay60us;delay60us;delay60us;delay60us;delay60us;delay60us;delay60us;}//480微秒延时

unsigned char display1[10]={\"0123456789\ //液晶字符显示 unsigned char display2[2]={'.','-'}; //显示符号

unsigned char display3[20]={\"Current_Wendu\//显示符号 unsigned char display4[20]={\"set_lowerwendu\unsigned char display5[20]={\"set_upperwendu\

unsigned int tempreture_nuber,tempreture_dot;//温度存放变量 unsigned char th_byte; //变量 unsigned char tl_byte; //变量 unsigned int tempreture_int; //变量 unsigned int upper_temperature=40; unsigned int lower_temperature=10; unsigned int set_flag = 0;

/************************************************************** [延时子程序delayms()]

- 35 -

***************************************************************/

void delay(unsigned int ms_count) {

unsigned int k; while(ms_count--) { for(k=0;k<250;k++) //约一毫秒 { _nop_();_nop_();_nop_();_nop_(); } } }

/**************************************************************** 外部中断初始化子程序

*****************************************************************/ void waibuzhongduan_init() {

EA = 1; //开总中断 EX0=1; //允许外部中断0中断 IT0=1; //下降沿触发中断 PX0=1; //外部中断0中断优先级高 }

/*********************LCD_1602的模块化程序*************************/ /* 液晶1602用来显示读取的温度值,设定的温度值, rs 与 P2、6口连接; rw 与 P2、5口连接; ep 与 P2、7口连接; **/ /*******************LCD_1602的模块化程序**************************/ bit lcd1602_busytest() //检查忙碌标志位是否忙碌 {

bit result;

rs = 0; //rs为低电平,rw为高电平时,为读指令 rw = 1; ep = 1; //ep使能,高电平有效,开始读指令 _nop_(); _nop_(); _nop_(); _nop_();

result=(P0&0x80); //忙碌标志位在高位,也就是P0.7 ep = 0;

return result; }

/**************************************************************

- 36 -

液晶写数据地址操作命令子函数

***************************************************************/ void lcd1602_write_comdand(unsigned char write_data) {

while(lcd1602_busytest());

rs = 0; //rs与rw都为低电平时写入指令 rw = 0; ep = 0; //写指令,使能是下降沿有效 _nop_(); _nop_();

P0 = write_data; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }

/************************************************************** 液晶写地址操作命令子函数

***************************************************************/

void lcd1602_write_address(unsigned char address_data) {

lcd1602_write_comdand(address_data|0x80); //数据显示的位置 }

/************************************************************** 写入数据显示到lcd的程序

***************************************************************/ void lcd1602_write_data(unsigned char display_data) //写入数据显示到lcd的 {

while(lcd1602_busytest()); rs = 1; //rs为高电平,rw为低电平时,写数据 rw = 0; ep = 0; //使能,下降沿有效 P0 = display_data; _nop_(); _nop_();

- 37 -

_nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }

/************************************************************** 液晶的初始化程序

***************************************************************/ void lcd1602_init() {

delay(15); 口

}

delay(5);

lcd1602_write_comdand(0x38); delay(5);

lcd1602_write_comdand(0x38); delay(5);

lcd1602_write_comdand(0x0c);//显示模式设置:显示开,有光标,光标闪烁 delay(5);

lcd1602_write_comdand(0x06);//显示模式设置:光标右移动,字符不移动 delay(5);

lcd1602_write_comdand(0x38);//清屏指令,将以前的指令全部清除 delay(5);

lcd1602_write_comdand(0x38);//显示模式设置;16*2显示,5*7点阵,8位数据接

/*******************DS18B20的模块化程序*****************************/ /* 获取外界温度信息,转化温度值 DQ与P3、7口连接

/*******************DS18B20的模块化程序*****************************/ /****************初始化*********************/ void init_ds18b20(void) {

DQ = 0; delay480us; DQ = 1; delay15us;

while(DQ==1); //等待从机 delay480us; }

- 38 -

/****************写时隙*********************/ void write_byte(unsigned char write_data) {

unsigned char i,temp; for(i=0;i<8;i++) { temp=write_data&0x01; write_data=write_data>>1; DQ = 0; delay1us; if(temp==0x01) { DQ = 1; } else { DQ = 0; } delay60us; DQ = 1; delay1us; } }

/****************读时隙***********************/ unsigned char read_byte(void) {

unsigned char read_data; unsigned char i; for(i=0;i<8;i++) { read_data=read_data>>1; DQ = 0; delay1us; DQ = 1; delay5us; if(DQ==1) { read_data=read_data|0x80; } else { read_data=read_data|0x00;

- 39 -

} delay45us; DQ=1; delay1us; }

return (read_data); }

/*************************************/ void readtemp(void) {

init_ds18b20(); write_byte(0xcc); write_byte(0x44);

init_ds18b20(); write_byte(0xcc); write_byte(0xbe); tl_byte=read_byte(); th_byte=read_byte();

tempreture_int=th_byte*16+tl_byte/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16

//这样得出的是温度的整数部分,小数部分被丢弃了

tempreture_dot=(tl_byte%16)*100/16; //小数部分的温度值 }

/**********************控制子程序********************/ /** 控制子程序 **/ /**********************控制子程序********************/ void control_funcation() {

if(tempreture_int > upper_temperature) { HT_motor = 0; //高温电机1驱动 H_alarm = 0; //高温报警开启 normal = 1; //正常温度关闭 }

else if(tempreture_int < lower_temperature) { LT_motor = 0; //低温电机2驱动 L_alarm = 0; //低温报警启动 normal = 1; //正常温度关闭

- 40 -

} else { P1 = 0xf7; //只有正常的温度提示 } }

/**************************************************************** 外部中断INT0中断服务子程序, 主要用于切换当前温度、设定温度的显示界面

*****************************************************************/ void waibuzhongduan_INT0() interrupt 0 {

set_flag++; if(set_flag>=3) { set_flag = 0; } }

/**************************************************************** 按键功能子程序 主要用于温度的上限、下限的设置

*****************************************************************/ /*void Lkey_funcation() {

if(key_add1==0) //加1按键按下 { delay(20); //延时20ms,去抖动 if(key_add1==0) //加1按键还有效 { lower_temperature++;//设置温度加1 if(lower_temperature >= 100) { lower_temperature=0; } delay(20); } }

if(key_add10==0) //加10按键按下 { delay(20); //延时20ms,去抖动 if(key_add10==0) //加10按键还有效 { lower_temperature=lower_temperature+10;//设置温度加10 if(lower_temperature >= 100)

- 41 -

{ lower_temperature=0; } delay(20); } } }*/

/**************************************************************** 按键功能子程序 主要用于温度的上限、下限的设置

*****************************************************************/ void Hkey_funcation() {

if(key_add1==0) { }

//加1按键按下

delay(20); //延时20ms,去抖动 if(key_add1==0) //加1按键还有效 { upper_temperature++;//设置温度加1 if(upper_temperature >= 100) { upper_temperature=0; } delay(20); }

if(key_add10==0) //加10按键按下 { delay(20); //延时20ms,去抖动 if(key_add10==0) //加10按键还有效 {

upper_temperature=upper_temperature+10;//设置温度加10 if(upper_temperature >= 100) { upper_temperature=0; } delay(20); } } }

/**********************温度显示程序********************/

- 42 -

/** 将DS18B20读取得温度

显示在液晶上 **/ /**********************温度显示程序********************/

void Temperature_display()//温度显示模块 {

unsigned char i=0;

lcd1602_write_address(0x44); //显示第二行的第五位 lcd1602_write_data(display1[tempreture_int/10]); delay(2);

lcd1602_write_data(display1[tempreture_int%10]); delay(2);

lcd1602_write_data(display2[0]); delay(2);

lcd1602_write_data(display1[tempreture_dot/10]); delay(2);

lcd1602_write_data(display1[tempreture_dot%10]); delay(2);

lcd1602_write_address(0x01);//显示到第一行的第三位,16位两行 i=0;

while(display3[i] != '\\0') { lcd1602_write_data(display3[i]); i++; } }

void main(void) {

unsigned char i; lcd1602_init();

waibuzhongduan_init(); while(1) {

lcd1602_write_comdand(0x01); //清屏指令,将液晶上的内容全部清掉 delay(2);

while(set_flag%3==0) { readtemp(); control_funcation(); Temperature_display(); }

lcd1602_write_comdand(0x01); //清屏指令,将液晶上的内容全部清掉

- 43 -

delay(2);

while(set_flag%3==1) {

// Lkey_funcation();

lcd1602_write_address(0x46); //显示第二行的第五位 delay(2);

lcd1602_write_data(display1[lower_temperature/10]); delay(2);

lcd1602_write_data(display1[lower_temperature%10]);

lcd1602_write_address(0x01);//显示到第一行的第三位,16位两行 i=0; while(display3[i] != '\\0') { lcd1602_write_data(display4[i]); i++; } }

lcd1602_write_comdand(0x01); //清屏指令,将液晶上的内容全部清掉 delay(2);

while(set_flag%3==2) { Hkey_funcation(); lcd1602_write_address(0x46); //显示第二行的第五位 delay(2); lcd1602_write_data(display1[upper_temperature/10]); delay(2); lcd1602_write_data(display1[upper_temperature%10]); delay(2); lcd1602_write_data('d'); delay(2); lcd1602_write_data('u'); lcd1602_write_address(0x01);//显示到第一行的第三位,16位两行 i=0; while(display3[i] != '\\0') { lcd1602_write_data(display5[i]); i++;

- 44 -

- 45 -

附录二 系统的原理图

- 46 -

附录三 单片级温度实时监控报警系统流程图

开始 液晶、定时器、变量初始化 键盘扫描、按键处理 时钟显示、温度转化并显示 Yes 温度小于较低温度值 No Yes 温度大于较低且小于温度值 No Yes 温度大于较高温度值 No 红绿灯亮,有短报警声,继电器控制开关断开,停止时钟 绿灯亮,有长报警声 正常工作 结束 - 47 -

参考文献

[1]单片机原理及应用(第二版) 电子工业出版社 张迎新等编著

[2]单片机原理与实例应用 清华大学出版社 万隆、张娟、陈文刚等编著单片 [3]单片机原理及接口技术(第三版) 北京航空航天大学出版社 李朝清 [4]c语言程序设计(第三版) 清华大学出版社 谭浩强编著

[5]模拟电子技术基础(第四版) 高等教育出版社 周良权 李世馨等编著 [6]数字电子技术 哈尔滨工程大学出版社 付子义等编著

[7]数字温度传感器DS18B20及其应用 南京工程学院报 韩志军 刘新民 [8]单片机课程设计实力指导 北京航空航天大学出版社 李光飞 [9]单片机彻底研究实习篇 人民邮电出版社 林伸茂

[10] DS18B20在温控系统中的应用 农机化研究 居荣 郭怡倩

[11] 单片机与数字温度传感器 DS18B20的接口设计 计算机测量与控制 马云峰 [12]基于单片机的高精度温度测量系统设计 现代电子技术 何宗虎 张德祥 张玲君

[13]基与Proteus 的Lcd1602接口设计与仿真 微计算机信息 陈清江

[14]单片微型计算机原理及应用 华中科技大学出版社 胡乾斌 李光斌 李玲 [15]电动机DSP控制 北京航空航天大学出版社 王晓明 王玲

[16]DSP原理及控制系统设计 清华大学出版社 栗思科 李拥军 杨龙 [17]数字电子技术 哈尔滨工程大学出版社 付子义等编著 [18] http://wenku.baidu.com [19]百度百科 http://baike.baidu.com [20]中国知网 http://www.cnki.net

- 48 -

因篇幅问题不能全部显示,请点此查看更多更全内容