FastBond2阶段2-基于51单片机火灾烟雾自动报警器
基于51单片机设计火灾烟雾报警器,能对火灾的实时、准确监测,快速、自动报警,该系统能自动完成对布测点的火情检测即气体温度、浓度,液晶显示屏会显示看到温度变化,如果超过设定温度就会自动报警,报警器就会发出警报和灯光常亮警示。
标签
嵌入式系统
hei
更新2023-11-01
重庆电力高等专科学校
685

一、前言

       上回FastBond2阶段1的文档中,展示了使用Scheme-it绘制的框图,并在Kicad进行了原理图和PCB的设计,相比于其他设计的软件,kicad更加的方便快捷。同时说明了火灾烟雾报警器的方法以及原理,也说明了项目中所使用到的活动规定厂家的芯片。

想了解阶段1的具体内容可以通过链接跳转:

在一阶段设计中由于初版PCB的设计版型偏大,为了更好的节省空间,现在参加FastBont第二阶段,所以进行对PCB板块的缩小、打板焊接以及程序的编写。

 

二、原理图与PCB设计

原理图设计是使用Kicad绘制的,本次设计主要采用的是Microchip的AT89C51RC单片机为基础进行设计,利用火焰传感器对火源亮度进行检测,温度传感器18B20进行温度检测,烟雾传感器MQ-2进行对空气有害气体进行检测。

 

Fg-FlvQsF0b-2fpAnZZd96jHrh4O

在原理图中我分别绘制了各个模块的电路,使用网络标签的连接,,不仅让接线更加的清晰明了、整洁,还能清晰的在原理图中展示出电路各个的功能模块。

FspppKAYSvE7QfzGX5wtLsK3DXd_

PCB板的绘制和走线同样也是用Kicad绘制,这是最终板框的设计,相比于初版能够更好的利用空间,更加的集成化,大大的节省所需要的空间。对于烟雾传感器和火焰传感器所用的模块,我用的是排母来代替接线,同时对板子进行了顶层和底层GND的铺铜处理,让导线的走势更加的便捷。

 

 

三、主要代码展示

 

首先是主函数介绍,一开始定义温度值、烟雾值和循环的字符,然后LCD1604需要对它进行初始化,读取需要检测报警的数值,如果数值异常,则返回重新定义的值;主函数循环体,对需要读取的数值进行循扫描显示;

 

void main(void)
{
	int   temp;					// 保存温度值
	uchar num;					// 保存烟雾值
	uchar i;						// 循环变量
	
	LcdInit();				    	// 液晶功能初始化
	LcdShowInit();					// 液晶显示内容初始化
	
	gMqAlarm=EEPROM_Read(0x2000);		// 从EEPROM中读取报警值
	if((gMqAlarm==0)||(gMqAlarm>100))		// 如果读出来数据异常,则重新赋值30
		gMqAlarm=30;
	LcdGotoXY(0,11);						// 光标定位
	LcdPrintNum1(gMqAlarm);				// 显示烟雾浓度的报警值
	
	gTempAlarm=EEPROM_Read(0x2001)-55;	// 将温度报警值读取出来
	if((gTempAlarm<=-55)||(gTempAlarm>125))	// 如果读出来数据异常,则重新赋值400		gTempAlarm=40;
	LcdGotoXY(1,11);						// 光标定位
	LcdPrintNum2(gTempAlarm);				// 显示温度的报警值

	while(DS18B20_ReadTemp()==85)			// 等待温度传感器初始化完成
	{
		DelayMs(10);
	}

	while(1)
	{
		num=Get_ADC0832();				// 获取烟雾的浓度值
		num=num/2.2;					// 调整浓度值,使其在0-100之间变化
		if(num>100)
			num=100;
		LcdGotoXY(0,5);					// 液晶光标定位到第0行第5列
		LcdPrintNum1(num);				// 显示烟雾浓度的值
		
		temp=DS18B20_ReadTemp();			// 读取温度值
		LcdGotoXY(1,5);					// 液晶光标定位到第1行第5列
		LcdPrintNum2(temp);				// 显示温度值
		
		AlarmJudge(num,temp);				// 报警判断
		
		for(i=0;i<15;i++)					// 执行15次循环
		{
			KeyScanf();					// 按键扫描
			DelayMs(10);					// 延时
		}
	}
}

 

然后这是报警判断,对三个需报警的参数进行判断,达到所设的报警阈值就发出低电平,让LED亮和蜂鸣器发声;

 

void AlarmJudge(uchar dat1, int dat2)
{
/*火焰报警判断*/
	if(Fire_P==0)
	{
		DelayMs(50);
		if(Fire_P==0)
		{
			Led1_P=0;
		}
	}
	else
	{
		Led1_P=1;
	}
	
	/*烟雾报警判断*/
	if(dat1>gMqAlarm)
	{
		Led3_P=0;
	}
	else
	{
		Led3_P=1;
	}
	
	/*温度报警判断*/
	if(dat2>gTempAlarm)
	{	
		Led2_P=0;
	}
	else
	{
		Led2_P=1;
	}

	/*蜂鸣器报警判断*/
	if((Led1_P==0)||(Led2_P==0)||(Led3_P==0))
		Buzzer_P=0;
	else
		Buzzer_P=1;
}

 

这是按键功能实现的代码,能够对烟雾报警值和温度报警值的阈值进行设置;

 

void KeyScanf()
{
	if(Key1_P==0)
	{
		LcdGotoXY(0,13);
		LcdWriteCmd(0x0f);				// 显示光标,并闪烁
		
		/*****烟雾报警值的设置**********************/
		DelayMs(10);						// 延时去除按键按下的抖动
		while(!Key1_P);					// 等待按键释放
		DelayMs(10);		   				// 延时去除按键松开的抖动
		
		while(Key1_P!=0)					// 如果按键1按下,那么跳到下一级设置
		{
			if(Key2_P==0)					// 如果减按键被按下	
			{
				if(gMqAlarm>1)			// 只有gMqAlarm大于1才能减1		
					gMqAlarm--;				
				LcdGotoXY(0,11);			// 液晶光标定位到第0行第11列
				LcdPrintNum1(gMqAlarm);	// 刷新改变后的报警值
				LcdGotoXY(0,13);
				DelayMs(250);				// 延时一下
			}
			if(Key3_P==0)					// 如果加按键被按下	
			{
				if(gMqAlarm<100)			// 只有gMqAlarm小于100才能加1
					gMqAlarm++;				
				LcdGotoXY(0,11);			// 液晶光标定位到第0行第11列
				LcdPrintNum1(gMqAlarm);	// 刷新改变后的报警值
				LcdGotoXY(0,13);
				DelayMs(250);				// 延时一下
			}
		}
		
		/*****温度报警值设置******************/
		LcdGotoXY(1,13);					// 光标定位
		DelayMs(10);						// 延时去除按键按下的抖动
		while(!Key1_P);					// 等待按键释放
		DelayMs(10);		   				// 延时去除按键松开的抖动
		while(Key1_P!=0)					// 如果按键1按下,则退出设置模式
		{
			if(Key2_P==0)					// 如果减按键被按下	
			{
				if(gTempAlarm>-54)		// 只有gTempAlarm大于-54才能减1	
					gTempAlarm--;				
				LcdGotoXY(1,11);			// 液晶光标定位到第1行第11列
				LcdPrintNum2(gTempAlarm);	// 刷新改变后的报警值
				LcdGotoXY(1,13);
				DelayMs(250);				// 延时一下
			}
			if(Key3_P==0)					// 如果加按键被按下	
			{
				if(gTempAlarm<125)		// 只有gTempAlarm小于125才能加1
					gTempAlarm++;				
				LcdGotoXY(1,11);			// 液晶光标定位到第0行第11列
				LcdPrintNum2(gTempAlarm);	// 刷新改变后的报警值
				LcdGotoXY(1,13);
				DelayMs(250);				// 延时一下
			}				
		}
		
		/*****退出报警值的设置***************/
		DelayMs(10);						// 延时去除按键按下的抖动
		while(!Key1_P);					// 等待按键释放
		DelayMs(10);		   				// 延时去除按键松开的抖动
		
		Sector_Erase(0x2000);				// 擦除单片机内部EEPROM的数据
		EEPROM_Write(0x2000,gMqAlarm);		// 将新设置的烟雾报警值写入EEPROM
		EEPROM_Write(0x2001,gTempAlarm+55);	// 将新设置的温度报警值+55写入
		LcdWriteCmd(0x0c);					// 关闭光标
	}
}

四、成品展示

FkoaJE3Y0-cuAs6xHNRFGO-QDi14

 

该板子焊接组装完成是这样,由于没有外壳,外观展示暂时这样。LED屏幕第一排是Gas是空气中有害气体的数值,前面005是实时对气体检测的数值,后面050是空气中有害气体所设置的报警阈值;第二排Tmp是温度的显示的数值,后面数值和前面同理。下面有四个按键,功能分别是:第一个,复位功能,能够对单片机进行一个手动复位;第二个,设置功能,按第一下的时候进入烟雾、有害气体浓度报警阈值的设置,按第二下的时候进入温度的报警阈值的设置,按第三下的时候确认以上设置;后面两个按键,是对设置时候的数值进行加减操作。

 

五、活动总结:

感谢硬禾科技举办的这次活动,看着自己画的板子做成成品,并且还可以正常工作,有所应用,内心十分的激动。虽然在这过程中遇到了很多困难,但最终都解决了,并且收获很多。

附件下载
烟雾温度报警器.kicad_pcb
烟雾温度报警器.kicad_sch
程序.rar
团队介绍
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号