找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10303|回复: 19
打印 上一主题 下一主题
收起左侧

烟雾及温度报警器无火焰传感器LSR160416 完整资料包 仿真 程序 电路都有

  [复制链接]
跳转到指定楼层
楼主

烟雾及温度报警器无火焰传感器仿真图

LSR16041使用说明

说明:K1设置按键,用来设置设定报警温度和烟雾浓度。
K2增加,K3减少。K4确定,只有确定后设置的报警值才有用。
设定报警数值后,当温度或者烟雾浓度达到设定值就会报警。

烟雾及温度报警器无火焰传感器的程序(部分预览)完整版请下载附件:
  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include <intrins.h>
  4. #include <absacc.h>
  5. #include <ctype.h>
  6. #include <math.h>
  7. #include <string.h>
  8. //#include "I2C.h"
  9. #include "lcd1602.h"
  10. #include "adc0832.h"

  11. sbit K1= P1^2;
  12. sbit K2= P1^3;
  13. sbit K3= P1^4;
  14. sbit K4= P1^5;
  15. sbit K5= P1^6;
  16. sbit K6= P1^7;
  17. sbit DQ= P2^7;

  18. sbit BUZZ= P2^6;


  19. uchar tmpdisplay[8]; //定义显示缓存数组
  20. bit read_flag=0;        //定义读时钟标志位
  21. bit mode=0;                          //显示模式0正常1设定

  22. uchar set_position=0;

  23. uchar set_tempure=0;     //设定温度
  24. uchar set_smokescope=0;         //设定浓度
  25. int real_tempure=0;                //实际温度
  26. uchar real_smokescope=0; //实际烟雾浓度

  27. uchar cursor_position=0;//光标位置
  28.        
  29. uchar  time_counter_50ms=0;
  30. uchar  smokescope=0;
  31. uchar  first_read_tempe=0;//第一次读取温度数值


  32. unsigned char t[2],*pt;                                //用来存放温度值,测温程序就是通过这个数组与主函数通信的
  33. unsigned char  TempBuffer1[10]={0x2b,0x30,0x30,0x30,0x2e,0x30,0x30,0xdf,0x43,'\0'};//{0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0xdf,0x43,'\0'};
  34.                                                                 //显示实时温度,上电时显示+122.00C
  35. /*
  36. unsigned char  TempBuffer0[16]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,
  37.                                                                 0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,'\0'};        */
  38.                                                                 //显示温度上下限,上电时显示TH:+125 TL:+124C                                                       
  39. unsigned char code dotcode[4]={0,25,50,75};


  40. /***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******
  41. 再将表值分离出十位和个位后送到十分位和百分位********************/

  42. void covert1(void)        //将温度转换为LCD显示的数据
  43. {
  44.        
  45.    unsigned char x=0x00,y=0x00;
  46.    t[0]=*pt;
  47.    pt++;
  48.    t[1]=*pt;
  49.    if(t[1]>0x07)                    //判断正负温度
  50.    {
  51.     TempBuffer1[0]=0x2d;             //0x2d为"-"的ASCII码
  52.         t[1]=~t[1];                         /*下面几句把负数的补码*/
  53.         t[0]=~t[0];                  /* 换算成绝对值*********/
  54.         x=t[0]+1;                                 /***********************/
  55.         t[0]=x;                                         /***********************/
  56.         if(x>255)                /**********************/
  57.         t[1]++;                                 /*********************/
  58.    }
  59.    else TempBuffer1[0]=0x2b;        //0xfe为变"+"的ASCII码
  60.   t[1]<<=4;                //将高字节左移4位
  61.   t[1]=t[1]&0x70;                //取出高字节的3个有效数字位
  62.   x=t[0];                                        //将t[0]暂存到X,因为取小数部分还要用到它
  63.   x>>=4;                                        //右移4位
  64.   x=x&0x0f;                                        //和前面两句就是取出t[0]的高四位       
  65.   t[1]=t[1]|x;                        //将高低字节的有效值的整数部分拼成一个字节
  66.   TempBuffer1[1]=t[1]/100+0x30;                             //+0x30 为变 0~9 ASCII码
  67.    if( TempBuffer1[1]==0x30) TempBuffer1[1]=0xfe; //百位数消隐
  68.   TempBuffer1[2]=(t[1]%100)/10+0x30;                                //分离出十位
  69.   TempBuffer1[3]=(t[1]%100)%10+0x30;                                 //分离出个位
  70.   t[0]=t[0]&0x0c;                                                        //取有效的两位小数
  71.   t[0]>>=2;                                                                        //左移两位,以便查表
  72.   x=t[0];                                                                               
  73.   y=dotcode[x];                                                                        //查表换算成实际的小数
  74.   TempBuffer1[5]=y/10+0x30;                                                        //分离出十分位
  75.   TempBuffer1[6]=y%10+0x30;                                                        //分离出百分位
  76. }                       


  77. //十进制转为十六  ,比如把10转为0x10,注意区分
  78. uchar data_to_hex(uchar temp_data)
  79. {
  80.         return (temp_data/10*16+temp_data%10);
  81. }


  82. /********************************************************************
  83. * 名称 : Delay_1ms()
  84. * 功能 : 延时子程序,延时时间为 1ms * x
  85. * 输入 : x (延时一毫秒的个数)
  86. * 输出 : 无
  87. ***********************************************************************/
  88. void Delay_1ms(uint i)//1ms延时
  89. {
  90.         uchar x,j;
  91.         for(j=0;j<i;j++)
  92.         for(x=0;x<=148;x++);       
  93. }

  94. //*********************************
  95. //按键扫描程序
  96. //mode:0,不支持连续按;1,支持连续按;
  97. //*********************************
  98. uchar KEY_Scan(uchar mode)
  99. {         
  100.         static uchar key_up=1;//按键按松开标志
  101.         if(mode)key_up=1;  //支持连按                  
  102.         if(key_up&&(K1==0||K2==0||K3==0||K4==0||K5==0||K6==0))
  103.         {
  104.                 Delay_1ms(5);//去抖动
  105.                 key_up=0;
  106.                 if(K1==0)return 1;
  107.                 else if(K2==0)return 2;
  108.                 else if(K3==0)return 3;
  109.                 else if(K4==0)return 4;
  110.                 else if(K5==0)return 5;
  111.         }else if(K1==1&&K2==1&&K3==1&&K4==1&&K5==1&&K6==1)key_up=1;             
  112.         return 0;// 无按键按下
  113. }

  114. void delay_18B20(unsigned int i)
  115. {
  116.         while(i--);
  117. }

  118. /**********ds18b20初始化函数**********************/

  119. void Init_DS18B20(void)
  120. {
  121.          unsigned char x=0;
  122.          DQ = 1;          //DQ复位
  123.          delay_18B20(8);  //稍做延时
  124.          DQ = 0;          //单片机将DQ拉低
  125.          delay_18B20(80); //精确延时 大于 480us
  126.          DQ = 1;          //拉高总线
  127.          delay_18B20(14);
  128.          x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  129.          delay_18B20(20);
  130. }

  131. /***********ds18b20读一个字节**************/  

  132. unsigned char ReadOneChar(void)
  133. {
  134.         unsigned char i=0;
  135.         unsigned char dat = 0;
  136.         for (i=8;i>0;i--)
  137.          {
  138.                   DQ = 0; // 给脉冲信号
  139.                   dat>>=1;
  140.                   DQ = 1; // 给脉冲信号
  141.                   if(DQ)
  142.                   dat|=0x80;
  143.                   delay_18B20(4);
  144.          }
  145.         return(dat);
  146. }

  147. /*************ds18b20写一个字节****************/  

  148. void WriteOneChar(unsigned char dat)
  149. {
  150.         unsigned char i=0;
  151.         for (i=8; i>0; i--)
  152.         {
  153.                   DQ = 0;
  154.                 DQ = dat&0x01;
  155.             delay_18B20(5);
  156.                 DQ = 1;
  157.             dat>>=1;
  158. }
  159. }

  160. /**************读取ds18b20当前温度************/

  161. unsigned char *ReadTemperature(char TH,char TL,unsigned char RS)
  162. {        unsigned char tt[2];
  163.         Init_DS18B20();
  164.         WriteOneChar(0xCC);            // 跳过读序号列号的操作
  165.         WriteOneChar(0x4E);         // //写入"写暂存器"命令,修改TH和TL和分辩率配置寄存器
  166.                                                         //先写TH,再写TL,最后写配置寄存器
  167.         WriteOneChar(TH);                //写入想设定的温度报警上限
  168.         WriteOneChar(TL);                //写入想设定的温度报警下限
  169.         WriteOneChar(RS);                //写配置寄存器,格式为0 R1 R0 1,1 1 1 1
  170.                                                         //R1R0=00分辨率娄9位,R1R0=11分辨率为12位

  171.         delay_18B20(80);       // this message is wery important
  172.         Init_DS18B20();
  173.         WriteOneChar(0xCC);            // 跳过读序号列号的操作
  174.         WriteOneChar(0x44);         // 启动温度转换

  175.         delay_18B20(80);       // this message is wery important
  176.         Init_DS18B20();
  177.         WriteOneChar(0xCC);         //跳过读序号列号的操作
  178.         WriteOneChar(0xBE);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  179.         delay_18B20(80);

  180.         tt[0]=ReadOneChar();            //读取温度值低位
  181.         tt[1]=ReadOneChar();                   //读取温度值高位

  182.         return(tt);
  183. }


  184. void Time0_init()
  185. {
  186.         TMOD |= 0x01;                         //使用模式1,16位定时器
  187.         TH0   = (65536-50000)/256;        //定时器装入初始值10ms
  188.         TL0   = (65536-50000)%256;
  189.         EA    = 1;  //总中断
  190.         ET0   = 1;//定时器0初始化
  191.         TR0   = 1;

  192. }
  193. //************************************
  194. //定时器初始化
  195. //初始化为10MS定时器       
  196. //************************************
  197. void Time1_init()
  198. {
  199.         TMOD |= 0x10;                         //使用模式1,16位定时器
  200.         TH1   = (65536-10000)/256;        //定时器装入初始值10ms
  201.         TL1   = (65536-10000)%256;
  202.         EA    = 1;  //总中断
  203.         ET1   = 1;//定时器1初始化
  204.         TR1   = 1;

  205. }
  206. //换算采集的烟雾浓度AD值,转换为百分制
  207. void covert_scope_data(uchar temp_data)
  208. {         
  209.     uchar temp=0;
  210.         temp=(temp_data<<1)/5;
  211.         if(temp_data>127)temp+=50;
  212.         if(temp==100)
  213.         {
  214.                 LCD_Print(12,1,"100");
  215.         }
  216.         else
  217.         {
  218.                 LCD_Print(12,1," ");
  219.             write_secondline(13, data_to_hex(temp));       
  220.         }
  221.         real_smokescope=temp;       
  222. }

  223. void main()
  224. {
  225.         uchar tem=0;
  226.         BUZZ=1;
  227.         init_lcd1602();
  228.         Time0_init();
  229.         Time1_init();
  230.        
  231.         while(1)
  232.         {       
  233.                 switch(KEY_Scan(0))        //扫描按键
  234.                 {
  235.                         case 1://K1
  236.                                   mode=1;
  237.                                   set_position++;
  238.                                   if(set_position>2)set_position=1;
  239.                                   if(set_position==1)
  240.                                   {
  241.                                      cursor_position=6;
  242.                                    }
  243.                                    else if(set_position==2)
  244.                                    {
  245.                                          cursor_position=12;
  246.                                    }

  247.                                 break;
  248.                         case 2://K2
  249.                                 if(set_position==1)
  250.                                 {
  251.                                    set_tempure++;
  252.                                   
  253.                                 }
  254.                                 else if(set_position==2)
  255.                                 {
  256.                                         set_smokescope++;
  257.                                 }
  258.                                 break;
  259.                         case 3://K3
  260.                                 if(set_position==1)
  261.                                 {
  262.                                    set_tempure--;
  263.                                 }
  264.                                 else if(set_position==2)
  265.                                 {
  266.                                           set_smokescope--;
  267.                                 }
  268.                                 break;
  269.                         case 4://K4
  270.                                 set_position=0;
  271.                                 cursor_position=0;
  272.                                 mode=0;       
  273.                                 break;
  274.                 }
  275.                 if(set_tempure>120)set_tempure=30;        //限幅
  276.                 else if(set_tempure<30)set_tempure=120;
  277.                 if(set_smokescope>100) set_smokescope = 20;
  278.                 else if(set_smokescope<20) set_smokescope=100;

  279.                 write_com(0x0c);  //关闭光标闪烁

  280.                 if(set_tempure>=100)
  281.                 {
  282.                         LCD_Print(4,0,"1");
  283.                         tem=set_tempure-100;
  284.                 }
  285.                 else
  286.                 {
  287.                         LCD_Print(4,0," ");
  288.                         tem=set_tempure;       
  289.                 }
  290.                 write_firstline(5,data_to_hex(tem));

  291.                    if(set_smokescope>=100)
  292.                 {
  293.                         LCD_Print(10,0,"1");
  294.                         tem=set_smokescope-100;
  295.                 }
  296.                 else
  297.                 {
  298.                         LCD_Print(10,0," ");
  299.                         tem=set_smokescope;       
  300.                 }
  301.                 write_firstline(11,data_to_hex(tem));

  302.                 if((mode==0)&&(first_read_tempe))        //正常情况下进行比较报警
  303.                 {
  304.                         if((real_smokescope>=set_smokescope)||(real_tempure>=set_tempure))
  305.                         {
  306.                                 BUZZ=0;           //打开报警
  307.                         }
  308.                         else
  309.                         {
  310.                                 BUZZ=1;           //关闭报警
  311.                         }
  312.                 }
  313.                 covert_scope_data(smokescope);         //***显示烟雾的浓度
  314.                 LCD_Print(2,1,TempBuffer1);          //显示温度

  315.                 //write_firstline(11,data_to_hex(real_tempure));                       
  316.                 if(cursor_position)                //打开闪烁
  317.                 {
  318.                         write_com(0x80+cursor_position);
  319.                         write_com(0x0e);
  320.                 }       
  321.         }
  322. }


  323. void time0(void)interrupt 1
  324. {
  325.         static temp_time_counter0=0;
  326.         unsigned char TH=110,TL=-20;                                            //下一步扩展时可能通过这两个变量,调节上下限

  327.         TH0=(65536-50000)/256;
  328.         TL0=(65536-50000)%256;
  329.         temp_time_counter0++;
  330.         time_counter_50ms++;
  331.         if(time_counter_50ms>200)time_counter_50ms=200;
  332.         if(temp_time_counter0>3)
  333.         {
  334.                 temp_time_counter0=0;       
  335.                 if(first_read_tempe==0)                                          //首次上电多次读取温度再进行显示
  336.                 {
  337.                   pt=ReadTemperature(TH,TL,0x3f);                 //上限温度-22,下限-24,分辨率10位,也就是0.25C,TM R1 R0 1 1 1 1 1 //读取温度,温度值存放在一个两个字节的数组中,                 
  338.                   first_read_tempe=1;                                         //置一表示读取到了温度               
  339.                 }
  340.                 else
  341.                 {
  342.                   pt=ReadTemperature(TH,TL,0x3f);                 //上限温度-22,下限-24,分辨率10位,也就是0.25C,TM R1 R0 1 1 1 1 1 //读取温度,温度值存放在一个两个字节的数组中,
  343.                   covert1();
  344.                   if(TempBuffer1[5]||TempBuffer1[6])     //有小数就进1.
  345.                    real_tempure = (TempBuffer1[2]-0x30)*10+TempBuffer1[3]-0x30+1;
  346.                   else
  347.                    real_tempure = (TempBuffer1[2]-0x30)*10+TempBuffer1[3]-0x30;
  348.                    if(TempBuffer1[1]==0x31)         //说明此时有百位
  349.                    {
  350.                              real_tempure+=100;
  351.                    }
  352.                    if(TempBuffer1[0]==0x2d)        //负温度
  353.                    {
  354.                                 real_tempure*=-1;
  355.                    }
  356.                 }       
  357.         }
  358. }

  359. void time1(void)interrupt 3
  360. {
  361.         TH1=(65536-10000)/256;
  362.         TL1=(65536-10000)%256;
  363.         smokescope = choiceADC(0);          //读取ADC数值
  364. }

复制代码


注:如果解压后kile工程打不开,请下高版本,或者打开“TXT代码”文件夹里的TXT文件,复
制里面的代码到自己新建的工程里。
关于kile和proteus的学习这里就不赘述了,相信大家有能力搞定的。

所有资料下载:
烟雾及温度报警器无火焰传感器LSR160416.rar (529.41 KB, 下载次数: 281)

评分

参与人数 2黑币 +55 收起 理由
1183953327 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1 发表于 2016-6-3 14:02 | 只看该作者
极好的资料,51黑有你更精彩!!
回复

使用道具 举报

板凳
ID:110502 发表于 2016-7-21 12:13 | 只看该作者
非常好的资料!!!!
回复

使用道具 举报

地板
ID:98985 发表于 2016-10-9 12:16 | 只看该作者
极好的资料,51黑有你更精彩!!
回复

使用道具 举报

5#
ID:108201 发表于 2016-10-12 09:11 | 只看该作者
最近我一直在研究MQ-2,原理都是一样的,自己之前没写出来,拿着你的代码改了下还是出不来,我用的是ADC0809的芯片
回复

使用道具 举报

6#
ID:108201 发表于 2016-10-12 09:12 | 只看该作者
可否指点一下,,,,,,,,,,,,,,,
回复

使用道具 举报

7#
ID:154957 发表于 2016-12-15 12:24 | 只看该作者
楼主好人
回复

使用道具 举报

8#
ID:154957 发表于 2016-12-15 12:25 | 只看该作者
谢谢啦已经下载
回复

使用道具 举报

9#
ID:159089 发表于 2017-1-2 21:19 | 只看该作者
谢谢, 这份资料不错哦
回复

使用道具 举报

10#
ID:85726 发表于 2017-2-9 17:43 | 只看该作者
很好!下载下来看看!
回复

使用道具 举报

11#
ID:206220 发表于 2017-5-31 07:15 | 只看该作者
看看,很有帮助
回复

使用道具 举报

12#
ID:198958 发表于 2017-5-31 14:29 来自手机 | 只看该作者
太好了这资料
回复

使用道具 举报

13#
ID:263826 发表于 2017-12-19 18:22 | 只看该作者
谢谢楼主
回复

使用道具 举报

14#
ID:273232 发表于 2018-1-8 14:57 | 只看该作者
楼主好人
回复

使用道具 举报

15#
ID:268656 发表于 2018-3-17 10:17 | 只看该作者
刚好选题能用上,参考参考
回复

使用道具 举报

16#
ID:268656 发表于 2018-3-17 10:49 | 只看该作者
楼主好人 谢谢
回复

使用道具 举报

17#
ID:441217 发表于 2018-12-24 23:36 | 只看该作者
请问S和R分别代表的是什么温度;能具体讲解一下功能吗
回复

使用道具 举报

18#
ID:461617 发表于 2019-1-4 11:07 | 只看该作者
很给力
回复

使用道具 举报

19#
ID:461250 发表于 2019-1-4 20:30 | 只看该作者
你的图中为什么没有烟雾传感器
回复

使用道具 举报

20#
ID:650842 发表于 2020-3-31 22:09 来自手机 | 只看该作者
hex文件夹里面没东西呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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