单片机 > 单片机程序设计 > 详情

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

发布时间:2023-09-01 发布时间:
|

继电器&&加湿器模块DXP原理图



加湿器模块实物


proteus仿真图

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_DBP0 //数据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上显示当前的温湿度及单位ue002其中湿度在第一行显示ue002温度在第二行显示

# include

# include

#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);// 主机把总线拉低必须大于18msue002保证DHT11能检测到起始信号


io=1; //发送开始信号结束后ue002拉高电平延时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-28usue002表示接收的为数据'0'


if(io==1)


temp=1; //如果26us-28us之后ue002还为高电平ue002则表示接收的数据为'1'


while(io);//等待数据信号高电平ue000'0'为26us-28usue002'1'为70usue001


data_byte<<=1;//接收的数据为高位在前ue000右移ue001


data_byte|=temp;


}


return data_byte;


}


void receive() //接收数据


{


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


start();//开始信号//


io=1; //主机设为输入ue002判断从机ue000DHT11ue001响应信号


if(!io)//判断从机是否有低电平响应信号//


{

while(!io);//判断从机发出 80us 的低电平响应信号是否结束//


while(io);//判断从机发出 80us 的高电平是否结束ue002如结束则主机进入数据接收状态


R_H=receive_byte();//湿度高位


R_L=receive_byte();//湿度低位


T_H=receive_byte();//温度高位


T_L=receive_byte();//温度低位


check=receive_byte();//校验位


io=0; //当最后一bit数据接完毕后ue002从机拉低电平50us


for(i=0;i<7;i++) //差不多50us的延时

{

_nop_(); //7us

_nop_();

_nop_();

_nop_();

[1] [2] [3]
51单片机智能加湿器DHT11

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32学习笔记4:外部中断