1.系统功能
火灾报警器,主要检测温度和烟雾,再通过单片机控制相应的报警和驱动负载。通过液晶显示当前的烟雾值和温度值,通过按键设定相应的阀值。
主要包括以下几项功能:
(1)火情探测功能:为了提高火灾报警的准确性和及时性,火灾报警系统需要使用各种方法进行火灾探测。在实际使用中,根据不同的防火场所,用户可以选用温度探测法、可燃气体检测法及烟雾探测法等合适的火灾探测方法,来有效的探测火灾;
(2)灯光报警功能:当室内烟雾浓度过大、有火情产生、故障等异常情况发生时,报警器要进行灯光报警。当烟雾超过最大设定值时,可以蜂鸣器报警。

2.系统硬件方案设计
(1)硬件框图
本设计主要由烟雾探测传感器电路、单片机、灯光报警电路、负载驱动电路、控制程序和编解码程序等组成。
系统的组成结构如下:
在这里插入图片描述
(2)系统硬件设计
在这里插入图片描述
在这里插入图片描述如图所示,上面的图为protel99se所画,下面的图为proteus仿真所画。
实时显示当前的烟雾值和温度值,共有2个报警值(可以通过按键设定),分别是温度的上限和烟雾的上限报警值,当烟雾超过的时候红灯和蜂鸣器声光报警,当温度超过时候黄灯和蜂鸣器声光报警。

(3)烟雾探测电路的设计
在这里插入图片描述
如图所示,在这个电路中,有两个部分,主要是烟雾传感器检测烟雾,将电压信号给ADC0809,模数转换电路将模拟信号转换成数字信号给单片机,单片机再读取相应的数值和处理。

3.软件设计
(1)程序流程图
在这里插入图片描述
(2)LCD1602驱动程序

//宏定义
#define uint unsigned int 
#define uchar unsigned char

//LCD管脚声明 (RW引脚实物直接接地,因为本设计只用到液晶的写操作,RW引脚一直是低电平)
sbit LCDRS = P2^3;
sbit LCDEN= P2^4;

//初始画时显示的内容
uchar code Init1[]="   SET E:000    ";
uchar code Init2[]="   NOW E:000    ";
//LCD延时
void LCDdelay(uint z)		  //该延时大约100us(不精确,液晶操作的延时不要求很精确)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=10;y>0;y--);
}

//写命令
void write_com(uchar com)
{
  LCDRS=0;				  
  P0=com;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
//写数据
void write_data(uchar date)
{
  LCDRS=1;
  P0=date;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
//1602初始化
void Init1602()
{
  uchar i=0;
  write_com(0x38);//屏幕初始化
  write_com(0x0c);//打开显示 无光标 无光标闪烁
  write_com(0x06);//当读或写一个字符是指针后一一位
  write_com(0x01);//清屏
  write_com(0x80);//设置位置

  for(i=0;i<16;i++)
  {
		write_data(Init1[i]);	  //显示数组1的数据
  }
  write_com(0x80+0x40);//设置位置
  for(i=0;i<16;i++)
  {
		write_data(Init2[i]);	  //显示数组2的数据
  }
}

void Display_1602(yushe_yanwu,temp)
{
	//设置烟雾
	write_com(0x80+9);
	write_data(0x30+yushe_yanwu/100);
	write_data(0x30+yushe_yanwu%100/10);
	write_data(0x30+yushe_yanwu%10);

	//时时烟雾
	write_com(0x80+0x40+9);
	write_data(0x30+temp/100);
	write_data(0x30+temp%100/10);
	write_data(0x30+temp%10);
}

(3)按键处理程序

/*************************按键说明******************************/
/*
1键设置按键
2键加按键
3键减按键
按一下设置键,温度报警值闪烁,此时按下加减按键调节温度报警值;再按一下设置键,烟雾报警值闪烁,此时按下加减按键,调节烟雾报警值;设置完成后,再按一下设置按键,退出设置。系统开始正常检测烟雾温度值,并且根据报警值判断是否开启报警
*/
//按键
sbit Key1=P2^6;				 //设置键
sbit Key2=P2^7;				 //加按键
sbit Key3=P3^7;				 //减按键

void Key()
{
	//模式选择
	if(Key1==0)	  //设置按键
	{
		while(Key1==0);
		if(Mode>=2) Mode=0;
		else
		{
//	   		write_com(0x38);//屏幕初始化
	   		write_com(0x0f);//打开显示 无光标 光标闪烁
//	   		write_com(0x06);//当读或写一个字符是指针后一一位
			Mode++;			//模式加一
			switch(Mode)	//判断模式的值
			{
				case 1:
				{
					write_com(0x80+7);//为1时 温度阀值的位置闪烁
					break;			  //执行后跳出switch
				}
				case 2:					//当模式加到3时
				{
//					write_com(0x38);//屏幕初始化
					write_com(0x0c);//打开显示 无光标 无光标闪烁
					Mode=0;			//模式清零
					break;
				}
			}
		}
	}
	if(Key2==0&&Mode!=0)	 //加按键只有在模式不等于0时有效
	{
		while(Key2==0);
		yushe_yanwu++;					   //同温度阀值设置
		if(yushe_yanwu>=255)
		yushe_yanwu=255;
		write_com(0x80+13);
		write_data(0x30+yushe_yanwu/100);
		write_data(0x30+yushe_yanwu%100/10);
		write_data(0x30+yushe_yanwu%10);
		write_com(0x80+15);
	}
	if(Key3==0&&Mode!=0)
	{
		while(Key3==0);
		yushe_yanwu--;							  //同上
		if(yushe_yanwu<=0)
		yushe_yanwu=0;
		write_com(0x80+13);
		write_data(0x30+yushe_yanwu/100);
		write_data(0x30+yushe_yanwu%100/10);
		write_data(0x30+yushe_yanwu%10);
		write_com(0x80+15);
	}
}

(4)主程序

/*****主函数*****/
void main()
{
	Init1602();			  //调用初始化显示函数
	while(1)			  //进入循环
	{
		temp=ADC0809();	  //读取烟雾值
		Key();			  //调用按键函数  扫描按键

		if(Mode==0)		  //只有当模式为0时才会执行以下的阀值判断部分
		{
			Display_1602(yushe_yanwu,temp);  //显示预设烟雾,烟雾值
			if(temp>=yushe_yanwu)	  //烟雾值大于等于预设值时
			{
				LED_yanwu=0;		  //烟雾指示灯亮
				baojing=0;			  //蜂鸣器报警
			}
			else					  //烟雾值小于预设值时
			{
				LED_yanwu=1;		  //关掉报警灯
			}
			if(temp<yushe_yanwu)	  //当烟雾小于预设值并且温度也小于预设值时 (&&:逻辑与,左右两边的表达式都成立(都为真,也就是1)时,该if语句才成立)
			{
				baojing=1;			  //停止报警
			}
		}
	}
}	

仿真+源码+AD电路图 下载:关注公众号,首页回复“火灾报警器”获取资料
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐