基于51单片机的智能火灾报警系统温度烟雾光

wx供重浩:创享日记
对话框发送:火灾报警
获取完整源码源文件+电路图+仿真文件+论文报告等
在这里插入图片描述


功能简介

51单片机+MQ-2烟雾传感+ADC0832模数转换芯片+DS18B20温度传感器+数码管显示+按键模块+声光报警模块

具体功能:
1、实时监测及显示温度值和烟雾浓度;
2、可通过三个按键设置烟雾报警值和温度报警值;
3、可实现手动紧急报警和手动取消报警功能;
4、温度超过阈值时,蜂鸣器响黄灯闪烁;烟雾超过阈值时,蜂鸣器响红灯灯闪烁;
5、测距范围: 烟物浓度:0——9等级;温度范围:0——99度。

在这里插入图片描述


原理图

在这里插入图片描述


PCB图

在这里插入图片描述


仿真图

在这里插入图片描述


软硬件设计框图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其余完整详见下载!


设计背景

智能火灾报警器系统的发展变化很快,新技术的发展进一步拓展了火灾报警系统的应用领域,为一些报警系统无法胜任的环境提供了有效的手段。我国的火灾报警从无到有,从有到现在的智能。火灾报警系统集早期探测、多传感器复合探测和探测器小型化、智能化的方向发展迈出了更快的步伐。

随着技术的创新,单片机早已深入应用到工农业生产各个领域及人们生活应用中。于是,各种类型的单片机也根据社会的需求而开发出来。单片机是器件级计算机系统,实际上它是一个微控制器或微处理器。由于它功能齐全、体积小、成本低,因此它可以应用到任何电子系统中去。同样,它也广泛应用于报警技术领域,使各类报警装置的功能更加完善,可靠性大大提高,以满足社会发展的需要。


硬件设计

智能火灾报警系统的原理是依据当烟雾浓度或温度达到设定值时,烟雾传感器和温度传感器感应到信号由ADC0832进行处理模数转化再到单片机进行处理,喇叭发出报警声音。系统共分为控制电路、检测电路、显示和报警电路。


软件设计

首先,开始执行初始化子程序,初始化实现的功能是I/O口输入、输出状态设定,寄存器初始化,中断功能等。设定定时初值为50ms,利用IAP写入EEPROM,作为取值间隔。然后,设置定时器0,选择方式1。方式1状态下,定时器的工作寄存器TH1、TL1,是全16位参与操作。接下来,定时器0中断的允许位置1,打开定时器0,关闭蜂鸣器,开启绿灯,设置报警初值。部分源码如下。

#include <reg51.h>	         //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义	变量范围0~255
#define uint  unsigned int	 //无符号整型 宏定义	变量范围0~65535
#include <intrins.h>
#include "eeprom52.h"

//数码管段选定义      0     1    2    3    4    5	 6	 7	  8	   9	
uchar code smg_du[]={
    
    0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x40,0xfd/*-*/};
//数码管位选定义
uchar code smg_we[]={
    
    0x7f,0xbf,0xdf,0xef};

uchar dis_smg[8]  = {
    
    0xa0,0x84,0x62,0x2a,0x39,0x2c,0x24,0xba};	

sbit CS=P2^3;		//CS定义为P3口的第2位脚,连接ADC0832CS脚  PCB
sbit SCL=P2^0;		//SCL定义为P3口的第3位脚,连接ADC0832SCL脚
sbit DO=P2^1;		//DO定义为P3口的第4位脚,连接ADC0832DO脚

sbit ledy = P1^6;   //温度报警指示灯
sbit ledr = P1^7;   //烟雾报警指示灯 x
sbit dq   = P1^5;	//18b20 IO口的定义
sbit beep = P3^6;   //蜂鸣器IO口定义
uint temperature,s_temp ;  //温度的变量
uchar dengji,s_dengji;     //烟物等级
uchar shoudong;            //手动报警键

bit flag_300ms = 1;
uchar key_can;		 //按键值的变量
uchar menu_1;        //菜单设计的变量

/*************读取18b20内的数据***************/
uchar read_18b20()
{
    
    
	uchar i,value;
	for(i=0;i<8;i++)
	{
    
    
		dq = 0;			 //把总线拿低读时间隙开始 
		value >>= 1;	 //读数据是低位开始
		dq = 1;			 //释放总线
		if(dq == 1)		 //开始读写数据 
			value |= 0x80;
		delay_uint(5);	 //60us	读一个时间隙最少要保持60us的时间
	}
	return value;		 //返回数据
}

/****************按键处理数码管显示函数***************/
void key_with()
{
    
    
	if(key_can == 4) 	 //紧急报警键  手动报警
	{
    
    
		if(menu_1 == 0)
			shoudong = 1;
	}
	if(key_can == 1)	 //设置键
	{
    
    
		menu_1 ++;
		if(menu_1 >= 3)
		{
    
    
			menu_1 = 0;
		}
	}
	if(menu_1 == 0)
	{
    
    
		if((key_can == 2) || (key_can == 3))
			shoudong = 0;          //取消手动报警
	}
	if(menu_1 == 1)			//设置高温报警
	{
    
    
		if(key_can == 2)
		{
    
    
			s_temp ++ ;		//高温报警值加1 
			if(s_temp > 99)
				s_temp = 99;
		}
		if(key_can == 3)
		{
    
    
			s_temp -- ;		//高温报警值减1 
			if(s_temp <= 10)
				s_temp = 10 ;
		}
		dis_smg[0] = smg_du[s_temp % 10];	           //取个位显示
		dis_smg[1] = smg_du[s_temp / 10 % 10];  //取十位显示
		dis_smg[2] = 0x80;
		dis_smg[3] = 0x1b;	//显示c
		write_eeprom();			   //保存数据
	}	
	if(menu_1 == 2)			//设置烟物报警
	{
    
    
		if(key_can == 2)
		{
    
    
			s_dengji ++ ;	  //烟物报警值加1 
			if(s_dengji >= 9)
				s_dengji = 9;
		}
		if(key_can == 3)
		{
    
    
			s_dengji --;	  //烟物报警值减1 
			if(s_dengji <= 1)
				s_dengji = 1;
		}
		dis_smg[0] = smg_du[s_dengji % 10];	           //取个位显示
		dis_smg[1] = 0x80 ;  
		dis_smg[2] = 0x80;
		dis_smg[3] = 0xc7;	//显示q
		write_eeprom();			   //保存数据
	}	
}  

/***************主函数*****************/
void main()
{
    
    
	beep = 0;				    //开机蜂鸣器叫一声
	delay_1ms(200);
	P0 = P1 = P2 = P3 = 0xff;   //初始化IO口为高电平
	temperature = read_temp();  //读取温度值
	init_eeprom();  //开始初始化保存的数据
	delay_1ms(650);				
	temperature = read_temp();  //读取温度值
	time_init(); //初始化定时器 		
	while(1)  
	{
    
    
		key();					//独立按键程序
		if(key_can < 10)
		{
    
    
			key_with();			//按键按下要执行的程序
		}
		if(flag_300ms == 1)
		{
    
    		
			flag_300ms = 0;
			clock_h_l();
			temperature = read_temp();  //读取温度值
			dengji = ad0832read(1,0);	
			dengji = dengji * 10 / 250;
			if(menu_1 == 0)
			{
    
    
				if(temperature >= 99)
					temperature = 99;
				dis_smg[3]=smg_du[dengji];	    //显示烟物报警等级
				dis_smg[2]= 0x80;	            // -		
				dis_smg[1]=smg_du[temperature/10%10];	//十位
				dis_smg[0]=smg_du[temperature%10];	    //个位	ADC0832为8位ADC,数值为0~255,我们将其分开放入l_tmpdate数组中显示
			}
		} 
		delay_1ms(1);
	}
}

/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
    
    	
	static uchar value;
	TH0 = 0xf8;
	TL0 = 0x30;     // 2ms
	value ++;	 
	display();	  //数码管显示函数
	if(value % 150 == 0)
	{
    
    
		flag_300ms = 1;	   //300ms
		value = 0;
	}
}

其余完整详见下载!

猜你喜欢

转载自blog.csdn.net/m0_46653805/article/details/131152592