9-基于单片机的远程空调/温湿度串口按键自动控制系统(DHT11 上位机 串口 空调控制 LCD1602 proteus 原理图 源代码 物料清单)

9-基于单片机的远程空调/温湿度串口按键自动控制系统(DHT11 上位机 串口 空调控制 LCD1602 proteus 原理图 源代码 物料清单)

功能描述:
1、温湿度传感器用DHT11检测系统的温度、湿度
2、LCD1602显示检测的实时温度与湿度
3、通过串口自动控制系统的信息,通过串口DEBUG窗口,实现串口控制系统的各项信息
4、也通过按键分别设置温度、湿度上下报警限值,过限则启动蜂鸣器报警
5、串口可以模拟多种信息,如WIFI 蓝牙 RS232 RS485等。
6、通过继电器控制空调升温、降温、加湿、除湿等。
7、继电器带动画。

资料有哪些:
1、源代码工程文件
2、原理图工程文件
3、仿真工程文件
4、元器件清单
5、流程图

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
在这里插入图片描述

#include "reg51.h"
#include "ADC0832.h"
#include "lcd1602.h"
#include "DHT11.h"

sbit k1=P2^5;//按钮
sbit k2=P2^6;
sbit k3=P2^7;
sbit beep=P1^4;//蜂鸣器
sbit jiangwen = P1^0;
sbit shengwen = P1^1;
sbit jiashi = P1^2;
sbit chushi = P1^3;

//========================================
uchar air=0;//空气质量 0-100
uchar alc=0;//酒精检测 0-100
uchar time=0;//系统定时
uchar mode=0;//系统模式,测量、设置
uchar disp1[]=" Control System";
uchar disp2[]="T:00 C S:00%";
uchar disp3[]="  UP T:00 S:00";
uchar disp4[]="DOWN   00   00";
uchar temp1=20,temp2=40,humi1=30,humi2=60;
uchar shidu=0;
//串口发送
void send(uchar i)
{
	SBUF=i;
	while(!TI);
	TI=0;
}
//发送字符串
void fa(uchar *p)
{
	while(*p!='\0')
	{
		if(*p!=0xdf)			
			send(*p);
		p++;
	}
}
//========================================
void disp()//显示阀值
{
	write_string(1,0,"                ");
	write_string(2,0,"                ");

	disp3[7]=temp2/10+0x30;
	disp3[8]=temp2%10+0x30;
	disp3[12]=humi2/10+0x30;
	disp3[13]=humi2%10+0x30;

	disp4[7]=temp1/10+0x30;
	disp4[8]=temp1%10+0x30;
	disp4[12]=humi1/10+0x30;
	disp4[13]=humi1%10+0x30;
	write_string(1,0,disp3);
	write_string(2,0,disp4);
	//设置光标
	switch(mode)
	{

		case 1:write_sfm(1,8);break;
		case 2:write_sfm(1,13);break;
		case 3:write_sfm(2,8);break;
		case 4:write_sfm(2,13);
	}
}
//主函数
void main()
{
	init_1602();//初始化
	disp2[4]=0xdf;

	SCON=0X50;			//设置为工作方式1
	TMOD=0X21;			//设置计数器工作方式2
	TH1=0XFD;			
	TL1=0XFD;
	ES=1;						//打开接收中断
	TR1=1;					//打开计数器

	TH0=0X3C;
	TL0=0XB0;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器
	while(1)
	{
		if(!k1)//设置,确认
		{
			delay_uint(5000);//延时防抖
			if(!k1)
			{
				if(mode<4)
					mode++;
				else
					mode=0;
				if(mode>0)
					disp();
				write_com(0x0e);
				//设置光标
				switch(mode)
				{
	
					case 1:write_sfm(1,8);break;
					case 2:write_sfm(1,13);break;			
					case 3:write_sfm(2,8);break;
					case 4:write_sfm(2,13);
				}
				while(!k1);
			}
		}
		if(mode>0)//设置
		{
			if(!k2)//加
			{
				delay_uint(5000);//延时防抖
				if(!k2)
				{
					switch(mode)
					{
						case 1://温度上限
							if(temp2<99)
								temp2++;
							disp();
							break;
						case 2://湿度上限
							if(humi2<99)
								humi2++;
							disp();
							break;
						case 3://温度下限
							if(temp1<temp2)
								temp1++;
							disp();
							break;
						case 4://湿度下限
							if(humi1<humi2)
								humi1++;
							disp();	
					}
					while(!k2);
				}
			}
			if(!k3)//减
			{
				delay_uint(5000);//延时防抖
				if(!k3)
				{
					switch(mode)
					{

						case 1://温度上限
							if(temp2>temp1)
								temp2--;
							disp();
							break;
						case 2://湿度上限
							if(humi2>humi1)
								humi2--;
							disp();
							break;
						case 3://温度下限
							if(temp1>0)
								temp1--;
							disp();
							break;
						case 4://湿度下限
							if(humi1>0)
								humi1--;
							disp();	
					}
					while(!k3);
				}
			}
		} 
	}
}
//定时器0中断
void Timer0() interrupt 1
{
	uint i=0,a=0;
	if(time<10)//0.5s
		time++;
	else
	{
		time=0;

	disp3[7]=temp2/10+0x30;
	disp3[8]=temp2%10+0x30;
	disp3[12]=humi2/10+0x30;
	disp3[13]=humi2%10+0x30;

	disp4[7]=temp1/10+0x30;
	disp4[8]=temp1%10+0x30;
	disp4[12]=humi1/10+0x30;
	disp4[13]=humi1%10+0x30;

		dht11_recive();//测量温湿度
		shidu=dht11_dat[0];

		disp2[2]=dht11_dat[2]/10+0x30;
		disp2[3]=dht11_dat[2]%10+0x30;
		disp2[9]=shidu/10+0x30;
		disp2[10]=shidu%10+0x30; 





		if(mode==0)//显示
		{
			write_string(1,0,"                ");
			write_string(2,0,"                ");
			write_string(1,0,disp1);
			write_string(2,0,disp2);
		
		//报警
		if((dht11_dat[2]>temp2)||(dht11_dat[2]<temp1)||(shidu>humi2)||(shidu<humi1) )
			beep=0;
		else
		{
			beep=1;
			write_com(0x0c);
		}


		if((dht11_dat[2]>temp2)||(dht11_dat[2]<temp1))
		{
			write_com(0x0e);
			write_sfm(2,3);
		}
		
			if((dht11_dat[2]>temp2))
		{
			jiangwen = 0;
		}else jiangwen = 1;
		
			if((dht11_dat[2]<temp1))
		{
			shengwen = 0;
		}else shengwen = 1;
		
		
			if((shidu>humi2))
		{
			chushi = 0;
		}else chushi = 1;
		
		
			if((shidu<humi1))
		{
			jiashi = 0;
		}else jiashi = 1;
		
		
		
		
		if((shidu>humi2)||(shidu<humi1))
		{
			write_com(0x0e);
			write_sfm(2,10);
		}
		
		
		
		}
		//串口发送
		fa(disp1);send(0x0d);
		fa(disp2);send(0x0d);
		fa(disp3);send(0x0d);
		//fa("       ");
		fa(disp4);send(0x0d);
		fa("    ");send(0x0d);
	}
	TH0=0X3C;
	TL0=0XB0;
}

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我Eric

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值