找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14645|回复: 3
收起左侧

单片机火焰检测报警器-课程设计报告 含源程序

  [复制链接]
ID:416863 发表于 2018-10-28 20:30 | 显示全部楼层 |阅读模式
目录

摘  要
第一章  绪论
第二章 总体内容及设计
2.1 总体内容设计及目标
2.2 组员及任务
第三章 电路设计及元器件选型
3.1 AT89C52单片机控制模块电路原理图设计
3.2晶振起振模块电路与功能
3.3 1602液晶屏显示模块电路原理图设计
3.4声音报警模块电路原理图设计
3.5红外火焰传感器功能及电路
第四章 程序设计
4.1输入部分程序
4.2输出部分程序
4.3定时应用与功能
第五章 电路设计及结果
第六章 总结
参考文献
摘  要
本论文以红外火焰检测传感器和单片机技术为核心并与其它电子技术相结合,设计出一种技术水平较好的红外火焰检测报警器, 用于火焰检测, 可检测 760 纳米~1100 纳米范围内的热源,火焰探测角度为 60°范围。以STC89C52单片机和Realplay火焰检测传感器为核心设计的火焰检测报警器可实现声光报警、1602液晶屏显示报警等功能。是一种结构简单、性能稳定、使用方便、价格低廉、智能化的火焰检测报警器。其中选用红外火焰检测传感器实现各种火焰的检测,具有灵敏度高、响应快、抗干扰能力强等优点,而且价格低廉,使用寿命长。选用的STC89C52单片机,具有高速、低功耗、超强抗干扰等优点,是目前同类技术中性价比较高的产品。本报警装置具有一定的实用价值。
第一章  绪论
随着经济的发展,高层建筑、地下建筑以及大型综合性建筑日益增多火灾隐患也随之增加,火灾发生的数量及其造成的损失都呈逐年上升趋势,因此,火灾报警系统成为保障人生命财产安全的重要因素。
火灾报警系统在国内的发展情况是我国火灾报警系统起步较发达国家晚几十年,从上世纪70年代我国才开始研制生产火灾报警系统产品。进入80年代后,国内厂家也多是模仿国外产品,或是引进国外技术进行生产,没有真正意义上的核心技术,并且市场也刚刚开始发育。火灾报警产品真正开始发展是在90年代以后,随着政府逐渐开放国门,国外企业开始大量进入中国消防市场,带来先进技术的同时也促进了市场的成熟。这时期,我国生产火灾报警产品的企业也得到了快速发展,部分企业进行了合资生产、技术合作,取得了不菲的成绩,也造就现今市场上许多有实力的商家,部分技术已接近赶上了国际水平。
本设计采用红外火焰检测传感器、AT89C52单片机以及1062LED液晶屏显示模块设计的一种智能火灾报警器,可以实现声光报警、液晶屏显示有无火源等功能。是一种结构简单、性能稳定、使用方便、价格低廉、智能化的火灾报警器,具有一定的实用价值。
第二章 总体内容及设计2.1 总体内容设计及目标
报警系统主要由数据采集模块、单片机控制模块、晶振起振模块、声光报警模块、液晶屏显示模块、电源模块组成。图2-1为火焰检测报警器的系统结构框图。
图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口初始化,液晶屏初始化完成后停留在一个设定状态,等待信号驱动。

                                                       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口,显示相应的数组。




                  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++;
                   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++;
                                                                         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. #include <reg51.h>
  2. #include <intrins.h>

  3. typedef unsigned char BYTE;
  4. typedef bit BOOL;

  5. int i,j,display=0,t02s;
  6. sbit LCD_RS = P2^5;
  7. sbit LCD_RW = P2^6;
  8. sbit LCD_EP = P2^7;
  9. sbit warning = P3^2;
  10. sbit beep = P3^4;
  11. //////////////显示数组
  12. BYTE code dis1[] = {" WELCOME TO "};
  13. BYTE code dis2[] = {"3W.auto-ctrl.COM"};
  14. BYTE code dis3[] = {" TEST...... "};
  15. BYTE code dis5[] = {"WWW.auto-ctrl.COM"};
  16. BYTE code Fire[] = {"Fire "};
  17. BYTE code Safe[] = {"Safe "};

  18. void flash();
  19. void delay(int ms)
  20. {                            // 延时子程序
  21.               while(ms--)
  22.               {
  23.                 for(i = 0; i< 250; i++)
  24.       {
  25.                  _nop_();
  26.                 }
  27.               }
  28. }

  29. BOOL lcd_bz()
  30. {                             // 测试 LCD 忙碌状态
  31. BOOL result;
  32. LCD_RS = 0;
  33. LCD_RW = 1;
  34. LCD_EP = 1;
  35. _nop_();
  36. result = (BOOL)(P0 & 0x80);
  37. LCD_EP = 0;
  38. return result;
  39. }

  40. void lcd_wcmd(BYTE cmd)
  41. {                            // 写入指令数据到 LCD
  42. while(lcd_bz());
  43. LCD_RS = 0;
  44. LCD_RW = 0;
  45. LCD_EP = 0;
  46. _nop_();
  47. P0 = cmd;
  48. _nop_();
  49. LCD_EP = 1;
  50. _nop_();
  51. LCD_EP = 0;
  52. }

  53. void lcd_pos(BYTE pos)
  54. {                               //设定显示位置
  55. lcd_wcmd(pos | 0x80);
  56. }

  57. void lcd_wdat(BYTE dat)
  58. {                               //写入字符显示数据到 LCD
  59. while(lcd_bz());
  60. LCD_RS = 1;
  61. LCD_RW = 0;
  62. LCD_EP = 0;
  63. P0 = dat;
  64. _nop_();
  65. _nop_();
  66. LCD_EP = 1;
  67. _nop_();
  68. _nop_();
  69. LCD_EP = 0;
  70. }

  71. void lcd_init()
  72. {                      //LCD 初始化设定
  73. lcd_wcmd(0x38);        //16*2 显示,5*7 点阵,8 位数据
  74. delay(1);
  75. lcd_wcmd(0x0c);        //显示开,关光标
  76. delay(1);
  77. lcd_wcmd(0x06);        //移动光标
  78. delay(1);
  79. lcd_wcmd(0x01);        //清除 LCD 的显示内容
  80. delay(1);
  81. }


  82. main()
  83. {
  84.               BYTE i;
  85.               int j=0;
  86.               lcd_init();            // 初始化 LCD
  87.               delay(10);
  88.               lcd_wcmd(0x06);        //向右移动光标
  89.               while(1)
  90.               {
  91.                 switch(display)
  92.       {
  93.                             case 0:
  94.                             {
  95.                                           i=0;
  96.                                           while(dis2[ i ] != '\0')
  97.                                           {
  98.                                                         lcd_pos(0x80+i);
  99.                                                         lcd_wdat(dis2[ i]);
  100.                                                         i++;
  101.                                                         delay(300);
  102.                                           }
  103.                                           flash();
  104.                                           lcd_wcmd(0x01); //清除 LCD 的显示内容
  105.                                           delay(20); //控制两屏转换时间
  106.                                           display = 1;
  107.                                           lcd_wcmd(0x06); //向右移动光标
  108.                             }
  109.                             break;
  110.                             case 1:
  111.                             {
  112.                               delay(300);
  113.           i = 0;
  114.           while(dis1[ i] != '\0')
  115.           {            //显示字符" "
  116.             lcd_pos(0x8A+i); //设置显示位置为第一行第 17 列
  117.             lcd_wdat(dis1[i]);
  118.             i++;
  119.           }
  120.           delay(300);
  121.           i = 0;
  122.                               while(dis5[i] != '\0')
  123.                               {
  124.             lcd_pos(0x4f+i); //设置显示位置为第一行第 17 列
  125.          //显示字符" "
  126.             lcd_wdat(dis5[i]);
  127.             i++;
  128.           }
  129.           delay(300);
  130.           for(j=0;j<16;j++) //向左移动 16 格
  131.           {
  132.             lcd_wcmd(0x18); //字符同时左移一格
  133.             delay(800); //控制移动时间
  134.           }
  135.                display=2;
  136.         }
  137.         break;
  138.          case 2:
  139.          {
  140.            flash();
  141.            delay(1000);
  142.            lcd_wcmd(0x01); //清除 LCD 的显示内容
  143.            delay(20); //控制两屏转换时间
  144.            display = 3;
  145.            lcd_wcmd(0x06); //向右移动光标
  146.           }
  147.         break;
  148.          case 3:
  149.          {
  150.                                           i=0;
  151.                                           while(dis3[ i ] != '\0')
  152.                                           {
  153.                                             lcd_pos(0x80+i);
  154.                                             lcd_wdat(dis3[ i]);
  155.                                             i++;
  156.                                             delay(30);
  157.             }
  158.                                                         display=4;
  159.                             }
  160.         break;
  161.          case 4:
  162.          {
  163.             if(warning == 0) //有光照时传感器输出低电平
  164.             {
  165.               //delay(300);
  166.               if(warning == 0)
  167.               {
  168.                  i=0;
  169.                  while(Fire[ i ] != '\0')
  170.                  {
  171.                    lcd_pos(0x43+i);
  172.                    lcd_wdat(Fire[ i]);
  173.                    i++;
  174.                    delay(30);
  175.                  }
  176.                  for(i=0;i<3;i++)
  177.                  {
  178.                    beep = 0;
  179.                    delay(200);
  180.                    beep = 1;
  181.                    delay(200);
  182.                  }
  183.                }
  184.              }
  185. //////////////////////////////////////////
  186.                 if(warning == 1)
  187.                 {
  188.                   // delay(300);
  189.                   if(warning == 1)
  190.                   {
  191.                      i=0;
  192.                      while(Safe[ i ] != '\0')
  193.                      {
  194.                        lcd_pos(0x43+i);
  195.                        lcd_wdat(Safe[ i]);
  196.                                                                          i++;
  197.                                                                          delay(30);
  198.                                                                       }
  199.                      beep = 1;
  200.                      // delay(300);
  201.                    }
  202.                  }
  203.          }
  204.          break;
  205.          default:
  206.          break;
  207.         }
  208.      }
  209. ……………………
  210. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
火焰检测报警器-课程设计.doc (7.15 MB, 下载次数: 112)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:682260 发表于 2020-1-6 16:10 | 显示全部楼层
赞 想下载
回复

使用道具 举报

ID:766661 发表于 2020-6-3 11:26 | 显示全部楼层
想要仿真文件
回复

使用道具 举报

ID:755250 发表于 2020-6-12 21:08 | 显示全部楼层
支持一下.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表