基于51单片机的火灾报警器
1.系统功能火灾报警器,主要检测温度和烟雾,再通过单片机控制相应的报警和驱动负载。通过液晶显示当前的烟雾值和温度值,通过按键设定相应的阀值。主要包括以下几项功能:(1)火情探测功能:为了提高火灾报警的准确性和及时性,火灾报警系统需要使用各种方法进行火灾探测。在实际使用中,根据不同的防火场所,用户可以选用温度探测法、可燃气体检测法及烟雾探测法等合适的火灾探测方法,来有效的探测火灾;(2)灯光...
1.系统功能
火灾报警器,主要检测温度和烟雾,再通过单片机控制相应的报警和驱动负载。通过液晶显示当前的烟雾值和温度值,通过按键设定相应的阀值。
主要包括以下几项功能:
(1)火情探测功能:为了提高火灾报警的准确性和及时性,火灾报警系统需要使用各种方法进行火灾探测。在实际使用中,根据不同的防火场所,用户可以选用温度探测法、可燃气体检测法及烟雾探测法等合适的火灾探测方法,来有效的探测火灾;
(2)灯光报警功能:当室内烟雾浓度过大、有火情产生、故障等异常情况发生时,报警器要进行灯光报警。当烟雾超过最大设定值时,可以蜂鸣器报警。
2.系统硬件方案设计
(1)硬件框图
本设计主要由烟雾探测传感器电路、单片机、灯光报警电路、负载驱动电路、控制程序和编解码程序等组成。
系统的组成结构如下:
(2)系统硬件设计
如图所示,上面的图为protel99se所画,下面的图为proteus仿真所画。
实时显示当前的烟雾值和温度值,共有2个报警值(可以通过按键设定),分别是温度的上限和烟雾的上限报警值,当烟雾超过的时候红灯和蜂鸣器声光报警,当温度超过时候黄灯和蜂鸣器声光报警。
(3)烟雾探测电路的设计
如图所示,在这个电路中,有两个部分,主要是烟雾传感器检测烟雾,将电压信号给ADC0809,模数转换电路将模拟信号转换成数字信号给单片机,单片机再读取相应的数值和处理。
3.软件设计
(1)程序流程图
(2)LCD1602驱动程序
//宏定义
#define uint unsigned int
#define uchar unsigned char
//LCD管脚声明 (RW引脚实物直接接地,因为本设计只用到液晶的写操作,RW引脚一直是低电平)
sbit LCDRS = P2^3;
sbit LCDEN= P2^4;
//初始画时显示的内容
uchar code Init1[]=" SET E:000 ";
uchar code Init2[]=" NOW E:000 ";
//LCD延时
void LCDdelay(uint z) //该延时大约100us(不精确,液晶操作的延时不要求很精确)
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
//写命令
void write_com(uchar com)
{
LCDRS=0;
P0=com;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//写数据
void write_data(uchar date)
{
LCDRS=1;
P0=date;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//1602初始化
void Init1602()
{
uchar i=0;
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
write_com(0x06);//当读或写一个字符是指针后一一位
write_com(0x01);//清屏
write_com(0x80);//设置位置
for(i=0;i<16;i++)
{
write_data(Init1[i]); //显示数组1的数据
}
write_com(0x80+0x40);//设置位置
for(i=0;i<16;i++)
{
write_data(Init2[i]); //显示数组2的数据
}
}
void Display_1602(yushe_yanwu,temp)
{
//设置烟雾
write_com(0x80+9);
write_data(0x30+yushe_yanwu/100);
write_data(0x30+yushe_yanwu%100/10);
write_data(0x30+yushe_yanwu%10);
//时时烟雾
write_com(0x80+0x40+9);
write_data(0x30+temp/100);
write_data(0x30+temp%100/10);
write_data(0x30+temp%10);
}
(3)按键处理程序
/*************************按键说明******************************/
/*
1键设置按键
2键加按键
3键减按键
按一下设置键,温度报警值闪烁,此时按下加减按键调节温度报警值;再按一下设置键,烟雾报警值闪烁,此时按下加减按键,调节烟雾报警值;设置完成后,再按一下设置按键,退出设置。系统开始正常检测烟雾温度值,并且根据报警值判断是否开启报警
*/
//按键
sbit Key1=P2^6; //设置键
sbit Key2=P2^7; //加按键
sbit Key3=P3^7; //减按键
void Key()
{
//模式选择
if(Key1==0) //设置按键
{
while(Key1==0);
if(Mode>=2) Mode=0;
else
{
// write_com(0x38);//屏幕初始化
write_com(0x0f);//打开显示 无光标 光标闪烁
// write_com(0x06);//当读或写一个字符是指针后一一位
Mode++; //模式加一
switch(Mode) //判断模式的值
{
case 1:
{
write_com(0x80+7);//为1时 温度阀值的位置闪烁
break; //执行后跳出switch
}
case 2: //当模式加到3时
{
// write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
Mode=0; //模式清零
break;
}
}
}
}
if(Key2==0&&Mode!=0) //加按键只有在模式不等于0时有效
{
while(Key2==0);
yushe_yanwu++; //同温度阀值设置
if(yushe_yanwu>=255)
yushe_yanwu=255;
write_com(0x80+13);
write_data(0x30+yushe_yanwu/100);
write_data(0x30+yushe_yanwu%100/10);
write_data(0x30+yushe_yanwu%10);
write_com(0x80+15);
}
if(Key3==0&&Mode!=0)
{
while(Key3==0);
yushe_yanwu--; //同上
if(yushe_yanwu<=0)
yushe_yanwu=0;
write_com(0x80+13);
write_data(0x30+yushe_yanwu/100);
write_data(0x30+yushe_yanwu%100/10);
write_data(0x30+yushe_yanwu%10);
write_com(0x80+15);
}
}
(4)主程序
/*****主函数*****/
void main()
{
Init1602(); //调用初始化显示函数
while(1) //进入循环
{
temp=ADC0809(); //读取烟雾值
Key(); //调用按键函数 扫描按键
if(Mode==0) //只有当模式为0时才会执行以下的阀值判断部分
{
Display_1602(yushe_yanwu,temp); //显示预设烟雾,烟雾值
if(temp>=yushe_yanwu) //烟雾值大于等于预设值时
{
LED_yanwu=0; //烟雾指示灯亮
baojing=0; //蜂鸣器报警
}
else //烟雾值小于预设值时
{
LED_yanwu=1; //关掉报警灯
}
if(temp<yushe_yanwu) //当烟雾小于预设值并且温度也小于预设值时 (&&:逻辑与,左右两边的表达式都成立(都为真,也就是1)时,该if语句才成立)
{
baojing=1; //停止报警
}
}
}
}
仿真+源码+AD电路图 下载:关注公众号,首页回复“火灾报警器”获取资料
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)