基于51单片机的火灾报警装置
主要元器件 | 数量 |
---|---|
51单片机 | 1 |
火焰传感器 | 1 |
烟雾传感器 | 1 |
DS18B20 | 1 |
LCD12864 | 1 |
蜂鸣器 | 1 |
按键 | 3 |
一、传感器简介
1.1 火焰传感器
火焰传感器能够探测到波长在700纳米~1000纳米范围内的红外光,探测角度为60,其中红外光波长在880纳米附近时,其灵敏度达到最大。远红外火焰探头将外界红外光的强弱变化转化为电流的变化,通过A/D转换器反映为0~255范围内数值的变化。外界红外光越强,数值越小;红外光越弱,数值越大。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号,输入到中央处理器,中央处理器根据信号的变化做出相应的程序处理。
1.2 烟雾传感器
原理:MQ135半导体空气污染气体传感器,所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在污染气体时,传感器的电导率随空气中污染气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。
作用:感知空气中烟雾的浓度,当达到一定浓度时触发警报。
1.3 DS18B20
DS18B20工作原理是低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号发送给计数器1。高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为计数器2的脉冲输入。得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
二、系统硬件设计
2.1 51单片机最小系统
2.2 LCD12864液晶屏显示电路
2.3 声光报警电路
2.4 ad转换电路
三、主要的程序设计
3.1程序流程框图
3.2 LCD12864主界面程序
unsigned char code LcdInit[2][17] ={ " 大厦火灾报警 " ,"环境:无火灾" };
unsigned char tempvalue[]="温度:xxx.xx";
unsigned char timevalue[]="2020.12.25 12:12"; //默认显示时间
/**********************************************************
设置在lcd12864显示屏的某个位置上显示自定义字符
**********************************************************/
void displayStr(int x,int y,unsigned char *str)
{
unsigned char i=0;
lcd_pos(y,x);
while(str[i] != 0)
{
wr_dat(str[i]); //显示字符
i++;
}
}
/**********************************************************
主界面
**********************************************************/
displayStr(0,0,LcdInit[0]);
displayStr(0,1,timevalue);
datapros(Ds18b20ReadTemp()); //读取当前环境的温度
displayStr(0,2,tempvalue);
displayStr(0,3,LcdInit[1]);
3.3 LCD12864报警界面程序
unsigned char code LcdWarning[3][17] ={ " 大厦火灾报警 " , "地点:院办505 " , " 发生火灾!!! "};
unsigned char timevalue[]="2020.12.25 12:12"; //默认显示时间
/**********************************************************
报警界面
**********************************************************/
void lcdwarning()
{
if(lcdwarnning_flag)
{
displayStr(0,0,LcdWarning[0]);
displayStr(0,1,timevalue);
displayStr(0,2,LcdWarning[1]);
displayStr(0,3,LcdWarning[2]);
}
}
3.4 3.4 A/D模数转化程序
/**********************************************************
烟雾传感器A/D转换程序
**********************************************************/
unsigned char MQ_A_D()
{
unsigned char i,dat=0;
DO=1;
CS=1; //一个转换周期开始
CLK=0; //为第一个脉冲作准备
CS=1; //一个转换周期开始
_nop_();
CS=0; //CS置0,片选有效
DI=1; //DIO置1,规定的起始信号
_nop_();
CLK=1; //第一个脉冲
_nop_();
CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
DI=1; //DIO置1, 通道选择信号
_nop_();
CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
_nop_();
CLK=0; //第二个脉冲下降沿
DI=0; //DI置0,选择通道0
_nop_();
CLK=1; //第三个脉冲
_nop_();
CLK=0; //第三个脉冲下降沿
DI=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
CLK=1; //第四个脉冲
_nop_();
CLK=0;
for(i=0;i<8;i++) //高位在前
{
dat<<=1; //将下面储存的低位数据向右移
CLK=1; //第四个脉冲
_nop_();
if(DO)
dat |= 0x01;
else
dat |= 0x00;
CLK=0;
}
CS=1; //片选无效
DO=1;
CLK=1;
return dat; //将读书的数据返回
}
/**********************************************************
火焰传感器A/D转换程序
**********************************************************/
unsigned char Fire_A_D()
{
unsigned char i,dat=0;
DO=1;
CS=1; //一个转换周期开始
CLK=0; //为第一个脉冲作准备
CS=1; //一个转换周期开始
_nop_();
CS=0; //CS置0,片选有效
DI=1; //DIO置1,规定的起始信号
_nop_();
CLK=1; //第一个脉冲
_nop_();
CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
DI=1; //DIO置1, 通道选择信号
_nop_();
CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
_nop_();
CLK=0; //第二个脉冲下降沿
DI=1; //DI置1,选择通道1
_nop_();
CLK=1; //第三个脉冲
_nop_();
CLK=0; //第三个脉冲下降沿
DI=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
CLK=1; //第四个脉冲
_nop_();
CLK=0;
for(i=0;i<8;i++) //高位在前
{
dat<<=1; //将下面储存的低位数据向右移
CLK=1; //第四个脉冲
_nop_();
if(DO)
dat |= 0x01;
else
dat |= 0x00;
CLK=0;
}
CS=1; //片选无效
DO=1;
CLK=1;
return dat; //将读书的数据返回
}
3.6 声光报警、输出控制信号程序
void warning()
{
if(warning_flag)//判断是否开始报警
{
led=~led; //控制led的io口取反,实现led闪烁,闪烁周期由定时器提供
beep=~beep; //控制蜂鸣器的io口取反,提供无源蜂鸣器周期方波信号
led_out=0; //输出控制信号,以led灯来表示输出控制其他消防设备信号
lcdwarnning_flag=1;//显示报警界面
TR1=1; //开启定时器
lcdwarning();
}
else
{
led=1;
beep=1;
led_out=1;
TR1=0;
lcdwarnning_flag=0;
clear();
displayStr(0,0,LcdInit[0]);
displayStr(0,1,timevalue);
datapros(Ds18b20ReadTemp());
displayStr(0,2,tempvalue);
displayStr(0,3,LcdInit[1]);
}
}
3.7 时钟程序
void InitTimer0(void)
{
TMOD |= 0x01;
TH0 = 0x0D8;
TL0 = 0x0F0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void InitTimer1(void)
{
TMOD |= 0x10;
TH1 = 0x0D8;
TL1 = 0x0F0;
EA = 1;
ET1 = 1;
TR1 = 0;
}
/**********************************************************
定时器中断,更新lcd12864界面时钟显示
**********************************************************/
void Timer0Interrupt(void) interrupt 1
{
static unsigned int i=0;
TH0 = 0x0D8;
TL0 = 0x0F0;
//add your code here!
i++;
if(i==100)
{
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
hour++;
}
}
timevalue[11]=hour/10+0x30;
timevalue[12]=hour%10+0x30;
timevalue[14]=min/10+0x30;
timevalue[15]=min%10+0x30;
i=0;
if(sec%5==1)
{
datapros_timer(Ds18b20ReadTemp());
}
updata_flag=1;
}
}