基于51单片机的天然气检测报警系统

1、设计需求及目标

利用MQ-5传感器实现对天然气体的检测,采集到数据,经过A/D转换后,再由单片机处理,并对处理后的数据进行分析,是否大于或等于某个预设值(也就是报警限),如果大于则会自动启动报警电路发出报警声音和风扇,反之则为正常状态。

具体实现功能:
1、MQ-5实时检测煤气浓度,浓度分为低中高3档,并分别用绿灯、黄灯和红灯指示,浓度到达相应的档位,则相应的灯亮,指示灯指示安全状态。
2、当浓度达到高档的时候,蜂鸣器报警,风扇启动,疏散煤气。
3、浓度达到中档的时候继电器断开。

2、设计思路及方案

本设计由STC89C52单片机+MQ-5传感器模块电路+3个LED指示灯电路+蜂鸣器报警电路+PCF8591AD模块+风扇控制电路+继电器控制电路+电源电路组成。设计框图如图所示。

基于51单片机的天然气检测报警系统_第1张图片

3、硬件电路图

基于51单片机的天然气检测报警系统_第2张图片

4、部分程序

#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

 

你可能感兴趣的:(51单片机实例)