编号: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