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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1770|回復: 1
收起左側

51單片機的DHT11溫濕度測量報警系統設計

[復制鏈接]
ID:448310 發表于 2018-12-17 20:16 | 顯示全部樓層 |閱讀模式
溫濕度測量系統

單片機源程序如下:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #include <intrins.h>

  5. typedef bit BOOL  ;

  6. sbit io = P1^1 ;//(口線定義)
  7. sbit bee=P1^0;
  8. sbit rs = P2^5 ;
  9. sbit rw = P2^6 ;
  10. sbit ep = P2^7 ;
  11. bit flag_300ms ;

  12. sbit K1=P1^2;
  13. sbit K2=P1^3;
  14. sbit K3=P1^4;

  15. uchar yemian=0;//(定義變量)
  16. uchar flat=1;
  17. uchar data_byte;
  18. uchar RH,RL,TH,TL;
  19. uchar WenDu,ShiDu;//報警的溫度和濕度
  20. #include "eeprom52.h"


  21. /****************************延時程序****************************/
  22. void delay(uchar ms)
  23. {       // 延時子程序
  24.          uchar i ;
  25.          while(ms--)
  26.          {
  27.                   for(i = 0 ; i<250;i++) ;
  28.          }
  29. }

  30. void delay1()//延時10us
  31. {
  32.         uchar i;
  33.         i--;
  34.         i--;
  35.         i--;
  36.         i--;
  37.         i--;
  38.         i--;
  39. }
  40. void longdelay(uchar s) //長延時
  41. {
  42.          while(s--)
  43.          {
  44.                   delay(20) ;
  45.          }
  46. }



  47. /******************把數據保存到單片機內部eeprom中******************/
  48. void write_eeprom()
  49. {
  50.         SectorErase(0x2000);
  51.         byte_write(0x2000, WenDu);
  52.         byte_write(0x2001, ShiDu);
  53.         byte_write(0x2060, a_a);       
  54. }

  55. /******************把數據從單片機內部eeprom中讀出來*****************/
  56. void read_eeprom()
  57. {
  58.         WenDu   = byte_read(0x2000);
  59.   ShiDu = byte_read(0x2001);
  60.         a_a      = byte_read(0x2060);
  61. }

  62. /**************開機自檢eeprom初始化*****************/
  63. void init_eeprom()
  64. {
  65.         read_eeprom();                //先讀
  66.         if(a_a != 2)                //新的單片機初始單片機內問eeprom
  67.         {
  68.         WenDu   = 30;
  69.         ShiDu   = 80;
  70.                 a_a = 2;
  71.                 write_eeprom();
  72.         }       
  73. }



  74. /********************報警程序部分*******************/
  75. void warn()  //報警函數
  76. {
  77.        
  78.   if(TH>=WenDu)  //檢測的溫度高于設定溫度報警值
  79.                                              
  80.      {
  81.       bee=0; //報警
  82.                        
  83.      }      
  84.                  
  85.         if(RH>=ShiDu)  //檢測的濕度高于設定的濕度值
  86.                                              
  87.      {
  88.       bee=0; //報警
  89.      }      

  90.                  
  91.         if( TH<WenDu  &&  RH<ShiDu )         
  92.     {
  93.                   bee=1; //停止報警
  94.                 }
  95.                  
  96.   
  97. }

  98. /************************LCD模塊******************************************/

  99. BOOL lcd_bz()//測試LCD忙碌狀態
  100. {      
  101.          BOOL result ;
  102.          rs = 0 ;
  103.          rw = 1 ;
  104.          ep = 1 ;
  105.          result = (BOOL)(P0 & 0x80) ;
  106.          ep = 0 ;
  107.          return result ;
  108. }

  109. void write_cmd(uchar cmd)// 寫指令
  110. {      
  111.         while(lcd_bz()) ;
  112.         rs = 0 ;
  113.         rw = 0 ;
  114.         ep = 0 ;
  115.         P0 = cmd ;
  116.         ep = 1 ;
  117.         ep = 0 ;  
  118. }

  119. void write_addr(uchar addr)//寫地址
  120. {      
  121.         write_cmd(addr|0x80) ;
  122. }

  123. void write_byte(uchar dat)//寫字節
  124. {      
  125.         while(lcd_bz()) ;
  126.           rs = 1 ;
  127.           rw = 0 ;
  128.           ep = 0 ;
  129.           P0 = dat ;
  130.           ep = 1 ;
  131.           ep = 0 ;
  132. }

  133. void lcd_init()// 初始化
  134. {      
  135.          write_cmd(0x38) ;
  136.          delay(1);
  137.          write_cmd(0x08) ;  
  138.          delay(1);
  139.          write_cmd(0x01) ;
  140.          delay(1);
  141.          write_cmd(0x06) ;
  142.          delay(1);
  143.          write_cmd(0x0c) ;
  144.          delay(1);
  145. }

  146. void display(uchar addr, uchar q)//在某一地址上顯示一字節
  147. {          
  148.          delay(1) ;
  149.          write_addr(addr) ;
  150.    write_byte(q) ;
  151.          delay(1) ;
  152.          
  153. }

  154. /*********************** DHT11測試模塊***************************************/

  155. void start()//開始信號
  156. {
  157.         io=1;
  158.         delay1();
  159.         io=0;
  160.         delay(20);//>18ms
  161.         io=1;
  162.         delay1();//20-40us
  163.         delay1();
  164.         delay1();
  165.         delay1();
  166.         delay1();
  167. }
  168. uchar receive_byte()//接收一個字節
  169. {
  170.         uchar i,temp,count;
  171.         for(i=0;i<8;i++)
  172.         {
  173.         temp=0;
  174.                 delay1();delay1();delay1();delay1();
  175.                 if(io==1)temp=1;
  176.                 count=2;
  177.                 while((io)&&count++);
  178.                 if(count==1)break;
  179.                 data_byte<<=1;       
  180.                 data_byte|=temp;
  181.         }
  182.         return data_byte;
  183. }
  184. void receive()//接收數據
  185. {
  186.         uchar T_H,T_L,R_H,R_L,check,num_check;
  187.         uchar count;
  188.         start();//開始信號
  189.         io=1;
  190.         if(!io)//讀取DHT11響應信號
  191.         {
  192.        
  193.         while((io)&&count++);
  194.         R_H=receive_byte();
  195.         R_L=receive_byte();
  196.         T_H=receive_byte();
  197.         T_L=receive_byte();
  198.         check=receive_byte();
  199.         io=0;//拉低延時50us
  200.         delay1();delay1();delay1();delay1();delay1();
  201.         io=1;
  202.         num_check=R_H+R_L+T_H+T_L;
  203.         if(num_check=check)
  204.         {
  205.                 RH=R_H;
  206.                 RL=R_L;
  207.                 TH=T_H;
  208.                 TL=T_L;
  209.                 check=num_check;
  210.         }
  211.         }
  212. }


  213. void showw()   // 問候語函數
  214. {      
  215.            lcd_init(); //初始化
  216.             delay(10);
  217.        
  218.      display(0x05,'W');
  219.      display(0x06,'e');
  220.                  display(0x07,'l');
  221.                  display(0x08,'c');
  222.                  display(0x09,'o');
  223.                  display(0x0a,'m');
  224.      display(0x0b,'e');
  225.            delay(250); //短暫延時
  226.            delay(250);
  227.            delay(250);
  228.           

  229. /*********************************/
  230. /*
  231.            display(0x40,' ') ;
  232.                  display(0x41,'h');
  233.                  display(0x42,'e');
  234.                
  235. */
  236. }


  237. /*************定時器0初始化程序***************/
  238. void time_init()          
  239. {
  240.         EA   = 1;                   //開總中斷
  241.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  242.         ET0  = 1;                  //開定時器0中斷
  243.         TR0  = 1;                  //允許定時器0定時
  244. }



  245. void key() //按鍵程序 選擇菜單模式
  246. {
  247.      
  248.           if(!K1)
  249.                    {  
  250.                           delay(20);
  251.                             if(!K1)
  252.                          {   
  253.                                                          while(!K1)
  254.                                            ;
  255.                                                           yemian++;
  256.                                                           flat++;
  257.                                                                 if(yemian>=3) { yemian=0; }
  258.                                                                
  259.              }
  260.                    }

  261.        
  262.        
  263. }


  264. shezhi()  //對里面的數值進行修改
  265. {
  266.     if(!K2)
  267.                    {  
  268.                           delay(50);
  269.                             if(!K2)
  270.                          {   
  271.                                                          ;
  272.                                                          
  273.                                                          if(yemian==1)
  274.                                                          {
  275.                                                           WenDu+=1;
  276.                                                                 if(WenDu>99) { WenDu=99; }  //濕度上限加
  277.                                                          }
  278.                                                          
  279.                                                          if(yemian==2)
  280.                                                          {
  281.                                                           ShiDu+=1;
  282.                                                                 if(ShiDu>99) { ShiDu=99; }  //濕度下限加
  283.                                                          }
  284.                                                          
  285.                                                                 write_eeprom();       //保存數據               
  286.              }
  287.                    }
  288.                          
  289.                           if(!K3)
  290.                    {  
  291.                             delay(50);
  292.                              if(!K3)
  293.                          {   
  294.                                                        
  295.                                            ;
  296.                                                            if(yemian==1)
  297.                                                              {
  298.                                                               WenDu-=1;          //濕度下限減
  299.                                                                     if(WenDu<1) {WenDu=1; }
  300.                                                              }
  301.                                                          
  302.                                                            if(yemian==2)
  303.                                                              {
  304.                                                               ShiDu-=1;         //濕度下限減
  305.                                                                     if(ShiDu<1) { ShiDu=1; }
  306.                                                              }
  307.                                                                 write_eeprom();       //保存數據               
  308.              }
  309.                    }


  310. }



  311. /***************************主程序*********************************/
  312. void main()
  313. {
  314.          init_eeprom();                              //讀eeprom數據
  315.    time_init();                                //初始化定時器
  316.    showw();    //顯示問候語 和名字
  317.   
  318.         while(1)
  319.         {   
  320.                
  321.                    key();
  322.                 //====================yemian==0時 進入工作狀態=================================
  323.                          if(yemian==0)  
  324.                         {
  325.                                 if(flat==1)
  326.                                  {
  327.            flat=0;
  328.                                          lcd_init(); //初始化
  329.                                                   
  330.                                          display(0x00,'T') ;    //Temp
  331.                        display(0x01,'e');
  332.                        display(0x02,'m');
  333.                                          display(0x03,'p');
  334.            display(0x04,':');
  335.                                          
  336.                                          display(0x08,0xdf); // 度
  337.                        display(0x09,'C');
  338.                                          
  339.                                          
  340.                                          display(0x40,'H') ;    //Humi
  341.                        display(0x41,'u');
  342.                        display(0x42,'m');
  343.                                          display(0x43,'i');
  344.            display(0x44,':');
  345.                                          
  346.                                          display(0x47,'%');
  347.                                          display(0x48,'R');
  348.                                          display(0x49,'H');
  349.                                          
  350.                                          display(0x0c,'T');
  351.            display(0x0d,':');
  352.            display(0x0e,WenDu/10+0x30);  //報警溫度
  353.                        display(0x0f,WenDu%10+0x30);
  354.                                   
  355.                                          display(0x4c,'H');
  356.            display(0x4d,':');
  357.                                    display(0x4e,ShiDu/10+0x30);  //報警濕度
  358.                        display(0x4f,ShiDu%10+0x30);
  359.          
  360.           }
  361.                        
  362.                          if(flag_300ms == 1)
  363.                      {               
  364.                              flag_300ms = 0;
  365.            receive();
  366.                                          
  367.                                          display(0x05,TH/10+0x30);  //溫度顯示
  368.                        display(0x06,TH%10+0x30);
  369.                                          
  370.            display(0x45,RH/10+0x30);  //濕度顯示
  371.                        display(0x46,RH%10+0x30);
  372.                                          
  373.                                        
  374.            warn();
  375.                      }
  376.                        
  377.         }               
  378.                        
  379.         //====================yemian==1 溫度設置===========================
  380.                                 if(yemian==1)  //溫度
  381.                             {
  382.                          if(flat==1)
  383.                                      {
  384.                flat=0;  
  385.                                                           bee=1;
  386.                lcd_init(); //初始化
  387.                                                          display(0x06,'T');
  388.                                                          display(0x07,'e');
  389.                                                          display(0x08,'m');
  390.                                                          display(0x09,'p');
  391.              }
  392.                                                  
  393.                                                 shezhi();
  394.                                                 display(0x47,WenDu/10+0x30);  //溫度
  395.                         display(0x48,WenDu%10+0x30);
  396.                       }
  397.                        
  398.                 //====================yemian==1濕度設置==========================       
  399.                                 if(yemian==2)   //濕度設置
  400.                             {
  401.                          if(flat==1)
  402.                                      {
  403.                flat=0;  
  404.                                                           bee=1;
  405.                lcd_init(); //初始化
  406.                                                          display(0x06,'H');
  407.                                                          display(0x07,'u');
  408.                                                          display(0x08,'m');
  409.                                                          display(0x09,'i');
  410.                                                  }
  411.                                                  shezhi();
  412.                                                  display(0x47,ShiDu/10+0x30);  //濕度
  413.                          display(0x48,ShiDu%10+0x30);
  414.                       }
  415.         }
  416. }



  417. /*************定時器0中斷服務程序***************/
  418. void time0_int() interrupt 1
  419. {       
  420.         static uchar value;
  421.         TH0 = 0x3c;
  422.         TL0 = 0xb0;     // 50ms
  423.          
  424.         if(value % 6 == 0)
  425.         {
  426.                 flag_300ms = 1;           //300ms
  427.                 value = 0;
  428.         }
  429. }
復制代碼

所有資料51hei提供下載:
程序.rar (48.58 KB, 下載次數: 29)
回復

使用道具 舉報

ID:1 發表于 2018-12-18 01:49 | 顯示全部樓層
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品日日摸夜夜添夜夜av | www.99精品 | 人人看人人爽 | 久久999| 成人一区二区三区 | 日韩欧美一区在线 | 中文字幕av一区二区三区 | 免费视频二区 | 免费久久99精品国产婷婷六月 | 久久99深爱久久99精品 | 精品视频一二区 | 国产日韩欧美一区 | 亚洲成av人影片在线观看 | 国产综合在线视频 | 韩国久久精品 | 999re5这里只有精品 | 福利视频二区 | 日韩av中文 | 日韩aⅴ片 | 午夜寂寞影院在线观看 | 草比网站 | 国产一区二区三区亚洲 | 先锋资源在线 | 欧美成人一区二区三区 | 亚洲精品9999| 欧美精品一区二区在线观看 | a视频在线 | 中文在线a在线 | 中文成人在线 | 国产在线激情视频 | 国产日韩欧美一区二区 | 精品美女视频在免费观看 | 免费一级黄色录像 | 日本高清在线一区 | 欧美电影免费观看高清 | 日本久久久久久 | 一区二区三区四区在线 | 男人的天堂久久 | 亚洲区视频 | 久久99精品久久久 | 中文在线a在线 |