《毕业设计(论文)-基于单片机的超温报警设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)-基于单片机的超温报警设计.doc(34页珍藏版)》请在三一文库上搜索。
1、基于单片机的超温报警设计学校代码: 序 号: 本 科 毕 业 论文题目: 基于单片机的超温报警设计 学 院: 姓 名: 学 号: 专 业: 电子信息工程 年 级: 指导教师: 二O 年 月30基于单片机的超温报警设计 摘要本设计设计了一款以AT89S52、DS18B20芯片为核心的温度数字显示报警系统。系统采用AT89S52单片机进行智能控制,利用DS18B20芯片实现对温度的测量,通过单片机处理进行报警点的设置,用液晶显示器LCD1602显示以串口传送数据,显示实时温度,通过三个按键的按键次数来决定温度阈值,按键1按一次设置上限温度,按键1按两次设置下限温度,按键1按三次温度设置完成,按键2
2、按下是当前温度值加1,按键3按下是当时温度减1。当DS18B20测量的温度值不在设定温度阈值范围内,单片机将驱动蜂鸣器报警。关键词:AT89S52,超温报警,DS18B20,LCD显示器Microcontroller-based over-temperature alarm designAbstractThe design designs to AT89S52 and DS18B20 chip as the core temperature digital display and alarm system.The system uses the AT8952 microcontroller f
3、or intelligent control,using DS18B20 chip implement temperature measurement,setting the alarm point by microcontroller,using with the LCD1602 displays data with serial transmission,and LCD1602 displays the real-time temperature,number of times by three keys to determine temperature threshold,setting
4、 the maximum temperature by keying Button 1 once,setting the minimum temperature Key Button 1 twice, completing the setment of temperature by key Button 1 three times.when the button 2 key once,the temperature value plus 1;when the button 3 key once,the current temperature value minus 1.when the mea
5、sured temperature by DS18B20 is not within the value of the temperature threshold,the microcontroller will drive the buzzer alarm.Key words:AT89S52,Over-temperature alarm,DS18B20,LCD Monitor目录1概述12 系统原理设计22.1 超温报警控制原理22.2 系统功能方框图23 系统硬件原理及其设计33.1 单片机与各模块连接工作原理33.2 复位电路83.3 晶振电路83.4 DS18B20数据采集电路93.5
6、 温度显示模块103.6 报警模块113.7 温度设置模块114 系统软件设计124.1 程序流程图124.2 程序125 结论26参考文献27致 谢28附录:超温报警系统总图291 概述温度是一种最基本的环境参数,人们的生活环境与温度息息相关,温度测量也被人们所异常关注因此,研究温度的测量方法和装置具有重要意义,温度测控技术也在各个领域应用越来越广泛采用单片机对温度进行控制,不仅具有控制方便和组态简单的优点,而且可以提高被控温度的技术指标。本设计介绍了一款由单片机AT89S52和新型的智能集成温度传感器DS18B20以及LCD1602显示器等部件实现的温度测量及报警系统同时在设计方面做了功能
7、的扩展,开关按键是用来调节温度,功能较强,可以设置上下限报警温度,且测量准确误差小,单片机可把由DS18B20读来的数据利用软件来进行处理,从而把数据传输到显示模块,实现实时温度显示,还有语音报警功能对温度实施监测,即当温度超过设置的最高温度或者低于给定的最低温度时,系统将驱动蜂鸣器发声报警。2 系统原理设计2.1 超温报警控制原理系统是对温度的监控。首先,用户预先通过温度设定模块按键输入温度报警值到程序中,该值作为系统阈值。温度传感器DS18B20将监测值传输给AT89S52单片机,单片机将DS18B20测量的温度值与预先设定的温度值T进行比较,当单片机比较监测到的数值超出所设定阈值时,驱动
8、蜂鸣器报警。2.2 系统功能方框图超温报警器原理框图如图2-1所示。整个系统由AT89S52单片机、温度设置模块、温度显示模块、DS18B20数据采集模块、报警器模块组成。单片机主要负责接受来自DS18B20数据,对数据进行对比处理,通过单片机处理控制温度显示模块和报警器模块。温度显示模块和报警器模块是执行来自单片机指令并反馈结果给用户。单 片 机温度设置模块DS18B20温度显示报警器图2-1 原理框图3 系统硬件原理及其设计3.1 单片机与各模块连接工作原理3.1.1 AT89S52单片机1. 主要性能与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、
9、全静态操作:0Hz33Hz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。图3-1 AT89S52双列直插封装方式引脚图2. 功能特性描述AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌
10、入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。8位微控制器8K字节在系统可编程Flash。(1)P0口:P0口是一个8位漏极开路的双向I/O口。作为输出
11、口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。 (2)P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL 逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.
12、0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下所示。在flash编程和校验时,P1口接收低8位地址字节。 引脚号第二功能 P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出 P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5 MOSI(在系统编程用) P1.6 MISO(在系统编程用) P1.7 SCK(在系统编程用) (3)P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻
13、的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。 (4)P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT
14、89S52特殊功能(第二功能)使用,如下所示。在flash编程和校验时,P3口也接收一些控制信号。 端口引脚第二功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 INTO(外中断0)P3.3 INT1(外中断1)P3.4 TO(定时/计数器0)P3.5 T1(定时/计数器1)P3.6 WR(外部数据存储器写选通)P3.7 RD(外部数据存储器读选通)此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。(5)RST复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。(6)ALE/PROG当访问外部程序存储器或数据存储器时,ALE(地
15、址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。(7)PSEN程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S52由外部程序存储器取指令
16、(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。(8)EA/VPP外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。(9)电源引脚Vcc和Vss引脚。Vcc接+5V电源,Vss接地。(10)时钟引脚XTAL1和XTAL2引脚。XTAL
17、1接外部晶体的1个引脚,该引脚内部是1个反相放大器的输入端,这个反相放大器构成了片内振荡器,如果采用外接晶体振荡器时,此引脚应接地。XTAL2接外部晶体的另一端,该引脚内部接至内部反相放大器的输出端,若采用外部时钟振荡时,该引脚接收时钟振荡的信号,即把此信号直接接到内部时钟发生器的输入端。3.1.2 单片机与各模块连接AT89S52单片机P3.7引脚与温度传感器DS18B20的DQ引脚相连,作为温度信号的输入/输出,其P2.0引脚与报警电路的连接进行信号的通讯,其P0.0P0.7引脚与显示电路的主芯片1602的D0D7数据线相连来控制LED显示,其P1.0与P1.1引脚与温度设置模块相连接,以
18、便用来控制系统的温度设置。系统原理图如图3-2所示。图3-2 系统原理图3.2 复位电路复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。本系统的复会电路电平方式的按键手动复位方式,是通过RST端经电阻与电源Vcc接通而实现的。C取10uF,R取10K。其复位电路与单片机连接图如图3-3所示。图3-3 复位电路3.3 晶振电路AT89S52内部有一个用于构成振荡器的高增益反相放大器,该高增益反相放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。这
19、两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自己振荡器,如图3-4所示是AT89S52内部时钟方式的振荡器电路。取C1=C2=30pF,晶振为12MHz。图3-4 晶振电路3.4 DS18B20数据采集电路DS18B20是由美国DALLAS半导体公司生产最新单线数字式温度传感器,主要特性如下:可实现对-55到+125范围内的温度测量,并且测量温度的误差在0.5,实际系统的分辨率可单独设定,并且保存在EEPROM中,即使断电也能够保存;现场温度的测量值通过串行通信的方式传输,即“单线总线”的数字方式传输;系统供电电压容许范围大,可在3V到5.5V的范围波动。DS18B20总共三个引脚,
20、一个引脚为电源地GND,另一个为外接电源端VDD,剩下一个DQ为数字信号输入/输出端。DS18B20的内部结构如图3-5所示,主要包括寄生电源电路、64位只读存储器ROM和单线接口、存储器和控制逻辑、存放中间数据的高速暂存存储器、温度传感器、报警上限寄存器TH、报警下限寄存器TL、配置寄存器和8位CRC循环冗余校验码发生器。图3-5 DS18B20基本组成与传统的热敏电阻相比,DS18B20能过直接读出被测温度并且可根据实际要去通过简单的编程实现912位的数字值读数方式。可以分别在93.75ms和750ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需
21、一个口线(单线接口)读写。温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可是系统结构更趋简单,可靠性更高。由于DS18B20采用单总线接口方式,所以它与单片机只需一根接口线即可,即只需要把DS18B20的DQ线与单片机的一根接口线即可,系统DQ线与单片机P3.7口连接。3.5 温度显示模块选用1602字符型液晶模块,它是目前功控系统中使用最为广泛的液晶屏之一。1602字符型液晶模块是点阵型液晶,驱动方便,经编码后显示内容多样化。系统的输入模块采用中断扫描44矩阵键盘,相比定时扫描方式,提高了MCU的使用效率。液晶显示模块具有体积小
22、、功耗低、显示内容丰富、超薄轻巧等优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用。目前字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件。LCD1602液晶显示模块可以显示两行,每16个字符,采用单+SV电源供电,外围电路配置简单,价格便宜,具有很高的性价比。表3-1 LCD1602的主要技术参数:显示容量162个字符芯片工作电压4.55.5V工作电流2.0mA(5.0V)模块最佳工作电压5.0V字符尺寸2.954.35(WXH)mm表3-2 LCD1602接口信号说明:编号符号引脚说明编号符号引脚说明1VSS电源地9D2Data I/O2VDD电源正极10D3Data I/O3
23、VL液晶显示偏压信号11D4Data I/O4RS数据/命令选择端(H/L)12D5Data I/O5R/W读/写选择端(H/L)13D6Data I/O6E使能信号14D7Data I/O7D0Data I/O15BLA背光源正极8D1Data I/O16BLK背光源负极D0D7为1602的数据线,它与单片机的P0口相连,R6R13为上拉电阻,R14为LCD对比度调节电阻。RS、R/W、E为控制口线,分别与AT89S52的P2.4、P2.3、P2.2相连接,实时显示温度。3.6 报警模块本设计中所设计的报警电路较为简单,由一个自我震荡型蜂鸣器和PNP型晶体管组成。蜂鸣器额定电流IB30mA,
24、而对于AT89S52单片机,P2.0口的灌电流为1.6mA,拉电流为60A,由此可见,仅靠单片机的P2.0口电流是不能驱动蜂鸣器的,必须使用集晶体管放大电路,为了使单片机消耗的功率更小,所以使用PNP型晶体管9012。3.7 温度设置模块为了使系统更具有通用性,系统通过温度设置模块设定用户所需要的报警上限和下限报警温度值,其原理是通过三个按键的按键次数来决定温度值,当S1按下时,系统开始设置温度,当S2按下一次则使报警温度值加1,直到用户所需的温度值为止,S3的作用与S2相反,它用于设置下限报警温度值。4 系统软件设计4.1 程序流程图程序启动后,首先调用DS18B20和LCD1602模块初始
25、化程序,然后调用温度采集模块,借用DS18B20内部模数转换的时间,调用温度值转换模块,将温度值转换成BCD码,送入AT89S52单片机处理,驱动LCD实时显示温度和超温报警。程序流程图如图4-1所示。开始LCD1602初始化DS18B20初始化温度采集送AT89S52处理LED显示报警是否超温NY图4-1 程序流程图4.2 程序#include /包含reg52.h文件#include /包含intrins.h文件#define uchar unsigned char /定义uchar代替unsigned char#define uint unsigned int /定义uint代替unsi
26、gned intsbit DQ=P37; /DQ定义为P3口位7sbit lcden=P22; /lcden定义为P2口位2sbit lcdrs=P24; /lcdrs定义为P2口位4sbit lcdrw=P23; /lcdrw定义为P2口位3sbit beep=P20; /beep定义为P2口位0sbit set=P10; /set定义为P1口位0sbit up=P11; /up定义为P1口位1sbit down=P12; /down定义为P1口位2uint temp,a,b; /定义temp,a,b为无符号整型uchar num; /定义num为无符号字符型uchar key=0; /定义
27、key为无符号字符型,key的初始值为0uchar g; /定义g为无符号字符型uchar bai,shi,ge,maxshi,maxge,minshi,minge; /定义变量uchar data temp_data2=0x00,0x00; /读出温度暂放uchar data display5=0x00,0x00,0x00,0x00,0x00;/显示单元数据,共4个数据和一个运算暂用uchar code ditab16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09; /定义数组d
28、itab16uint data data12=0x32,0x00 /无符号数组uint data1 被定义为data存储类型uchar code table1 = WEN KONG ; /定义数组table1 uchar code table2 = WENDU: . C ; /定义数组table2 uchar code table3 =Set Temperature ; /定义数组table3 uchar code table4=SANGXIAN: . C ; /定义数组table4 uchar code table5=XIAXIAN: . C ; /定义数组table5 uchar code
29、 warn=WARNING WARNING ; /定义数组table6 /*11us延时函数*/void delay(uint t) for(;t0;t-);/*1ms延时函数*/void delaylcd(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void write_com(uchar com) /定义函数write_com,给LCD写命令lcdrs=0; /低电平写命令P0=com; /写入命令delaylcd(2); /延时2mslcden=1; /LCD使能端置高电平delaylcd(2); /延时2mslcden=0; /LCD使
30、能端置低电平void write_data(uchar date) /定义函数write_data,写LCD数据lcdrs=1; /高电平写数据P0=date; /写入数据delaylcd(2); /延时2mslcden=1; /LCD使能端置高电平delaylcd(2); /延时2mslcden=0; /LCD使能端置低电平void displayminmax() /定义函数displayminmax,第1行显示温度上下阈值uchar i;write_com(0x80); /设置光标位置为第1行第1位maxshi=data10/10; / maxshi为上限温度十位maxge=data10%
31、10; / maxge为上限温度个位minshi=data11/10; / minshi为下限温度十位minge=data11%10; / minge为下限温度个位write_data(0x30+minshi); /显示下限温度的十位write_data(0x30+minge); /显示下限温度的个位write_data(0xdf); /显示下限温度-上限温度 write_data(0x43);write_data(0x2d);write_data(0x2d);write_data(0x2d);write_data(0x3e);write_data(0x30+maxshi); /显示上限温度的
32、十位write_data(0x30+maxge); /显示上限温度的个位write_data(0xdf);write_data(0x43);for(i=0;i4;i+)write_data(0x20); /显示四个空格void initdisplay() /定义函数initdisplay,显示2行字符displayminmax(); /调用displayminmax函数write_com(0x80+0x40); /设置光标位置,从第2行第1位开始写for(num=0;num0;i-) /从18B20移出一个字节 DQ=1;_nop_();_nop_(); /从高拉到低 DQ=0;_nop_()
33、;_nop_();_nop_();_nop_();/延时5 us DQ=val&0x01; /最低位移出,向其间写一位 delay(6); /延时66 us val=val/2; /右移1位,准备写下一位数据 DQ=1; delay(1);/*DS18B20读1字节函数*/从总线上取1个字节uchar read_byte(void) /读DS18B20的字节uchar i;uchar value=0;for(i=8;i0;i-) DQ=1;_nop_();_nop_(); /2us value=1; /移位,准备存放下一次数据 DQ=0;_nop_();_nop_();_nop_();_nop
34、_(); /4 us DQ=1;_nop_();_nop_();_nop_();_nop_(); /4 us if(DQ) /读取数据 value|=0x80; /读取到的数据为1 delay(6); /66 usDQ=1;return(value); /返回value值/*读出温度函数*/read_temp() /DS18B20读取温度 ow_reset(); /总线复位 delay(200); /延时220us write_byte(0xcc); /发命令,跳过读序列号的操作 write_byte(0x44); /发转换命令, 启动温度转换 ow_reset(); /复位 delay(1)
35、; /延时 write_byte(0xcc); /发命令 write_byte(0xbe); /读取温度寄存器等(共可读9个寄存器)前两个就是温度 temp_data0=read_byte(); /读温度值的低字节 temp_data1=read_byte(); /读温度值的高字节 temp=temp_data1; temp6348) /温度值正负判断 tem=65536-tem;n=1; /负温度求补码,标志位置1 display4=tem&0x0f; /取小数部分的值 display0=ditabdisplay4; /存入小数部分显示值 display4=tem4; / 取中间八位,即整数部分的值 display3=display4/100; / 取百位数据暂存 display1=display4%100; / 取后两位数据暂存 display2=display1/10; / 取十位数据暂存 display1=display1%10; / 取各位数据暂存void write_1602() /温度写给LCD1602write_com(0x80+0x40+8); /设置光标位置,第2行第9位if(display3=1) /若