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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的智能加濕器(DHT11源程序)

  [復制鏈接]
跳轉到指定樓層
樓主
基于51單片機的智能加濕器最近幫小伙伴的,設計一款智能加濕器,要求能夠設置溫度上下限并且在LCD1602上進行數據顯示,現在項目做完就分享一下,可以作為51單片機練手的項目
下面是一些圖,在壓縮包里都可以看見,其他包括程序和數據手冊也會一起打包.

繼電器&&加濕器模塊DXP原理圖



加濕器模塊實物







1、硬件連接
//DHT11
io = P1^0;    //DHT11 DATA端口

//蜂鳴器和LED
sbit Beep = P2^0;   //蜂鳴器
sbit Led = P2^1;    //LED

sbit Led_SF = P2^2;   //噴霧LED
sbit Led_DJ = P2^3;   //待機LED

//按鍵
sbit Key_Wake = P2^4;    //按鍵接地
sbit Key_Set = P1^2;    //設置按鍵    //Version:2.0
sbit Key_Sel = P1^3;    //上下限選擇
sbit Key_Up = P1^4;     //增加
sbit Key_Down = P1^5;   //減少
sbit Key_End = P1^6;    //退出設置

/*   LCD1602
#define LCD1602_DB  P0   //數據  P0^0-->DB0
sbit LCD1602_RW = P2^5;   //RW
sbit LCD1602_RS = P2^6;   //RS
sbit LCD1602_EN = P2^7;   //EN    */   
2、操作說明
   (1)默認是運行階段,按鍵按一次(會有蜂鳴器響)進入待機狀態,LCD顯示Sleepping,待機LED亮
    (2) 按Key_Set鍵時進入"Setting"設置界面,Sel鍵為上下限切換,Up為增加,Down為減少,End為退出
        例如設置下限為44:按Set,按4次Up,再按End退出即可,(設置上限還需要按下Sel切換鍵)
3、默認設置濕度大于70%RH時,停止噴霧,濕度小于40%RH時,打開加濕器(噴霧LED亮起)

下面是單片機代碼(mian),2秒延時刷新一次,包括DHT11源碼,整個系統有三個模式,分別是運行模式、設置模式與待機模式
  1. /******************************************************
  2. By:CYJ
  3. Version:2.0
  4. LCDD1602顯示界面
  5.      0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  6.    0 T e m p :     °C     
  7.    1 H u m i :     % R H
  8.            H _ U :       H _ D  :
  9. *******************************************************/
  10. //LCD1602上顯示當前的溫濕度及單位其中濕度在第一行顯示溫度在第二行顯示
  11. # include <reg51.h>
  12. # include <intrins.h>
  13. #include "lcd.h"
  14.         
  15. //DHT11
  16. sbit io=P1^0;      //dht11 data端接單片機的P1^0口

  17. //加濕器控制按鍵
  18. sbit JSQ = P1^1;

  19. //蜂鳴&LED控制位
  20. sbit Beep = P2^0;   //蜂鳴器
  21. sbit Led = P2^1;    //測試LED

  22. sbit Led_SF = P2^2;   //噴霧LED
  23. sbit Led_DJ = P2^3;   //待機LED

  24. //按鍵掃描
  25. sbit Key_Wake = P2^4;   //喚醒按鍵
  26. sbit Key_Set = P1^2;    //進入設置
  27. sbit Key_Sel = P1^3;    //移位控制
  28. sbit Key_Up = P1^4;     //增加
  29. sbit Key_Down = P1^5;   //減少
  30. sbit Key_End = P1^7;    //退出設置

  31. /*   LCD1602
  32. #define LCD1602_DB  P0
  33. sbit LCD1602_RW = P2^5;//數據總線
  34. sbit LCD1602_RS = P2^6;     
  35. sbit LCD1602_EN = P2^7; */         

  36. uchar Flag = 0;    //喚醒
  37. uchar data_byte;
  38. uchar RH = 0,RL = 0,TH = 0,TL = 0; //DHT11的數據位

  39. uchar *XP1 = "Temp:";   //溫度
  40. uchar *XP2 = "Humi:";   //濕度
  41. uchar *XP3 = "C";      //溫度單位
  42. uchar *XP4 = "%RH";     //濕度單位

  43. uchar *XP5 = "Hello the world";   //啟動界面
  44. uchar *XP6 =  "Starting...";
  45. uchar *XP7 = "Sleepping...";   //待機狀態

  46. uchar *XP8 = "Setting..."; //設置中
  47. uchar *XP9 = "H_U:";   //上限
  48. uchar *XP10 = "H_D:";  //下限

  49. uchar code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-'};
  50. uchar Humi_U = 70,Humi_D = 40;     //濕度上下限
  51. uchar yiwei = 0;

  52. /*******************************************************************************
  53. * 函數名      : delayxms()\ delay1()
  54. * 功能                    : 延時
  55. * 輸入        :
  56. * 輸出        :
  57. *******************************************************************************/
  58. void delayxms(uint xms)   //0us
  59. {
  60.     unsigned char a = 0,b = 0;
  61.           uint num = 0;
  62.         
  63.           for(num=xms;num>0;num--)
  64.         {
  65.     for(b=199;b>0;b--)
  66.         for(a=1;a>0;a--);
  67.         }
  68. }

  69. void delay(uchar ms) //延時模塊//

  70. {

  71.   uchar i;

  72.   while(ms--)                 

  73.         

  74. for(i=0;i<100;i++);

  75. }

  76. void delay1()

  77. {

  78.   uchar i;

  79.   for(i=0;i<1;i++);

  80. }

  81. /*******************************************************************************
  82. * 函數名      :
  83. * 功能                    : DHT11讀取溫濕度
  84. * 輸入        :
  85. * 輸出        :
  86. *******************************************************************************/
  87. void start()//開始信號

  88. {

  89.   io=1;

  90.   //delay1();
  91.   _nop_();
  92.         _nop_();
  93.         _nop_();
  94.         _nop_();
  95.         _nop_();
  96.         _nop_();
  97.         _nop_();
  98.         _nop_();
  99.         _nop_();
  100.         
  101.   io=0;

  102.   delay(25);// 主機把總線拉低必須大于18ms保證DHT11能檢測到起始信號

  103.   io=1;    //發送開始信號結束后拉高電平延時20-40us

  104.         _nop_();
  105.         _nop_();
  106.         _nop_();
  107.         _nop_();
  108.         _nop_();
  109.         _nop_();
  110.         _nop_();
  111.         _nop_();
  112.         _nop_();
  113.         _nop_();
  114.         _nop_();
  115.         _nop_();
  116.         _nop_();
  117.         _nop_();
  118.         _nop_();
  119.         _nop_();
  120.         _nop_();
  121.         _nop_();
  122.         _nop_();
  123.         _nop_();
  124.         _nop_();
  125.         _nop_();
  126.         _nop_();
  127.         _nop_();
  128.         _nop_();
  129.         _nop_();
  130.         _nop_();
  131.         _nop_();
  132. }

  133. uchar receive_byte()//接收一個字節
  134. {

  135.   uchar i,temp;

  136.   for(i=0;i<8;i++)    //接收8bit的數據

  137.   {

  138.          while(!io);   //等待50us的低電平開始信號結束
  139.   _nop_();
  140.         _nop_();
  141.         _nop_();
  142.         _nop_();
  143.         _nop_();
  144.         _nop_();
  145.         _nop_();
  146.         _nop_();
  147.         _nop_();
  148.         _nop_();
  149.         _nop_();
  150.         _nop_();
  151.         _nop_();
  152.         _nop_();
  153.         _nop_();
  154.         _nop_();
  155.         _nop_();
  156.         _nop_();
  157.         _nop_();
  158.         _nop_();
  159.         _nop_();
  160.         _nop_();
  161.         _nop_();
  162.         _nop_();
  163.         _nop_();
  164.         _nop_();

  165.          temp=0;  //時間為26us-28us表示接收的為數據'0'

  166.          if(io==1)

  167.          temp=1; //如果26us-28us之后還為高電平則表示接收的數據為'1'

  168.     while(io);//等待數據信號高電平'0'為26us-28us'1'為70us

  169.          data_byte<<=1;//接收的數據為高位在前右移

  170.          data_byte|=temp;

  171.   }

  172.   return data_byte;

  173. }   

  174. void receive()      //接收數據

  175. {

  176.   uchar T_H,T_L,R_H,R_L,check,num_check,i;

  177.   start();//開始信號//

  178.   io=1;   //主機設為輸入判斷從機DHT11響應信號

  179.   if(!io)//判斷從機是否有低電平響應信號//

  180.   {  
  181.         while(!io);//判斷從機發出 80us 的低電平響應信號是否結束//

  182.         while(io);//判斷從機發出 80us 的高電平是否結束如結束則主機進入數據接收狀態

  183.         R_H=receive_byte();//濕度高位

  184.          R_L=receive_byte();//濕度低位

  185.         T_H=receive_byte();//溫度高位

  186.         T_L=receive_byte();//溫度低位

  187.         check=receive_byte();//校驗位

  188.         io=0;       //當最后一bit數據接完畢后從機拉低電平50us

  189.         for(i=0;i<7;i++)        //差不多50us的延時
  190.   {
  191.                 _nop_();    //7us  
  192.                 _nop_();
  193.                 _nop_();
  194.                 _nop_();
  195.                 _nop_();
  196.                 _nop_();
  197.                 _nop_();
  198.         }
  199.         _nop_();

  200.         io=1;     //總線由上拉電阻拉高進入空閑狀態

  201.         num_check=R_H+R_L+T_H+T_L;

  202.         if(num_check==check)   //判斷讀到的四個數據之和是否與校驗位相同

  203.          {

  204.    RH=R_H;

  205.    RL=R_L;

  206.    TH=T_H;

  207.    TL=T_L;

  208.    check=num_check;

  209.          }

  210.   }

  211. }

  212. /*******************************************************************************
  213. * 函數名      : Test()
  214. * 功能                    : LED&BEEP
  215. * 輸入        :
  216. * 輸出        :
  217. *******************************************************************************/
  218. void Test()
  219. {
  220.         uchar num = 0;
  221.         
  222.         Beep = 1;
  223.         delayxms(500);
  224.         Beep = 0;
  225.         
  226.         for(;num<3;num++)
  227.         {
  228.                 Led = 0;
  229.                 delayxms(500);
  230.                 Led = 1;
  231.         }
  232. }        

  233. void Sound()
  234. {
  235.         Beep = 1;
  236.         delayxms(200);
  237.         Beep = 0;
  238. }

  239. void SF(uint xms)    //釋放LED
  240. {
  241.         Led_SF = 0;
  242.         delayxms(xms);
  243.         Led_SF = 1;
  244. }
  245.         
  246. void DJ(uint xms)    //待機LED
  247. {
  248.         Led_DJ = 0;
  249.         delayxms(xms);
  250.         Led_DJ = 1;
  251. }

  252. /*******************************************************************************
  253. * 函數名      : Key_Scan()
  254. * 功能                    : 按鍵掃描
  255. * 輸入        :
  256. * 輸出        :
  257. *******************************************************************************/
  258. void Key_Scan()
  259. {
  260.         uchar U_SW = 0,U_GW = 0,D_SW = 0,D_GW = 0;
  261.         
  262.         if(Key_Wake==0)   //待機與運行控制
  263.         {
  264.                 delayxms(12);
  265.                 if(Key_Wake==0)
  266.                 {
  267.                         Sound();
  268.                         Flag++;
  269.                         if(Flag>1)
  270.                                 Flag = 0;   //清零標志位
  271.                 }
  272.         }
  273.         
  274.         if(Key_Set==0)   //設置溫度上下限
  275.         {
  276.                 delayxms(12);
  277.                 if(Key_Set==0)   //設置溫度上下限
  278.                 {
  279.                         Lcd1602_Write_Cmd(0x01);    //清屏
  280.                         LcdShowStr(0,0,XP8);     //設置狀態
  281.                         LcdShowStr(0,1,XP9);     //上限
  282.                         LcdShowStr(7,1,XP10);    //下限
  283.                         
  284.                         Sound();
  285.                         while(1)
  286.                         {
  287.                                 U_SW = Humi_U/10;     //上限數據顯示
  288.                                 U_GW = Humi_U%10;
  289.                                 D_SW = Humi_D/10;     //下限數據顯示
  290.                                 D_GW = Humi_D%10;

  291.                                 DisplayOneChar(4,1,ASCII[U_SW]);
  292.                                 DisplayOneChar(5,1,ASCII[U_GW]);
  293.                                 DisplayOneChar(11,1,ASCII[D_SW]);
  294.                                 DisplayOneChar(12,1,ASCII[D_GW]);
  295.                                 
  296.                                 if(Key_Sel==0)      //移位
  297.                                 {
  298.                                         delayxms(12);
  299.                                         if(Key_Sel==0)
  300.                                         {
  301.                                                 Sound();
  302.                                                 if(yiwei>1)
  303.                                                         yiwei = 0;   //清零
  304.                                                 yiwei++;
  305.                                         }
  306.                                 }
  307.                                        
  308.         if(Key_Up==0)   //增加
  309.                                 {
  310.                                         delayxms(12);
  311.                                         if(Key_Up==0)
  312.                                         {
  313.                                                 Sound();
  314.                                                 if(yiwei==0)  //下限值設置
  315.                                                 {
  316.                                                         Humi_D++;
  317.                                                 }
  318.                                                 if(yiwei==1)  //上限值設置
  319.                                                 {
  320.                                                         Humi_U++;
  321.                                                 }
  322.                                         }
  323.                                 }                                
  324.                                        
  325.         if(Key_Down==0)   //減少
  326.                                 {
  327.                                         delayxms(12);
  328.                                         if(Key_Down==0)
  329.                                         {
  330.                                                 Sound();
  331.                                                 if(yiwei==0)  //下限值設置
  332.                                                 {
  333.                                                         Humi_D--;
  334.                                                 }
  335.                                                 if(yiwei==1)  //上限值設置
  336.                                                 {
  337.                                                         Humi_U--;
  338.                                                 }
  339.                                         }
  340.                                 }        
  341.                                 
  342.                                 if(Key_End==0)   //退出設置
  343.                                 {
  344.                                         delayxms(12);
  345.                                         if(Key_End==0)
  346.                                         {        
  347.                                                 Sound();
  348.                                                 break;
  349.                                         }
  350.                                 }
  351.                         }
  352.                         
  353.                 }
  354.         }
  355.                
  356. }
復制代碼

附件里面只包含源程序: 智能加濕器.7z (5.47 MB, 下載次數: 452)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:705430 發表于 2020-5-8 21:32 | 只看該作者
濕度在閾值附近時候,加濕器來回啟動,程序有去“抖動”作用嗎?
回復

使用道具 舉報

板凳
ID:312929 發表于 2020-5-9 09:16 | 只看該作者
半壁松 發表于 2020-5-8 21:32
濕度在閾值附近時候,加濕器來回啟動,程序有去“抖動”作用嗎?

文件里面有仿真文件么?
回復

使用道具 舉報

地板
ID:705430 發表于 2020-5-9 14:36 | 只看該作者
1979759100Ls 發表于 2020-5-9 09:16
文件里面有仿真文件么?

沒有,還不會使用仿真軟件,完全自學
回復

使用道具 舉報

5#
ID:599670 發表于 2020-5-29 09:46 | 只看該作者
這個力害了。。
回復

使用道具 舉報

6#
ID:763162 發表于 2020-6-3 19:42 | 只看該作者
求一個仿真文件...
回復

使用道具 舉報

7#
ID:655165 發表于 2020-6-21 17:51 | 只看該作者
好程序
回復

使用道具 舉報

8#
ID:774631 發表于 2020-6-22 08:45 | 只看該作者
謝謝分享
回復

使用道具 舉報

9#
ID:294657 發表于 2020-7-9 14:18 | 只看該作者
版主,霧化器是買的模塊對嗎?
回復

使用道具 舉報

10#
ID:802200 發表于 2020-7-12 22:30 | 只看該作者
老哥,能發一下整張全部仿真圖的圖片嗎
回復

使用道具 舉報

11#
ID:775455 發表于 2020-7-13 19:39 | 只看該作者
剛買了dht11,還不會玩,來學習學習
回復

使用道具 舉報

12#
ID:864677 發表于 2020-12-21 14:22 | 只看該作者
這個真的厲害了,但還沒有仿真嗎?
回復

使用道具 舉報

13#
ID:1067244 發表于 2023-3-19 14:45 | 只看該作者

這個真的厲害了,但還沒有仿真嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97日韩精品 | 亚洲男人天堂2024 | 五月激情六月婷婷 | 久色 | 日韩视频一区二区 | h小视频| 日本不卡一区二区三区 | 亚洲精品一区二区三区蜜桃久 | 国产精品一区二区三区四区五区 | 亚洲一区二区在线 | 精品国产乱码久久久久久老虎 | 91成人在线 | 欧美激情一区二区 | 精品日韩在线 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 在线观看免费av网 | 91精品国产一二三 | 99久久精品国产一区二区三区 | 免费国产一区 | 国产精品国产精品国产专区不卡 | 三级在线免费 | 婷婷狠狠| 伊人伊人伊人 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 亚洲免费在线视频 | 在线欧美 | 亚洲一区二区三区免费视频 | 亚洲天堂网站 | 黄网站免费入口 | 狠狠的干| 性高湖久久久久久久久3小时 | 天天综合日日夜夜 | 综合久久网| 国产日韩欧美激情 | dy天堂| 国产精品久久久久久久久久免费看 | 亚洲欧美一区二区三区国产精品 | 久久久高清 | 欧美精品一区在线发布 | 午夜专区| 欧美日韩国产一区二区三区 |