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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+DHT11溫濕度檢測程序+原理圖等資料

  [復制鏈接]
跳轉到指定樓層
樓主
基于DHT11溫濕度報警系統LCD1602顯示操作說明

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

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

單片機電路原理圖:




蜂鳴器    蜂鳴器    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-灰色    電源開關    SW1
U1    單片機    U1
DHT11    溫濕度傳感器    U2
12M    晶振    Y1

單片機源程序如下:
  1. #include <reg52.h>                 //調用單片機頭文件
  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;        //菜單設計的變量
  14. uint t_high = 35,t_low = 10;        //溫度報警參數
  15. uint s_high = 80,s_low = 10;        //濕度報警參數

  16. /***************************************************************
  17. * 名稱 : delay_1ms()
  18. * 功能 : 延時1ms函數
  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:數據寄存器          L:指令寄存器
  32. sbit rw=P1^1;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  33. sbit e =P1^2;         //片選信號   下降沿觸發

  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命令函數
  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寫數據函數
  64. * 輸入 : 需要寫入1602的數據
  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上顯示兩位十進制數************************/
  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上顯示這字符函數************************/
  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初始化設置************************/
  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.                 {                                                //確認是按鍵按下
  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. /****************按鍵顯示函數***************/
  155. void key_with()
  156. {
  157.         if(key_can == 1)           //設置鍵
  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)                        //設置高溫報警
  167.         {
  168.                 if(key_can == 2)
  169.                 {
  170.                         t_high ++ ;                //設置高溫值加1        
  171.                         if(t_high > 99)
  172.                                 t_high = 99;
  173.                 }
  174.                 if(key_can == 3)
  175.                 {
  176.                         t_high -- ;                //設置高溫值減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);             //將光標移動到秒個位
  182.                 write_com(0x0f);                    //顯示光標并且閃爍       
  183.         }       
  184.         if(menu_1 == 2)                        //設置低溫報警
  185.         {
  186.                 if(key_can == 2)
  187.                 {
  188.                         t_low ++ ;                        //設置低溫值加1
  189.                         if(t_low >= t_high)
  190.                                 t_low = t_high - 1;
  191.                 }
  192.                 if(key_can == 3)                         //設置高溫值減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);            //將光標移動到秒個位
  200.                 write_com(0x0f);                    //顯示光標并且閃爍       
  201.         }
  202.         if(menu_1 == 3)                        //設置高濕報警
  203.         {
  204.                 if(key_can == 2)
  205.                 {
  206.                         s_high ++ ;                //設置高濕值加1        
  207.                         if(s_high > 99)
  208.                                 s_high = 99;
  209.                 }
  210.                 if(key_can == 3)
  211.                 {
  212.                         s_high -- ;                //設置高濕值減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);             //將光標移動到秒個位
  218.                 write_com(0x0f);                    //顯示光標并且閃爍       
  219.         }       
  220.         if(menu_1 == 4)                        //設置低濕報警
  221.         {
  222.                 if(key_can == 2)
  223.                 {
  224.                         s_low ++ ;                        //設置低濕值加1
  225.                         if(s_low >= s_high)
  226.                                 s_low = s_high - 1;
  227.                 }
  228.                 if(key_can == 3)                         //設置低濕值減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);            //將光標移動到秒個位
  236.                 write_com(0x0f);                    //顯示光標并且閃爍       
  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)          //判斷是否響應    0 為響應
  248.         {
  249.                 while(dht11 == 0);
  250.                 while(dht11 == 1);          //等待響應時間過完
  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         數據1的高電平時間為110us 低為27us
  258.                                 if(dht11 == 1)
  259.                                 {
  260.                                         table_dht11[i] |= 0x01;
  261.                                         while(dht11 == 1);          //等待響應時間過完
  262.                                 }                       
  263.                         }                       
  264.                 }                       
  265.         }
  266.         dht11 = 1;
  267. }


  268. /****************報警函數***************/
  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;                  //關閉指示燈
  278.         }

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

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

  294.         if((table_dht11[0] <= s_low))
  295.         {
  296.                 sl_led = 0;                  //打開指示燈
  297.         }else
  298.         {
  299.                 sl_led = 1;                  //關閉指示燈
  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;                                //開機叫一聲   
  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();   //報警函數
  329.                 }
  330.                 key();
  331.                 if(key_can < 10)
  332.                 {
  333.                         key_with();                            //設置報警溫度       
  334.                         if(key_can == 3)
  335.                         {
  336.                                 flag_en = 0;   //手動取消報警
  337.                         }
  338.                 }
  339.                 delay_1ms(1);
  340.         }
  341. }
復制代碼

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

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

使用道具 舉報

沙發
ID:638594 發表于 2019-11-9 13:16 | 只看該作者
真棒
回復

使用道具 舉報

板凳
ID:556679 發表于 2019-11-17 20:51 | 只看該作者
請問DHT11溫濕度傳感器在ISIS7中應該用什么元件替代?
回復

使用道具 舉報

地板
ID:648362 發表于 2019-11-24 14:42 | 只看該作者
我想問下,為什么DHT11一值沒有傳回數據回來呢
回復

使用道具 舉報

5#
ID:648362 發表于 2019-11-24 14:43 | 只看該作者
你是白癡 發表于 2019-11-17 20:51
請問DHT11溫濕度傳感器在ISIS7中應該用什么元件替代?

就畫一個3個排針就好了
回復

使用道具 舉報

6#
ID:421783 發表于 2020-4-3 23:23 | 只看該作者
樓主,小白我問個問題,為什么沒看見定義按鍵的引腳,還有uchar key_can;        這個什么意思,求大佬告知
回復

使用道具 舉報

7#
ID:350754 發表于 2020-4-21 15:26 | 只看該作者
您好,想問問您有proteus軟件仿真圖嗎
回復

使用道具 舉報

8#
ID:350754 發表于 2020-4-21 15:26 | 只看該作者
您好,請問您有proteus軟件的仿真圖嗎
回復

使用道具 舉報

9#
ID:747552 發表于 2020-5-11 19:10 | 只看該作者
在這里的代碼齊全嘛?還是說 壓縮包里得齊全?
回復

使用道具 舉報

10#
ID:747552 發表于 2020-5-11 19:11 | 只看該作者
你現在的程序是完整的嘛?
回復

使用道具 舉報

11#
ID:749778 發表于 2020-5-12 11:05 | 只看該作者
您好,請問您有proteus軟件的仿真圖嗎
回復

使用道具 舉報

12#
ID:749778 發表于 2020-5-12 11:06 | 只看該作者
您好,請問您有proteus軟件的仿真圖嗎
回復

使用道具 舉報

13#
ID:748803 發表于 2020-5-12 11:17 | 只看該作者
你好,請問程序可以運行嗎
回復

使用道具 舉報

14#
ID:171157 發表于 2020-5-17 11:30 | 只看該作者
不能用
回復

使用道具 舉報

15#
ID:171157 發表于 2020-5-17 11:31 | 只看該作者
程序根本就沒有讀DHT11數據的程序
回復

使用道具 舉報

16#
ID:171157 發表于 2020-5-17 11:31 | 只看該作者
少加點糖 發表于 2020-5-12 11:17
你好,請問程序可以運行嗎

不用想了,不能運行的。程序里根本就沒有讀取DHT11的驅動程序
回復

使用道具 舉報

17#
ID:761098 發表于 2020-5-25 21:26 | 只看該作者
強,向樓主學習
回復

使用道具 舉報

18#
ID:767601 發表于 2020-6-3 20:50 來自手機 | 只看該作者
這個顯示好像有些問題呀,
回復

使用道具 舉報

19#
ID:717291 發表于 2020-7-3 17:33 | 只看該作者
這里是不是完整程序,還是說在壓縮包里面
回復

使用道具 舉報

20#
ID:717291 發表于 2020-7-3 17:33 | 只看該作者
newheyuan 發表于 2020-5-17 11:31
不用想了,不能運行的。程序里根本就沒有讀取DHT11的驅動程序

我也運行不了
回復

使用道具 舉報

21#
ID:564944 發表于 2020-7-15 22:40 | 只看該作者
1847@wy 發表于 2020-6-3 20:50
這個顯示好像有些問題呀,

我也覺得顯示有問題,我弄了protues仿真,按下設置鍵顯示不對
回復

使用道具 舉報

22#
ID:597214 發表于 2020-7-24 09:33 | 只看該作者
接收不到 發表于 2019-11-24 14:42
我想問下,為什么DHT11一值沒有傳回數據回來呢

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美性一级 | 免费一区二区三区 | 日韩欧美一区二区在线播放 | 一级欧美黄色片 | 中文字幕视频在线观看 | 国产午夜精品一区二区三区嫩草 | 国产一区久久久 | 黄色一级电影免费观看 | 日本一二区视频 | 国产精品免费看 | 欧美视频在线播放 | 久草福利 | 亚洲色图婷婷 | 91久久久精品国产一区二区蜜臀 | 国产男女视频 | 欧美一区二区久久 | 天天久久 | 欧美一级淫片免费视频黄 | 亚洲综合在线播放 | 亚洲人成人一区二区在线观看 | 色精品 | 欧美日韩三区 | 99re在线视频 | 国产一区二区 | 国产精品一二区 | 久久久久黑人 | 亚洲一区二区中文字幕 | 久久国产精品一区二区三区 | 国产剧情一区二区三区 | 国产精品大片在线观看 | 久草.com | 国产在线精品一区二区三区 | 美国一级片在线观看 | 国产精品日日摸夜夜添夜夜av | 大伊人久久 | 国产色片在线 | 亚洲性人人天天夜夜摸 | 国产精品一区二区三区久久 | 欧美久久久久久 | 国产丝袜一区二区三区免费视频 | 一级特黄视频 |