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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5870|回復: 1
打印 上一主題 下一主題
收起左側

51單片機智能家居環境監測系統程序 煙霧溫濕度監測Proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
本設計是基于STC89C52的智能家居環境監測系統主要模塊有DHT11溫濕度數據采集模塊,MQ-2煙霧數據采集模塊,ADC0832模數轉換模塊,LCD1602顯示模塊,蜂鳴器報警電路,LED閃爍電路,外部按鍵電路

主要功能包括通過DHT11進行溫濕度數據采集并通過LCD1602進行實時顯示,MQ-2煙霧模塊采集數據反饋到ADC0832經過模數轉換后傳送到單片機芯片中處理數據,也是通過LCD1602進行顯示,當以上任何一個數據超出閾值時,都會觸發蜂鳴器報警和對應的LED顯示燈閃爍。此外,根據環境的不同需要,可以通過外部按鍵進行更改溫濕度上下限的閾值范圍和煙霧濃度的上限

原理圖如圖所示:


實物圖如圖所示:


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <absacc.h>
  4. #include <math.h>  
  5. #include "0832.h"
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #include "eeprom52.h"

  9. sbit DATA = P3^7;  //溫濕度
  10. sbit E=P2^5;                //1602使能引腳
  11. sbit RS=P2^7;                //1602數據/命令選擇引腳
  12. sbit RW=P2^6;
  13. sbit K1=P1^3;//設置鍵
  14. sbit K2=P1^4;//加
  15. sbit K3=P1^5;//減
  16. sbit LED1=P3^1;         //煙霧報警
  17. sbit LED2=P3^2;                           //溫度上限
  18. sbit LED3=P3^3;                                //溫度下限
  19. sbit LED4=P3^4;                                 //濕度上限
  20. sbit LED5=P3^5;                                           //濕度下限
  21. sbit alarm=P3^0;                 //蜂鳴器
  22. uchar U8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp;
  23. uchar U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,U8checkdata;
  24. uchar Mode,humidity,temperature,smog;
  25. bit BJ_LED1=1,BJ_LED2=1,BJ_LED3=1,BJ_LED4=1,BJ_LED5=1,BJ_LED6=1;          //定義LED報警變量
  26. bit bdata FlagStartRH;
  27. uchar flag ;//記錄當前設置狀態
  28. uint count;

  29. //定時器0初始化
  30. void Timer0_Init()
  31. {
  32.         ET0 = 1;        //允許定時器0中斷
  33.         TMOD = 0x11;       //定時器工作方式選擇
  34.         TL0 = 0xFF;     
  35.         TH0 = 0x4B;     //定時器賦予初值
  36.         TH1=0xdc;
  37.         TL1=0x00;
  38.         ET1=1;
  39.         TR0 = 1;        //啟動定時器
  40. }

  41. //定時器0中斷
  42. void Timer0_ISR (void) interrupt 1 using 0
  43. {
  44.         uchar RHCounter;
  45.         TL0 = 0xFF;
  46.         TH0 = 0x4B;     //定時器賦予初值
  47.         RHCounter++;
  48.     if (RHCounter >= 15)
  49.     {
  50.        FlagStartRH = 1;
  51.            RHCounter = 0;
  52.     }
  53. }
  54. void Delay1(uint j)
  55. {
  56.     uchar i;
  57.     for(;j>0;j--)
  58.     {        
  59.                 for(i=0;i<27;i++);
  60.     }
  61. }

  62. void  Delay_10us(void)
  63. {
  64.     uchar i;
  65.     i--;
  66.     i--;
  67.     i--;
  68.     i--;
  69.     i--;
  70.     i--;
  71. }

  72. void delay_ms(uint z)  //延時函數
  73. {
  74.         uint x,y;
  75.         for(x=z;x>0;x--)
  76.                 for(y=121;y>0;y--);                        //約1ms
  77. }        

  78. void  COM(void)
  79. {
  80.     uchar i;
  81.     for(i=0;i<8;i++)          
  82.     {
  83.               U8FLAG=2;
  84.                    while((!DATA)&&U8FLAG++);
  85.                 Delay_10us();
  86.                 Delay_10us();
  87.                 Delay_10us();
  88.                   U8temp=0;
  89.         if(DATA)U8temp=1;
  90.                     U8FLAG=2;
  91.                 while((DATA)&&U8FLAG++);
  92.                    //超時則跳出for循環                  
  93.                    if(U8FLAG==1)break;
  94.                    //判斷數據位是0還是1         
  95.                      
  96.                 // 如果高電平高過預定0高電平值則數據位為 1
  97.                     
  98.                 U8comdata<<=1;
  99.                    U8comdata|=U8temp;        //0
  100.     }//rof
  101. }

  102. //--------------------------------
  103. //-----溫濕度讀取子程序 ------------
  104. //--------------------------------
  105. //----以下變量均為全局變量--------
  106. //----溫度高8位== U8T_data_H------
  107. //----溫度低8位== U8T_data_L------
  108. //----濕度高8位== U8RH_data_H-----
  109. //----濕度低8位== U8RH_data_L-----
  110. //----校驗 8位 == U8checkdata-----
  111. //----調用相關子程序如下----------
  112. //---- Delay();, Delay_10us();,COM();
  113. //--------------------------------
  114. uchar RH(void)
  115. {
  116.     //主機拉低18ms
  117.     DATA=0;
  118.         Delay1(180);  //原來為5
  119.         DATA=1;
  120.         //總線由上拉電阻拉高 主機延時20us
  121.         Delay_10us();
  122.         Delay_10us();
  123.         Delay_10us();
  124.         Delay_10us();
  125.         //主機設為輸入 判斷從機響應信號
  126.         DATA=1;
  127.         //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行          
  128.         if(!DATA)                 //T !          
  129.         {
  130.             U8FLAG=2;
  131.             //判斷從機是否發出 80us 的低電平響應信號是否結束         
  132.             while((!DATA)&&U8FLAG++);
  133.             U8FLAG=2;
  134.             //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
  135.             while((DATA)&&U8FLAG++);
  136.             //數據接收狀態                 
  137.             COM();
  138.             U8RH_data_H_temp=U8comdata;
  139.             COM();
  140.             U8RH_data_L_temp=U8comdata;
  141.             COM();
  142.             U8T_data_H_temp=U8comdata;
  143.             COM();
  144.             U8T_data_L_temp=U8comdata;
  145.             COM();
  146.             U8checkdata_temp=U8comdata;
  147.             DATA=1;
  148.             //數據校驗
  149.             U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  150.             if(U8temp==U8checkdata_temp)
  151.             {
  152.                       U8RH_data_H=U8RH_data_H_temp;
  153.                       U8RH_data_L=U8RH_data_L_temp;
  154.                       U8T_data_H=U8T_data_H_temp;
  155.                       U8T_data_L=U8T_data_L_temp;
  156.                       U8checkdata=U8checkdata_temp;
  157.             }
  158.                 return 1;
  159.         }
  160.         else   //傳感器不響應
  161.         {
  162.            return 0;
  163.         }
  164. }

  165. /********************************************************************
  166. * 文件名  : 液晶1602顯示.c
  167. * 描述    :  該程序實現了對液晶1602的控制。
  168. ***********************************************************************/


  169. /********************************************************************
  170. * 名稱 : delay()
  171. * 功能 : 延時,延時時間大概為140US。
  172. * 輸入 : 無
  173. * 輸出 : 無
  174. ***********************************************************************/

  175. void delay()
  176. {
  177.         int i,j;
  178.         for(i=0; i<=10; i++)
  179.         for(j=0; j<=2; j++);
  180. }          
  181.        
  182. /********************************************************************
  183. * 名稱 : enable(uchar del)
  184. * 功能 : 1602命令函數
  185. * 輸入 : 輸入的命令值
  186. * 輸出 : 無
  187. ***********************************************************************/

  188. void write_1602com(uchar del)
  189. {
  190.         P0 = del;
  191.         RS = 0;
  192.         E = 1;
  193.         delay();
  194.         E = 0;
  195.         delay();
  196. }

  197. /********************************************************************
  198. * 名稱 : write(uchar del)
  199. * 功能 : 1602寫數據函數
  200. * 輸入 : 需要寫入1602的數據
  201. * 輸出 : 無
  202. ***********************************************************************/

  203. void write_1602dat(uchar del)
  204. {
  205.         P0 = del;
  206.         RS = 1;
  207.         E = 1;
  208.         delay();
  209.         E = 0;
  210.         delay();
  211. }

  212. /********************************************************************
  213. * 名稱 : L1602_init()
  214. * 功能 : 1602初始化,請參考1602的資料
  215. * 輸入 : 無
  216. * 輸出 : 無
  217. ***********************************************************************/
  218. void L1602_init(void)
  219. {
  220.        
  221.         write_1602com(0x38);
  222.         write_1602com(0x0c);
  223.         write_1602com(0x06);
  224.         write_1602com(0x01); //清屏要放在最后
  225.         delay_ms(2);
  226. }


  227. void display()
  228. {
  229.   write_1602com(0x83);
  230.   write_1602dat(temperature%100/10+0x30);
  231.   write_1602dat(temperature%100%10+0x30);
  232.   write_1602com(0x8c);
  233.   write_1602dat(humidity%100/10+0x30);
  234.   write_1602dat(humidity%100%10+0x30);
  235.     write_1602com(0xc3);
  236.   write_1602dat(smog%100/10+0x30);
  237.   write_1602dat(smog%100%10+0x30);
  238.           write_1602com(0x85);
  239.         write_1602dat(0xdf);                                                                  
  240. }
  241. void display_1()
  242. {
  243.   write_1602com(0x83);
  244.   write_1602dat(TH%100/10+0x30);
  245.   write_1602dat(TH%100%10+0x30);
  246.   write_1602com(0x8c);
  247.   write_1602dat(TL%100/10+0x30);
  248.   write_1602dat(TL%100%10+0x30);
  249.    write_1602com(0xc3);
  250.   write_1602dat(HH%100/10+0x30);
  251.   write_1602dat(HH%100%10+0x30);
  252.   write_1602com(0xcc);
  253.   write_1602dat(HL%100/10+0x30);
  254.   write_1602dat(HL%100%10+0x30);
  255. }
  256. void write_string(uchar * str)
  257. {
  258.   while( * str)
  259.   {
  260.   write_1602dat(* str);
  261.   str++;
  262.   }
  263. }
  264. /***按鍵函數***/
  265. void KEY()
  266. {
  267. if(K1==0)
  268. {
  269.    Delay1(200);
  270.   if(K1==0)
  271.   {
  272.            flag++;
  273.         if(flag==1)
  274.     {
  275.          write_1602com(0x80);
  276.          write_string("TH:   C  TL:   C");
  277.          write_1602com(0xc0);
  278.          write_string("HH:  %   HL:  % ");
  279.          write_1602com(0x85);
  280.         write_1602dat(0xdf);
  281.         write_1602com(0x8e);
  282.         write_1602dat(0xdf);
  283.          display_1();
  284.          write_1602com(0x84);
  285.          write_1602com(0x0f);
  286.         }
  287.         else if(flag==2)
  288.          write_1602com(0x8d);
  289.          else if(flag==3)
  290.          write_1602com(0xc4);
  291.          else if(flag==4)
  292.          write_1602com(0xcd);
  293.          else if(flag==5)
  294.          {
  295.          write_1602com(0xc0);
  296.          write_string("                ");
  297.          write_1602com(0x80);
  298.          write_string("Sg:  mg/m3      ");
  299.          write_1602com(0x83);
  300.          write_1602dat(SM/10+0x30);
  301.          write_1602dat(SM%10+0x30);

  302.          write_1602com(0x84);
  303.          }
  304.          else
  305.          {
  306.          write_1602com(0x80);
  307.          write_string("Te:   C  Hu:  % ");
  308.          write_1602com(0xc0);
  309.          write_string("Sg:  mg/m3      ");
  310.          write_1602com(0x85);
  311.      write_1602dat(0xdf);
  312.      display();
  313.          write_1602com(0x0c);
  314.          flag=0;
  315.          write_eeprom();
  316.          }
  317.          while(!K1);
  318.   }
  319. }
  320. if(K2==0)
  321. {
  322.    Delay1(200);
  323.   if(K2==0)
  324.   {
  325.    switch (flag)
  326.            {
  327.                     case 1: TH++;if(TH>99) TH=0;if(TH<=TL) TH=TL+1;  write_1602com(0x83);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30); write_1602com(0x84);break;
  328.                     case 2: TL++;if(TL>98) TL=0; if(TL>=TH) TL=TH-1;    write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d); break;
  329.                         case 3: HH++;if(HH>99) HH=0; if(HH<=HL) HH=HL+1;write_1602com(0xc3);write_1602dat(HH/10+0x30);write_1602dat(HH%10+0x30); write_1602com(0xc4);break;
  330.                         case 4: HL++;if(HL>98) HL=0;   if(HL>=HH) HL=HH-1;  write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30); write_1602com(0xcd);break;
  331.                         case 5: SM++;if(SM>9)  SM=0;  write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84); break;
  332.                    }
  333.    while(!K2);
  334.   }
  335. }
  336. if(K3==0)
  337. {
  338.    Delay1(200);
  339.   if(K3==0)
  340.   {
  341.    switch (flag)
  342.    {
  343.    case 1: TH--;if(TH>99) TH=99; if(TH<=TL) TH=TL+1;   write_1602com(0x83);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30); write_1602com(0x84);break;
  344.    case 2: TL--;if(TL>99) TL=98;if(TL>=TH) TL=TH-1;   write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d); break;
  345.    case 3: HH--;if(HH>99) HH=99; if(HH<=HL) HH=HL+1;   write_1602com(0xc3);write_1602dat(HH/10+0x30);write_1602dat(HH%10+0x30); write_1602com(0xc4);break;
  346.    case 4: HL--;if(HL>99) HL=98;if(HL>=HH) HL=HH-1;   write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30); write_1602com(0xcd);break;
  347.    case 5: SM--;if(SM>99)  SM=9;  write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84); break;
  348.    }
  349.    while(!K3);
  350.   }
  351. }
  352. }
  353. void Onealarm()
  354. {
  355.   alarm=0;
  356.   Delay1(200);
  357.   alarm=1;
  358. }

  359. void dis_init()
  360. {
  361.         unsigned char pp=0;
  362.         write_1602com(0x80);                                //進入設置狀態顯示
  363.         write_string("Welcome to use  ");        //設置狀態第一行顯示
  364.         write_1602com(0xc0);                                //選中第二行
  365.         write_string("Please waiting..");        //設置狀態第二行顯示
  366.         P3=0xFE;
  367.         delay_ms(500);
  368.         for(pp=0;pp<8;pp++)
  369.         {
  370.                 P3=_crol_(P3,1);
  371.                 delay_ms(100);
  372.         }
  373.         P3=0x7F;
  374.         for(pp=0;pp<8;pp++)
  375.         {
  376.                 P3=_cror_(P3,1);
  377.                 delay_ms(100);
  378.         }
  379.         alarm=1;
  380.         LED1=LED2=LED3=LED4=LED5=0;
  381.         delay_ms(2000);
  382. }

  383. /********************************************************************
  384. * 名稱 : Main()
  385. * 功能 : 主函數
  386. ***********************************************************************/
  387. void main()
  388. {
  389.     uint testnum;

  390.     EA = 0;
  391.         Timer0_Init();  //定時器0初始化
  392.         EA = 1;
  393.         RW=0;
  394.   
  395.         L1602_init();
  396.         dis_init();
  397.          write_1602com(0x85);
  398.      write_1602dat(0xdf);
  399.                    write_1602com(0x80);
  400. ……………………

  401. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
單片機煙霧溫濕度監測.7z (1.37 MB, 下載次數: 327)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:753283 發表于 2020-6-2 20:50 來自觸屏版 | 只看該作者
樓主有圖嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 永久av | 久久久观看| 国产1区2区在线观看 | 午夜精品影院 | av在线一区二区三区 | 亚洲一区电影 | 在线观看毛片网站 | 日韩av在线一区二区三区 | 九九综合 | 欧美亚洲视频 | 国产免费一区二区三区 | 国产美女网站 | 亚洲精品麻豆 | 欧美激情在线观看一区二区三区 | 91综合在线观看 | 偷拍自拍在线观看 | 中文字幕av一区二区三区 | www久久久 | 一级免费毛片 | 亚洲精品久久久 | 精品毛片在线观看 | 成人在线免费电影 | 黄色免费观看网站 | 一区二区在线 | 日韩不卡一区二区 | 久久偷人| 羞羞视频在线观看免费观看 | 日韩在线视频一区 | 一级国产精品一级国产精品片 | 三级视频网站 | 一区二区三区av | 日韩免费av网站 | 中文字字幕一区二区三区四区五区 | 波多野结衣在线观看一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 国产网站在线免费观看 | 久久毛片 | 欧美精品91爱爱 | 午夜激情免费视频 | 综合久久99 | 一区二区在线 |