继电器&&加湿器模块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_();
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』