文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用Proteus8仿真51单片机控制器,使用LCD1604液晶、DHT11温湿度传感器、声光报警、按键模块、CO\CO2\烟雾传感器、继电器控制模块等。
主要功能:
系统运行后,LCD1604显示温湿度、CO、CO2和烟雾浓度;
可通过按键K5选择自动/手动模式,当处于手动模式时,
K1用于控制加热散热,K2用于控制加湿除湿,K3用于控制
风扇开关,K4用于手动关闭所有设备;当处于自动模式时,
检测温度高于上限,风扇开启,低于下限,加热开启,阈值范围内关闭加热和散热;检测湿度高于上限,除湿开启,低于下限,加湿开启,阈值范围内关闭加湿和除湿;检测CO/CO2/烟雾浓度高于上限,开启风扇,低于阈值关闭风扇。超限时声光报警。
二、软件设计
*/
//系统数据设置
void sys_data_set(void)
{
u8 key=0;
static u8 jsrflag=0;
static u8 jcsflag=0;
static u8 fsflag=0;
key=key_scan(0);
//模式设置
if(key==KEY3_PRESS)
{
//自动模式
if(sys_ctrl.auto_flag==0)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>7)sys_ctrl.mode=1;
}
//手动模式
else
{
FS_PIN=!FS_PIN;
}
}
//在设置模式下,加
else if(key==KEY1_PRESS)
{
//自动模式
if(sys_ctrl.auto_flag==0)
{
switch(sys_ctrl.mode)
{
case 1://温度下限
sys_ctrl.templ++;
if(sys_ctrl.templ>99)sys_ctrl.templ=0;
break;
case 2://温度上限
sys_ctrl.temph++;
if(sys_ctrl.temph>99)sys_ctrl.temph=0;
break;
case 3://湿度下限
sys_ctrl.humil++;
if(sys_ctrl.humil>99)sys_ctrl.humil=0;
break;
case 4://湿度上限
sys_ctrl.humih++;
if(sys_ctrl.humih>99)sys_ctrl.humih=0;
break;
case 5://CO浓度上限
sys_ctrl.coh++;
if(sys_ctrl.coh>99)sys_ctrl.coh=0;
break;
case 6://CO2浓度上限
sys_ctrl.co2h++;
if(sys_ctrl.co2h>99)sys_ctrl.co2h=0;
break;
case 7://烟雾浓度上限
sys_ctrl.gash++;
if(sys_ctrl.gash>99)sys_ctrl.gash=0;
break;
}
}
//手动模式
else
{
jsrflag=!jsrflag;
if(jsrflag==1)//加热
{
JR_PIN=0;SR_PIN=1;
}
else//散热
{
JR_PIN=1;SR_PIN=0;
}
}
}
//在设置模式下,减
else if(key==KEY2_PRESS)
{
//自动模式
if(sys_ctrl.auto_flag==0)
{
switch(sys_ctrl.mode)
{
case 1://温度下限
sys_ctrl.templ--;
if(sys_ctrl.templ<0)sys_ctrl.templ=99;
break;
case 2://温度上限
sys_ctrl.temph--;
if(sys_ctrl.temph<0)sys_ctrl.temph=99;
break;
case 3://湿度下限
sys_ctrl.humil--;
if(sys_ctrl.humil<0)sys_ctrl.humil=99;
break;
case 4://湿度上限
sys_ctrl.humih--;
if(sys_ctrl.humih<0)sys_ctrl.humih=99;
break;
case 5://CO浓度上限
sys_ctrl.coh--;
if(sys_ctrl.coh<0)sys_ctrl.coh=99;
break;
case 6://CO2浓度上限
sys_ctrl.co2h--;
if(sys_ctrl.co2h<0)sys_ctrl.co2h=99;
break;
case 7://烟雾浓度上限
sys_ctrl.gash--;
if(sys_ctrl.gash<0)sys_ctrl.gash=99;
break;
}
}
//手动模式
else
{
jcsflag=!jcsflag;
if(jcsflag==1)//加湿
{
JS_PIN=0;CS_PIN=1;
}
else//除湿
{
JS_PIN=1;CS_PIN=0;
}
}
}
//确定
else if(key==KEY4_PRESS)
{
//自动模式
if(sys_ctrl.auto_flag==0)
sys_ctrl.mode=0;
//手动模式
else
{
JR_PIN=1;SR_PIN=1;
JS_PIN=1;CS_PIN=1;
FS_PIN=1;
}
}
//自动/手动
else if(key==KEY5_PRESS)
{
sys_ctrl.auto_flag=!sys_ctrl.auto_flag;
if(sys_ctrl.auto_flag==0)
{
JR_PIN=1;SR_PIN=1;
JS_PIN=1;CS_PIN=1;
FS_PIN=1;
}
}
}
//系统功能控制
void sys_fun_ctrl(void)
{
//自动模式
if(sys_ctrl.auto_flag==0)
{
//正常模式下
if(sys_ctrl.mode==0)
{
//如果温度高于上限,报警,打开散热
if(sys_ctrl.temp>sys_ctrl.temph)
{
JR_PIN=1;SR_PIN=0;
beep_alarm(1,10000);
}
//如果温度低于下限,报警,打开加热
else if(sys_ctrl.temp<sys_ctrl.templ)
{
JR_PIN=0;SR_PIN=1;
beep_alarm(1,10000);
}
//温度正常,关闭加热/散热
else
{
JR_PIN=1;SR_PIN=1;
}
//如果湿度高于上限,报警,打开除湿
if(sys_ctrl.humi>sys_ctrl.humih)
{
JS_PIN=1;CS_PIN=0;
beep_alarm(1,10000);
}
//如果湿度低于下限,报警,打开加湿
else if(sys_ctrl.humi<sys_ctrl.humil)
{
JS_PIN=0;CS_PIN=1;
beep_alarm(1,10000);
}
//如果湿度正常,关闭加湿除湿
else
{
JS_PIN=1;CS_PIN=1;
}
//如果CO/CO2/烟雾体浓度高于上限,报警,打开风扇
if(sys_ctrl.co>sys_ctrl.coh || sys_ctrl.co2>sys_ctrl.co2h || sys_ctrl.gas>sys_ctrl.gash)
{
FS_PIN=0;
beep_alarm(1,10000);
}
else FS_PIN=1;
}
}
}
//应用控制系统
void appdemo_show(void)
{
u8 i=2;
sys_parm_init();//系统参数初始化
lcd1604_init();
DHT11_Init();
//读取数据,等待稳定
while(i--)
{
sys_data_get();
delay_ms(100);
}
sys_open_show();//系统开机界面显示
while(1)
{
sys_data_get();//系统数据获取
sys_data_show();//系统数据显示
sys_data_set();//系统数据设置
sys_fun_ctrl();//系统功能控制
}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。