完整word版基于单片机的火灾报警器设计与实现.docx
《完整word版基于单片机的火灾报警器设计与实现.docx》由会员分享,可在线阅读,更多相关《完整word版基于单片机的火灾报警器设计与实现.docx(25页珍藏版)》请在冰豆网上搜索。
完整word版基于单片机的火灾报警器设计与实现
编号:
设计说明书
题目:
基于单片机的火灾报警器设计与实现
学院:
桂林电子科技大学职业技术学院
专业:
电子信息工程技术
学生姓名:
学号:
*******
职称:
讲师
2015年6月日
摘要
火灾自动报警系统(FireAlarmSystem,简称FAS系统)是人们为了早期发现通报火灾,并及时采取有效措施,控制和扑灭火灾,而设置在建筑物中或其它场所的一种自动消防设施,是人们同火灾作斗争的有力工具。
本次设计以AT89C51单片机,MQ-2烟雾传感器和DS18B20温度传感器为核心设计的火灾报警器可实现报警故障自诊断、报警设置、实时温度显示及与温度报警值设定等功能。
是一种结构简单、电路简单、而且易懂、性能稳定、使用方便、价格低廉、智能化的烟雾报警器,具有非常高的实用价值。
关键词:
AT89C51;温度传感器;烟雾传感器;火灾报警器;四位共阴数码管;
引言
随着社会的发展、科技的进步以及人们生活水平的逐步提高,各种方便于生活的电子产品开始进入人们的生活。
现代家庭用火、用电量的增加,许多人因不懂家庭安全常识引起火灾事故,家庭火灾发生的频率越来越高,使好端端的幸福家庭转眼间毁于一旦,有的导致家破人亡。
居民家庭火灾一旦发生,处置不当、报警迟缓,,很容易出现扑救不及时、灭火器材缺乏及在场人惊慌失措、逃生迟缓等不利因素,最终导致重大生命财产损失。
探讨家庭火灾的特点及防火对策,对于预防家庭火灾,减少火灾损失具有现实意义。
所以说,人们应该积极了解家庭火灾的主要起因,掌握防止发生火灾的知识和万一发生火灾时保护自己的方法,及时消除。
本系统使用AT89S51单片机,选用集成温度传感器DS18B20和气体传感器MQ-2作为敏感元件,利用多传感器信息融合技术,开发了可用于小型单位火灾报警的报警器。
具有灵敏度高、响应快、抗干扰能力强等优点,而且价格低廉,使用寿命长等特点
1系统概述
1.1选题背景
全世界几乎每天都有火灾发生。
城里的高层建筑,地下商场以及大型的建筑群日益增多。
火灾的隐患也伴随着社会的发展而逐年升高。
自动火灾报警系统就是为了保障人民生命财产安全而发明的,并且随着现代技术水平的不断提高。
在方式,功能,和结构上不断的完善。
家庭火灾的主要原因是麻痹大意,没有及时采取预防措施,本次设计的火灾报警器,是防止火灾最重要的手段之一,它的作用是使用18B20温度传感器,实时检测房间的温度,使用MQ-2实时检测房间。
一切正常时,绿灯亮,但温度超过预定值或有大量烟雾是,说明可能发生火灾时,蜂鸣器便会发出报警信号,且红灯亮。
1.2设计要求
要求:
(1)用单片机实现;
(2)用C语言编程;
(3)硬件电路板布局合理;
(4)使用18B20温度传感器,实时检测房间的温度,且使用数码管显示温度;
(5)使用烟雾传感器,实时检测房间;
(6)如果空气中有烟雾,则蜂鸣器报警,并点亮红灯;若气体没有烟雾,则绿点亮表示正常;
(7)如果空气温度超过限定值,则认为发生火灾,并蜂鸣器报警,点亮红灯。
2设计原理
2.1硬件部分
火灾报警器分为三个部分:
温度传感器检测温度模块,烟雾传感器检测烟雾模块,数码管显示模块。
主控芯片采用AT89C52;显示部分采用四位共阴数码管;时钟电路采用12MHZ的石英晶体振荡器,将其和单片机对应的引脚正确连接,将晶振产生的时钟信号作为定时信号;复位电路采用传统RC复位电路。
单片机的I/O口分配:
P1.0接温度传感器输出脚,P1.1接烟雾传感器模块的TTL信号;P1.5接绿灯,P1.6接红灯,P1.7接蜂鸣器,P0口和P2口分别接数码管的段选和位选。
2.2软件部分
程序采用C语言进行编程,编程后利用KeiluVision4来进行编译,再生成的HEX文件通过下载口导入芯片中。
然后根据按键功能查看是否实现功能。
3硬件电路设计与分析
3.1硬件框架图
图1
3.2单片机最小系统
3.2.1STC89C52芯片介绍
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,指令代码完全兼容传统8051使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
工作电压:
3.3V~5.5V;
工作频率范围:
0~40MHz;
用户应用程序空间为8K字节;
片上集成512字节RAM;
通用I/O口(32个),上电复位后为:
P0/P1/P2/P3是准双向口/弱上拉,P0作为I/O口用时,需加上拉电阻;
外部中断2个,下降沿中断或低电平触发电路;共2个16位定时器/计数器。
即定时器T0、T1;可通过可直接使用串口下载,串口(RxD/P3.0,TxD/P3.1)直接下载用户程序;具有EEPROM(掉电储存)功能,内带4K字节EEPROM存储空间。
图2
3.2.2时钟电路
STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。
时钟可以由内部方式产生或外部方式产生在RXD和TXD引脚上外接定时元件,内部振荡器就产生自激振荡。
定时元件通常采用石英晶体和电容组成的并联谐振回路。
晶体振荡频率可以在1.2~12MHz之间选择,电容值的大小可对频率起微调的作用。
单片机最小系统起振电容C1、C2一般采用15~33pF,晶振一般采用12MHZ,并且电容离晶振越近越好,晶振离单片机越近越好。
时钟电路原理图:
图3
3.2.3复位电路
一般情况下,电容的大小是10uF,电阻的大小是10k,复位电路的原理是单片机RST引脚接收到2US以上的电平信号,只要保证电容的充放电时间大于2US,即可实现复位。
在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。
所以可以通过按键的断开和闭合在运行的系统中控制其复位,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。
复位电路原理图:
图4
3.3四位数码管
3.3.1数码管的介绍
四位数码管是一种半导体发光器件,其基本单元是发光二极管。
数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个,引线已在内部连接完成,只需引出它们的各个笔划,公共电极分别由字母a,b,c,d,e,f,g,dp来表示,能显示4个数码管叫四位数码管。
图5
四位数码管的引脚图:
图6
3.3.2四位数码管共阳和共阴的区分
市面上的四位一体的数码管一般都没有数据表,所以掌握他们管脚的分布是很重要的一个环节。
共阳数码管是指,将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指,将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
区别他们的方法是:
若公共端接地,其他端接电源,若各段测试能亮,说明是共阴的,反之共阳的;若公共端接电源,其他端分别接的,测得各端亮,则说明是共阳的,反之为共阴的。
此次设计的火灾报警器的四位数码管采用共阴数码管。
3.3.3数码管的驱动方式
(1)静态显示:
静态显示也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,但一个STC89S51单片机可用的I/O端口才32个,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
(2)动态显示:
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,却能够节省大量的I/O端口,而且功耗更低。
3.474HC573芯片介绍
此次篮球计分牌的设计利用74HC573来驱动两个四位共阴数码管。
74HC573 的八个锁存器都是透明的D 型锁存器,当使能(G)为高时,Q 输出将随数据(D)输入而变。
当使能为低时,输出将锁存在已建立的数据电平上。
输出控制不影响锁.器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。
这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。
特别适用于缓冲寄存器,I/O 通道,双向总线驱动器和工作寄存器
74HC573芯片引脚图:
图7
3.5温度传感器DS18B20模块
DS18B20常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点
接线方法:
面对着扁平的那一面,左负右正,一旦接反就会立刻发热,有可能烧毁!
同时,接反也是导致该传感器总是显示85℃的原因。
温度的读取:
DS18B20在出厂时以配置为12位,读取温度时共读取16位,前5个位为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正数。
温度为正时读取方法为:
将16进制数转换成10进制即可。
温度为负时读取方法为:
将16进制取反后加1,再转换成10进制即可
3.6烟雾传感器MQ-2模块
接线方式:
1、VCC:
接电源正极(5V)
2、GND:
接电源负极
3、DO:
TTL开关信号输出
4、AO:
模拟信号输出
电气性能:
1、具有信号输出指示。
2、双路信号输出(模拟量输出及TTL电平输出)
3、TTL输出有效信号为低电平。
(当输出低电平时信号灯亮,可直接接单片机)
4、模拟量输出0~5V电压,浓度越高电压越高。
5、对液化气,天然气,城市煤气有较好的灵敏度。
6、具有长期的使用寿命和可靠的稳定性
7、快速的响应恢复特性
特别提醒:
传感器通电后,需要预热20S左右,测量的数据才稳定,传感器发热属于正常现象,因为内部有电热丝,如果烫手就不正常了。
4软件设计与分析
本系统的编程部分工作采用Keil_C51语言完成,KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。
运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。
如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
4.1程序主流程图:
否
是
是
否
4.2初始化定时器程序
voidinit()//初始化定时器
{
TMOD=0X11;
TH0=0xFE;TL0=0x36;
TH1=0xFC;TL1=0x18;
TR0=1;
EA=1;
ET0=1;
ET1=1;
}
4.3四位共阴数码管的动态显示程序
/***********************数码位选函数*****************************/
voidsmg_we_switch(uchari)
{
switch(i)
{
case0:
smg_we1=0;smg_we2=1;smg_we3=1;smg_we4=1;break;
case1:
smg_we1=1;smg_we2=0;smg_we3=1;smg_we4=1;break;
case2:
smg_we1=1;smg_we2=1;smg_we3=0;smg_we4=1;break;
case3:
smg_we1=1;smg_we2=1;smg_we3=1;smg_we4=0;break;
}
}
/***********************数码显示函数*****************************/
voiddisplay()
{
staticuchari;
i++;
if(i>smg_i)
i=0;
smg_we_switch(i);//位选
P0=dis_smg[i];//段选
}
5系统调试
单片机应用系统的调试是系统开发的重要环节。
当完成了单片机应用系统的硬件设计、软件设计和硬件组装后,便可进入应用系统调试阶段。
系统调试的目的是查出系统中硬件设计与软件设计中存在的错误以及可能出现的不协调问题,以便修改设计,最终使系统能正确地工作。
单片机应用系统的调试分为硬件调试、软件调试和脱机运行调试三个部分。
5.1硬件调试
5.1.1最小系统调试
(1)上电复位后,用万用表测量单片机VCC和GND为5V;
(2)上电复位后,晶振起振,晶振两端电压约为1.5V~2V;
(3)上电复位后,万用表测量9脚为低电平;
(4)没烧录程序时,万用表测量各I/O口输出高电平,约5V;
(5)30脚,产生频率,万用表测量为高电平,约5V;
(6)31脚,接VCC,万用表测量为高电平,约5V;
5.1.2四位数码管调试
将公共端接电源,其他端分别接GND,测得各端亮,说明数码管属于共阴数码管,且数码管各端LED发光管正常。
5.2软件调试
程序按照流程图编程,数码管采用动态显示的方法,利用定时器0的工作方式1,在中断函数中对数码管的公共端进行位选控制。
为了防止PCB连接数码管时有很多跳线,原理图上将数码管个引脚的连接方式进行了修改,而程序的0~9段代码为:
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};导致电路板上电时数码管显示乱码;经过修改段代码为:
{0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7}后,测试数码管显示正常。
5.3脱机运行调试
在焊完成后,程序烧录进去,上电后四位数码管都亮,说明P2口已开始进行位选工作;查看程序仿真合理,单片机最小系统正常工作;
用万用表检测数码管的各引脚电压,发现有两个引脚电压与单片机P0口段选输出电压不同,说明有断线;
整块电路板完全符合设计要求。
6总结
按照脱机运行调试的电路板的情况来看,完全符合设计要求,应该是一个成功的设计。
实训中也暴露出在理论学习中的不足之处,对单片机的很多方面内容还不够了解,有些地方还需有待加强学习,正是理论学习的不足导致对作品原理图正确性的怀疑。
通过不断地翻书查资料确定设计的原理图没问题后,才开始制作电路板。
制作电路板的工作是交给我的队友。
最后的电路板,只有几根断线而已,补接好后,功能都能实现,一次成功,出乎我的意料,他向我展示了他强大的动手能力;也得益于我设计的原理图和PCB,都经过我的反复检查。
对此作品的软件程序编写,经XX找到了些程序,但这些程序不符合我的设计原理图。
要得到能够实现功能的火灾报警器程序,我能从零开始编程。
经过参考单片机实验指导书,编写的这个结构清晰简单,实现的功能也很全面,但感觉程序太琐长,不善精简。
谢辞
两周的实训结束了,由衷感谢我的指导老师。
周光祥老师对我遇到的问题总是耐心解答和悉心指导;提出了许多富有启发性的建议和具有创意的想法;
在这次毕业设计中,得益于学校的各方面资源,图书馆可以查找到许多相关的有用的书籍资料、图书馆网站上的数据库也给我提供了不少参考,这些都给我们创造一个良好的学习、设计环境。
在跟随周光祥老师学习期间,我学到了许多从未接触过的知识,受益匪浅。
感谢桂林电子科技大学和诸位老师对我的培养和教育,同时也感谢学院为我提供良好的做毕业设计的环境。
本文参考了大量的文献资料,在此,向各学术界的前辈们致敬!
附录1:
火灾报警器原理图:
附录2:
火灾报警器PCB图:
附录3:
火灾报警器程序
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodesmg_du[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7};//段码
uchardis_smg[]={0x80,0x80,0x80,0x80};
ucharsmg_i=4;//数码管的显示个位数
sbitsmg_we1=P2^3;
sbitsmg_we2=P2^2;
sbitsmg_we3=P2^1;
sbitsmg_we4=P2^0;
sbitdq=P1^0;//温度传感器DS18B20输出
sbitkey=P1^1;//烟雾传感器MQ-2经LM358放大输出低电平信号
sbitled_g=P1^5;
sbitled_r=P1^6;
sbitbeeper=P1^7;
bitflag_wd_z_f;//正负温度
inttemperature;
/***********************1ms延时函数*****************************/
voiddelay_1ms(uintq)
{
uinti,j;
for(i=0;ifor(j=0;j<120;j++);
}
/***********************小延时函数*****************************/
voiddelay_uint(uintq)
{while(q--);}
/***********************数码位选函数*****************************/
voidsmg_we_switch(uchari)
{
switch(i)
{
case0:
smg_we1=0;smg_we2=1;smg_we3=1;smg_we4=1;break;
case1:
smg_we1=1;smg_we2=0;smg_we3=1;smg_we4=1;break;
case2:
smg_we1=1;smg_we2=1;smg_we3=0;smg_we4=1;break;
case3:
smg_we1=1;smg_we2=1;smg_we3=1;smg_we4=0;break;
}
}
/***********************数码显示函数*****************************/
voiddisplay()
{
staticuchari;
i++;
if(i>smg_i)i=0;
smg_we_switch(i);//位选
P0=dis_smg[i];//段选
}
/***********************18b20初始化函数*****************************/
voidinit_18b20()
{
bitq;
dq=1;//把总线拿高
delay_uint
(1);//15us
dq=0;//给复位脉冲
delay_uint(80);//750us
dq=1;//把总线拿高等待
delay_uint(10);//110us
q=dq;//读取18b20初始化信号
delay_uint(20);//200us
dq=1;//把总线拿高释放总线
}
/*************写18b20内的数据***************/
voidwrite_18b20(uchardat)
{chari;
for(i=0;i<8;i++)
{//写数据是低位开始
dq=0;//把总线拿低写时间隙开始
dq=dat&0x01;//向18b20总线写数据了
delay_uint(5);//60us
dq=1;//释放总线
dat>>=1;
}}
/*************读取18b20内的数据***************/
ucharread_18b20()
{chari,value;
for(i=0;i<8;i++)
{q=0;//把总线拿低读时间隙开始
value>>=1;//读数据是低位开始
dq=1;//释放总线
if(dq==1)//开始读写数据
value|=0x80;
delay_uint(5);//60us读一个时间隙最少要保持60us的时间
}
returnvalue;//返回数据
}
/*************读取温度的值读出来的是小数***************/
uintread_temp()
{
uintvalue;
ucharlow;
init_18b20();//初始化18b20
write_18b20(0xcc);//跳过64位ROM
write_18b20(0x44);//启动一次温度转换命令
delay_uint(50);//500us
init_18b20();//初始化18b20
EA