基于51单片机的可燃性气体报警器设计


前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

资料获取

文章底部名片,详细资料联系我。

设计介绍

基于51单片机的可燃性气体报警器设计旨在实时监测环境中的可燃气体浓度,并在浓度超标时及时发出报警信号,以保障生产和生活环境的安全。以下是对该设计的详细介绍:

设计目标
开发一个基于51单片机的可燃性气体报警器,能够实时监测环境中的可燃气体浓度,并在浓度超标时及时发出报警信号,以防止火灾等安全事故的发生。

核心元件
传感器:采用MQ-4型可燃气体传感器,该传感器灵敏度高、响应速度快、稳定性好。当环境中存在可燃气体时,传感器的电阻值会发生变化,从而检测气体浓度。
单片机:选用51单片机(如AT89S52)作为核心控制器,负责接收传感器采集的数据,并根据预设的阈值判断是否触发报警。
显示模块:采用LCD1602液晶显示屏,用于实时显示当前环境中的可燃气体浓度值,便于用户直观了解环境状况。
报警模块:包含声光报警设备,如蜂鸣器和LED灯。当可燃气体浓度超过安全阈值时,会发出声音和灯光报警,以提醒用户注意安全。

设计程序

#include<REG52.H>
#include "lcd12864.h"

#define uint unsigned int 
#define uchar unsigned char
	
sbit K1=P3^2; //K1按键定义
sbit K2=P3^3; //K2按键定义
sbit K3=P3^4; //K3按键定义
sbit K4=P3^5; //K4按键定义
sbit PLAY=P3^0;//语音报警脚定义
#define AD P1  //AD数据脚定义
sbit A0=P2^6;
sbit B0=P2^7;
sbit C0=P3^7;
unsigned int Send=800;
unsigned int temp=0;
uchar flag=0,flag1=0;
unsigned char EXT=0;
unsigned char bian=0;
  
uchar keynum=0,keynum1=0;

unsigned char keyscan()	   //按键子程序	4个按键按下按键返回对应的按键值 K1:返回1,K2:返回2,K3:返回3,K4:返回4,无按键按下返回0.
{
  if(K1==0)		  //按键一按下
  { 
		delay(5);
      if(K1==0)
		{
		  while(!K1); //松手检测
		  return 1;		//返回1给函数表示按键1按下
		}
  }
    if(K2==0)	 //按键二按下
  {
		delay(5);
		if(K2==0)
		{
		  while(!K2);
		  return 2;	 //返回2给函数表示按键2按下
		}
  }
  if(K3==0)	   //按键三按下
  {
		delay(5);
		if(K3==0)
		{
		  while(!K3);
		  return 3;	   //返回3给函数表示按键3按下
		}
  }
  if(K4==0)		//按键四按下
  {
		delay(5);
		if(K4==0)
		{
		  while(!K4);
		  return 4;	 //返回4给函数表示按键4按下
		}
  }
  return 0;		   //没有按键按下时返回0
}

void Task1()
{
  unsigned int vout;//	AD百分比值
	unsigned int VGET;	//AD电压值
  uchar str[]="0123";
	unsigned char str4[]="012";
	uchar str3[]="00000000";
	uchar str1[]="0120";
	uchar str2[]="0124";
	unsigned char str5[]="0000";
	 
	str2[0]='9'+14;	//将通道和通道值存入对应的显示数组
  str2[1]='9'+15;
	str2[2]='5'+10;
  str2[3]='5'+EXT;
	if(EXT==0)			//判断通道标志等于零
	{
	   A0=0;B0=0;C0=0;	//开通道0
	}
	if(EXT==1)		  //判断通道标志等于一
	{
		A0=1;B0=0;C0=0;	  //开通道1
	}
	if(EXT==2)		//判断通道标志等于二
	{
		A0=0;B0=1;C0=0;	 //开通道2
	}
	if(EXT==3)		//判断通道标志等于三
	{
		A0=1;B0=1;C0=0;//开通道3
	}	 
	if(EXT==4)	  //判断通道标志等于四
	{
	  A0=0;B0=0;C0=1;	 //开通道4
	}//str4[0]='5'+12;
	temp=AD;
	str4[0]='9'+8;		 //将设置的报警值存入显示数组
	str4[1]='9'+9;
	str4[2]='9'+19;
	str5[0]='5'+10;
	str5[1]='5'+Send%1000/100;
	str5[2]='5'+Send%100/10;
  str5[3]='5'+11;
	disnumstr2(3,0,str4,1);	 //显示设置的报警值
	disnumstr2(3,6,str5,1);
	vout=1020/255*temp;	 //AD值转成百分比
	VGET=5100/255*temp;	 //AD值转成电压值
	if(VGET>5100)VGET=5000;
	if(vout>1000)vout=1000;
	if(vout>=1000)
	str1[0]='5'+vout/1000;
	else
	str1[0]='5'+10;				 //将百分比值存入显示数组
	str1[1]='5'+vout%1000/100;
	str1[2]='5'+vout%100/10;
  str1[3]='5'+11;
	str3[0]='9'+17;
	str3[1]='9'+18;
	str3[2]='9'+19;
	str3[3]='5'+10;
	str3[4]='5'+VGET/1000;	  //将电压值存入显示数组
	str3[5]='9'+20;
	str3[6]='5'+VGET%1000/100;
	str3[7]='9'+16;
   //str1[0]='5'+temp%100/10;
  disnumstr2(0,0,str,1);	//显示百分比
  disnumstr2(0,8,str1,1);
	disnumstr2(1,4,str2,1);	//显示通道值
	disnumstr2(2,0,str3,1);//显示电压值
	if(vout>Send) //超过报警值则报警
	{
		PLAY=1;
	}
	else		//否则不报警
	{
	    PLAY=0;	
	}	
}
void Task2()
{
	 unsigned char str4[]="012345";
	 unsigned char str3[]="0123";  
	 
	if(keynum1==1)		  //加按键按一下设置值加1%
	{
    	 Send=Send+10;
		 if(Send>=1000)
		 Send=0;
		 keynum1=0;
	}
	if(keynum1==2)	 //减按键按一下设置值减1%
	{
	     Send=Send-10;
		 if(Send==65535)
		 Send=990;
		 keynum1=0;
    }
	str4[0]='5'+12;		 //将设置值存入显示数组
	str4[1]='5'+13;
	str4[2]='5'+14;
	str4[3]='5'+15;
  str4[4]='5'+16;
	str4[5]='5'+17;
	str3[0]='5'+10;
	str3[1]='5'+Send%1000/100;
	str3[2]='5'+Send%100/10;
  str3[3]='5'+11;
	disnumstr2(1,4,str3,1);	   //显示设置界面和设置值
	disnumstr2(0,2,str4,1);

}
void main()
{
  uchar i;uchar xx=0xe0;
	init();    //液晶初始化
	delay(100);
	lcdclr();
  PLAY=0;
  for(;;)
  {
    keynum=keyscan();	   //取出按键值
	  if(keynum!=0)	       //判断是否有按键按下
    {
		   keynum1=keynum;	 //将按键的值固定起来
		   keynum=0;		     //清空按键中间变量的值  
	  }
	  if(keynum1==3)	     //当设置键按下 浓度显示界面和浓度报警设置界面切换
	  {
	    keynum1=0;	  //清空按键值方便按键下次检测
		  flag++;		    //任务标志位切换
		  if(flag==2)	  //flag的值最多只能是0,和1.当flag到2时
		  flag=0;		    //则将flag的值清空
		  lcdclr();	    //每次任务切换都要做清屏
	  }
  	if(flag==0)	      //判断是否是浓度显示界面
	  Task1();          //浓度显示界面
	  if(flag==1)	      //判断是否是浓度报警设置界面
    Task2();		      //浓度报警设置界面
	  if(keynum1==4)	  //当通道按键按下
	  {
	     EXT++;		   //通道标志加一
		   if(EXT==5)  //加到5时
		   EXT=0;	     //通道清零
       keynum1=0;	 //清空按键值
	  }
  }
}


具体实现截图

在这里插入图片描述

在这里插入图片描述

设计获取

文章下方名片联系我即可~

精彩专栏推荐订阅:在下方专栏👇🏻

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值