利用MQ-5传感器实现对天然气体的检测,采集到数据,经过A/D转换后,再由单片机处理,并对处理后的数据进行分析,是否大于或等于某个预设值(也就是报警限),如果大于则会自动启动报警电路发出报警声音和风扇,反之则为正常状态。
具体实现功能:
1、MQ-5实时检测煤气浓度,浓度分为低中高3档,并分别用绿灯、黄灯和红灯指示,浓度到达相应的档位,则相应的灯亮,指示灯指示安全状态。
2、当浓度达到高档的时候,蜂鸣器报警,风扇启动,疏散煤气。
3、浓度达到中档的时候继电器断开。
本设计由STC89C52单片机+MQ-5传感器模块电路+3个LED指示灯电路+蜂鸣器报警电路+PCF8591AD模块+风扇控制电路+继电器控制电路+电源电路组成。设计框图如图所示。
#include
#include
#include
#include "i2c.h"
#include "delay.h"
sbit fengshan = P1^0; //接口定义
sbit buzzer = P1^1;
sbit relay = P1^2;
sbit LED_GRE = P1^3;
sbit LED_YEL = P1^4;
sbit LED_RED = P1^5;
unsigned long time_20ms=0; //定时变量
unsigned char dis0[16]; //数组暂存
unsigned char midVolt ; //ad采集电压
unsigned char i;
void Init_Timer0(void);//函数声明
void UART_Init(void);
void uartSendByte(unsigned char dat);
void uartSendStr(unsigned char *s,unsigned char length);
void main (void)
{
Init_Timer0(); //定时器0初始化
UART_Init();
DelayMs(120);
uartSendStr("ready ok!",9);
while(1) //主循环
{
midVolt=ReadADC(0)*99/255; //读取AD检测到的转化为数值
sprintf(dis0,"NongDu:%2d\n",(unsigned int)midVolt); //发送
uartSendStr(dis0,10);
if(midVolt<30)
{
fengshan = 1;//关 风扇
buzzer = 1;//关 蜂鸣器
relay = 1;//关 继电器
LED_GRE = 0;//开 绿灯
LED_YEL = 1;//关 黄灯
LED_RED = 1;//关 红灯
}
else if(midVolt<50)
{
fengshan = 1;//关 风扇
buzzer = 1;//关 蜂鸣器
relay = 0;//开 继电器
LED_GRE = 1;//关 绿灯
LED_YEL = 0;//开 黄灯
LED_RED = 1;//关 红灯
}
else
{
fengshan = 0;//开 风扇
buzzer = 0;//开 蜂鸣器
relay = 0;//开 继电器
LED_GRE = 1;//关 绿灯
LED_YEL = 1;//关 黄灯
LED_RED = 0;//开 红灯
}
for(i=0;i<5;i++) DelayMs(100);
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
time_20ms++;
}
void UART_Init(void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
void uartSendByte(unsigned char dat)
{
unsigned char time_out;
time_out=0x00;
SBUF = dat; //将数据放入SBUF中
while((!TI)&&(time_out<100)) //检测是否发送出去
{time_out++;DelayUs2x(10);} //未发送出去 进行短暂延时
TI = 0; //清除ti标志
}
void uartSendStr(unsigned char *s,unsigned char length)
{
unsigned char NUM;
NUM=0x00;
while(NUM