基于单片机的超温报警设计Word格式文档下载.docx
《基于单片机的超温报警设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的超温报警设计Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
系统是对温度的监控。
首先,用户预先通过温度设定模块按键输入温度报警值到程序中,该值作为系统阈值。
温度传感器DS18B20将监测值传输给AT89S52单片机,单片机将DS18B20测量的温度值与预先设定的温度值T进行比较,当单片机比较监测到的数值超出所设定阈值时,驱动蜂鸣器报警。
2.2系统功能方框图
超温报警器原理框图如图2-1所示。
整个系统由AT89S52单片机、温度设置模块、温度显示模块、DS18B20数据采集模块、报警器模块组成。
单片机主要负责接受来自DS18B20数据,对数据进行对比处理,通过单片机处理控制温度显示模块和报警器模块。
温度显示模块和报警器模块是执行来自单片机指令并反馈结果给用户。
图2-1原理框图
3系统硬件原理及其设计
3.1单片机与各模块连接工作原理
3.1.1AT89S52单片机
1.主要性能
与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:
0Hz~33Hz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
图3-1AT89S52双列直插封装方式引脚图
2.功能特性描述
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有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内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
8位微控制器8K字节在系统可编程Flash。
(1)P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动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.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下所示。
在flash编程和校验时,P1口接收低8位地址字节。
引脚号第二功能
P1.0T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P1.5MOSI(在系统编程用)
P1.6MISO(在系统编程用)
P1.7SCK(在系统编程用)
(3)P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
在访问外部程序存储器或用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”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下所示。
在flash编程和校验时,P3口也接收一些控制信号。
端口引脚第二功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2INTO(外中断0)
P3.3INT1(外中断1)
P3.4TO(定时/计数器0)
P3.5T1(定时/计数器1)
P3.6WR(外部数据存储器写选通)
P3.7RD(外部数据存储器读选通)
此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。
(5)RST——复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。
(6)ALE/PROG——当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
(7)PSEN——程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S52由外部程序存储器取指令(或数据)时,每个机器周期两次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引脚。
XTAL1接外部晶体的1个引脚,该引脚内部是1个反相放大器的输入端,这个反相放大器构成了片内振荡器,如果采用外接晶体振荡器时,此引脚应接地。
XTAL2接外部晶体的另一端,该引脚内部接至内部反相放大器的输出端,若采用外部时钟振荡时,该引脚接收时钟振荡的信号,即把此信号直接接到内部时钟发生器的输入端。
3.1.2单片机与各模块连接
AT89S52单片机P3.7引脚与温度传感器DS18B20的DQ引脚相连,作为温度信号的输入/输出,其P2.0引脚与报警电路的连接进行信号的通讯,其P0.0~P0.7引脚与显示电路的主芯片1602的D0~D7数据线相连来控制LED显示,其P1.0与P1.1引脚与温度设置模块相连接,以便用来控制系统的温度设置。
系统原理图如图3-2所示。
图3-2系统原理图
3.2复位电路
复位电路的基本功能是:
系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。
为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。
本系统的复会电路电平方式的按键手动复位方式,是通过RST端经电阻与电源Vcc接通而实现的。
C取10uF,R取10KΩ。
其复位电路与单片机连接图如图3-3所示。
图3-3复位电路
3.3晶振电路
AT89S52内部有一个用于构成振荡器的高增益反相放大器,该高增益反相放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自己振荡器,如图3-4所示是AT89S52内部时钟方式的振荡器电路。
取C1=C2=30pF,晶振为12MHz。
图3-4晶振电路
3.4DS18B20数据采集电路
DS18B20是由美国DALLAS半导体公司生产最新单线数字式温度传感器,主要特性如下:
可实现对-55℃到+125℃范围内的温度测量,并且测量温度的误差在±
0.5℃,实际系统的分辨率可单独设定,并且保存在EEPROM中,即使断电也能够保存;
现场温度的测量值通过串行通信的方式传输,即“单线总线”的数字方式传输;
系统供电电压容许范围大,可在3V到5.5V的范围波动。
DS18B20总共三个引脚,一个引脚为电源地GND,另一个为外接电源端VDD,剩下一个DQ为数字信号输入/输出端。
DS18B20的内部结构如图3-5所示,主要包括寄生电源电路、64位只读存储器ROM和单线接口、存储器和控制逻辑、存放中间数据的高速暂存存储器、温度传感器、报警上限寄存器TH、报警下限寄存器TL、配置寄存器和8位CRC循环冗余校验码发生器。
图3-5DS18B20基本组成
与传统的热敏电阻相比,DS18B20能过直接读出被测温度并且可根据实际要去通过简单的编程实现9~12位的数字值读数方式。
可以分别在93.75ms和750ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需一个口线(单线接口)读写。
温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可是系统结构更趋简单,可靠性更高。
由于DS18B20采用单总线接口方式,所以它与单片机只需一根接口线即可,即只需要把DS18B20的DQ线与单片机的一根接口线即可,系统DQ线与单片机P3.7口连接。
3.5温度显示模块
选用1602字符型液晶模块,它是目前功控系统中使用最为广泛的液晶屏之一。
1602字符型液晶模块是点阵型液晶,驱动方便,经编码后显示内容多样化。
系统的输入模块采用中断扫描4×
4矩阵键盘,相比定时扫描方式,提高了MCU的使用效率。
液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用。
目前字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件。
LCD1602液晶显示模块可以显示两行,每16个字符,采用单+SV电源供电,外围电路配置简单,价格便宜,具有很高的性价比。
表3-1LCD1602的主要技术参数:
显示容量
16×
2个字符
芯片工作电压
4.5~5.5V
工作电流
2.0mA(5.0V)
模块最佳工作电压
5.0V
字符尺寸
2.95×
4.35(WXH)mm
表3-2LCD1602接口信号说明:
编号
符号
引脚说明
1
VSS
电源地
9
D2
DataI/O
2
VDD
电源正极
10
D3
3
VL
液晶显示偏压信号
11
D4
4
RS
数据/命令选择端(H/L)
12
D5
5
R/W
读/写选择端(H/L)
13
D6
6
E
使能信号
14
D7
7
D0
15
BLA
背光源正极
8
D1
16
BLK
背光源负极
D0~D7为1602的数据线,它与单片机的P0口相连,R6~R13为上拉电阻,R14为LCD对比度调节电阻。
RS、R/W、E为控制口线,分别与AT89S52的P2.4、P2.3、P2.2相连接,实时显示温度。
3.6报警模块
本设计中所设计的报警电路较为简单,由一个自我震荡型蜂鸣器和PNP型晶体管组成。
蜂鸣器额定电流IB≤30mA,而对于AT89S52单片机,P2.0口的灌电流为1.6mA,拉电流为60μA,由此可见,仅靠单片机的P2.0口电流是不能驱动蜂鸣器的,必须使用集晶体管放大电路,为了使单片机消耗的功率更小,所以使用PNP型晶体管9012。
3.7温度设置模块
为了使系统更具有通用性,系统通过温度设置模块设定用户所需要的报警上限和下限报警温度值,其原理是通过三个按键的按键次数来决定温度值,当S1按下时,系统开始设置温度,当S2按下一次则使报警温度值加1,直到用户所需的温度值为止,S3的作用与S2相反,它用于设置下限报警温度值。
4系统软件设计
4.1程序流程图
程序启动后,首先调用DS18B20和LCD1602模块初始化程序,然后调用温度采集模块,借用DS18B20内部模数转换的时间,调用温度值转换模块,将温度值转换成BCD码,送入AT89S52单片机处理,驱动LCD实时显示温度和超温报警。
程序流程图如图4-1所示。
图4-1程序流程图
4.2程序
#include<
reg52.h>
//包含reg52.h文件
intrins.h>
//包含intrins.h文件
#defineucharunsignedchar//定义uchar代替unsignedchar
#defineuintunsignedint//定义uint代替unsignedint
sbitDQ=P3^7;
//DQ定义为P3口位7
sbitlcden=P2^2;
//lcden定义为P2口位2
sbitlcdrs=P2^4;
//lcdrs定义为P2口位4
sbitlcdrw=P2^3;
//lcdrw定义为P2口位3
sbitbeep=P2^0;
//beep定义为P2口位0
sbitset=P1^0;
//set定义为P1口位0
sbitup=P1^1;
//up定义为P1口位1
sbitdown=P1^2;
//down定义为P1口位2
uinttemp,a,b;
//定义temp,a,b为无符号整型
ucharnum;
//定义num为无符号字符型
ucharkey=0;
//定义key为无符号字符型,key的初始值为0
ucharg;
//定义g为无符号字符型
ucharbai,shi,ge,maxshi,maxge,minshi,minge;
//定义变量
uchardatatemp_data[2]={0x00,0x00};
//读出温度暂放
uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};
//显示单元数据,共4个数据和一个运算暂用
ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//定义数组ditab[16]
uintdatadata1[2]={0x32,0x00}//无符号数组uintdata1[]被定义为data存储类型
ucharcodetable1[]={"
WENKONG"
};
//定义数组table1[]
ucharcodetable2[]={"
WENDU:
.C"
//定义数组table2[]
ucharcodetable3[]={"
SetTemperature"
//定义数组table3[]
ucharcodetable4[]={"
SANGXIAN:
.C"
//定义数组table4[]
ucharcodetable5[]={"
XIAXIAN:
//定义数组table5[]
ucharcodewarn[]={"
WARNINGWARNING"
};
//定义数组table6[]
//
/*****************11us延时函数*************************/
voiddelay(uintt)
{
for(;
t>
0;
t--);
}
/*****************1ms延时函数*************************/
voiddelaylcd(uintz)
uintx,y;
for(x=z;
x>
x--)
for(y=110;
y>
y--);
voidwrite_com(ucharcom)//定义函数write_com,给LCD写命令
lcdrs=0;
//低电平写命令
P0=com;
//写入命令
delaylcd
(2);
//延时2ms
lcden=1;
//LCD使能端置高电平
lcden=0;
//LCD使能端置低电平
voidwrite_data(uchardate)//定义函数write_data,写LCD数据
lcdrs=1;
//高电平写数据
P0=date;
//写入数据
voiddisplayminmax()//定义函数displayminmax,第1行显示温度上下阈值
uchari;
write_com(0x80);
//设置光标位置为第1行第1位
maxshi=data1[0]/10;
//maxshi为上限温度十位
maxge=data1[0]%10;
//maxge为上限温度个位
minshi=data1[1]/10;
//minshi为下限温度十位
minge=data1[1]%10;
//minge为下限温度个位
write_data(0x30+minshi);
//显示下限温度的十位
write_data(0x30+minge);
//显示下限温度的个位
write_data(0xdf);
//显示下限温度℃--->
上限温度℃
write_data(0x43);
write_data(0x2d);
write_data(0x3e);
write_data(0x30+maxshi);
//显示上限温度的十位
write_data(0x30+maxge);
//显示上限温度的个