资源描述
广州学院
嵌入式技术应用项目说明书
(火焰检测报警器)
院(系) 机械工程学院
专 业 机械电子工程
班 级 12机电2班
学生姓名 利齐帅 徐杰龙 林辉 梁庆堂
指导老师 王蕊
成 绩
2023年 10 月 10 日
课 程 设 计 任 务 书
兹发给 12机电2 班学生利齐帅、徐杰龙、林辉、梁庆堂 课程设计任务书,内容如下:
1. 设计题目: 火焰检测报警器
2. 应完毕的项目:
(1) 设计说明书计算准确、书写工整,字数不少于3000字;图纸对的清楚,符合制图标准及有关规定。
(2)分组实现原理图设计及相关元器件的设计,按规定完毕总体电路。
(3)基于相关电路完毕电路设计、程序设计与实物。
(4)完毕总体内容,实现具体功能。
3. 参考资料以及说明:
(1)《电子线路CAD与实训》(电子工艺出版社)
(2)《电子工艺技术与实践》(机械工程出版社)
(3)《单片机原理及应用》(清华大学出版社)
(4)集成电路数据手册查询网:
(5)《新概念51单片机C语言教程:入门、提高、开发、拓展全攻略》(电子工业出版社)
4. 本设计任务书于2023年 11月16日发出,应于2023年11月27日前完毕,然后进行答辩。
指导教师 签发 2023 年 11 月 16 日
评语:
总评成绩:
指导教师签字:
年 月 日
目 录
摘 要 4
第一章 绪论 5
第二章 总体内容及设计 6
2.1 总体内容设计及目的 6
2.2 成员及任务 6
第三章 电路设计及元器件选型 7
3.1 AT89C52单片机控制模块电路原理图设计 7
3.2晶振起振模块电路与功能 8
3.3 1602液晶屏显示模块电路原理图设计 9
3.4声音报警模块电路原理图设计 11
3.5红外火焰传感器功能及电路 11
第四章 程序设计 13
4.1输入部分程序 13
4.2输出部分程序 14
4.3定期应用与功能 16
第五章 电路设计及结果 17
第六章 总结 19
参考文献 20
摘 要
本论文以红外火焰检测传感器和单片机技术为核心并与其它电子技术相结合,设计出一种技术水平较好的红外火焰检测报警器, 用于火焰检测, 可检测 760 纳米~1100 纳米范围内的热源,火焰探测角度为 60°范围。以STC89C52单片机和Realplay火焰检测传感器为核心设计的火焰检测报警器可实现声光报警、1602液晶屏显示报警等功能。是一种结构简朴、性能稳定、使用方便、价格低廉、智能化的火焰检测报警器。其中选用红外火焰检测传感器实现各种火焰的检测,具有灵敏度高、响应快、抗干扰能力强等优点,并且价格低廉,使用寿命长。选用的STC89C52单片机,具有高速、低功耗、超强抗干扰等优点,是目前同类技术中性价比较高的产品。本报警装置具有一定的实用价值。
关键词:火焰传感器;声光报警器;液晶屏;STC89C52
第一章 绪论
随着经济的发展,高层建筑、地下建筑以及大型综合性建筑日益增多火灾隐患也随之增长,火灾发生的数量及其导致的损失都呈逐年上升趋势,因此,火灾报警系统成为保障人生命财产安全的重要因素。
火灾报警系统在国内的发展情况是我国火灾报警系统起步较发达国家晚几十年,从上世纪70年代我国才开始研制生产火灾报警系统产品。进入80年代后,国内厂家也多是模仿国外产品,或是引进国外技术进行生产,没有真正意义上的核心技术,并且市场也刚刚开始发育。火灾报警产品真正开始发展是在90年代以后,随着政府逐渐开放国门,国外公司开始大量进入中国消防市场,带来先进技术的同时也促进了市场的成熟。这时期,我国生产火灾报警产品的公司也得到了快速发展,部分公司进行了合资生产、技术合作,取得了不菲的成绩,也造就现今市场上许多有实力的商家,部分技术已接近赶上了国际水平。
本设计采用红外火焰检测传感器、AT89C52单片机以及1062LED液晶屏显示模块设计的一种智能火灾报警器,可以实现声光报警、液晶屏显示有无火源等功能。是一种结构简朴、性能稳定、使用方便、价格低廉、智能化的火灾报警器,具有一定的实用价值。
第二章 总体内容及设计
2.1 总体内容设计及目的
报警系统重要由数据采集模块、单片机控制模块、晶振起振模块、声光报警模块、液晶屏显示模块、电源模块组成。图2-1为火焰检测报警器的系统结构框图。
火焰传感器
信号放大电路
A/D转换电路
电源模块
STC89C52单片机
声光报警
液晶屏显示报警
图2-1 系统结构框图
AT89C52单片机控制模块用于实时监测外部中断的电平变化,当红外火焰传感器检测到有火焰时,火焰传感器会输出低电平数字信号,单片机将数据转换为相应的数字显示在液晶屏上或声光报警;晶振起振模块为系统提供基本的时钟信号; USB下载/电源模块为单片机的电源接口,为单片机提供电源及程序烧录。
2.2 成员及任务
成员:徐杰龙、利齐帅、林辉、梁庆堂
任务分派:
徐杰龙:负责总体电路的原理图完善,程序流程图设计和编写程序。
利齐帅:负责AT89C52单片机控制模块、电源模块原理图绘制,AT89C52原理图元件。
林辉:查找集成电路数据手册、查找资料。
梁庆堂:负责晶振起振模块、1602液晶屏显示模块原理图绘制
第三章 电路设计及元器件选型
3.1 AT89C52单片机控制模块电路原理图设计
单片机控制模块采用AT89C51芯片作为主控芯片,所谓的单片机是将计算机的基本部件微型化并集成到一块芯片上,具有独特功能的微型计算机,通常片内都具有CPU、ROM、RAM、并行I/O、串行I/O、定期器/计数器、中断控制、系统时钟及系统总线等。单片机全称为单片微型计算机,又称微控制器或嵌入式控制器,是一种可通过编程控制的解决器。
如图3-1所示,单片机的VCC引脚需要接入+5V电源电压正极,GND引脚需要接入电源电压的负极。
图3-1 AT89C52单片机芯片
EA引脚(外部程序存储器访问控制端)是单片机的外部程序存储器访问控制端,假如它接高电平VCC,则单片机执行片内部程序存储器中的程序,从000H开始终止于0FFFH,并在读取完单片机内部程序存储器的0FFFH后自动转向读取外部的程序存储器,一般只用单片机的内部程序存储器,故接高电平;假如接低电平,则单片机访问的所有是外部程序存储器,从0000H开始终止于0000FH。
AT89C51单片机共有P0、P1、P2、P3这4组I/O口,每组有8个I/O口,单片机复位时,这4组I/O口都默认作为输出端口使用。51单片机上电后,假如没有人为地控制其I/O口的状态,它所有未控制的I/O口都默认为高电平。
① P0口是一个开漏型双向I/O口,其内部没有上拉电阻,为高阻状态,所以不能正常地输出高/低电平,使用该I/O口要接100Ω的上拉电阻。P0口具有除一般I/O口外的第二重功能—作为低8位地址线。
② P1口是一组准双向8位I/O口,每个口可独立控制,内带上拉电阻,这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口,之所以称它为“准双向”是由于该口在作为输入使用前,要先向该口进行写1操作,然后单片机内部才干对的读出外部信号。也就是要使其有个“准备过程”,故称其为准双向口。
③ P2口是一组准双向8位I/O口,每个口可独立控制,内带上拉电阻,与P1口相似。P2口具有除一般I/O口外的第二重功能—作为高8位地址线。
3.2晶振起振模块电路与功能
晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步。如图3-2所示,XTAL1、XTAL2为时钟信号端,XTAL1为片内振荡电路的输入端,XTAL2为片内振荡电路的输出端。8051有两种工作方式,一是片内时钟振荡方式,另一种是外部时钟方式。片内时钟振荡电路需在XTAL1、XTAL2这两个引脚外接石英晶体和振荡电容,典型的晶振取11.0592MHz(由于可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的us级时间,方便定期操作),振荡电容的值一般取10pF~30pF的瓷片电容。
图3-2 晶振起振模块电路原理图
3.3 1602液晶屏显示模块电路原理图设计
液晶显示的原理是运用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。本设计字符式显示。用LCD显示一个字符时比较复杂,由于一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置相应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简朴了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM相应的地址,设立光标,在此送上该字符相应的代码即可。其电路原理图如图3-3。
图3-3 1602液晶屏显示模块电路原理图
1602采用标准的16脚接口,其中:
第1脚:VSS为地电源
第2脚:VDD接5V正电源
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15~16脚:空脚
1602液晶模块内部的控制器共有11条控制指令,如表3-1所示:
表3-1 控制命令表
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.4声音报警模块电路原理图设计
该设计使用的是无源蜂鸣器,如图3-4所示。由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O 口是无法直接驱动的,所以要运用放大电路来驱动,一般使用三极管来放大电流就可以了。声报警电路由单片机的P3.4引脚进行控制,当P3.4输出的电平为高电平时,三极管导通,蜂鸣器的电流形成回路,发出声音报警;否则,三极管截止,蜂鸣器不发出声音。
图3-4 声音报警电路
3.5红外火焰传感器功能及电路
火焰传感器是机器人专门用来搜寻火源的传感器,当然火焰传感器也可以用来检测光线的亮度,只是本传感器对火焰特别灵敏。火焰传感器运用红外线对对火焰非常敏感的特点,使用特制的红外线接受管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号,输入到中央解决器中,中央解决器根据信号的变化做出相应的程序解决。如图3-5所示。
图3-5 火焰传感器电路原理图
用途: 各种火焰,火源探测
模块特色:
1、 可以检测火焰或者波长在760纳米~1100纳米范围内的光源,打火机测试火焰距离为80cm,对火焰越大,测试距离越远
2、 探测角度60度左右,对火焰光谱特别灵敏
3 、灵敏度可调(图中蓝色数字电位器调节)
4、比较器输出,信号干净,波形好,驱动能力强,超过15mA
5、配可调精密电位器调节灵敏度
6、工作电压3.3V-5V
7、输出形式 :DO数字开关量输出(0和1)和AO模拟电压输出
8、设有固定螺栓孔,方便安装
9、小板PCB尺寸:3.2cm x 1.4cm 10、使用宽电压LM393比较器
模块使用说明:
1 、火焰传感器对火焰最敏感,对普通光也是有反映的,一般用做火焰报警等用途。
2、 小板输出接口可以与单片机IO口直接相连
3、传感器与火焰要保持一定距离,以免高温损坏传感器,对打火机测试火焰距离为80cm,对火焰越大,测试距离越远
4、小板模拟量输出方式和AD转换解决,可以获得更高的精度
第四章 程序设计
4.1输入部分程序
程序流程图如图4-1所示,通电时寄存器初始化、单片机I/O口初始化,液晶屏初始化完毕后停留在一个设定状态,等待信号驱动。
开始
寄存器初始化
单片机I/O口初始化
主函数循环
检测是否有火焰
等待解决、显示
N
Y
图4-1 输入程序流程图
以下为系统初始化过程后显示子程序。
void lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(BYTE dat)
{ //写入字符显示数据到 LCD
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
void lcd_init()
{ //LCD 初始化设定
lcd_wcmd(0x38); //16*2 显示,5*7 点阵,8 位数据
delay(1);
lcd_wcmd(0x0c); //显示开,关光标
delay(1);
lcd_wcmd(0x06); //移动光标
delay(1);
lcd_wcmd(0x01); //清除 LCD 的显示内容
delay(1);
}
4.2输出部分程序
程序流程图如图4-2所示,程序开始运营时,定义液晶屏显示的数组,程序进入主函数,执行显示指令,当有火焰时,火焰传感器输出低电平信号0,单片机根据数据信号传送到液晶屏的相应I/O口,显示相应的数组。
开始
初始化液晶屏,电源灯亮
从火焰传感器采集信号
是否检测到火焰
蜂鸣器不响,液晶显示“TEST……..Safe”,LED灯不亮
蜂鸣器报警,液晶显示“TEST……..Fire”,LED灯亮。
Y N
图4-2 输出程序流程图
以下为液晶屏显示函数内容。
if(warning == 0) //有光照时传感器输出低电平
{
//delay(300);
if(warning == 0)
{
i=0;
while(Fire[ i ] != '\0')
{
lcd_pos(0x43+i);
lcd_wdat(Fire[i]);
i++;
delay(30);
}
for(i=0;i<3;i++)
{
beep = 0;
delay(200);
beep = 1;
delay(200);
}
}
}
//////////////////////////////////////////
if(warning == 1)
{
// delay(300);
if(warning == 1)
{
i=0;
while(Safe[ i ] != '\0')
{
lcd_pos(0x43+i);
lcd_wdat(Safe[i]);
i++;
delay(30);
}
beep = 1;
// delay(300);
}
}
}
break;
4.3定期应用与功能
本次设计重要使用了_nop_延时来实现定期功能,它的作用为:对于延时很短的,规定在us级的,采用“_nop_”函数,这个函数相称汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,规定在大于10us,采用C51中的循环语句来实现。
第五章 电路设计及结果
如图5-1为本设计的总体电路原理图,该图是采用Altium Designer电子线路绘图软件完毕的,图中的各种元器件都是根据设计电路严格选定的,并且其参数大小跟设计电路完全一致。图5-2为无火焰时的实物显示,图5-3为有火焰时的实物显示。
图5-1 总体电路原理图
图5-2 无火焰时的实物显示
图5-3 有火焰时的实物显示
现象:当给板子供板子的时候,蜂鸣器不响,液晶显示“TEST……..Safe”,LED灯不亮。当出现火焰时蜂鸣器响进行报警,液晶显示“TEST……..Fire”,LED红灯亮。
第六章 总结
本次课程设计对于我们有很大的帮助,大学已经度过了三年,但是我们还只是停留在理论的学习上。但通过本次课程设计,使我对《模拟电子技术》这门课程有了更进一步的理解。《模拟电子技术》是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强软件实践。一个人的力量是有限的,要想把课程设计做的更好,就要学会参考一定的资料,小组共同努力,让思想有机的结合起来,得出实验结果。
在这个过程中,我们也曾经由于仿真失败而纠结。但结果还是很给力的,虽然这只是一次的极简朴的课程制作,可是平心而论,也花费了我不少的心血,这就让我不得不佩服开发技术的前辈,才意识到老一辈对我们社会的付出,为了人们的生活更美好,他们为我们社会所付出多少心血啊!
知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面尚有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆!
通过这次的课程设计我们对于专业课的学习有了更加深刻的结识,认为现在学的知识用不上就加以怠慢,等到想用的时候却发现自己的学习本来是那么的不扎实。以后努力学好每门专业课,让自己拥有更多的知识,才干解决更多的问题!
参考文献
[1] 王国玉,管莉.电子线路CAD与实训[M].北京:电子工业出版社,2023
[2] 林海汀.电子工艺技术与实践[M].北京:机械工业出版社,2023
[3] 郭天祥.新概念51单片机C语言教程:入门、提高、开发、拓展全攻略[M].北京:电子工业出版社,2023
[4] 黄勤.单片机原理及应用[M].北京:清华大学出版社,2023
[5] 集成电路数据手册查询网:
附 件
~~~~~~~完整程序~~~~~~~
#include <reg51.h>
#include <intrins.h>
typedef unsigned char BYTE;
typedef bit BOOL;
int i,j,display=0,t02s;
sbit LCD_RS = P2^5;
sbit LCD_RW = P2^6;
sbit LCD_EP = P2^7;
sbit warning = P3^2;
sbit beep = P3^4;
//////////////显示数组
BYTE code dis1[] = {" WELCOME TO "};
BYTE code dis2[] = {"3W.auto-ctrl.COM"};
BYTE code dis3[] = {" TEST...... "};
BYTE code dis5[] = {"WWW.auto-ctrl.COM"};
BYTE code Fire[] = {"Fire "};
BYTE code Safe[] = {"Safe "};
void flash();
void delay(int ms)
{ // 延时子程序
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试 LCD 忙碌状态
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
_nop_();
result = (BOOL)(P0 & 0x80);
LCD_EP = 0;
return result;
}
void lcd_wcmd(BYTE cmd)
{ // 写入指令数据到 LCD
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
_nop_();
P0 = cmd;
_nop_();
LCD_EP = 1;
_nop_();
LCD_EP = 0;
}
void lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(BYTE dat)
{ //写入字符显示数据到 LCD
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat;
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
LCD_EP = 0;
}
void lcd_init()
{ //LCD 初始化设定
lcd_wcmd(0x38); //16*2 显示,5*7 点阵,8 位数据
delay(1);
lcd_wcmd(0x0c); //显示开,关光标
delay(1);
lcd_wcmd(0x06); //移动光标
delay(1);
lcd_wcmd(0x01); //清除 LCD 的显示内容
delay(1);
}
main()
{
BYTE i;
int j=0;
lcd_init(); // 初始化 LCD
delay(10);
lcd_wcmd(0x06); //向右移动光标
while(1)
{
switch(display)
{
case 0:
{
i=0;
while(dis2[ i ] != '\0')
{
lcd_pos(0x80+i);
lcd_wdat(dis2[i]);
i++;
delay(300);
}
flash();
lcd_wcmd(0x01); //清除 LCD 的显示内容
delay(20); //控制两屏转换时间
display = 1;
lcd_wcmd(0x06); //向右移动光标
}
break;
case 1:
{
delay(300);
i = 0;
while(dis1[i] != '\0')
{ //显示字符" "
lcd_pos(0x8A+i); //设立显示位置为第一行第 17 列
lcd_wdat(dis1[i]);
i++;
}
delay(300);
i = 0;
while(dis5[i] != '\0')
{
lcd_pos(0x4f+i); //设立显示位置为第一行第 17 列
//显示字符" "
lcd_wdat(dis5[i]);
i++;
}
delay(300);
for(j=0;j<16;j++) //向左移动 16 格
{
lcd_wcmd(0x18); //字符同时左移一格
delay(800); //控制移动时间
}
display=2;
}
break;
case 2:
{
flash();
delay(1000);
lcd_wcmd(0x01); //清除 LCD 的显示内容
delay(20); //控制两屏转换时间
display = 3;
lcd_wcmd(0x06); //向右移动光标
}
break;
case 3:
{
i=0;
while(dis3[ i ] != '\0')
{
lcd_pos(0x80+i);
lcd_wdat(dis3[i]);
i++;
delay(30);
}
display=4;
}
break;
case 4:
{
if(warning == 0) //有光照时传感器输出低电平
{
//delay(300);
if(warning == 0)
{
i=0;
while(Fire[ i ] != '\0')
{
lcd_pos(0x43+i);
lcd_wdat(Fire[i]);
i++;
delay(30);
}
for(i=0;i<3;i++)
{
beep = 0;
delay(200);
beep = 1;
delay(200);
}
}
}
//////////////////////////////////////////
if(warning == 1)
{
// delay(300);
if(warning == 1)
{
i=0;
while(Safe[ i ] != '\0')
{
lcd_pos(0x43+i);
lcd_wdat(Safe[i]);
i++;
delay(30);
}
beep = 1;
// delay(300);
}
}
}
break;
default:
break;
}
}
}
void flash()
{
for(i=0;i<12;i++)
{
delay(600); //控制停留时间
}
lcd_wcmd(0x08); //关闭显示
for(i=0;i<12;i++)
{
delay(200);
}
lcd_wcmd(0x0c);
for(i=0;i<12;i++)
{
delay(200);
展开阅读全文