地下室火灾报警器设计.docx
《地下室火灾报警器设计.docx》由会员分享,可在线阅读,更多相关《地下室火灾报警器设计.docx(22页珍藏版)》请在冰豆网上搜索。
地下室火灾报警器设计
1、绪论
1.1课题描述
地下室常作为人们的杂物间使用,或者充当饭店的酒窖功能,里面经常摆放着很多易燃物品,由于地下室经常潮湿和经常飘散的灰尘会使普通的烟雾报警器误报[1]。
所以设计此种地下室火灾报警器。
1.2方案设计
方案一:
火灾发生的时候会有光亮,会使昏暗的地下室光强出现变化,故采用光敏电阻设计此报警器;
方案二:
火灾发生的时候会产生大量热量,会使阴冷的地下室温度变化,故采用温度传感器设计此报警器;
方案三:
由于火灾发生时产生光和热,同时采用光敏电阻和温度传感器级联设计此报警器。
1.3方案比较:
方案一只采用光敏电阻,电路设计比较简单,但是如果地下室入口没有密封好,或者地下室开有透光窗,外界光强变化时,容易出现报警器误报;
方案二采用温度传感器设计,电路上和方案三相当,但是如果地下室密封性好,地下室的一些容易发酵的酒水或者其他粮食蔬菜之类的发酵产生的大量热量,也会使报警器出现误报;
方案三综合光强变化和温度变化,电路设计上只比方案二多一个光敏传感器,但是却同时具备了光强和温度传感。
如果地下室密封性好,温度升高的时候并没有光照变化,避免误报;如果地下室密封性不好或者开有透光窗,光强变化的时候,发酵产生的热量及时的散出地下室,报警器也不会误报。
只有火灾时候瞬间产生高温不会及时散去,而且有大量光照,报警器才会工作。
综合以上方案,故采用方案三。
1.4基本工作原理及框图
1.4.1工作原理:
温度传感器测温,在lcd1602上实时显示温度。
当温度超过设置的标准温度时,打开外部中断。
如果没有中断,主程序继续检测温度报警开关K1是否打开,如果温度报警开关关闭,则程序返回开始位置继续测温。
如果温度报警开关打开,则出现提示音“地下室温度过高,请及时通风”。
在温度过高时,同时出现了光照,光敏电阻阻值减小,电压拉低,则出现外部中断,提示音“地下室有火情”。
1.4.2程序流程图:
主程序:
中断处理程序:
1.4.3框图:
按键1:
设置报警温度+;
按键2:
设置报警温度-;
按键3:
设置每次加减的大小(1或者5);
按键4:
退出设置;
开关1:
打开/关闭温度报警;
2、相关芯片、传感器及硬件电路设计
2.1STC89C52RC芯片
STC89C52RC是STC公司生产的一款8051内核芯片,内部含有FlashEEPROM,为CMOS产品,内部有8KB的程序存储空间,512B的RAM。
因为本设计应用于火灾报警,因此要选用温度范围-40℃至+85℃的工业级产品。
外部晶振最高可接入40MHz,双列直插式封装。
需要为维持51单片机运行搭建最小系统,硬件连接如图。
2.2DS18B20温度传感器
使用DS18B20单线数字温度传感器具有以下优点:
(1)和微处理器连接时,仅需要一个I/O口就可实现。
单总线具有经济性好、抗干扰能力强、使用方便等优点;
(2)测温范围宽,测量精度高:
DS18B20测温范围为-55℃到+125℃;在-10℃至+85℃范围内,精度为±0.5℃。
(3)测量参数可配置:
DS18B20测量分辨率可通过程序设定9-12位。
(4)DS18B20体积小、适用电压宽。
DS18B20连接如图:
测温电路实图:
2.3LCD1602字符型液晶
LCD1602是一种专门用来显示字母、数字、符号的点阵型液晶模块。
它是由若干个5x7或者5x11的点阵字符位组成,一共可显示2行,每行可显示16个字符,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
LCD1602的电路图如图
液晶连接实物图:
2.4光敏电阻
光敏电阻器是利用半导体的光电导效应制成的一种电阻值随入射光的强弱而改变的一种电阻器,又称为光电导探测器,入射光强,电阻减小,入射光弱,电阻增大。
光敏电阻部分的电路如图:
总电路图如图:
总电路实图:
3、系统软件设计[2]
3.1温度传感器控制程序
3.1.1头文件名“ds18b20.h”
#ifndef_DS18B20_H_
#define_DS18B20_H//定义ds18b20.h
#include
#ifndefuchar
#defineucharunsignedchar
#endif//定义uchar为类型unsignedchar
#ifndefuint
#defineuintunsignedint
#endif//定义uint为类型unsignedint
sbitDSIO=P2^3;//将P2^3命名为DSIO
voidTempDelay1ms();//声明一个延时1ms的函数
voidTempDelay100ms();//声明一个延时100ms的函数
ucharDs18b20Init();//声明DS18B20的初始化函数
voidDs18b20WriteByte(uchardat);//声明一个函数将一个8位的二进制数写入DS18B20
ucharDs18b20ReadByte();//声明一个函数读取DS18B20的一个8位二进制数
voidDs18b20ChangTemp();//声明一个函数写入温度转换命令到DS18B20
voidDs18b20ReadTempCom();//声明一个函数发送读取温度命令到DS18B20
intDs18b20ReadTemp();//声明一个函数读取温度并返回
#endif
3.1.2源文件名“ds18b20.c”
#include"ds18b20.h"
voidTempDelay1ms()
{
uchara,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
voidTempDelay100ms()
{
uchara,b,c;
for(c=19;c>0;c--)
for(b=20;b>0;b--)
for(a=130;a>0;a--);
}
ucharDs18b20Init()
{
uinti;
DSIO=0;//拉低总线
i=70;
while(i--);//延时
DSIO=1;//释放总线
while(DSIO)
{
i++;
if(i>5)
return0;//初始化失败
}
return1;//初始化成功
}
voidDs18b20WriteByte(uchardat)
{
uinti,j;
for(j=0;j<8;j++)
{
DSIO=0;//拉低总线
i++;//延时
DSIO=dat&0x01;//从最低位开始送数据到ds18b20
i=6;
while(i--);//延时
DSIO=1;//释放总线
dat>>=1;//数据移位,准备送下一位
}
}
ucharDs18b20ReadByte()
{
ucharbyte,bi;
uinti,j;
for(j=8;j>0;j--)
{
DSIO=0;//拉低总线
i++;//延时
DSIO=1;//释放总线
i++;
i++;//延时
bi=DSIO;//读ds18b20传到总线的数据,从最低位开始
byte=(byte>>1)|(bi<<7);//移位,准备读取下一位
i=4;
while(i--);//延时
}
returnbyte;//返回读取到的数据
}
voidDs18b20ChangTemp()
{
Ds18b20Init();//初始化
TempDelay1ms();//延时
Ds18b20WriteByte(0xcc);//跳过ROM操作
Ds18b20WriteByte(0x44);//发送温度转换命令
TempDelay100ms();//延时
}
voidDs18b20ReadTempCom()
{
Ds18b20Init();//初始化
TempDelay1ms();//延时
Ds18b20WriteByte(0xcc);//跳过ROM操作
Ds18b20WriteByte(0xbe);//发送读取温度命令
}
intDs18b20ReadTemp()
{
uinttemp=0;
uchartmh,tml;
Ds18b20ChangTemp();//发送温度转换命令
Ds18b20ReadTempCom();//发送读取温度命令
tml=Ds18b20ReadByte();//读取温度(共16位),先读低8位
tmh=Ds18b20ReadByte();//读取温度高8位
temp=tmh;
temp<<=8;
temp|=tml;//将16位温度数据保存到16位变量temp
returntemp;//返回温度值
}
3.2液晶屏控制程序
3.2.1头文件名“lcd1602.h”
#ifndef_LCD1602_H_
#define_LCD1602_H_//定义lcd1602.h
#include
#ifndefuchar
#defineucharunsignedchar//定义uchar为类型unsignedchar
#endif
#ifndefuint
#defineuintunsignedint//定义uint为类型unsignedint
#endif
#defineGPIO_LCDP1//定义GPIO_LCD替换P1,作为lcd1602的输入
sbitRS=P2^0;//声明RS为I/O口P2^0
sbitRW=P2^1;//声明RW为I/O口P2^1
sbitE=P2^2;//声明E为I/O口P2^2
voidLcdDelay5ms();//声明一个延时5ms的函数
voidLcdWriteCom(ucharcom);//声明一个函数给lcd1602写入命令
voidLcdWriteData(uchardat);//声明一个函数给lcd1602写数据
voidLcdInit();//声明一个函数lcd1602初始化
#endif
3.2.2源文件名“lcd1602.c”
#include"lcd1602.h"
voidLcdDelay5ms()
{
uchara,b;
for(b=19;b>0;b--)
for(a=130;a>0;a--);
}
voidLcdWriteCom(ucharcom)
{
RS=0;//操作命令
RW=0;//写操作
E=0;//关闭使能
GPIO_LCD=com;//命令送到P1口
LcdDelay5ms();//延时(大于40ns)
E=1;//开使能
LcdDelay5ms();//延时(大于150ns)
E=0;//写命令结束,关闭使能
}
voidLcdWriteData(uchardat)
{
RS=1;//操作数据
RW=0;//写操作
E=0;//关闭使能
GPIO_LCD=dat;//将数据送到P1口
LcdDelay5ms();//延时(大于40ns)
E=1;//开使能
LcdDelay5ms();//延时(大于150ns)
E=0;//写数据结束,关闭使能
}
voidLcdInit()
{
LcdWriteCom(0x38);//设置显示模式(8位总线,双行显示,5*7点阵字符)
LcdWriteCom(0x0c);//显示开关控制(整屏显示开,不显示光标)
LcdWriteCom(0x06);//设置输入模式,读/写一个字符,地址指针加1,整屏显示不动
LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据存储器地址(第一行第一位)
}
3.3主程序“main.c”
#include
#include"lcd1602.h"
#include"ds18b20.h"
sbitKey1=P2^7;
sbitKey2=P2^6;
sbitKey3=P2^5;
sbitKey4=P2^4;
sbitK1=P3^0;
sbitAlm=P3^1;
sbitLED=P3^6;
sbitBZ=P3^7;
inttemp100;
voidTempDisplay(inttemp)
{
inta;
uchardatas[]={0,0,0,0,0};
floattp;
a=temp;
if(temp<0)
{
LcdWriteCom(0x86);
LcdWriteData('-');
a-=1;
a=~a;
tp=a;
a=tp*0.0625*100+0.5;
}
else
{
LcdWriteCom(0x86);
LcdWriteData('+');
tp=a;
a=tp*0.0625*100+0.5;
}
temp100=a;
datas[0]=a/10000;
datas[1]=a%10000/1000;
datas[2]=a%1000/100;
datas[3]=a%100/10;
datas[4]=a%10;
LcdWriteCom(0x87);
LcdWriteData(datas[0]+'0');
LcdWriteData(datas[1]+'0');
LcdWriteData(datas[2]+'0');
LcdWriteData('.');
LcdWriteData(datas[3]+'0');
LcdWriteData(datas[4]+'0');
}
voidmain()
{
uchari,step,set;
ucharcodest[]="STD:
";
ucharcodewd[]="TEMP:
";
ucharcodesp[]="STEP:
";
ucharsets[]={0,0,0};
inttemp;
Ds18b20Init();
Ds18b20ChangTemp();
LED=0;
BZ=0;
LcdInit();
EA=1;//中断允许
EX0=0;//外部中断0关
set=24;
step=1;
P2|=0xf0;
K1=1;
while(Key4)
{
LcdWriteCom(0xc0);
for(i=0;i<4;i++)
{
LcdWriteData(st[i]);
}//显示字符std
LcdWriteCom(0xc8);
for(i=0;i<5;i++)
{
LcdWriteData(sp[i]);
}//显示字符step
sets[0]=set/100;
sets[1]=set%100/10;
sets[2]=set%10;
LcdWriteCom(0xc4);
for(i=0;i<3;i++)
{
LcdWriteData('_');
}//std的温度闪烁
LcdDelay5ms();
LcdWriteCom(0xc4);
for(i=0;i<3;i++)
{
LcdWriteData(sets[i]+'0');
}//显示std的设定温度
LcdDelay5ms();
LcdDelay5ms();
LcdDelay5ms();
LcdDelay5ms();
LcdDelay5ms();
LcdWriteCom(0xce);
LcdWriteData(step+'0');//显示步长
if(Key1==0)
{
LcdDelay5ms();
if(Key1==0)
{
if(set<100)
set+=step;
else
set=24;
}
while(!
Key1);
}
if(Key2==0)
{
LcdDelay5ms();
if(Key2==0)
{
if(set>24)
set-=step;
else
set=100;
}
while(!
Key2);
}
if(Key3==0)
{
LcdDelay5ms();
if(Key3==0)
{
switch(step)
{
case
(1):
step=5;
break;
case(5):
step=1;
break;
}
}
while(!
Key3);
}
}
while
(1)
{
temp=Ds18b20ReadTemp();
LcdWriteCom(0x80);
for(i=0;i<5;i++)
{
LcdWriteData(wd[i]);
}
LcdWriteCom(0x8e);
LcdWriteData('C');
TempDisplay(temp);
if(temp100>(set*100))
{
IT0=1;//外部中断0电平触发
EX0=1;//外部中断0开
if(K1==1)
{
LED=1;
}
}
else
{
LED=0;
}
}
}
4、总结
此地下室火灾报警器可以对一般明火火情及时反应工作,但是像其他火灾报警器一样,对于阴燃火情发现不及时。
该报警器还可拆开成两个报警器用:
(1)拆成一个报警温度可调节的温度报警器,可以用在养殖场、温室大棚、孵化场等对温度有要求场合;
(2)拆成一个光照报警器,可以用在洗照片的暗室等场合。
5、参考文献
[1]杨帆.离子感烟防火报警器使用注意事项[J].家庭电子.四川:
家庭电子杂志社,2000(12).
[2]郭天祥.51单片机C语言教程[M].北京:
电子工业出版社,2009.