基于单片机的防火防盗报警系统


前言

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

资料获取

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

设计介绍

随着社会和经济的发展,防火工作越来越重要,但是目前国内的许多研发都侧重于大型场所的火灾报警。因此,我们就有必要研制一种结构简单、经济实用的家庭烟雾报警器以适应市场的需求。基于供家庭使用的烟雾报警器应该具备的基本要求和功能,文章设计了一种比较适合的烟雾报警器。
本设计以传感器和单片机作为烟雾报警器设计的核心器件,配合其它器件即可实现声光报警、自动排烟换气和消防灭火等功能。设计中单片机选用STC89C52作为控制器件,传感器选用MQ-2型半导体可燃气体敏感元件烟雾传感器实现烟雾的检测。烟雾报警器主要由烟雾信号采集及前置放大电路、模数转换电路、单片机控制电路、显示电路、声光报警电路和安全保护电路构成,设计合理、简单易懂、价格低廉,使单片机在烟雾报警系统的控制中得到充分应用,具有一定的实用价值。论文主要针对烟雾报警系统中的各个组成部分及功能进行了详细的介绍和说明,并对其主控电路和外围设备电路之间的接口连接方式,以及系统软件设计进行了重点的分析和讲解。
热释电红外传感器,它的制作简单、成本低、安装比较方便,而且防盗性能比较稳定,抗干扰能力强、灵敏度高、安全可靠。这种防盗器安装隐蔽,不易被盗贼发现,便于多用户统一管理。本设计包括硬件和软件设计两个部分。硬件部分包括单片机控制模块、红外探头模块、驱动执行报警模块、LED控制模块等部分组成。处理器采用51系列单片机STC89C52,程序使用C语言编写。

功能介绍

基于单片机的防火防盗报警系统设计方案

本设计实现如下功能:

1.主人进入时有密码控制,有外部闯入时有报警,报警控制点1个门5个窗,都有传感器和热释电红外报警(仿真用变阻器代替)。

2.有5个房间都装有温度和烟雾传感器,达到设定值时报警。

3.密码锁4位密码,密码输入控制时间15s,输入错误或者15s未输入则报警。密码锁用4*4矩阵按键和lcd显示,0-9,取消,确定,设置按键,密码锁可以重新更改密码。

4.单片机用at89c52,温度传感器DS18B20,烟雾MQ-2(仿真变阻器代替)接AD转换ADC0832。

5.有几个独立按键:

(1)设置总开关可以关闭单片机部分功能但不能关闭密码锁的功能。

(2)可以通过按键设定温度和烟雾传感器设定值的高低

设计程序

程序源代码

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

#include <intrins.h>
#include "lcd1602.h"
#include "eeprom52.h"

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

sbit dq   = P2^0;	//18b20 IO口的定义
sbit beep = P3^2;   //蜂鸣器IO口定义
sbit fengshan = P1^4;
uint temperature,s_temp ;  //温度的变量
uchar dengji,s_dengji;     //烟物等级
uchar shoudong;            //手动报警键



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


/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<120;j++);
}


/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
	SectorErase(0x2000);
	byte_write(0x2000, s_temp);
	byte_write(0x2001, s_dengji);
	byte_write(0x2060, a_a);	
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
	s_temp   = byte_read(0x2000);
	s_dengji = byte_read(0x2001);
	a_a      = byte_read(0x2060);
}

/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
	read_eeprom();		//先读
	if(a_a != 1)		//新的单片机初始单片机内问eeprom
	{
		s_temp   = 50;
		s_dengji = 60;
		a_a = 1;
		write_eeprom();
	}	
}

/***********************18b20初始化函数*****************************/
void init_18b20()
{
	bit q;
	dq = 1;				//把总线拿高
	delay_uint(1);	    //15us
	dq = 0;				//给复位脉冲
	delay_uint(80);		//750us
	dq = 1;				//把总线拿高 等待
	delay_uint(10);		//110us
	q = dq;				//读取18b20初始化信号
	delay_uint(20);		//200us
	dq = 1;				//把总线拿高 释放总线
}

/*************写18b20内的数据***************/
void write_18b20(uchar dat)
{
	uchar i;
	for(i=0;i<8;i++)
	{					 //写数据是低位开始
		dq = 0;			 //把总线拿低写时间隙开始 
		dq = dat & 0x01; //向18b20总线写数据了
		delay_uint(5);	 // 60us
		dq = 1;			 //释放总线
		dat >>= 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;		 //返回数据
}

/*************读取温度的值 读出来的是小数***************/
uint read_temp()
{
	uint value;
	uchar low;			   //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
	init_18b20();		   //初始化18b20
	write_18b20(0xcc);	   //跳过64位ROM
	write_18b20(0x44);	   //启动一次温度转换命令
	delay_uint(50);		   //500us

	init_18b20();		   //初始化18b20
	
	write_18b20(0xcc);	   //跳过64位ROM
	write_18b20(0xbe);	   //发出读取暂存器命令
	
	EA = 0;
	low = read_18b20();	   //读温度低字节
	value = read_18b20();  //读温度高字节
	EA = 1;
	value <<= 8;		   //把温度的高位左移8位
	value |= low;		   //把读出的温度低位放到value的低八位中
	value *= 0.0625;	       //转换到温度值 
	return value;		   //返回读出的温度 
}


/***********读数模转换数据********************************************************/	
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
						//  1  0  0 通道
						//  1  1  1 通道 
unsigned char ad0832read(bit SGL,bit ODD)
{
	unsigned char i=0,value=0,value1=0;		
		SCL=0;
		DO=1;
		CS=0;		//开始
		SCL=1;		//第一个上升沿	
		SCL=0;
		DO=SGL;
		SCL=1;  	//第二个上升沿
		SCL=0;
		DO=ODD;
		SCL=1;	    //第三个上升沿
		SCL=0;	    //第三个下降沿
		DO=1;
		for(i=0;i<8;i++)
		{
			SCL=1;
			SCL=0; //开始从第四个下降沿接收数据
			value<<=1;
			if(DO)
				value++;						
		}
		for(i=0;i<8;i++)
		{			//接收校验数据
			value1>>=1;
			if(DO)
				value1+=0x80;
			SCL=1;
			SCL=0;
		}
		CS=1;
		SCL=1;	
		if(value==value1)				//与校验数据比较,正确就返回数据,否则返回0	
			return value;
	return 0;
}



/*************定时器0初始化程序***************/
void time_init()	  
{
	EA   = 1;	 	  //开总中断
	TMOD = 0X01;	  //定时器0、定时器1工作方式1
	ET0  = 1;		  //开定时器0中断 
	TR0  = 1;		  //允许定时器0定时
}


/********************独立按键程序*****************/
uchar key_can;	 //按键值

void key()	 //独立按键程序
{
	static uchar key_new;
	key_can = 20;                   //按键值还原
	P1 |= 0x0f;
	if((P1 & 0x0f) != 0x0f)		//按键按下
	{
		delay_1ms(1);	     	//按键消抖动
		if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
		{						//确认是按键按下
			key_new = 0;
			switch(P1 & 0x0f)
			{
				case 0x0e: key_can = 4; break;	   //得到k1键值
				case 0x0d: key_can = 3; break;	   //得到k2键值
				case 0x0b: key_can = 2; break;	   //得到k3键值
				case 0x07: key_can = 1; break;	   //得到k4键值
			}		
		}			
	}
	else 
		key_new = 1;	
}

/****************按键处理LCD1602液晶显示函数***************/
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)
			init_1602() ;  //初始化显示
	}
	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 ;
		}
		write_sfm2(1,8,s_temp);   //显示温度
		write_sfm2(2,8,s_dengji);		   //显示烟物等级
		write_com(0x80+7);           //将光标移动到第2行第到3位
		write_com(0x0f);                  //显示光标并且闪烁
		write_eeprom();       //保存数据					

	}	
	if(menu_1 == 2)			//设置低温报警
	{
		if(key_can == 2)
		{
			s_dengji ++ ;	  //烟物报警值加1 
			if(s_dengji >= 99)
				s_dengji = 99;
		}
		if(key_can == 3)
		{
			s_dengji --;	  //烟物报警值减1 
			if(s_dengji <= 1)
				s_dengji = 1;
		}
		write_sfm2(1,8,s_temp);   //显示温度
		write_sfm2(2,8,s_dengji);		   //显示烟物等级
		write_com(0x80+0x40+7);           //将光标移动到第2行第到3位
		write_com(0x0f);                  //显示光标并且闪烁
		write_eeprom();       //保存数据					

	}	
}  

/****************报警函数***************/
void clock_h_l()
{
	static uchar value;
	if((dengji >= s_dengji) || (temperature >= s_temp) || (shoudong == 1))		//报警
	{
		value ++;
		if(value >= 2)
		{
			value = 10;
			beep = ~beep;	  //蜂鸣器报警
			fengshan = 0;     //起动风扇
		}
	}else 
	{
		if((dengji < s_dengji) && (temperature < (s_temp)) && (shoudong == 0))	  //取消报警
		{
			value = 0;
			beep = 1;
			fengshan = 1;      //关闭风扇
		}	
	}
}

/***************主函数*****************/
void main()
{
	beep = 0;				    //开机蜂鸣器叫一声
	delay_1ms(200);
	P0 = P1 = P2 = P3 = 0xff;   //初始化IO口
	temperature = read_temp();  //读取温度值
	init_1602();			   //1602液晶初始化
	init_eeprom();      			//读eeprom数据
	time_init();				//初始化定时器 
	delay_1ms(650);				
	while(1)
	{
		key();					//独立按键程序
		if(key_can < 10)
		{
			key_with();			//按键按下要执行的程序
		}
		if(flag_300ms == 1)
		{		
			flag_300ms = 0;
			temperature = read_temp();  //读取温度值
			clock_h_l();
			dengji = ad0832read(1,0);	
			dengji = dengji * 99 / 255;
			if(menu_1 == 0)
			{
				if(temperature >= 99)
					temperature = 99;
				write_sfm2(1,8,temperature);   //显示温度
				write_sfm2(2,8,dengji);		   //显示烟物等级
			}
		} 
	}
}

/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{	
	static uchar value;
	TH0 = 0x3c;
	TL0 = 0xb0;     // 50ms
	value ++;	 
	if(value % 6 == 0)
	{
		flag_300ms = 1;	   //300ms
		value = 0;
	}
}








具体实现截图

在这里插入图片描述

请添加图片描述

请添加图片描述
请添加图片描述

文档目录

目 录
摘 要 7
Abstract 8
1 绪论 9
1.1 课题背景 9
1.2 设计概述 9
1.3 烟雾报警器的国内外现状 10
1.4 烟雾报警器的发展趋势 11
1.5 设计任务分析 11
2 总体方案设计 11
2.1 烟雾检测传感器选型 12
2.2.1 烟雾传感器的介绍 13
2.2.2 MQ-2半导体气体烟雾传感器 13
2.2 单片机选型 14
2.2.1 STC89C52单片机简介 15
2.2.2 单片机的引脚功能描述 15
2.1.3 温度采集模块 17
2.3 红外感应部分 17
2.3.1 电源模块 17
2.3.2 信号采集处理模块 18
3 系统的硬件电路 18
3.1 单片机最小系统 18
3.2 单片机的时钟电路与复位电路设计 19
3.3 烟雾检测AD采集电路 20
3.4 显示模块 21
3.5 声音报警电路 21
3.6 按键控制电路 22
3.7 电源模块 22
3.8 温度传感器(DS18B20)电路 23
3.8.1 DSl8B20简介 23
3.8.2 DSl8B20具体参数及工作方式 25
3.8.3 18B20接口电路 26
4 系统软件的设计 27
5 硬件调试及调试中遇到的问题 27
6 电路的调试 28
7 总结评价 28
致谢 29
参考文献 29
附录一 30
总体原理图设计 30
附录二 30
程序源代码 30

设计获取

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

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

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值