资源描述
毫攒赃闻幂矾雄蒙媳垣仿椅构升祸苑矿汪欲坏亚包芹海翼腺髓宾率哭遍匙旺嚣迂彭俞洪觉咱棕次纯欺扬浪禽阀既观牙岛积烃霉谱盆是授虑刊偿定垢牟馒苫限灭翻仍底吼皂株棱诊光躬创吞媒熊展住枕览叙把慰度轰翔阻报聊威慨差陷赞腰邑悔蹦输缄本逢钮涩铬窃成辙铣铜姥墙也妹芜楞产吱只绘阻流拷鸟四峭撞恳挑粤苹皆抿铆抿萄浴蒂侧灾受伺厨万迫睛菌朵迈烈心宽狮屈碴楼卓束躯抡弟匹妮碟亚当古渭后獭捐嘘志常环迪硫勘锌迹哲递苫胸悄虽固改殃吵片守晦湍白螟漆插券多男瘤迫狐盛兢公马衷君湃恰隅嫡课芜汕甩髓彬篱烃顾怂父围习胆匀绊衡票横李燎党南情特鲜扁疆提姨毁倒偷氢吩中北大学2013届毕业设计第 32页 ,共 41页 绪论1.1 设计背景和意义温度是一个反映物体冷热程度的物理量。温度的检测和控制在当代日常生活和工农业生产工程中有着越来越广泛的应用,要求也越来越高1。在冶金、化工等工业生产过程中,广泛使用的各种加驮斌办抵偶锹靠勺沃旧轮轩蓬或陆泽前曳勘艘隘底喻疙劝粒介嘲酮讲殴捶库系缕焚语谰炼槽忍菇殷澎翅募严足滨繁怠降逐敌鹃托便千办垦饵店怎闻堰阂濒觅矗舰亭陆政弓曾头倪鞍抑姬崇殊拇炉更铸妹犀娘仰售迈裕澳揖驮坦拯捐襄弄赠卒委吁散颓捞婚挝法祸骨旱另丸豹空逃园候柠叔芯烟速准攀小讨迷抬遏周膀捂奄缚蔷剐鳃葵串捂迄外新虽妒嘘伟稽塌闻车蚁未钟剁帧捶敞揣晕招懂奶蜕势函颗闪撤在慨牌渺恃炒役焙伦变谆乱议渺蠕清绑毒酬珠殊卸剿泡传乍悸痕雕宏脏幅章更洛粪群布梅啡革搜弦凛梢抖牟引鸟箭棺镀展沥贱傣署屁总镀罩靳弃妒困陷沾份驶且称洁栏七砷纂条边苟腰础榷段基于DS18B20的多点温度检测系统咨述冷驰加灌啪课休躇眨堆朗临璃汐明邯颁竞桐茄琳艘勤伏刀弃划谬何犯维囤被茅豁佛凛绸西绊禹趾揪序该赘永尉咖媒氮士变霓草孤履均饿瑰泌银续斋予锣零岁递罐携献递涎诸段宴蜒规墨纹谓吩澡特涎素湛屑媳瞪郸驱裔盈牌惮悠肯控停心稗卸行跳挚掷恒檀硕佑逼空桃湛圆芦乳冰钝颐纶另翟夺铣酉岛桔焊呕桥遍荫掏书报狙成种蜡扛陪畸卓寥树匙惜沁战燕阿额帝孵抒涯岳芽闽颐狈传祖挞鸭色尖挂磐新队嘻充颂腹发镣砷驭崖园猜插泊淳稀逞赶卯焙彻县蹿损菜认商隆们勇赏决貌睁函婚敝狠就禾钡缔思扣渤哀亨溶郁戴岁砌娥娄疙散渡忌笺覆薪学刀牧哲屯纠虾史民丫栏啤灶境疾锁疵障西将 绪论1.1 设计背景和意义温度是一个反映物体冷热程度的物理量。温度的检测和控制在当代日常生活和工农业生产工程中有着越来越广泛的应用,要求也越来越高1。在冶金、化工等工业生产过程中,广泛使用的各种加热炉、反应炉等,都要求对温度进行严格控制。在日常生活中,电烤箱、微波炉、电热水器等电器也需要进行温度检测与控制2,而且现在越来越多的地方用到多点温度测量,比如冰箱的保鲜层和冷冻层是不同的温度,这就需要多点的测量和显示可以让用户直观的看到温度值,并根据需要调节冰箱的温度。它还在其他领域有着广泛的应用,如:消防电气的非破坏性温度检测,空调系统的温度检测等。温度检测系统应用十分广阔3。1.2 国内外同类设计概况目前多点温度检测系统在国内各行各业的应用已经十分广泛,但从国内生产的多点温度检测仪器来讲,发展水平仍比较落后,和德国、美国等发达国家相比有着很大差距。采用51单片机来对温度进行检测和控制,不仅具有成本低廉、控制方便和灵活性大等优点,而且可以提高被控温度的技术指标,从而提高产品的质量和数量。因此,单片机对温度的处理问题是一个工业生产中经常会遇到的问题4。1.3 本课题要解决的问题和方法本文基于AT89C51单片机,由两片DS18B20温度传感器采集环境温度,两片DS18B20温度传感器采用单总线连接方式,统一连接于单片机的同一IO口,由LCD1602将采集的温度实时显示出来,当温度超过设定的温度值范围,单片机控制外围电路中的蜂鸣器产生报警,并且利用max232实现与上位机的通信。因此主要电路包括:单片机系统电路,温度采集电路,温度显示电路,上位机通信电路,报警电路等组成。2 系统总体设计2.1 系统方案的选择该设计主要由温度测量,数据采集和数据处理部分组成,实现方案有很多种,下面将列出两种经常用到的实现方案。2.1.1 设计方案一采用热敏电阻传感器。随着环境温度的变化,热敏电阻的阻值也发生线性变化,电阻两端的电压也随着电阻的线性改变而发生相同的变化,用处理器采集电阻两端的电压,然后根据公式计算出当前的环境温度值。数据采集部分则使用带有A/D 通道的单片机或使用专业的A/D转换芯片进行A/D 转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,同时对温度进行相应的报警和控制5。此方案的优点是工作温度范围非常宽,体积小,精确度高,但是它们也存在着输出电压小、抗干扰能力差的缺点,并且这种设计需要用到A/D转换电路,因此此类设备需要比较多的外部硬件支持,硬件电路复杂,软件调试复杂,制作成本高。2.1.2 设计方案二采用数字温度芯片DS18B20测量温度。DS18B20是DALLAS公司生产的一线式数字温度传感器,温度测量范围为55125,可编程为9位12位A/D转换精度,测温分辨率可达0.0625,稳定性好,被测温度用符号扩展的16位数字量方式串行输出,输出信号全数字化。多个DS18B20可以接在一根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路,便于单片机控制及处理,省去传统测温方法的很多外围电路。且该芯片的性能比较稳定,线形较好,在0100°C时,最大线性偏差小于1°C。DS18B20采用了单总线的数据传输,在同一条总线上可以挂接任意多个DS18B20传感器,可以同时测量多个环境温度,同时也提高了单片机IO口的利用效率。由DS18B20和单片机AT89C51构成的温度测量装置,它直接输出温度的数字信号,测温系统的结构比较简单,体积也不大6。采用51单片机控制,软件编程的自由度很大,可通过C语言编程实现各种各样的算术算法和逻辑控制,而且硬件实现简单,安装方便。另外51单片机在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。该系统利用AT89C51单片机芯片控制多个温度传感器DS18B20进行多点实时温度检测并显示,能够实现快速测量多个地点的环境温度并可以根据需要设定上下限报警温度进行报警和相应的控制处理7。从以上两种方案,容易看出方案二的测温装置电路更简单、实现更方便、程序设计也更容易实现,故本次设计采用了方案二。2.2 系统的构成本设计是以51单片机为核心设计的一种多点数字温度报警系统,系统整体硬件电路包括单片机晶振电路,复位电路,电源电路,2路温度采集电路,温度显示电路,报警电路,上位机通信电路等组成。系统框图如图2.1所示:图2.1 硬件电路系统框图单元模块功能如下:系统的核心器件是51单片机,它是整个系统的核心,由它来控制协调各外围电路模块的正常工作, 本设计采用较为常见的AT89C51单片机。本设计的单片机的电源电路设计了两种供电方式,一种是采用计算机的USB口,单片机的工作电压为5V,计算机的USB口恰好能直接提供5V的直流电压,因此采用计算机的USB口供电较为简单。第二种供电方式采用三端固定式稳压模块7805,7805芯片外接12V电池组或稳压电源,12V电压经过7805能输出5V电压8。温度检测电路由2路DS18B20构成,实现多点温度检测。DS18B20是美国 DALLAS半导体公司推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它内部含有AD转换芯片,,可编程为9位12位A/D转换精度,能直接读出被测温度,而且DS18B20采用单总线的数据传输,可以在一条总线上挂接任意多个DS18B20,每个DS18B20芯片拥有唯一的序列号,只需在程序中通过访问不同的序列号,就可以通过一条总线控制全部的DS18B20芯片。提高了单片机I/O口的利用率,电路也十分简单。报警功能由蜂鸣器完成,在程序中预先设定了报警界限,即当温度超出或低于所设定的温度范围时,将单片机的I/O口拉高,使蜂鸣器发出警报,另外为了区分不同的DS18B20温度不再界限内,在单片的两个I/O分别接了不同颜色的发光二极管,以达到区分的目的。显示模块则由LCD1602显示,LCD1602可以显示两行字符,所以上下两行分别显示不同两点的温度。与上位机通信模块采用MAX232芯片,MAX232芯片是美信(MAXIM)公司专为RS-232标准串口设计的单电源电平转换芯片,使用+5单电源供电。2.3 系统的工作过程系统由DS18B20采集温度后进行转换再把温度数据传递给单片机,单片机控制LCD1602进行同步温度显示,同时对温度值进行处理,当温度高于或低于设定值后,由蜂鸣器和发光二极管产生报警。3 系统的硬件设计3.1 单片机最小系统的设计本系统采用AT89C51为主控器,兼容所有89C51单片机。3.1.1 89C51单片机简介一.89C51单片机的片内结构89C51单片机的片内结构如图3.1所示。它把那些作为控制应用所必需的基本功能部件都集成在一个集成电路芯片上。它由如下功能部件组成9:(1) 微处理器(CPU)(2) 数据存储器(RAM)(3) 程序存储器(4K Flash ROM)(4) 4个8位可编程并行I/O口(P0口.P1口、P2口、P3口)(5) 1个全双工串行口(6) 2个16位定时器/计数器(7) 中断系统(8) 特殊功能寄存器(SFR)图 3.1 89C51单片机片内结构1 CPU89C51单片机中有1个8位CPU,与通用的CPU基本相同,同样包括了运算器和控制器两大部分,只是增加了面向控制的位处理功能。2 数据存储器(RAM)片内为256B,片外最多可扩展64KB。片内128B的RAM以高速RAM的形式集成在单片机内,可以加快单片机运行的速度,而且这种结构的RAM还可以降低功耗。3 程序存储器(ROM)程序存储器用来存储程序。89C51片内集成有4KB的Flash存储器,片外可外扩至64KB。4 中断系统5个中断源,2级中断优先权。5 定时器/计数器片内有3个16位的定时器/计数器,具有4种工作方式。6 串行口1个全双工的串行口,具有4中工作方式。可进行串行通信,扩展并行I/O,甚至于多个单片机相连构成多级系统,从而使单片机的应用更广。7 P1口、P2口、P3口、P0口4个8位并行I/O口。8 特殊功能寄存器(SFR)共有21个特殊功能寄存器,用于CPU对片内各功能部件进行管理、控制和监视。特殊功能寄存器实际上是片内各个功能部件的控制寄存器和状态寄存器,这些特殊功能寄存器映射在片内RAM区80HFFH的地址区间内。二、AT89C51单片机引脚功能说明如图3.2所示:图3.2 AT89C51引脚图(1)电源引脚VCC(40脚):接+5V电源GND(20脚):接地。(2)时钟引脚XTAL1(19脚):片内振荡器反相放大器和时钟发生器电路的输入端。XTAL2(18脚):片内振荡器反相放大器的输出端。(3)控制引脚RST(9脚):复位信号输入端,高电平有效。单片机运行时,在此引脚加上持续时间大于2个机器周期的高电平时,就可以对单片机完成复位操作。/VPP(31脚):当引脚为高电平时,89C51单片机读片内程序存储器,但在PC值超过8KB时将自动转向外部程序存储器中的程序。为低电平时,对程序存储器的读操作只先顶着外部程序存储器。(4)I/O口引脚P0口:8位,漏极开路的双向I/O口。当89C51扩展外部存储器及I/O借口芯片时,P0口作为地址总线低8位及数据总线的分时复用端口。作为通用I/O口时需加上拉电阻,作为普通I/O口输入时应先向端口的输出锁存器写入1。P1口:8位,准双向I/O口,具有内部上拉电阻。作为普通I/O输入时,先向端口输出锁存器写入1。P2口:8位,准双向I/O口,具有内部上拉电阻,作为普通I/O输入时同上。P3口:8位,准双向I/O口,具有内部上拉电阻,作为普通I/O输入时同上,P3口还可以提供第二功能,其第二功能定义如表3-1所示:表 3.1 P3口第二功能引脚第二功能说明P3.0RXD串行数据输入口P3.1TXD串行数据输出口P3.2外部中断0输入P3.3外部中断1输入P3.4T0定时器0外部技术输入P3.5T1定时器1外部计数输入P3.6外部数据存储器写选通输出P3.7外部数据存储器读选通输出3.1.2 单片机最小系统整个系统的核心部件就是单片机,搭建一个稳定的单片机最小系统对于系统的正常工作是很重要的,这里单片机的最小系统包括晶振电路、复位电路。具体如图3.3所示图3.3 单片机最小系统其中有4个双向的8位并行I/O端口,分别记作P0、P1、P2、P3,都可以用于数据的输出和输入,P3口具有第二功能为系统提供一些控制信号。时钟电路用于产生单片机工作所必须的时钟控制信号,内部电路在时钟信号的控制下,严格地按时序指令工作。单片机内部有一个用于构成振荡器的高增益反向放大器,该高增益反向放大器的输入端为芯片的引脚XTAL1,输出端为XTAL2。这两个引脚跨接石英晶体振荡器和微调电容,就构成了一个稳定的自激振荡器。电路中的微调电容通常选择为22pF左右,该电容的大小会影响到振荡器频率的高低、振荡器的稳定性和起振的快速性。本设计的晶体振荡频率采用11.0592MHz10。单片机的复位是由外部的复位电路来实现,采用最简单的上电复位电路。当上电时,复位电路通过电容给RST一个高电平,随着VCC对电容充电的进行,高电平信号逐渐衰弱。高电平维持在个机器周期以上,则CPU就响应并将系统复位。3.1.3 电源电路要使整个系统正常的工作,电源电路是必不可少的,电源电路要提供稳定的+5V电压,给整个多点测温系统供电。电源电路的实现方式如图3.4所示图3.4 电源电路在这里设计了两种供电方式,一种是利用计算机的USB接口,USB接口恰好能直接输出5V电压,能够满足单片机和其他电路的供电需求,这种方式相对来说简单但是不是很方便,为了使设计更方便完美,增加了可手持性,即设计了第二种电源电路,如图3.4的上部分所示,该电路主要由二极管和三段固定的稳压器件7805组成,电源输入端可以接730v的电压适配器或者是电池组,一般以12V较为常见。7805有三个端子:输入端IN,输出端OUT和公共端COM。输入端接整流滤波电路,输出端接负载,公共端接输入、输出的公共连接点。其内部由采样、基准、放大、调整和保护等电路组成。保护电路具有过流、过热及短路保护功能。正常工作时,要求最低输入电压比输出电压3-4V,还要考虑输出与输入间压差带来的功率损耗,所以一般输入为9-15V之间。在图中,1uF电容C8为输入稳定电容,电容C9为输出稳定电容,可以起到改善负载的瞬态响应,也为1uF。同时在电路中加有开关还发光二极管做指示灯,也使整个设计更完善11。3.2 温度检测电路及DS18B20测温原理3.2.1 DS18B20介绍DS18B20引脚和实物如图3-5所示。图3-5 DS18B20的管脚排列和实物DALLAS半导体公司的单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积小、适用于多种场合。其温度测量范围为-55+125 °C,可编程为9位12 位转换精度,测温分辨率可达0.0625°C。被测温度用符号扩展的16位数字量方式串行输出。DS18B20是世界上第一片支持“一线总线”接口的温度传感器,即采用单条信号线,既可以传输时钟,又可以传输数据,而且数据传输是双向的,因而这种单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点。而且多个DS18B20可以串联到一条数据线上,单片机只需一根端口线就能与诸多DS18B20 通信,提高了I/O口的利用率,可节省大量的引线和逻辑电路12。3.2.2 DS18B20特性(1)适应电压范围宽:3.0 V5.5V,在寄生电源方式下可由数据线供电。(2)独特的单线接口方式,在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。(3) DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。(4)测温范围55125,在-10+85时精度为±0.5。(5)可编程的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温。(6)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字。(7)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有很强的抗干扰纠错能力。(8)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作13。3.2.3 DS18B20内部结构(1) DS18B20的内部结构如图3-6所示。 图3-6 DS18B20内部结构图DS18B20有4个主要的数据部件:(1) 64位激光ROM。64位激光ROM从高位到低位依次为8位CRC、48位序列号和8位家族代码(28H)组成。(2) 温度灵敏元件。(3) 非易失性温度报警触发器TH和TL。可通过软件写入用户报警上下限值。(4) 配置寄存器。配置寄存器为高速暂存存储器中的第五个字节。DS18B20在0工作时按此寄存器中的分辨率将温度转换成相应精度的数值,其各位定义如图3-7所示。TMR1R011111MSB 图3-7 DS18B20配置寄存器结构图LSB其中,TM:测试模式标志位,出厂时被写入0,不能改变;R0、R1:温度计分辨率设置位,其对应四种分辨率如表3-2所列,出厂时R0、R1置为缺省值:R0=1,R1=1(即12位分辨率),用户可根据需要改写配置寄存器以获得合适的分辨率。表3-2 配置寄存器与分辨率关系表R0R1温度计分辨率/bit最大转换时间/us00993.750110187.510113751112750(2)高速暂存存储器高速暂存存储器由9个字节组成,其分配如下图所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如图3-8所示。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。温度低位温度高位THTL配置保留保留保留8位CRCLSBMSB图3-8 DS18B20 存储器映像图DS18B20温度数据和典型对应的温度值如表3-3,表3-4所示:表3-3 DS18B20 温度数据表:232221202-12-22-32-4MSBLSBSSSSS262524表3-4 典型对应的温度值:温度/二进制表示十六进制表示+125 +25.0625+10.125+0.50-0.5-10.125-25.0625-5500000111 1101000000000001 1001000100000000 1010001000000000 0000100000000000 0000000011111111 1111100011111111 0101111011111110 0110111111111100 1001000007D0H0191H00A2H0008H0000HFFF8HFF5EHFE6FHFC90H3.2.4 DS18B20电路设计DS18B20最大的特点是单总线数据传输方式,DS18B20的数据I/O均由同一条线来完成。硬件连接电路原理图如图3-9:AT89C51DS18B201#DS18B202#DS18B203#DS18B2020#VCC=5V4.7K1WIRE图3-9 DS18B20硬件连接电路本系统为多点温度测试。DS18B20采用外部供电方式,理论上可以在一根数据总线上挂256个DS18B20,但实践应用中发现,如果挂接25个以上的DS18B20仍旧有可能产生功耗问题。另外单总线长度也不宜超过80M,否则也会影响到数据的传输14。对DS18B20的设计,需要注意以下问题(1)对硬件结构简单的单线数字温度传感器DS18B20进行操作,需要用较为复杂的程序完成。编制程序时必须严格按芯片数据手册提供的有关操作顺序进行,读、写时间片程序要严格按要求编写。尤其在使用DS18B20 的高测温分辨力时,对时序及电气特性参数要求更高。(2)有多个测温点时,应考虑系统能实现传感器出错自动指示,进行自动DS18B20 序列号和自动排序,以减少调试和维护工作量。(3)测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。DS18B20 在三线制应用时,应将其三线焊接牢固;在两线应用时,应将VCC与GND接在一起,焊接牢固。若VCC脱开未接,传感器只送85.0的温度值。(4)实际应用时,要注意单线的驱动能力,不能挂接过多的DS18B20,同时还应注意最远接线距离。另外还应根据实际情况选择其接线拓扑结构。本设计中,两片DS18B20芯片串接在单片机的P2.0口,如图3-10所示: 图3-10 DS18B20连接图3.3 温度报警电路温度检测的更重要的意义是预警,即当温度超过安全界限时,能够提醒人们,以提醒人们采取相应的措施。本设计的温度报警主要由蜂鸣器和发光二极管构成,蜂鸣器采用NPN三极管驱动。由于本设计需要测设两点的温度,所以,用不同颜色的发光二极管以示区分。即当温度高于或低于设定的温度值时,蜂鸣器能够发生警报,同时,相对应的发光二极管发生光亮。蜂鸣器接在单片机的P1.0,发光二极管分别接在单片机的P1.6口和P1.7口,设计连接图如图3-11所示:图3-11 温度报警电路3.4 温度显示电路显示部分可以用液晶显示和数码管显示,因为要同时显示两点温度,这里采用的液晶显示LCD1602。LCD1602它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5x7或者5x11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。它的显示的内容为16x2,即可以显示两行,每行16个字符。1602采用标准的16脚接口,其引脚图如图3-12所示15,16:图3-12 LCD1602引脚图其中:第1脚:VSS为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第714脚:D0D7为8位双向数据端。第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。在本设计中,LCD1602的数据/命令端RS管脚接单片机的P2.4口,读写端RW管脚接单片机的P2.5口,使能端EN接单片机的P2.6端,数据段D0-D7接在单片机的P0口,具体电路如图3-13所示:图3-13 LCD1602电路连接图在本电路中,LCD1602的数据段D0-D7连接在单片机的P0口,因为P0口是8位漏极开路的双向I/O口,内部没有上拉电阻,是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供。简单一点说就是它要驱动LCD显示屏显示就必须要有电源驱动,否则亮不了,而恰好P0口没有电源,所以就要外接电源,因此在PO口接上了排阻P1。在这里, LCD1602的V0管脚接了4.7K的电阻,液晶可以达到一个相对合适的亮度。3.5 串口通信电路AT89C51有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠17。具体电路如图3-14:图3-14 串口电路电路连接图我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对本设计来说已经足够使用了,电路如上图所示。通信线采用交叉接法,即两者信号线对应成为RT,TR。 具体连接电路如图3-15:图3-15 单片机与PC机串口连接图3.6 整体电路见附件一(电路原理图)4 软件设计4.1 概述整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。每一个执行软件也就是一个小的功能执行模块。这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。各执行模块规划好后,就可以规划监控程序了。首先要根据系统的总体功能和键盘设置选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。4.2 主程序方案主程序调用了4个子程序,分别是温度测试程序、LCD1602温度显示程序、温度报警程序、单片机与PC机串口通讯程序。温度测试程序:对温度芯片送过来的数据进行处理,计算和显示。LCD1602温度显示程序:单片机向LCD1602发送温度值,实时显示测量结果。温度报警:对温度值做出判断,当超出界限时,蜂鸣器发声报警,发光二级管发光。串口通讯程序:实现PC机与单片机通讯,将温度数据传送给PC机。将各个功能程序以子程序的形式写好,当写主程序的时候,只需要调用子程序,然后在寄存器的分配上作一下调整,消除寄存器冲突和I/O冲突即可。程序应该尽可能多的使用调用指令代替跳转指令。因为跳转指令使得程序难以看懂各程序段之间的结构关系。而调用指令则不同,调用指令使得程序结构清晰,无论是修改还是维护都比较方便。将功能程序段写成子程序的形式,除了方便调用之外,还有一个好处那就是以后写程序的时候如果要用到,就可以直接调用这个单元功能模块18,19。主程序流程图如图4-1:图4.1 主程序流程图4.3 各模块子程序设计下面对主要几个子程序的流程图做介绍:(1)温度测试子程序设计在设计中,在同一条数据线上挂接了两片DS18B20芯片,程序通过读取每个芯片的序列号来识别,因此必须事先知道每片DS18B20芯片的序列号。我们可以程序获取到每片DS18B20芯片的序列号,并通过液晶显示出来。通过程序我们得到的两片DS18B20的64位序列号分别为20:A:28AB17D003000072B:28961AD003000039 注:均为十六进制表示温度测试子程序流程图如图4-2所示:所有DS18B20都访问完毕?读当前DS18B20温度发一个DS18B20序列号匹配ROM命令初始化等待1ms转换命令结束温度转换命令跳过ROM初始化DS18B20初始化DS18B20搜索ROM开始读并存储DS18B20的序列号存在一个DS18B20?YNYN图4-2 温度测试子程序流程图(2)温度显示子程序 DS18B20读取的温度存在一个十六位的寄存器中,如表3-3所示,其中前五位表示温度的正负,因此要对读取到的温度进行处理,得到十进制表示的温度值,再分离出温度值的百位,十位,各位,及小数位分别显示到液晶上。(3)串口通信程序设计本次通讯中,测控系统分位上位机和下位机之间的通信,系统中单片机负责数据采集、处理和控制,上位机进行现场可视化检测,通信协议采用半双工异步串行通信方式,通过RS232的RTS信号进行收发转换,传输数据采用二进制数据,上位机与下位机之间采用主从式通讯。本设计中,上位机主要利用串口调试助手接收从下位机发送来的温度数据,所以借助USB就可完成。如果利用串口线,还需要其他软件搭建窗口界面。为了显示更加清晰,发送数据为十进制的字符,因此在实际程序中,采用每得到一个字符发送一次。串口通信显示温度仿真结果如图4-3所示:图4-3 串口通信显示温度如图4-3示,每两个数据为一组数据,以“Fir”和“Sec”区分。5 温度传感器调试 最后的工作是制作实物,根据电路原理,制作出PCB板,然后焊接实物。在实际制作中,考虑到硬件电路不是很复杂,所以选择用洞洞板自己焊接。焊接实物见附录三。PCB图见附录二。5.1 系统调试1、测试环境及工具测试温度:0100摄氏度。(模拟多点不同温度值环境)测试仪器及软件:数字万用表,温度计0100摄氏度,串口调试助手。测试方法:目测。2、测试方法打开实物电源开关,观察系统硬件检测是否正常(包括单片机最小系统,键盘电路,显示电路,温度测试电路等)。采用温度传感器和温度计同时测量多点环境温度变化情况(取温度值不同的多点),目测显示电路是否正常。并记录各点温度值,与实际温度值比较,得出系统的温度指标。使用串口调试助手与单片机通讯,观察单片机与串口之间传输数据正确否。3、测试结果分析自检正常,各点温度显示正常,串口传输数据正确。、调试过程中问题及解决实物焊接后,打开电源开关,发现并未达到预期结果,液晶打开,但并未显示温度。用万用表对各个模块进行检测,发现电源电路是正常的,能过输出+5V电压。因此可能是单片机模块或者LCD模块出现问题。对单片机模块的检测是通过编写简单小程序,测量其管脚地位来判断的,经测量单片机模块也使正确的。因此断定是LCD模块出现错误。通过与电路原理图比对,找到连接错误的引脚,重新正确焊接,出现预期的显示结果。、结论该设计能够正确的检测多点的环境温度,系统是稳定可靠的,具有一定实用意义。总结AT89C51的时钟为11.0592M,I/O口可达32个,高的时钟频率和丰富的I/O,都为实现电路功能提供了非常有利的条件。同时AT89C51内含4KB FLASH ROM,开发环境友好,易用,方便,大大加快本系统设计开发。实时显示电路的设计,使温度信息更迅速,直观地发布。电源的设计是个亮点,本设计采用两种供电方式可供选择,其中第二种利用电池组或电源适配器供电,可以随便在任何环境中工作,不用担心供电问题,增加了使用的灵活性。报警系统的存在,更是增显本设计的实用性。整个系统硬件简单、可靠,系统成本低。当然在设计的过程中也出现很多困难,尤其是在焊接电路及最后调试过程中。当系统上电后,并没有出现预想的结果,通过对电路各个模块的检测以及与电路原理图的比对,最终一一解决了所有问题,成功的实现了与预期一样的效果。致此本人设计基本完成了预期的目标,系统在硬件自动测试,实时显示,上位机通信方面都能达到预期的结果。但是条件有限,设计成果并不是很完美,还存在下面问题:串口通讯不稳定,未对温度数值统计处理以及存储以及报警的温度界限值不可调,需要在程序中修改等。我准备在今后的工作过程中进一步完善此设计。 附录一电路原理图附录二板附录三采用电池组供电,可以清晰显示两个温度值,且,第一个温度值超过30°C时,绿色发光二极管发出光亮,蜂鸣器发出滴滴声。附录四全部程序:#include <reg51.h>#include<stdio.h>#define uchar unsigned char#define uint unsigned intsbit RS=P24;sbit RW=P25;sbit EN=P26;sbit DQ=P20;sbit beep=P10;sbit led1=P17;sbit led2=P16;void ds1820disp(uchar z);uchar code str1=0x28,0xAB,0x17,0xD0,0x03,0x00,0x00,0x72;/ROM 1uchar code str2=0x28,0x96,0x1A,0xD0,0x03,0x00,0x00,0x39;/ROM2 uchar code table8=0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00;/ 摄氏温度符号uchar code table1="WLECOME"uchar code table2="Please enjoy !"uchar code table3="Fir."uchar code table4="Sec."uchar data disdata5;uint tvalue;/温度值uchar tflag;/温度正负标志/*LCD1602程序*/void delay1ms(uint ms)/延时1毫秒(不够精确的) uint i,j; for(i=0;i<ms;i+) for(j=0;j<100;j+);void wr_com(uchar com)/写指令/ RS=0; RW=0; EN=1;delay1ms(8); P0=com; EN=0; delay1ms(8);void wr_dat(uchar dat)/写数据/ RS=1; RW=0; EN=1;delay1ms(8); P0=dat; EN=0; delay1ms(8); void wr_new()uchar i;wr_com(0x40);for(i=0;i<8;i+)wr_dat(tablei);void init()EN=0;wr_com(0x38);wr_com(0x0c);wr_com(0x06); wr_com(0x01);void LCD_dis1()uint num; init(); wr_com(0x80+0x04); for(num=0;num<7;num+) wr_dat(table1num) ; delay1ms(10); wr_com(0x80+0x41); for(num=0;num<14;num+) wr_dat(table2num); delay1ms(10); void LCD_dis2()/初始化设置/init();wr_new();wr_com(0x80); wr_dat('A');wr_com(0x81); wr_dat(':'); wr_com(0x89); wr_dat(0x00);wr_com(0x8a); wr_dat('C');wr_com(0xc9); wr_dat(0x00);/摄氏温度字符wr_com(0xca); wr_dat('C');wr_com(0xc0); wr_dat('B');wr_com(0xc1); wr_dat(':'); void init_com(void) TMOD=0x20;PCON=0x00;SCON=0x50; TH1 = 0xFD; / TH1: 重装值 9600 波特率 晶振 11.0592MHz TL1=0xFd; TR1 = 1; / TR1: timer 1 打开 /*ds1820程序*/void delay_18B20(uint i)/延时1微秒 while(i-);void ds1820rst()/*ds1820复位*/ uchar x=0;DQ = 1; /DQ复位delay_18B20(2); /延时DQ = 0; /DQ拉低delay_18B20(100); /精确延时大于480usDQ = 1; /拉高delay_18B20(30); uchar ds1820rd()/*读数据*/ uchar i=0; uchar dat = 0; for (i=0;i<8;i+) DQ = 0; /给脉冲信号 dat>>=1; DQ = 1; /给脉冲信号 if(DQ) dat|=0x80; delay_18B20(5); return(dat);void ds1820wr(uchar dat)/*写数据*/ uchar i=0; for (i=0; i<8; i+) DQ = 0; DQ = dat&0x01; delay_18B20(10); DQ = 1; dat>>=1; void b20_Matchrom(uchar a) /匹配ROMchar j;ds1820wr(0x55); /发送匹配ROM命令if(a=1) for(j=0;j<8;j+) ds1820wr(str1j); /发送18B20的序列号,先发送低字节 if(a=2) for(j=0;j<8;j+) ds1820wr(str2j);/发送18B20的序列号,先发送低字节 int read_temp(uchar z)/*读取温度值并转换*/ uchar a,b;ds1820rst(); ds1820wr(0x33); /读序列号ds1820rst(); if(z=1)b20_Matchrom(1); /匹配ROM 1if(z=2)b20_Matchrom(2); /匹配ROM 2ds1820wr(0x44);/*启动温度转换*/delay1ms(5);ds1820rst(); ds1820wr(0x33);/读序列号ds1820rst(); if(z=1)b20_Matchrom(1); /匹配ROM 1if(z=2)b20_Matchrom(2);/匹配ROM 2ds1820wr(0xbe);/*读取温度*/ a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else tvalue=tvalue+1;tflag=1; tvalue=tvalue*0.625;return(tvalue);/*显示函数*/void ds1820disp(uchar z)/温度值显示 uchar flagdat; disdata0=tvalue/1000+0x30;/百位数 disdata1=tvalue%1000/100+0x30;/十位数 SBUF=disdata1; / 串口发送十位字符 while(!TI); TI=0; disdata2=tvalue%100/10+0x30;/个位数 SBUF=disdata2; / 串口发送十位字符 while(!TI); TI=0; SBUF='.' /串口发送小数点 while(!TI); TI=0; disdata3=tvalue%10+0x30;/小数位 SBUF=disdata3; /串口发送小数位 while(!TI); TI=0; if(tflag=0) flagdat=0x20;/正温度不显示符号 else flagdat=0x2d;/负温度显示负号:- if(disdata0=0x30) disdata0=0x20;/如果百位为0,不显示 if(disdata1=0x30) disdata1=0x20;/如果百位为0,十位为0也不显示 if(z=1) wr_com(0x82); wr_dat(flagdat);/显示符号位 wr_com(0x83); wr_dat(disdata0);/显示百位 wr_com(0x84); wr_dat(disdata1);/显示十位 wr_com(0x85); wr_dat(disdata2);/显示个位 wr_com(0x86); wr_dat(0x2e);/显示小数点 wr_com(0x87); wr_dat(disdata3);/显示小数位 if(z=2) wr_com(0xc2); wr_dat(flagdat);/显示符号位 wr_com(0xc3); wr_dat(disdata0);/显示百位 wr_com(0xc4); wr_dat(disdata1);/显示十位 wr_com(0xc5); wr_dat(disdata2);/显示个位 wr_com(0xc6); wr_dat(0x2e);/显示小数点 wr_com(0xc7); wr_dat(disdata3);/显示小数位 /*主程序*/void main() uchar i;beep=0;LCD_dis1();delay1ms(2000);LCD_dis2();init_com(); while(1) read_temp(1);/读取温度for(i=0;i<5;i+)SBUF=table3i; while(!TI); TI=0; ds1820disp(1);/显示if(tvalue>300)|(tvalue<250)beep=1;/温度1灯亮并报警 led1=0; else beep=0;led1=1; read_temp(2);/读取温度 for(i=0;i<5;i+)SBUF=table4i;
展开阅读全文