目录
摘要
随着现代家庭用火、用电量的增加,家庭火灾发生的频率越来越高。火灾报警器也随之被广泛应用于各种场合。
本课题所研究的GSM模块无线多功能火灾报警器采用51单片机为核心控制器,利用气体传感器MQ-2、ADC0809模数转换器、DS18B20温度传感器、继电器等实现基本功能。通过这些传感器和芯片,当环境中可燃气体浓度或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号,继电器实现负载控制,GSM模块短信提示,以此来实现火灾报警,智能化提示。
一、硬件方案
本设计采用51单片机+LCD1602液晶显示、DS18B20温度传感器、MQ-2烟雾传感器或MQ-5可燃气体传感器、ADC0832模数转换芯片和GSM模块。
系统框图如下:
二、设计功能
1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用)单片机
2.实时显示当前的烟雾值和温度值
3.温度和烟雾的报警值可以通过按键设定
4.当前温度值超过上限时,红灯亮,蜂鸣器响。
5.当前烟雾值超过上限时,黄灯亮,蜂鸣器响。
6.当烟雾或可燃气体浓度超过报警值时启动A继电器,A继电器带动风扇转动模拟排烟。
7. 当温度和烟雾都超过报警值时启动B继电器,B继电器带动水泵,模拟洒水。
8.温度或烟雾超标时GSM模块会发送短信到手机。
三、成品实物图
四、原理图
五、PCB图
六、Proteus仿真
七、程序源码
部分代码:
#include <reg52.h>
#include "xiugai.h" //在这里面改其他不用改了
#include <intrins.h> //包含头文件
#include <display.h> //显示函数
#include "uart.c"
#include "gsm.h"
#define uint unsigned int
#define uchar unsigned char //宏定义
#include "eeprom52.h"
/*******************************定义全局变量********************************/
unsigned char dat = 0x00; //AD值
unsigned char count = 0x00; //定时器计数
unsigned char CH; //通道变量
unsigned char dis[4]; //显示数值
unsigned int sum=0; //平均值计算时的总数
unsigned char m=0;
signed char w; //温度值全局变量
uint c; //温度值全局变量
uchar temp;
uchar yushe_wendu; //报警温度值
uchar yushe_yanwu; //烟雾报警值
uchar flag_fasong[3]; //0是温度1是浓度2是都超标
//按钮模式|
uchar Mode=0;
//函数声明
extern void Key();
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, yushe_wendu);
byte_write(0x2001, yushe_yanwu);
byte_write(0x2002, dianhuahaoma[0]);
byte_write(0x2003, dianhuahaoma[1]);
byte_write(0x2004, dianhuahaoma[2]);
byte_write(0x2005, dianhuahaoma[3]);
byte_write(0x2006, dianhuahaoma[4]);
byte_write(0x2007, dianhuahaoma[5]);
byte_write(0x2008, dianhuahaoma[6]);
byte_write(0x2009, dianhuahaoma[7]);
byte_write(0x200a, dianhuahaoma[8]);
byte_write(0x200b, dianhuahaoma[9]);
byte_write(0x200c, dianhuahaoma[10]);
byte_write(0x2060, a_a);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
yushe_wendu = byte_read(0x2000);
yushe_yanwu = byte_read(0x2001);
dianhuahaoma[0]=byte_read(0x2002);
dianhuahaoma[1]=byte_read(0x2003);
dianhuahaoma[2]=byte_read(0x2004);
dianhuahaoma[3]=byte_read(0x2005);
dianhuahaoma[4]=byte_read(0x2006);
dianhuahaoma[5]=byte_read(0x2007);
dianhuahaoma[6]=byte_read(0x2008);
dianhuahaoma[7]=byte_read(0x2009);
dianhuahaoma[8]=byte_read(0x200a);
dianhuahaoma[9]=byte_read(0x200b);
dianhuahaoma[10]=byte_read(0x200c);
a_a = byte_read(0x2060);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
yushe_wendu = 50;
yushe_yanwu = 45;
dianhuahaoma[0]=0;
dianhuahaoma[1]=0;
dianhuahaoma[2]=0;
dianhuahaoma[3]=0;
dianhuahaoma[4]=0;
dianhuahaoma[5]=0;
dianhuahaoma[6]=0;
dianhuahaoma[7]=0;
dianhuahaoma[8]=0;
dianhuahaoma[9]=0;
dianhuahaoma[10]=0;
a_a = 1;
write_eeprom(); //保存数据
}
}
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 ) //通道选择
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
dat = test;
nop_();
CS = 1; //释放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
资料包括:
需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。