基于51单片机的尾气成分监测系统(程序+Proteus仿真+电路图+元件清单)

编号:59

基于51单片机的尾气成分监测系统

功能描述:

         本设计由51单片机最小系统+ADC0832模块+液晶1602显示模块+ESP8266-Wifi模块+按键模块+DS18B20温度传感器+MQ7一样化碳传感器模块+MQ-136硫化氢H2S传感器+MQ-2烟雾传感器+SGP30二氧化碳传感器+声光报警模块组成

1、主控制器是89C82单片机。
2、MQ-7、MQ-2、MQ-135分别测量CO、烟雾、H2S等浓度,通过ADC0832进行A/D转换获取
3、DS18B20温度传感器测量当前温度,SGP30传感器获取CO2浓度
3、液晶1602实时显示当前温度、CO、烟雾、H2S
4、三个按键可分别设置以上数据的报警值,超限声光报警
5、数据通过ESP8266模块实时发送至手机APP(TPC调试助手)显示

视频演示链接:

59、基于51单片机的尾气成分监测系统

仿真图:

电路图:

实物图:

程序源码:

#include "reg52.h"
#include "lcd1602.h"
#include "delay.h"
#include "ADC0832.h"
#include "SGP30.H"
#include "key.h"
#include "ds18b20.h"
#include "uart.h"



#include "STRING.H"
#include "STDIO.H"

sbit BEEP = P2^4;

unsigned char Beep_Flag = 0;
bit Timer_Flag = 1;					//时间到 标准位
bit Timer_300ms = 1;					//时间到 标准位

extern unsigned char mq136up;	 		//各个数据上限值
extern unsigned char mq7up ;
extern unsigned char mq2up ;

extern unsigned int co2up;

extern unsigned short int tpup;

/************************************************************************
* 函数: void Timer2Init(void)
* 描述: 定时器1初始化函数
* 参数: none.
* 返回: none.
* 备注:定时50ms 11.0592MHz
************************************************************************/  
void Timer0Init(void)	//50毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;			//设置定时初值
	TH0 = 0x4C;			//设置定时初值
	TF0 = 0;			//清除TF0标志
	TR0 = 1;			//定时器0开始计时
	ET0 = 1;
	EA = 1;
}

	
void main(void)
{
	unsigned char disbuf[20];

	unsigned char H2S  = 0;					//硫化氢
	unsigned char CO = 0;
	unsigned char MQ2 = 0;					//可燃气体烟雾
	short temprature;		   				//读到的温度值
	float temp = 0;

	unsigned char keyvalue = 0;		//键值 


	unsigned int CO2Data;			//定义CO2浓度变量


//	unsigned char send[20]=NULL;


	Lcd1602_Init();			  				//LCD1602液晶初始化

	delay_ms(100);
	temprature=DS18B20_Get_Temp();		//读取温度
	//SGP30模块开机需要一定时间初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变,因此上电后每隔500ms读取一次
	//SGP30模块的值,如果CO2浓度为400ppm,TVOC为0ppd,发送“正在检测中...”,直到SGP30模块初始化完成。
	//初始化完成后刚开始读出数据会波动比较大,属于正常现象,一段时间后会逐渐趋于稳定。
	while(temprature==850)
	{
		

		temprature=DS18B20_Get_Temp();		//读取温度

//		printf("正在检测中...\r\n");
		delay_ms(100);
		Lcd1602_String(0,0,"  Watiting....  ");
	}
	Timer0Init();	//50毫秒@11.0592MHz
	Lcd1602_String(0,0,"ADC0:         ");
	Lcd1602_String(0,1,"ADC1:         ");
	UartInit();								//9600bps@11.0592MHz

	while(1)
	{

		if(Timer_300ms==1)
		{
			Timer_300ms = 0;
		   	H2S = ADC0832(1,0)*100/256;			//通道0  
			CO = ADC0832(1,1)*100/256;				//通道1
	
			MQ2 = ADC08321(1,0)*100/256;
				

	
			temprature=DS18B20_Get_Temp();		//读取温度
			temp = (float)temprature/10;			
	
			sprintf(disbuf,"H2S:%02bd C:%02bd W:%02bd",H2S,CO,MQ2);
			Lcd1602_String(0,0,disbuf);
	
		    sprintf(disbuf,"CO2:%04d T:%4.1f",CO2Data,(float)temprature/10);
			Lcd1602_String(0,1,disbuf);

			if(H2S>mq136up||CO>mq7up||MQ2>mq2up||CO2Data>co2up||temp>tpup)
			{
				Beep_Flag = 1;
			}
			else
			{
				 Beep_Flag = 0;
			}
		}
		
	
		keyvalue = KEY_Scan(0);				//获取单击按键键值
		switch(keyvalue)
		{
			case 1:		  					//key0按键处理
				KEY_Set();					//键盘设置时间
			break;
			
			case 3:							//key2按键处理
			
				
			break;
			

		}
		

		if(Timer_Flag == 1)				//5S到了
		{	
		
//				memset(send,'\0',sizeof(send));				


//				sprintf(send,"H2S:%02bd C:%02bd W:%02bd CO2:%04d T:%4.1f ",H2S,CO,MQ2,CO2Data,(float)temprature/10);
//				send[33]='B';
//				send[34]=':';
//				send[35]=Beep_Flag+0X30;
//				send[36]='\r';
//				send[37]='\n';
			//	sprintf(send,"H2S:%02bd C:%02bd W:%02bd CO2:%04d T:%4.1f B:%1bd\r\n",H2S,CO,MQ2,CO2Data,(float)temprature/10,Beep_Flag);

				//status = Esp8266_Net_SendData((unsigned char *)send,strlen(send));	//发送数据到APP		
		
	
			Timer_Flag = 0;
		}
		

	}
}

/* Timer0 interrupt routine */ 		
void tm0_isr() interrupt 1 using 1	   //50ms中断
{
	static unsigned int cnt=0;	
	static unsigned int cnt1=0;
	static unsigned int cnt2=0;
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x4C;		//设置定时初值
	TF0 = 0;
	if(Beep_Flag == 1)	//报警打开?
	{
	 	if(cnt++>=10)	//500ms?
		{
			cnt = 0;
			BEEP = ~BEEP;
		}
	}
	else
	{
		BEEP = 1;
	}

	if(cnt1++>=40)						//50ms*40 = 2S
	{
		cnt1 = 0;
		Timer_Flag = 1;					//赋予标志位
	}
	
	if(cnt2++>=6)						//50ms*6 = 0.3s
	{
		cnt2 = 0;
		Timer_300ms = 1;					//赋予标志位
	}
	

}

软件免费下载地址:

1、Proteus仿真软件
文件内容:Proteus7.8安装包、Proteus8.6安装包、Proteus.8.10安装包、Proteus Professional 8.11 SP0安装包

链接:https://pan.baidu.com/s/11LNUZ9BJXWvXf1C4dPc3_w 
提取码:2756

2、KEIL4 C51软件安装包

链接:https://pan.baidu.com/s/1CTZBqDsPsyIbjCIjI_birA 
提取码:sy2a 

文件下载:

链接: https://pan.baidu.com/s/1pNm79TldPY3AXu_AY6hrdA?pwd=m49e 提取码: m49e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

单片机技能设计

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

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

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

打赏作者

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

抵扣说明:

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

余额充值