资源描述
广州学院
嵌入式技术应用项目说明书
(火焰检测报警器)
院(系) 机械工程学院
专 业 机械电子工程
班 级 12机电2班
学生姓名 利齐帅 徐杰龙 林辉 梁庆堂
指导老师 王蕊
成 绩
10 月 10 日
课 程 设 计 任 务 书
兹发给 12机电2 班学生利齐帅、徐杰龙、林辉、梁庆堂 课程设计任务书,内容以下:
1. 设计题目: 火焰检测报警器
2. 应完成项目:
(1) 设计说明书计算正确、书写工整,字数不少于3000字;图纸正确清楚,符合制图标准及相关要求。
(2)分组实现原理图设计及相关元器件设计,按要求完成总体电路。
(3)基于相关电路完成电路设计、程序设计和实物。
(4)完成总体内容,实现具体功效。
3. 参考资料和说明:
(1)《电子线路CAD和实训》(电子工艺出版社)
(2)《电子工艺技术和实践》(机械工程出版社)
(3)《单片机原理及应用》(清华大学出版社)
(4)集成电路数据手册查询网:
(5)《新概念51单片机C语言教程:入门、提升、开发、拓展全攻略》(电子工业出版社)
4. 本设计任务书于 11月16日发出,应于11月27日前完成,然后进行答辩。
指导老师 签发 年 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].北京:电子工业出版社,
[2] 林海汀.电子工艺技术和实践[M].北京:机械工业出版社,
[3] 郭天祥.新概念51单片机C语言教程:入门、提升、开发、拓展全攻略[M].北京:电子工业出版社,
[4] 黄勤.单片机原理及应用[M].北京:清华大学出版社,
[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);
}
lcd_wcmd(0x08);
for(i=0;i<12;i++)
{
delay(200);
}
lcd_wcmd(0x0c);
for(i=0;i<12;i++)
{
delay(200);
}
}
展开阅读全文