找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 15154|回復(fù): 12
收起左側(cè)

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

  [復(fù)制鏈接]
ID:416713 發(fā)表于 2020-5-7 17:04 | 顯示全部樓層 |閱讀模式
基于51單片機(jī)的智能加濕器最近幫小伙伴的,設(shè)計(jì)一款智能加濕器,要求能夠設(shè)置溫度上下限并且在LCD1602上進(jìn)行數(shù)據(jù)顯示,現(xiàn)在項(xiàng)目做完就分享一下,可以作為51單片機(jī)練手的項(xiàng)目
下面是一些圖,在壓縮包里都可以看見,其他包括程序和數(shù)據(jù)手冊(cè)也會(huì)一起打包.

繼電器&&加濕器模塊DXP原理圖
繼電器控制電路.PNG


加濕器模塊實(shí)物
加濕器模塊實(shí)物圖.PNG
TIM圖片20200507164840.jpg

TIM圖片20200507164924.jpg

壓縮包說明.PNG

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;   //待機(jī)LED

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

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

下面是單片機(jī)代碼(mian),2秒延時(shí)刷新一次,包括DHT11源碼,整個(gè)系統(tǒng)有三個(gè)模式,分別是運(yùn)行模式、設(shè)置模式與待機(jī)模式
  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上顯示當(dāng)前的溫濕度及單位其中濕度在第一行顯示溫度在第二行顯示
  11. # include <reg51.h>
  12. # include <intrins.h>
  13. #include "lcd.h"
  14.         
  15. //DHT11
  16. sbit io=P1^0;      //dht11 data端接單片機(jī)的P1^0口

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

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

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

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

  31. /*   LCD1602
  32. #define LCD1602_DB  P0
  33. sbit LCD1602_RW = P2^5;//數(shù)據(jù)總線
  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的數(shù)據(jù)位

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

  43. uchar *XP5 = "Hello the world";   //啟動(dòng)界面
  44. uchar *XP6 =  "Starting...";
  45. uchar *XP7 = "Sleepping...";   //待機(jī)狀態(tài)

  46. uchar *XP8 = "Setting..."; //設(shè)置中
  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. * 函數(shù)名      : delayxms()\ delay1()
  54. * 功能                    : 延時(shí)
  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) //延時(shí)模塊//

  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. * 函數(shù)名      :
  83. * 功能                    : DHT11讀取溫濕度
  84. * 輸入        :
  85. * 輸出        :
  86. *******************************************************************************/
  87. void start()//開始信號(hào)

  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);// 主機(jī)把總線拉低必須大于18ms保證DHT11能檢測(cè)到起始信號(hào)

  103.   io=1;    //發(fā)送開始信號(hào)結(jié)束后拉高電平延時(shí)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()//接收一個(gè)字節(jié)
  134. {

  135.   uchar i,temp;

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

  137.   {

  138.          while(!io);   //等待50us的低電平開始信號(hào)結(jié)束
  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;  //時(shí)間為26us-28us表示接收的為數(shù)據(jù)'0'

  166.          if(io==1)

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

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

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

  170.          data_byte|=temp;

  171.   }

  172.   return data_byte;

  173. }   

  174. void receive()      //接收數(shù)據(jù)

  175. {

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

  177.   start();//開始信號(hào)//

  178.   io=1;   //主機(jī)設(shè)為輸入判斷從機(jī)DHT11響應(yīng)信號(hào)

  179.   if(!io)//判斷從機(jī)是否有低電平響應(yīng)信號(hào)//

  180.   {  
  181.         while(!io);//判斷從機(jī)發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束//

  182.         while(io);//判斷從機(jī)發(fā)出 80us 的高電平是否結(jié)束如結(jié)束則主機(jī)進(jìn)入數(shù)據(jù)接收狀態(tài)

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

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

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

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

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

  188.         io=0;       //當(dāng)最后一bit數(shù)據(jù)接完畢后從機(jī)拉低電平50us

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

  200.         io=1;     //總線由上拉電阻拉高進(jìn)入空閑狀態(tài)

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

  202.         if(num_check==check)   //判斷讀到的四個(gè)數(shù)據(jù)之和是否與校驗(yàn)位相同

  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. * 函數(shù)名      : 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)    //待機(jī)LED
  247. {
  248.         Led_DJ = 0;
  249.         delayxms(xms);
  250.         Led_DJ = 1;
  251. }

  252. /*******************************************************************************
  253. * 函數(shù)名      : 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)   //待機(jī)與運(yùn)行控制
  263.         {
  264.                 delayxms(12);
  265.                 if(Key_Wake==0)
  266.                 {
  267.                         Sound();
  268.                         Flag++;
  269.                         if(Flag>1)
  270.                                 Flag = 0;   //清零標(biāo)志位
  271.                 }
  272.         }
  273.         
  274.         if(Key_Set==0)   //設(shè)置溫度上下限
  275.         {
  276.                 delayxms(12);
  277.                 if(Key_Set==0)   //設(shè)置溫度上下限
  278.                 {
  279.                         Lcd1602_Write_Cmd(0x01);    //清屏
  280.                         LcdShowStr(0,0,XP8);     //設(shè)置狀態(tài)
  281.                         LcdShowStr(0,1,XP9);     //上限
  282.                         LcdShowStr(7,1,XP10);    //下限
  283.                         
  284.                         Sound();
  285.                         while(1)
  286.                         {
  287.                                 U_SW = Humi_U/10;     //上限數(shù)據(jù)顯示
  288.                                 U_GW = Humi_U%10;
  289.                                 D_SW = Humi_D/10;     //下限數(shù)據(jù)顯示
  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)  //下限值設(shè)置
  315.                                                 {
  316.                                                         Humi_D++;
  317.                                                 }
  318.                                                 if(yiwei==1)  //上限值設(shè)置
  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)  //下限值設(shè)置
  332.                                                 {
  333.                                                         Humi_D--;
  334.                                                 }
  335.                                                 if(yiwei==1)  //上限值設(shè)置
  336.                                                 {
  337.                                                         Humi_U--;
  338.                                                 }
  339.                                         }
  340.                                 }        
  341.                                 
  342.                                 if(Key_End==0)   //退出設(shè)置
  343.                                 {
  344.                                         delayxms(12);
  345.                                         if(Key_End==0)
  346.                                         {        
  347.                                                 Sound();
  348.                                                 break;
  349.                                         }
  350.                                 }
  351.                         }
  352.                         
  353.                 }
  354.         }
  355.                
  356. }
復(fù)制代碼
一路5V繼電器控制模塊.PNG
附件里面只包含源程序: 智能加濕器.7z (5.47 MB, 下載次數(shù): 452)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:705430 發(fā)表于 2020-5-8 21:32 | 顯示全部樓層
濕度在閾值附近時(shí)候,加濕器來回啟動(dòng),程序有去“抖動(dòng)”作用嗎?
回復(fù)

使用道具 舉報(bào)

ID:312929 發(fā)表于 2020-5-9 09:16 | 顯示全部樓層
半壁松 發(fā)表于 2020-5-8 21:32
濕度在閾值附近時(shí)候,加濕器來回啟動(dòng),程序有去“抖動(dòng)”作用嗎?

文件里面有仿真文件么?
回復(fù)

使用道具 舉報(bào)

ID:705430 發(fā)表于 2020-5-9 14:36 | 顯示全部樓層
1979759100Ls 發(fā)表于 2020-5-9 09:16
文件里面有仿真文件么?

沒有,還不會(huì)使用仿真軟件,完全自學(xué)
回復(fù)

使用道具 舉報(bào)

ID:599670 發(fā)表于 2020-5-29 09:46 | 顯示全部樓層
這個(gè)力害了。。
回復(fù)

使用道具 舉報(bào)

ID:763162 發(fā)表于 2020-6-3 19:42 | 顯示全部樓層
求一個(gè)仿真文件...
回復(fù)

使用道具 舉報(bào)

ID:655165 發(fā)表于 2020-6-21 17:51 | 顯示全部樓層
好程序
回復(fù)

使用道具 舉報(bào)

ID:774631 發(fā)表于 2020-6-22 08:45 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:294657 發(fā)表于 2020-7-9 14:18 | 顯示全部樓層
版主,霧化器是買的模塊對(duì)嗎?
回復(fù)

使用道具 舉報(bào)

ID:802200 發(fā)表于 2020-7-12 22:30 | 顯示全部樓層
老哥,能發(fā)一下整張全部仿真圖的圖片嗎
回復(fù)

使用道具 舉報(bào)

ID:775455 發(fā)表于 2020-7-13 19:39 | 顯示全部樓層
剛買了dht11,還不會(huì)玩,來學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:864677 發(fā)表于 2020-12-21 14:22 | 顯示全部樓層
這個(gè)真的厲害了,但還沒有仿真嗎?
回復(fù)

使用道具 舉報(bào)

ID:1067244 發(fā)表于 2023-3-19 14:45 | 顯示全部樓層

這個(gè)真的厲害了,但還沒有仿真嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表