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;
}