找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12434|回复: 12
收起左侧

基于51单片机的智能加湿器(DHT11源程序)

  [复制链接]
ID:416713 发表于 2020-5-7 17:04 | 显示全部楼层 |阅读模式
基于51单片机的智能加湿器最近帮小伙伴的,设计一款智能加湿器,要求能够设置温度上下限并且在LCD1602上进行数据显示,现在项目做完就分享一下,可以作为51单片机练手的项目
下面是一些图,在压缩包里都可以看见,其他包括程序和数据手册也会一起打包.

继电器&&加湿器模块DXP原理图
继电器控制电路.PNG


加湿器模块实物
加湿器模块实物图.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;   //待机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. }
复制代码
一路5V继电器控制模块.PNG
附件里面只包含源程序: 智能加湿器.7z (5.47 MB, 下载次数: 442)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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
文件里面有仿真文件么?

没有,还不会使用仿真软件,完全自学
回复

使用道具 举报

ID:599670 发表于 2020-5-29 09:46 | 显示全部楼层
这个力害了。。
回复

使用道具 举报

ID:763162 发表于 2020-6-3 19:42 | 显示全部楼层
求一个仿真文件...
回复

使用道具 举报

ID:655165 发表于 2020-6-21 17:51 | 显示全部楼层
好程序
回复

使用道具 举报

ID:774631 发表于 2020-6-22 08:45 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:294657 发表于 2020-7-9 14:18 | 显示全部楼层
版主,雾化器是买的模块对吗?
回复

使用道具 举报

ID:802200 发表于 2020-7-12 22:30 | 显示全部楼层
老哥,能发一下整张全部仿真图的图片吗
回复

使用道具 举报

ID:775455 发表于 2020-7-13 19:39 | 显示全部楼层
刚买了dht11,还不会玩,来学习学习
回复

使用道具 举报

ID:864677 发表于 2020-12-21 14:22 | 显示全部楼层
这个真的厉害了,但还没有仿真吗?
回复

使用道具 举报

ID:1067244 发表于 2023-3-19 14:45 | 显示全部楼层

这个真的厉害了,但还没有仿真吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表