|
基于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源码,整个系统有三个模式,分别是运行模式、设置模式与待机模式
- /******************************************************
- By:CYJ
- Version:2.0
- LCDD1602显示界面
- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- 0 T e m p : °C
- 1 H u m i : % R H
- H _ U : H _ D :
- *******************************************************/
- //LCD1602上显示当前的温湿度及单位其中湿度在第一行显示温度在第二行显示
- # include <reg51.h>
- # include <intrins.h>
- #include "lcd.h"
-
- //DHT11
- sbit io=P1^0; //dht11 data端接单片机的P1^0口
- //加湿器控制按键
- sbit JSQ = P1^1;
- //蜂鸣&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; //进入设置
- sbit Key_Sel = P1^3; //移位控制
- sbit Key_Up = P1^4; //增加
- sbit Key_Down = P1^5; //减少
- sbit Key_End = P1^7; //退出设置
- /* LCD1602
- #define LCD1602_DB P0
- sbit LCD1602_RW = P2^5;//数据总线
- sbit LCD1602_RS = P2^6;
- sbit LCD1602_EN = P2^7; */
- uchar Flag = 0; //唤醒
- uchar data_byte;
- uchar RH = 0,RL = 0,TH = 0,TL = 0; //DHT11的数据位
- uchar *XP1 = "Temp:"; //温度
- uchar *XP2 = "Humi:"; //湿度
- uchar *XP3 = "C"; //温度单位
- uchar *XP4 = "%RH"; //湿度单位
- uchar *XP5 = "Hello the world"; //启动界面
- uchar *XP6 = "Starting...";
- uchar *XP7 = "Sleepping..."; //待机状态
- uchar *XP8 = "Setting..."; //设置中
- uchar *XP9 = "H_U:"; //上限
- uchar *XP10 = "H_D:"; //下限
- uchar code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-'};
- uchar Humi_U = 70,Humi_D = 40; //湿度上下限
- uchar yiwei = 0;
- /*******************************************************************************
- * 函数名 : delayxms()\ delay1()
- * 功能 : 延时
- * 输入 :
- * 输出 :
- *******************************************************************************/
- void delayxms(uint xms) //0us
- {
- unsigned char a = 0,b = 0;
- uint num = 0;
-
- for(num=xms;num>0;num--)
- {
- for(b=199;b>0;b--)
- for(a=1;a>0;a--);
- }
- }
- void delay(uchar ms) //延时模块//
- {
- uchar i;
- while(ms--)
-
- for(i=0;i<100;i++);
- }
- void delay1()
- {
- uchar i;
- for(i=0;i<1;i++);
- }
- /*******************************************************************************
- * 函数名 :
- * 功能 : DHT11读取温湿度
- * 输入 :
- * 输出 :
- *******************************************************************************/
- void start()//开始信号
- {
- io=1;
- //delay1();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
-
- io=0;
- delay(25);// 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号
- io=1; //发送开始信号结束后拉高电平延时20-40us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- uchar receive_byte()//接收一个字节
- {
- uchar i,temp;
- for(i=0;i<8;i++) //接收8bit的数据
- {
- while(!io); //等待50us的低电平开始信号结束
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- temp=0; //时间为26us-28us表示接收的为数据'0'
- if(io==1)
- temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'
- while(io);//等待数据信号高电平'0'为26us-28us'1'为70us
- data_byte<<=1;//接收的数据为高位在前右移
- data_byte|=temp;
- }
- return data_byte;
- }
- void receive() //接收数据
- {
- uchar T_H,T_L,R_H,R_L,check,num_check,i;
- start();//开始信号//
- io=1; //主机设为输入判断从机DHT11响应信号
- if(!io)//判断从机是否有低电平响应信号//
- {
- while(!io);//判断从机发出 80us 的低电平响应信号是否结束//
- while(io);//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态
- R_H=receive_byte();//湿度高位
- R_L=receive_byte();//湿度低位
- T_H=receive_byte();//温度高位
- T_L=receive_byte();//温度低位
- check=receive_byte();//校验位
- io=0; //当最后一bit数据接完毕后从机拉低电平50us
- for(i=0;i<7;i++) //差不多50us的延时
- {
- _nop_(); //7us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- _nop_();
- io=1; //总线由上拉电阻拉高进入空闲状态
- num_check=R_H+R_L+T_H+T_L;
- if(num_check==check) //判断读到的四个数据之和是否与校验位相同
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- check=num_check;
- }
- }
- }
- /*******************************************************************************
- * 函数名 : Test()
- * 功能 : LED&BEEP
- * 输入 :
- * 输出 :
- *******************************************************************************/
- void Test()
- {
- uchar num = 0;
-
- Beep = 1;
- delayxms(500);
- Beep = 0;
-
- for(;num<3;num++)
- {
- Led = 0;
- delayxms(500);
- Led = 1;
- }
- }
- void Sound()
- {
- Beep = 1;
- delayxms(200);
- Beep = 0;
- }
- void SF(uint xms) //释放LED
- {
- Led_SF = 0;
- delayxms(xms);
- Led_SF = 1;
- }
-
- void DJ(uint xms) //待机LED
- {
- Led_DJ = 0;
- delayxms(xms);
- Led_DJ = 1;
- }
- /*******************************************************************************
- * 函数名 : Key_Scan()
- * 功能 : 按键扫描
- * 输入 :
- * 输出 :
- *******************************************************************************/
- void Key_Scan()
- {
- uchar U_SW = 0,U_GW = 0,D_SW = 0,D_GW = 0;
-
- if(Key_Wake==0) //待机与运行控制
- {
- delayxms(12);
- if(Key_Wake==0)
- {
- Sound();
- Flag++;
- if(Flag>1)
- Flag = 0; //清零标志位
- }
- }
-
- if(Key_Set==0) //设置温度上下限
- {
- delayxms(12);
- if(Key_Set==0) //设置温度上下限
- {
- Lcd1602_Write_Cmd(0x01); //清屏
- LcdShowStr(0,0,XP8); //设置状态
- LcdShowStr(0,1,XP9); //上限
- LcdShowStr(7,1,XP10); //下限
-
- Sound();
- while(1)
- {
- U_SW = Humi_U/10; //上限数据显示
- U_GW = Humi_U%10;
- D_SW = Humi_D/10; //下限数据显示
- D_GW = Humi_D%10;
- DisplayOneChar(4,1,ASCII[U_SW]);
- DisplayOneChar(5,1,ASCII[U_GW]);
- DisplayOneChar(11,1,ASCII[D_SW]);
- DisplayOneChar(12,1,ASCII[D_GW]);
-
- if(Key_Sel==0) //移位
- {
- delayxms(12);
- if(Key_Sel==0)
- {
- Sound();
- if(yiwei>1)
- yiwei = 0; //清零
- yiwei++;
- }
- }
-
- if(Key_Up==0) //增加
- {
- delayxms(12);
- if(Key_Up==0)
- {
- Sound();
- if(yiwei==0) //下限值设置
- {
- Humi_D++;
- }
- if(yiwei==1) //上限值设置
- {
- Humi_U++;
- }
- }
- }
-
- if(Key_Down==0) //减少
- {
- delayxms(12);
- if(Key_Down==0)
- {
- Sound();
- if(yiwei==0) //下限值设置
- {
- Humi_D--;
- }
- if(yiwei==1) //上限值设置
- {
- Humi_U--;
- }
- }
- }
-
- if(Key_End==0) //退出设置
- {
- delayxms(12);
- if(Key_End==0)
- {
- Sound();
- break;
- }
- }
- }
-
- }
- }
-
- }
复制代码
附件里面只包含源程序:
智能加湿器.7z
(5.47 MB, 下载次数: 452)
|
评分
-
查看全部评分
|