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;
}
}
其余完整详见下载!