【Proteus仿真】【51单片机】基于单片机的环境监测系统


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用LCD1604液晶、DHT11温湿度传感器、声光报警、按键模块、CO\CO2\烟雾传感器、继电器控制模块等。

主要功能:
系统运行后,LCD1604显示温湿度、CO、CO2和烟雾浓度;
可通过按键K5选择自动/手动模式,当处于手动模式时,
K1用于控制加热散热,K2用于控制加湿除湿,K3用于控制
风扇开关,K4用于手动关闭所有设备;当处于自动模式时,
检测温度高于上限,风扇开启,低于下限,加热开启,阈值范围内关闭加热和散热;检测湿度高于上限,除湿开启,低于下限,加湿开启,阈值范围内关闭加湿和除湿;检测CO/CO2/烟雾浓度高于上限,开启风扇,低于阈值关闭风扇。超限时声光报警。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/


//系统数据设置
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设计,视频分享,技术交流。

本资料是基于51单片机环境监测系统 /*--------------------------------------------------------------------- ds18b20.h文件 ds18b20的函数 作者: 创建日期:2008.05.05 最后修改日期:2008.05.10 版本:2.0 1 单线单口的ds18b20的温度读取。 2 复位状态连续读取。 3 转换温度值在Disbuf[5];。 所有子程序: delay_ds18b20(unsigned int t) //延时US unsigned char ReadOneChar(void) //读一个字节 void WriteOneChar(unsigned char dat) //写一个字节 bit Init_DS18B20(void) //初始化函数 void TemperatuerResult(void) //复位 void r_ds18b20() //读取并转换温度值到Disbuf[]! ----------------------------------------------------------------------*/ #ifndef __ds18b20_1_H__ #define __ds18b20_1_H__ #include #define uchar unsigned char #define uint unsigned int /*--------------------------------------------------------- ds18b20数据、控制口定义 ---------------------------------------------------------*/ /*--------------------------------------------------------- void r_ds18b20(void) //读取并转换温度值到Disbuf[]! { TemperatuerResult(); xiaoshu = tplsb&0x0f; tpmsb = tpmsb<>4; xiaoshutemp = xiaoshu *625; xiaoshutemp = xiaoshutemp/100; zhengshu = tpmsb + tplsb; if(zhengshu = 0x64)&&(zhengshu <= 0x7d)) { Disbuf[0] = zhengshu/100; Disbuf[1] = zhengshu%100/10; Disbuf[2] = zhengshu%10+10; Disbuf[3] = xiaoshutemp/10; Disbuf[4] = xiaoshutemp%10; } else; } #include "reg52.h" #include "ds18b20.h" #define uchar unsigned char #define uint unsigned int void main() //主函数 { Init_DS18B20(); while(1) { r_ds18b20(); } } ---------------------------------------------------------*/ #endif
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值