久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10196|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产午夜精品视频 | 国产午夜精品久久久 | 欧美综合一区二区三区 | 日本久久综合 | 亚洲欧洲在线视频 | 中文字幕免费观看 | 国产欧美日韩一区 | jav成人av免费播放 | 羞羞视频免费观看入口 | 三级黄片毛片 | 狠狠色综合久久婷婷 | 欧美久久一级 | 国产精品视频免费观看 | 成人久久久 | 视频在线观看亚洲 | 精品欧美一区二区三区久久久 | 久久久久久久久国产成人免费 | 亚洲精品久久久久久久不卡四虎 | 亚洲不卡在线观看 | 日韩高清一区 | 国产精品九九视频 | 综合婷婷 | 日本 欧美 三级 高清 视频 | 欧美激情精品久久久久久变态 | 免费精品 | 91亚洲精品久久久电影 | 久久综合狠狠综合久久综合88 | 久久夜夜 | 日韩欧美一级片 | 精品国产精品国产偷麻豆 | 超碰97人人人人人蜜桃 | 亚洲精品在线观看网站 | 欧美一级在线观看 | 欧美激情一区二区三级高清视频 | 亚洲精品久久久久久久不卡四虎 | 日韩伦理一区二区 | 精品欧美在线观看 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 亚洲 中文 欧美 日韩 在线观看 | 涩涩视频在线观看 | 欧美日韩在线视频一区二区 |