基于STC89C52的智能加湿器系统,当室内湿度未达到加湿器系统预设值时,超声波雾化器工作,当达到预设值时加湿器停止工作;液位检测电路检测到水箱内水位低于安全水位时,声光报警电路工作提示用户加水;通过键盘电路可以控制加湿器启停,以及湿度预设值的更改,并在液晶屏上显示相关内容。
📝本作是最初是学校内比赛使用,比赛已经结束,开源出来做学习参考
📘包含单片机单元、湿度检测电路、液位检测电路、显示模块、键盘电路、声光报警电路和电源模块等几部分构成。
🧬软件程序:
1.当室内湿度未达到加湿器系统预设值时,超声波雾化器工作,当达到预设值时加湿器停止工作;
2.液位检测电路检测到储水箱内水位低于安全水位时,声光报警电路工作提示用户加水;
3.通过键盘电路可以控制加湿器启停以及湿度预设值的更改,并在液晶屏上显示相关内容。
#include <reg52.H>
#include <intrins.H>
#include <math.H>
#define uchar unsigned char
#define uint unsigned int
// 1602 接口
sbit RS = P3^5;
sbit LCDEN = P3^4;
// 按键 接口
sbit KEY1= P2^0; // 预设值加 ++
sbit KEY2 = P2^1; // 预设值减 ——
sbit KEY3= P2^2; // 加湿器开启 开
sbit KEY4 = P2^3; // 加湿器关闭 关
sbit BEEP = P2^6; //水位检测电平
sbit LED = P2^5; //水位检测电平
sbit HUMI= P4^5; // 加湿器 接口
sbit TOUCH= P4^4; // 触摸感应水位接口 接口
uchar pre=40; //预设值设置
int temp; //判断
// 模块 开关
#define HUMI_OFF HUMI=0
#define HUMI_ON HUMI=1
#define BEEP_OFF BEEP=0
#define BEEP_ON BEEP=1
#define LED_OFF LED=1
#define LED_ON LED=0
int mode=0; //初始手动模式
/**************************************** 延时函数 us 与 ms *********************************************/
void delayUs()
{
_nop_();
}
void DHT11_delay_us(uchar n)
{
while(--n);
}
void delayMs(uint a)
{
uint i, j;
for(i = a; i > 0; i--)
for(j = 100; j > 0; j--);
}
/******************************************* 有关1602的驱动 ***********************************************/
// 16*2
//1602_写命令 写啥命令
void writeComm(uchar comm)
{
RS = 0; //写命令模式
P0 = comm; //写指令送到数据总线
LCDEN = 1; //使能给高电平
delayUs(); // 稍稍延迟
LCDEN = 0; //使能给低电平——完成脉冲
delayMs(1);
}
//写数据:RS=1, RW=0;
void writeData(uchar dat)
{
RS = 1;
P0 = dat;
LCDEN = 1;
delayUs();
LCDEN = 0;
delayMs(1);
}
// 1602_初始化函数
void init()
{
writeComm(0x38); //开显示 16*2显示 5*7点阵 8位数据接口
writeComm(0x0c); //开显示,不显示光标
writeComm(0x06); //写一个字符指针加1
writeComm(0x01); //清屏
}
//通过字符数组 和 字符长度显示字符串
void writeString(uchar * str, uchar length)
{
uchar i;
for(i = 0; i < length; i++)
{
writeData(str[i]);
}
}
/******************************************** 四个按键检测 **************************************************/
void keyscan()
{
if(KEY3==0) //初始低电平
{
// 开 按键 长按
while(KEY3==0)
{
temp++;
delayMs(10);
if(temp==100)
{
writeComm(0xcf);
writeData(0x53);
while(KEY3==0); //长按执行
mode=0;
}
}
if(temp<100) //短按执行
HUMI_ON;
temp=0;
}
if(KEY4==0) //初始低电平
{
// 关 按键 长按
while(KEY4==0)
{
temp++;
delayMs(10);
if(temp==100)
{
writeComm(0xcf);
writeData(0x5A);
while(KEY4==0); //长按执行
mode=1;
}
}
if(temp<100) //短按执行
HUMI_OFF;
temp=0;
}
if((KEY1==0)|(KEY2==0)) //初始低电平
{
delayMs(10);
// ++ 按键
if(KEY1==0) //延时后 达到真正底部
{
pre++;
if(pre<0)
pre=1;
if(pre>99)
pre=99;
}
// -- 按键
if(KEY2==0) //延时后 达到真正底部
{
pre--;
if(pre<1)
pre=1;
if(pre>81)
pre=80;
}
}
}
/******************************************* DHT11 温度读取 ***********************************************/
sbit Data=P2^7;
uchar RH,RL,TH,TL,revise; // 湿度RH,RL 温度 TH,TL 校验位 revise
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
delayMs(30);
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte()
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
while(!Data);
DHT11_delay_us(8);
dat<<=1;
if(Data==1)
dat+=1;
while(Data);
}
return dat;
}
void DHT11_receive() // 读取数据包就可以了,每次读取数据一共读取40个bit也就是五个字节
{
uchar R_H,R_L,T_H,T_L;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延时80us
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿度低八位
T_H=DHT11_rec_byte(); //接收温度高八位
T_L=DHT11_rec_byte(); //接收温度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //最后一字节为校验位,校验是否正确
{
RH=(R_H)*0.9;
RL=R_L;
TH=T_H;
TL=T_L;
}
}
}
/************************************************* 主函数 main *****************************************************/
int i;
int m;
int flag=0;
void main()
{
//屏幕初始化显示
uchar table[] = "Humid Tempr Pre "; //显示字符串
uchar table1[] = ". % . C % "; //显示字符串
BEEP_OFF; LED_OFF; HUMI_OFF; // 开始 关闭蜂鸣器 开始 关闭LED
init/*屏幕初始化函数*/(); //1602初始化函数
writeComm(0x80); //将数据指针定位到第一行第一字符
writeString(table, 16); //显示字符串函数 字符串地址 和 遍历次数
writeComm(0xc2); //将数据指针定位到第一行第一字符
writeString(table1, 16); //显示字符串函数 字符串地址 和 遍历次数
while(KEY4==0); //长按执行
writeComm(0xcf);
writeData(0x53);
while(1)
{
//温度延时与通信
delayMs(90);
DHT11_receive();
//湿度显示
writeComm(0xc0);
writeData(RH/10+0x30);
writeData(RH%10+0x30);
writeComm(0xc3);
writeData(RL/10+0x30);
// 温度 显示
writeComm(0xc6);
writeData(TH/10+0x30);
writeData(TH%10+0x30);
writeComm(0xc9);
writeData(TL%10+0x30);
// 预设值加减与显示
keyscan();
writeComm(0xcc);
writeData(pre/10+0x30);
writeData(pre%10+0x30);
// 液位检测电路检测到储水箱内水位低于安全水位时,声光报警电路工作提示用户加水;
if(TOUCH==0) //延时后 达到真正底部
{
writeComm(0x8f);
writeData(0x20);
LED_OFF;
BEEP_OFF;
flag=0;
}
else if(TOUCH==1)
{
writeComm(0x8f);
writeData(0xff);
BEEP_ON;
i++;
if(i%3==0)
{
LED=~LED;
}
}
if(mode==1)
{
//当室内温度(DHT22)未达到加湿器系统预设值时,超声波雾化器工作,当达到预设值时加湿器停止工作;
if(RH<pre)
HUMI_ON;
else if(RH>pre)
HUMI_OFF;
}
}
}
⚙️电路部分:
1.采用DHT11获取环境温度湿度。
2.采用TC301D进行液位检测。
3.传感器实时监测室内湿度,并在液晶显示屏上显示,通过按键控制加湿系统的启停以及湿度预设值的调整。
4. 加湿功能通过NE555产生方波,驱动MOS管,配合电感升压,驱动雾化片加湿
PCB: