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

標(biāo)題: 單片機(jī)+DHT11溫濕度檢測程序+原理圖等資料 [打印本頁]

作者: 1183953327    時間: 2019-5-24 21:52
標(biāo)題: 單片機(jī)+DHT11溫濕度檢測程序+原理圖等資料
基于DHT11溫濕度報警系統(tǒng)LCD1602顯示操作說明

本設(shè)計系統(tǒng)是DHT11溫濕度報警系統(tǒng)LCD1602顯示,可設(shè)置溫度的高溫報警值和低溫報警值、濕度的高濕度報警值和低溫度報警值,當(dāng)有報警時蜂鳴器會發(fā)出滴滴的報警聲,同時綠色發(fā)光二極管閃爍,在LCD1602液晶上還能很直觀的看到報警信息。并具有掉電保存功能,數(shù)據(jù)保存在單片機(jī)內(nèi)部EEPOM中,進(jìn)入設(shè)置界面后如果沒有鍵按下系統(tǒng)會在30秒后自動退出設(shè)置界面,人性化的按鍵設(shè)置,按鍵還具有連加、減功能,當(dāng)按下按鍵時有按鍵聲即蜂鳴器叫一聲,按鍵聲可以進(jìn)入菜單內(nèi)設(shè)置,可設(shè)置按鍵聲打開或關(guān)閉。系統(tǒng)還設(shè)有取消報警回差值,增加的系統(tǒng)的抗干擾性。

報警方式:聲光報警   
蜂鳴器滴滴報警聲、發(fā)光二極管閃爍。
DHT11溫濕度檢測

單片機(jī)電路原理圖:




蜂鳴器    蜂鳴器    B1
10uF    電容    C1
20pF    電容    C2, C3
D    指示燈    D1, D2, D3, D4,
LCD1602    液晶    LCD1
9012    三極管    Q1
10K    電阻    R3, R4
2K    電阻    R1
2K    電阻    R2, R5
SW-PB    按鍵    S1, S2, S3, S4, S5
sw-灰色    電源開關(guān)    SW1
U1    單片機(jī)    U1
DHT11    溫濕度傳感器    U2
12M    晶振    Y1

單片機(jī)源程序如下:
  1. #include <reg52.h>                 //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

  4. sbit beep = P1^4;   //蜂鳴器

  5. int flag_300ms ;

  6. //  按鍵的IO變量的定義
  7. uchar key_can;                 //按鍵值的變量

  8. sbit wh_led = P2^2;  //溫度報警指示燈IO口定義
  9. sbit wl_led = P2^3;  //溫度報警指示燈IO口定義
  10. sbit sh_led = P2^1;  //濕度報警指示燈IO口定義
  11. sbit sl_led = P2^0;  //濕度報警指示燈IO口定義

  12. uchar flag_en = 1;

  13. uchar menu_1;        //菜單設(shè)計的變量
  14. uint t_high = 35,t_low = 10;        //溫度報警參數(shù)
  15. uint s_high = 80,s_low = 10;        //濕度報警參數(shù)

  16. /***************************************************************
  17. * 名稱 : delay_1ms()
  18. * 功能 : 延時1ms函數(shù)
  19. * 輸入 : q
  20. * 輸出 : 無
  21. ****************************************************************/
  22. void delay_1ms(uint q)
  23. {
  24.         uint i,j;
  25.         for(i=0;i<q;i++)
  26.                 for(j=0;j<120;j++);
  27. }

  28. sbit dht11=P1^5;         //溫度傳感器IO口定義
  29. uchar table_dht11[5]={1,2,3,4,5};

  30. uchar code table_num[]="0123456789abcdefg";

  31. sbit rs=P1^0;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
  32. sbit rw=P1^1;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
  33. sbit e =P1^2;         //片選信號   下降沿觸發(fā)

  34. /********************************************************************
  35. * 名稱 : delay_uint()
  36. * 功能 : 小延時。
  37. * 輸入 : 無
  38. * 輸出 : 無
  39. ***********************************************************************/
  40. void delay_uint(uint q)
  41. {
  42.         while(q--);
  43. }

  44. /********************************************************************
  45. * 名稱 : write_com(uchar com)
  46. * 功能 : 1602命令函數(shù)
  47. * 輸入 : 輸入的命令值
  48. * 輸出 : 無
  49. ***********************************************************************/
  50. void write_com(uchar com)
  51. {
  52.         e=0;
  53.         rs=0;
  54.         rw=0;
  55.         P0=com;
  56.         delay_uint(25);
  57.         e=1;
  58.         delay_uint(100);
  59.         e=0;
  60. }

  61. /********************************************************************
  62. * 名稱 : write_data(uchar dat)
  63. * 功能 : 1602寫數(shù)據(jù)函數(shù)
  64. * 輸入 : 需要寫入1602的數(shù)據(jù)
  65. * 輸出 : 無
  66. ***********************************************************************/
  67. void write_data(uchar dat)
  68. {
  69.         e=0;
  70.         rs=1;
  71.         rw=0;
  72.         P0=dat;
  73.         delay_uint(25);
  74.         e=1;
  75.         delay_uint(100);
  76.         e=0;       
  77. }


  78. /***********************lcd1602上顯示特定的字符****0XDF 度********************/
  79. void write_zifu(uchar hang,uchar add,uchar date)
  80. {
  81.         if(hang==1)   
  82.                 write_com(0x80+add);
  83.         else
  84.                 write_com(0x80+0x40+add);
  85.         write_data(date);       
  86. }

  87. /***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
  88. void write_sfm2(uchar hang,uchar add,uint date)
  89. {
  90.         if(hang==1)   
  91.                 write_com(0x80+add);
  92.         else
  93.                 write_com(0x80+0x40+add);
  94.         write_data(0x30+date/10%10);
  95.         write_data(0x30+date%10);       
  96. }

  97. /***********************lcd1602上顯示這字符函數(shù)************************/
  98. void write_string(uchar hang,uchar add,uchar *p)
  99. {
  100.         if(hang==1)   
  101.                 write_com(0x80+add);
  102.         else
  103.                 write_com(0x80+0x40+add);
  104.                 while(1)                                                                                                                 
  105.                 {
  106.                         if(*p == '\0')  break;
  107.                         write_data(*p);
  108.                         p++;
  109.                 }       
  110. }

  111. /***********************lcd1602初始化設(shè)置************************/
  112. void init_1602()        //lcd1602初始化
  113. {
  114.         write_com(0x38);       
  115.         write_com(0x0c);
  116.         write_com(0x06);
  117.         delay_uint(1000);
  118.         write_string(1,0,"Wd:00  H00  L00   ");       
  119.         write_string(2,0,"Sd:00% H00% L00% ");       
  120.         write_zifu(1,5,0xdf);        //顯示度               
  121.         write_zifu(1,10,0xdf);        //顯示度       
  122.         write_zifu(1,15,0xdf);        //顯示度       
  123.         write_sfm2(1,3,table_dht11[2]);           //顯示溫度
  124.         write_sfm2(2,3,table_dht11[0]);   //顯示濕度       
  125.         write_sfm2(1,7,t_high);          //顯示溫度
  126.         write_sfm2(2,7,s_high);   //顯示濕度               
  127.         write_sfm2(1,10,t_low);          //顯示溫度
  128.         write_sfm2(2,10,s_low);   //顯示濕度               
  129. }

  130. /********************獨立按鍵程序*****************/
  131. uchar key_can;         //按鍵值

  132. void key()             //獨立按鍵程序
  133. {
  134.         static uchar key_new;
  135.         key_can = 20;               //按鍵值還原
  136.         P3 |= 0xf0;
  137.         if((P3 & 0xf0) != 0xf0)                //按鍵按下
  138.         {
  139.                 delay_1ms(1);                     //按鍵消抖動
  140.                 if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
  141.                 {                                                //確認(rèn)是按鍵按下
  142.                         key_new = 0;
  143.                         switch(P3 & 0xf0)
  144.                         {
  145.                                 case 0xd0: key_can = 1; break;           //得到k1鍵值
  146.                                 case 0xb0: key_can = 2; break;           //得到K2鍵值
  147.                                 case 0x70: key_can = 3; break;           //得到k3鍵值
  148.                         }
  149.                 }                       
  150.         }
  151.         else
  152.                 key_new = 1;       
  153. }


  154. /****************按鍵顯示函數(shù)***************/
  155. void key_with()
  156. {
  157.         if(key_can == 1)           //設(shè)置鍵
  158.         {
  159.                 menu_1 ++;
  160.                 if(menu_1 > 2)
  161.                 {
  162.                         menu_1 = 0;
  163.                         init_1602();  //lcd1602初始化                       
  164.                 }
  165.         }
  166.         if(menu_1 == 1)                        //設(shè)置高溫報警
  167.         {
  168.                 if(key_can == 2)
  169.                 {
  170.                         t_high ++ ;                //設(shè)置高溫值加1        
  171.                         if(t_high > 99)
  172.                                 t_high = 99;
  173.                 }
  174.                 if(key_can == 3)
  175.                 {
  176.                         t_high -- ;                //設(shè)置高溫值減1        
  177.                         if(t_high <= t_low)
  178.                                 t_high = t_low + 1;
  179.                 }
  180.                 write_sfm2(1,8,t_high);           //顯示溫度
  181.                 write_com(0x80+8);             //將光標(biāo)移動到秒個位
  182.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍       
  183.         }       
  184.         if(menu_1 == 2)                        //設(shè)置低溫報警
  185.         {
  186.                 if(key_can == 2)
  187.                 {
  188.                         t_low ++ ;                        //設(shè)置低溫值加1
  189.                         if(t_low >= t_high)
  190.                                 t_low = t_high - 1;
  191.                 }
  192.                 if(key_can == 3)                         //設(shè)置高溫值減1
  193.                 {
  194.                         t_low -- ;                       
  195.                         if(t_low <= 1)
  196.                                 t_low = 1;
  197.                 }
  198.                 write_sfm2(1,13,t_low);   //顯示濕度       
  199.                 write_com(0x80+13);            //將光標(biāo)移動到秒個位
  200.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍       
  201.         }
  202.         if(menu_1 == 3)                        //設(shè)置高濕報警
  203.         {
  204.                 if(key_can == 2)
  205.                 {
  206.                         s_high ++ ;                //設(shè)置高濕值加1        
  207.                         if(s_high > 99)
  208.                                 s_high = 99;
  209.                 }
  210.                 if(key_can == 3)
  211.                 {
  212.                         s_high -- ;                //設(shè)置高濕值減1        
  213.                         if(s_high <= s_low)
  214.                                 s_high = s_low + 1;
  215.                 }
  216.                 write_sfm2(2,8,s_high);           //顯示濕度
  217.                 write_com(0x80+0x40+8);             //將光標(biāo)移動到秒個位
  218.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍       
  219.         }       
  220.         if(menu_1 == 4)                        //設(shè)置低濕報警
  221.         {
  222.                 if(key_can == 2)
  223.                 {
  224.                         s_low ++ ;                        //設(shè)置低濕值加1
  225.                         if(s_low >= s_high)
  226.                                 s_low = s_high - 1;
  227.                 }
  228.                 if(key_can == 3)                         //設(shè)置低濕值減1
  229.                 {
  230.                         s_low -- ;                       
  231.                         if(s_low <= 1)
  232.                                 s_low = 1;
  233.                 }
  234.                 write_sfm2(2,13,s_low);           //顯示濕度
  235.                 write_com(0x80+0x40+13);            //將光標(biāo)移動到秒個位
  236.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍       
  237.         }               
  238. }


  239. /*****************讀溫濕度傳感器程序****************/
  240. void dst11()
  241. {
  242.         uchar i,j;                         
  243.         dht11 = 0;       
  244.         delay_1ms(5);
  245.         dht11 = 1;
  246.         delay_uint(4);         //50us
  247.         if(dht11 == 0)          //判斷是否響應(yīng)    0 為響應(yīng)
  248.         {
  249.                 while(dht11 == 0);
  250.                 while(dht11 == 1);          //等待響應(yīng)時間過完
  251.                 for(i=0;i<5;i++)
  252.                 {
  253.                         for(j=0;j<8;j++)
  254.                         {
  255.                                 table_dht11[i] <<= 1;
  256.                                 while(dht11 == 1);
  257.                                 delay_uint(4);         //50us         數(shù)據(jù)1的高電平時間為110us 低為27us
  258.                                 if(dht11 == 1)
  259.                                 {
  260.                                         table_dht11[i] |= 0x01;
  261.                                         while(dht11 == 1);          //等待響應(yīng)時間過完
  262.                                 }                       
  263.                         }                       
  264.                 }                       
  265.         }
  266.         dht11 = 1;
  267. }


  268. /****************報警函數(shù)***************/
  269. void clock_h_l()
  270. {
  271.         if((table_dht11[2] >= t_high))
  272.         {                         
  273.                 wh_led = 0;                  //打開指示燈
  274.         }
  275.         else
  276.         {
  277.                 wh_led = 1;                  //關(guān)閉指示燈
  278.         }

  279.         if((table_dht11[2] <= t_low))
  280.         {                         
  281.                 wl_led = 0;                  //打開指示燈
  282.         }
  283.         else
  284.         {
  285.                 wl_led = 1;                  //關(guān)閉指示燈
  286.         }

  287.         if((table_dht11[0] >= s_high))
  288.         {
  289.                 sh_led = 0;                  //打開指示燈
  290.         }else
  291.         {
  292.                 sh_led = 1;                  //關(guān)閉指示燈
  293.         }

  294.         if((table_dht11[0] <= s_low))
  295.         {
  296.                 sl_led = 0;                  //打開指示燈
  297.         }else
  298.         {
  299.                 sl_led = 1;                  //關(guān)閉指示燈
  300.         }

  301.         if((wh_led == 0) || (wl_led == 0) || (sh_led == 0) || (sl_led == 0))
  302.         {
  303.                         if(flag_en == 1)
  304.                         beep = ~beep;           //蜂鳴器報警
  305.         }
  306.         else
  307.         {
  308.                 beep = 1;
  309.                 flag_en = 1;
  310.         }

  311. }


  312. /******************主程序**********************/          
  313. void main()
  314. {               

  315.         beep = 0;                                //開機(jī)叫一聲   
  316.         delay_1ms(150);
  317.         P0 = P1 = P2 = P3 = 0xff;
  318.         init_1602();        //lcd1602初始化
  319.         while(1)
  320.         {
  321.                 flag_300ms ++;
  322.                 if(flag_300ms >= 300)
  323.                 {
  324.                         flag_300ms = 0;
  325.                         dst11();                //先讀出溫濕度1的值
  326.                         write_sfm2(2,3,table_dht11[0]);   //顯示濕度       
  327.                         write_sfm2(1,3,table_dht11[2]);           //顯示溫度
  328.                         clock_h_l();   //報警函數(shù)
  329.                 }
  330.                 key();
  331.                 if(key_can < 10)
  332.                 {
  333.                         key_with();                            //設(shè)置報警溫度       
  334.                         if(key_can == 3)
  335.                         {
  336.                                 flag_en = 0;   //手動取消報警
  337.                         }
  338.                 }
  339.                 delay_1ms(1);
  340.         }
  341. }
復(fù)制代碼

所有資料51hei提供下載:
DHT11溫濕度檢測 發(fā)送資料.4個燈.rar (3.52 MB, 下載次數(shù): 329)


作者: xiedada    時間: 2019-11-9 13:16
真棒
作者: 你是白癡    時間: 2019-11-17 20:51
請問DHT11溫濕度傳感器在ISIS7中應(yīng)該用什么元件替代?
作者: 接收不到    時間: 2019-11-24 14:42
我想問下,為什么DHT11一值沒有傳回數(shù)據(jù)回來呢
作者: 接收不到    時間: 2019-11-24 14:43
你是白癡 發(fā)表于 2019-11-17 20:51
請問DHT11溫濕度傳感器在ISIS7中應(yīng)該用什么元件替代?

就畫一個3個排針就好了
作者: sick    時間: 2020-4-3 23:23
樓主,小白我問個問題,為什么沒看見定義按鍵的引腳,還有uchar key_can;        這個什么意思,求大佬告知
作者: huida1999    時間: 2020-4-21 15:26
您好,想問問您有proteus軟件仿真圖嗎
作者: huida1999    時間: 2020-4-21 15:26
您好,請問您有proteus軟件的仿真圖嗎
作者: 705800782    時間: 2020-5-11 19:10
在這里的代碼齊全嘛?還是說 壓縮包里得齊全?
作者: 705800782    時間: 2020-5-11 19:11
你現(xiàn)在的程序是完整的嘛?
作者: 71672727    時間: 2020-5-12 11:05
您好,請問您有proteus軟件的仿真圖嗎
作者: 71672727    時間: 2020-5-12 11:06
您好,請問您有proteus軟件的仿真圖嗎
作者: 少加點糖    時間: 2020-5-12 11:17
你好,請問程序可以運行嗎
作者: newheyuan    時間: 2020-5-17 11:30
不能用
作者: newheyuan    時間: 2020-5-17 11:31
程序根本就沒有讀DHT11數(shù)據(jù)的程序
作者: newheyuan    時間: 2020-5-17 11:31
少加點糖 發(fā)表于 2020-5-12 11:17
你好,請問程序可以運行嗎

不用想了,不能運行的。程序里根本就沒有讀取DHT11的驅(qū)動程序
作者: yinke-21    時間: 2020-5-25 21:26
強(qiáng),向樓主學(xué)習(xí)
作者: 1847@wy    時間: 2020-6-3 20:50
這個顯示好像有些問題呀,
作者: 練啟泓1294949    時間: 2020-7-3 17:33
這里是不是完整程序,還是說在壓縮包里面
作者: 練啟泓1294949    時間: 2020-7-3 17:33
newheyuan 發(fā)表于 2020-5-17 11:31
不用想了,不能運行的。程序里根本就沒有讀取DHT11的驅(qū)動程序

我也運行不了
作者: 陳二土    時間: 2020-7-15 22:40
1847@wy 發(fā)表于 2020-6-3 20:50
這個顯示好像有些問題呀,

我也覺得顯示有問題,我弄了protues仿真,按下設(shè)置鍵顯示不對
作者: pwz0    時間: 2020-7-24 09:33
接收不到 發(fā)表于 2019-11-24 14:42
我想問下,為什么DHT11一值沒有傳回數(shù)據(jù)回來呢

我試了一下這個讀溫濕度傳感器程序,delay_1ms(5)應(yīng)該是延時時間太短 根據(jù)DHT11的手冊,起始信號拉低最少要延時18ms再拉高,所以改成delay_1ms(18)或者時間再長一點,就能讀回數(shù)據(jù)




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 最新国产视频 | 亚洲天堂一区二区 | 婷婷综合五月天 | 国产亚洲欧美在线视频 | 成人国产精品久久久 | 国产精品美女一区二区 | 在线免费看黄 | 亚洲成人免费视频在线 | 综合久久综合久久 | 欧美一级免费看 | 久久99精品久久久久久青青日本 | 欧美成视频 | 国产日韩欧美 | 国产98色在线 | 日韩 | 国产亚洲精品美女久久久久久久久久 | 久久久久亚洲 | 国产精品大片在线观看 | 久久高清| 黄色a级一级片 | 性一交一乱一透一a级 | 成人国内精品久久久久一区 | 人人做人人澡人人爽欧美 | 国产成人精品免费视频大全最热 | www.久| 久久免费精品视频 | 激情综合五月 | 91一区二区 | 免费观看一级黄色录像 | 综合网在线 | 欧美 日韩精品 | 国产精品久久久久一区二区三区 | 亚洲一区二区中文字幕在线观看 | 在线欧美一区二区 | 日韩成人在线视频 | 久久综合九色综合欧美狠狠 | av一区二区三区四区 | 免费看一级毛片 | www.色综合 | 人人天天操| 国产成人精品久久二区二区91 | 美女日皮网站 |