找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机火灾报警器程序

[复制链接]
跳转到指定楼层
楼主
基于单片机的火灾报警器,进行烟雾和温度检测。

单片机程序如下:
  1. #include <reg52.h>
  2. #include "intrins.h"                                                                                          

  3. #define     u8                          unsigned char
  4. #define     u16                   unsigned int
  5. #define     uchar                          unsigned char
  6. #define     uint                   unsigned int

  7. uchar yushe_wendu=50;                                
  8. uchar yushe_yanwu=100;                                
  9. uint wendu;                                                                 
  10. uchar yanwu;                                                                 

  11. //????
  12. uchar Mode=0;                                                                 
  13. //??
  14. sbit Led_Reg                 =P2^2;                                 
  15. sbit Led_Yellow  =P2^4;                                 
  16. sbit Buzzer             =P2^0;                                 
  17. sbit Fan                      =P3^3;                                 


  18. /********************************************************************
  19. * ?? : delay_1ms()
  20. * ?? : ??1ms??
  21. * ?? : q
  22. * ?? : ?
  23. ***********************************************************************/
  24. void delay_ms(uint q)
  25. {
  26.         uint i,j;
  27.         for(i=0;i<q;i++)
  28.                 for(j=0;j<110;j++);
  29. }
  30. /***********************************************************************************************************
  31. LCD1602????
  32. ***********************************************************************************************************/

  33. //LCD??
  34. sbit LCDRS = P2^7;
  35. sbit LCDEN = P2^6;
  36. sbit D0                 = P0^0;
  37. sbit D1                 = P0^1;
  38. sbit D2                 = P0^2;
  39. sbit D3                 = P0^3;
  40. sbit D4                 = P0^4;
  41. sbit D5                 = P0^5;
  42. sbit D6                 = P0^6;
  43. sbit D7                 = P0^7;



  44. //LCD
  45. void LCDdelay(uint z)                  
  46. {
  47.   uint x,y;
  48.   for(x=z;x>0;x--)
  49.     for(y=10;y>0;y--);
  50. }
  51. void LCD_WriteData(u8 dat)         
  52. {
  53.         if(dat&0x01)D0=1;else D0=0;
  54.         if(dat&0x02)D1=1;else D1=0;
  55.         if(dat&0x04)D2=1;else D2=0;
  56.         if(dat&0x08)D3=1;else D3=0;
  57.         if(dat&0x10)D4=1;else D4=0;
  58.         if(dat&0x20)D5=1;else D5=0;
  59.         if(dat&0x40)D6=1;else D6=0;
  60.         if(dat&0x80)D7=1;else D7=0;
  61. }
  62. //
  63. void write_com(uchar com)
  64. {
  65.   LCDRS=0;                                 
  66.         LCD_WriteData(com);
  67. //  DAT=co
  68.   LCDdelay(5);
  69.   LCDEN=1;
  70.   LCDdelay(5);
  71.   LCDEN=0;
  72. }
  73. //
  74. void write_data(uchar date)
  75. {
  76.   LCDRS=1;
  77.         LCD_WriteData(date);
  78. //  DAT=dat
  79.   LCDdelay(5);
  80.   LCDEN=1;
  81.   LCDdelay(5);
  82.   LCDEN=0;
  83. }

  84. /*------------------------------------------------
  85.               ??????
  86. ------------------------------------------------*/
  87. void SelectPosition(unsigned char x,unsigned char y)
  88. {     
  89.         if (x == 0)
  90.         {     
  91.                 write_com(0x80 + y);     
  92.         }
  93.         else
  94.         {      
  95.                 write_com(0xC0 + y);      
  96.         }        
  97. }
  98. /*------------------------------------------------
  99.               ???????
  100. ------------------------------------------------*/
  101. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  102. {     
  103.         SelectPosition(x,y) ;
  104.         while (*s)
  105.         {     
  106.                 write_data( *s);     
  107.                 s ++;     
  108.         }
  109. }
  110. //======================================================================
  111. // ??: void LCD_Write_Char(u8 x,u8 y,u16 s,u8
  112. // ??: LCD_Write_Char(0,1,366,4)
  113. // ??: ??0??????????366??4?,????? 03
  114. // ??: x:?,y:?,s:?????,l:???
  115. // ??: non
  116. // ??: VER1
  117. // ??: 2013-4
  118. // ??: ????655
  119. //======================================================================
  120. void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
  121. {     
  122.         SelectPosition(x,y) ;

  123.         if(l>=5)
  124.                 write_data(0x30+s/10000%10);        
  125.         if(l>=4)
  126.                 write_data(0x30+s/1000%10);               
  127.         if(l>=3)
  128.                 write_data(0x30+s/100%10);               
  129.         if(l>=2)
  130.                 write_data(0x30+s/10%10);                        
  131.         if(l>=1)
  132.                 write_data(0x30+s%10);               

  133. }
  134. /*1602????
  135.   write_com(0x38);
  136.   write_com(0x0c);
  137.   write_com(0x0d);
  138.   write_com(0x0d);
  139. */
  140. //1602?
  141. void Init1602()
  142. {
  143.   uchar i=0;
  144.   write_com(0x38);
  145.   write_com(0x0c);
  146.   write_com(0x06);
  147.   write_com(0x01);

  148. }

  149. void Display_1602(yushe_wendu,yushe_yanwu,c,temp)
  150. {
  151.         
  152.         LCD_Write_Char(0,6,yushe_wendu,2) ;

  153.         
  154.         LCD_Write_Char(0,13,yushe_yanwu,3) ;

  155.         
  156.         LCD_Write_Char(1,6,c/10,2) ;
  157.         write_data('.');
  158.         LCD_Write_Char(1,9,c%10,1) ;

  159.         
  160.         LCD_Write_Char(1,13,temp,3) ;
  161. }



  162. /***********************************************************************************************************
  163. ADC0832????
  164. ***********************************************************************************************************/
  165. sbit ADCS         =P1^5;
  166. sbit ADCLK  =P1^2;
  167. sbit ADDI         =P1^3; //ADC0832 ????                /*????????????,?ADC0832????????????,
  168. sbit ADDO         =P1^3; //ADC0832 ????                /*????????,???????????????????



  169. //========================================================================
  170. // ??: unsigned int Adc0832(unsigned char channel)
  171. // ??:                 temp=Adc0832(0);
  172. // ??: ??0???AD?
  173. // ??: channel:??0???1??
  174. // ??: ?????AD?
  175. // ??: VER1.0
  176. // ??: 2015-05-29
  177. // ??:
  178. //========================================================================
  179. unsigned int Adc0832(unsigned char channel)
  180. {
  181.         uchar i=0;
  182.         uchar j;
  183.         uint dat=0;
  184.         uchar ndat=0;
  185.         uchar  Vot=0;

  186.         if(channel==0)channel=2;
  187.         if(channel==1)channel=3;
  188.         ADDI=1;
  189.         _nop_();
  190.         _nop_();
  191.         ADCS=0;//??CS?
  192.         _nop_();
  193.         _nop_();
  194.         ADCLK=1;//??CLK?
  195.         _nop_();
  196.         _nop_();
  197.         ADCLK=0;//??CLK?,?????1
  198.         _nop_();
  199.         _nop_();
  200.         ADCLK=1;//??CLK?
  201.         ADDI=channel&0x1;
  202.         _nop_();
  203.         _nop_();
  204.         ADCLK=0;//??CLK?,?????2
  205.         _nop_();
  206.         _nop_();
  207.         ADCLK=1;//??CLK?
  208.         ADDI=(channel>>1)&0x1;
  209.         _nop_();
  210.         _nop_();
  211.         ADCLK=0;//??CLK?,?????3
  212.         ADDI=1;//??????
  213.         _nop_();
  214.         _nop_();
  215.         dat=0;
  216.         for(i=0;i<8;i++)
  217.         {
  218.                 dat|=ADDO;//???
  219.                 ADCLK=1;
  220.                 _nop_();
  221.                 _nop_();
  222.                 ADCLK=0;//????????
  223.                 _nop_();
  224.                 _nop_();
  225.                 dat<<=1;
  226.                 if(i==7)dat|=ADDO;
  227.         }
  228.         for(i=0;i<8;i++)
  229.         {
  230.                 j=0;
  231.                 j=j|ADDO;//???
  232.                 ADCLK=1;
  233.                 _nop_();
  234.                 _nop_();
  235.                 ADCLK=0;//????????
  236.                 _nop_();
  237.                 _nop_();
  238.                 j=j<<7;
  239.                 ndat=ndat|j;
  240.                 if(i<7)ndat>>=1;
  241.         }
  242.         ADCS=1;//??CS?
  243.         ADCLK=0;//??CLK?
  244.         ADDO=1;//?????,??????
  245.         dat<<=8;
  246.         dat|=ndat;

  247.         return(dat);            //return ad data
  248. }

  249. /***********************************************************************************************************
  250. DS18B20????
  251. ***********************************************************************************************************/

  252. sbit DQ = P1^0;                                 



  253. /*****?????:???????ds18b20??*****/
  254. void Delay_DS18B20(int num)
  255. {
  256.   while(num--) ;
  257. }
  258. /*****???DS18B20*****/
  259. void Init_DS18B20(void)
  260. {
  261.   unsigned char x=0;
  262.   DQ = 1;         
  263.   Delay_DS18B20(8);   
  264.   DQ = 0;         
  265.   Delay_DS18B20(80);   
  266.   DQ = 1;         
  267.   Delay_DS18B20(14);
  268.   x = DQ;           
  269.   Delay_DS18B20(20);
  270. }
  271. /*****?????*****/
  272. unsigned char ReadOneChar(void)
  273. {
  274.   unsigned char i=0;
  275.   unsigned char dat = 0;
  276.   for (i=8;i>0;i--)
  277.   {
  278.     DQ = 0;     
  279.     dat>>=1;
  280.     DQ = 1;     
  281.     if(DQ)
  282.     dat|=0x80;
  283.     Delay_DS18B20(4);
  284.   }
  285.   return(dat);
  286. }
  287. /*****?????*****/
  288. void WriteOneChar(unsigned char dat)
  289. {
  290.   unsigned char i=0;
  291.   for (i=8; i>0; i--)
  292.   {
  293.     DQ = 0;
  294.     DQ = dat&0x01;
  295.     Delay_DS18B20(5);
  296.     DQ = 1;
  297.     dat>>=1;
  298.   }
  299. }
  300. /*****????*****/
  301. unsigned int ReadTemperature(void)
  302. {
  303.   unsigned char a=0;
  304.   unsigned char b=0;
  305.   unsigned int t=0;
  306.   float tt=0;
  307.   Init_DS18B20();
  308.   WriteOneChar(0xCC);  
  309.   WriteOneChar(0x44);  
  310.   Init_DS18B20();
  311.   WriteOneChar(0xCC);  
  312.   WriteOneChar(0xBE);  
  313.   a=ReadOneChar();     
  314.   b=ReadOneChar();   
  315.   t=b;
  316.   t<<=8;
  317.   t=t|a;
  318.   tt=t*0.0625;
  319.   t= tt*10+0.5;     
  320.   return(t);
  321. }
  322. //===================================================================================
  323. //===================================================================================
  324. //===================================================================================


  325. /*****????*****/
  326. u16 check_wendu(void)
  327. {
  328.         u16 c;
  329.         c=ReadTemperature()-5;                          
  330.         if(c<1) c=0;
  331.         if(c>=999) c=999;
  332.         return c;
  333. }


  334. /***********************************************************************************************************
  335. ????????
  336. ***********************************************************************************************************/
  337. //
  338. sbit Key1=P1^6;                                
  339. sbit Key2=P1^7;                                
  340. sbit Key3=P3^2;                                


  341. #define KEY_SET                 1               
  342. #define KEY_ADD                        2               
  343. #define KEY_MINUS                3               

  344. //======================================================================
  345. // ??: u8 Key_Scan
  346. // ??: temp=u8 Key_Scan(
  347. // ??: ??????????
  348. // ??: NO
  349. // ??: ???
  350. // ??: VER1
  351. // ??: 2015-05-
  352. // ??: ????????,????????????0,???????
  353. //======================================================================
  354. u8 Key_Scan()
  355. {         
  356.         static u8 key_up=1;
  357.         if(key_up&&(Key1==0||Key2==0||Key3==0))
  358.         {
  359.                 delay_ms(10);
  360.                 key_up=0;
  361.                 if(Key1==0)                        return 1;
  362.                 else if(Key2==0)return 2;
  363.                 else if(Key3==0)return 3;
  364.         }
  365.         else if(Key1==1&&Key2==1&&Key3==1)
  366.                 key_up=1;            
  367.          return 0;
  368. }



  369. void main (void)
  370. {
  371.         u8 key;
  372.         wendu=check_wendu();                  
  373.         Init1602();                          
  374.         LCD_Write_String(0,0,"SET T:00   E:000");  
  375.         LCD_Write_String(1,0,"NOW T:00.0 E:000");  
  376.         delay_ms(1000);
  377.         wendu=check_wendu();                  
  378.         while (1)                                                
  379.         {
  380.                 key=Key_Scan();                                       
  381.                 yanwu=Adc0832(0);                                
  382.                 wendu=check_wendu();         

  383.                 if(key==KEY_SET)
  384.                 {
  385.                         Mode++;
  386.                 }

  387.                 switch(Mode)                                                
  388.                 {
  389.                         case 0:                                                               
  390.                         {
  391.                                 Display_1602(yushe_wendu,yushe_yanwu,wendu,yanwu);  
  392.                                 if(yanwu>=yushe_yanwu)         
  393.                                 {
  394.                                         Led_Reg=0;                                          
  395.                                         Fan=0;
  396.                                         Buzzer=0;                                                  
  397.                                 }
  398.                                 else                                                                                 
  399.                                 {
  400.                                         Led_Reg=1;                                          
  401.                                         Fan=1;
  402.                                 }
  403.                                 if(wendu>=(yushe_wendu*10))         
  404.                                 {
  405.                                         Buzzer=0;                                                  
  406.                                         Led_Yellow=0;                                          
  407.                                 }
  408.                                 else                                                                                 
  409.                                 {
  410.                                         Led_Yellow=1;                                          
  411.                                 }
  412.                                 if((yanwu<yushe_yanwu)&&(wendu<(yushe_wendu*10)))         
  413.                                 {
  414.                                         Buzzer=1;                                                  
  415.                                 }
  416.                                 break;
  417.                         }
  418.                         case 1:
  419.                         {
  420.                                 SelectPosition(0,5) ;                                       
  421.                            write_com(0x0d);                                                        
  422.                                 if(key==KEY_ADD)                                                        
  423.                                 {
  424.                                         yushe_wendu++;                                            
  425.                                         if(yushe_wendu>=99)                                         
  426.                                         yushe_wendu=99;                                                         
  427.                                         LCD_Write_Char(0,6,yushe_wendu,2) ;
  428.                                 }
  429.                                 if(key==KEY_MINUS)                                                
  430.                                 {
  431.                                         if(yushe_wendu<=1)                                       
  432.                                         yushe_wendu=1;                          
  433.                                         yushe_wendu--;                                                        
  434.                                         LCD_Write_Char(0,6,yushe_wendu,2) ;
  435.                                 }
  436.                                 break;                                                                                          
  437.                         }
  438.                         case 2:                                
  439.                         {
  440.                                 SelectPosition(0,12) ;                                
  441.                            write_com(0x0d);                                                        
  442.                                 if(key==KEY_ADD)                                                        
  443.                                 {
  444.                                         if(yushe_yanwu>=255)        
  445.                                         yushe_yanwu=254;            
  446.                                         yushe_yanwu++;                                            
  447.                                         LCD_Write_Char(0,13,yushe_yanwu,3) ;
  448.                                 }
  449.                                 if(key==KEY_MINUS)                                                
  450.                                 {
  451.                                         if(yushe_yanwu<=1)                                       
  452.                                                 yushe_yanwu=1;                  
  453.                                         yushe_yanwu--;                                                        
  454.                                         LCD_Write_Char(0,13,yushe_yanwu,3) ;
  455.                                 }
  456.                                 break;
  457.                         }
  458.                         default        :        
  459.                         {
  460.                                 write_com(0x38);
  461.                                 write_com(0x0c);
  462.                                 Mode=0;                        
  463.                                 break;
  464.                         }
  465.                 }

  466.         }

  467. }
复制代码


51hei图片_20230314215434.png (101.54 KB, 下载次数: 26)

仿真图

仿真图

Proteus仿真8.13版本工程,无代码.7z

25.86 KB, 下载次数: 11

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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