基于STC89C52的智能加湿器系统
  2KHsypvvjo2Q 2023年11月02日 38 0

基于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管,配合电感升压,驱动雾化片加湿

基于STC89C52的智能加湿器系统_智能家居

PCB:

基于STC89C52的智能加湿器系统_智能家居_02

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  Bupra52NT6c4   2023年11月02日   31   0   0 单片机STM32LVGLMCU
2KHsypvvjo2Q
作者其他文章 更多