东北大学2012届毕业设计说明书
判断手动/自动检测 手动 自动 轮流检测某些监测点 开始 初始化 指定某监测点检测 温度烟雾信号采集
报警判断 异常 无异常 报警 是否取消报警 取消报警 结束 图2.3 程序流程图
4.2.1数据采集子程序
对于烟雾信息,根据电路设计可知,MQ-2烟雾传感器电路传回单片机P1口的是高低电频的信号。高电频意味着没有出现异常,低电频意味着烟雾指数出现异常。因此,对烟雾情况的检测实则对P1口相应管脚上高低电频的检测。在读取的同时也实现了判断功能,因此也是把报警功能和取消报警功能跟烟雾数据采集结合于一体的原因。
对于温度信息,由于DS18B20是单总线传输数据的器件,只需根据该器件的单总线特性设计程序。每采集一次温度信息的流程为:
第22页 共37页
东北大学2012届毕业设计说明书
读取温度,跳过ROM命器件复位 器件复位 跳过ROM命令,执行温并转换为所令,设置读模式 度转化命令并等待完成 需的值 温度采集子函数:
unsigned int temperature(unsigned char Q) {
unsigned char temp1,temp2; unsigned int temp; rst18B20(Q);
write18B20(Q,0xcc); write18B20(Q,0x44);
rst18B20(Q);
write18B20(Q,0xcc); write18B20(Q,0xbe);
temp1=read18B20(Q);//低8位 temp2=read18B20(Q);//高8位
temp=temp2; temp<<=8; temp+=temp1;
temp=(unsigned int)(temp*0.625); //保留一位小数 return temp; }
此函数中的参数值的是监测点对应的位置。由于电路连接对应的是单片机的P3口,所以该函数要借助辅助子函数unsigned char getQ(unsigned char i)来将1~8转化为P2口的P2^0~P2^7管脚即:0x01,0x02,0x04,0x10,0x20,0x40,0x80.以支持单总线操作。所以如果要检测第8号监测点,则本函数的调用应该是:tmpT=temperature(getQ(8))。 4.2.2火灾判断/报警子程序
根据任务要求,火灾判断报警子程序要实现两个功能:1.对采集到的温度、烟雾浓度值进行判断,触发报警;2.对取消报警按键的读取,当报警产生时如果被按下,则取消当前的报警,如果再次被按下,则恢复报警功能。 烟雾检测及温度、烟雾报警判断子函数: void checkFun(unsigned char i){ unsigned char temp=0x01; temp<<=(i-1); dense=0xff; delaynms(1);
第23页 共37页
}
东北大学2012届毕业设计说明书
tmpT=temperature(getQ(i)); if((dense&temp)==0){ //check dense while(((cancel%2)==0)&&((dense&temp)==0)){ led=0; buzz=0; seg7(i,2); }
}else if(tmpT>stdT){ //check temperature while(((cancel%2)==0)&&(tmpT>stdT)){ tmpT=temperature(getQ(i)); led=0; buzz=0; seg7(i,2); } } led=1; buzz=1; seg7(0,2);
此函数中的参数则指的是检测点的位置。此函数中包含了温度采集子函 unsigned int temperature(unsigned char Q)和数码管显示子函数。 数码管显示子函数:
void seg7(unsigned char value,unsigned char lock){ if(value%2==1) AA=1; else AA=0; value/=2;
if(value%2==1) BB=1; else BB=0; value/=2;
if(value%2==1) CC=1; else CC=0; value/=2;
if(value%2==1) DD=1; else DD=0; if(lock==1){ //total number lock1=1;
delaynms(20); lock1=0;
delaynms(20); lock2=0;
}else if(lock==2){ //fire number lock2=1;
delaynms(20);
第24页 共37页
东北大学2012届毕业设计说明书
}
}
lock2=0;
delaynms(20); lock1=0;
根据数码管显示部分的电路设计可知,两个数码管的显示只需要控制6个单片机引脚。其中AA、BB、CC、DD引脚连接的是74LS47芯片的输入引脚,单片机控制这四个引脚输出的2进制数经过74LS47译码,控制数码管显示相应的十进制数字。其中lock1,lock2分别连接两个74HC573使能端,当lock1=0,lock2=1时,红色数码管保持当前读数不变,蓝色数码管根据AA、BB、CC、DD的输出信号改变数字,当lock1=1,lock2=0时,蓝色数码管保持当前读数不变,红色数码管根据AA、BB、CC、DD的输出信号改变数字。该程序中包含了毫秒延时函数。
毫秒延时函数:
void delaynms(unsigned int ms) {
unsigned int x,y; for(x=ms;x;x--) for(y=110;y;y--); }
此函数中的参数即延时的时间,单位为毫秒。 4.2.3系统控制子程序
系统控制功能主要有三个:1.指定检测点的位置;2.设置监测点的个数;3.取消/恢复报警功能。
本设计主要通过按键的应用来实现系统控制功能。根据设计的电路可知,10个按键是经过两个8-3编码器连接到单片机的P3^3~P3^7 五个引脚上的,并且两个8-3译码器的GS端还通过一个与门连接到P3^2即外部中断0口,所以系统控制子程序是通过外部中断0实现的。当外部中断0被触发,则开始检测P3^3~P3^7上的电位信息,经过程序分析得出到底是哪个按键被按下,然后执行相应的控制命令。
系统控制子程序:
void keyValue() interrupt 0{ unsigned char temp; EX0=0; EA=0;
temp=P3&0xf8; switch(temp){
case 0x38:keyV= 1;//0011 1000 break;
case 0xf0:keyV= 2;//1111 0000 break;
case 0xe8:keyV= 3;//1110 1000 break;
第25页 共37页
}
东北大学2012届毕业设计说明书
case 0xe0:keyV= 4;//1110 0000 break;
case 0xd8:keyV= 5;//1101 1000 break;
case 0xd0:keyV= 6;//1101 0000 break;
case 0xc8:keyV= 7;//1100 1000 break;
case 0xc0:keyV= 8;//1100 0000 break;
case 0xb8:keyV= 9;//1011 1000 break;
case 0x78:keyV= 10;//0111 1000 break; }
if(keyV>=1&&keyV<=8){ checkNum=keyV;
alter=1; //check the only one }else if(keyV==9){ cancel++;
}else if(keyV==10){ alter++; //calculate the total number the check alternately if(alter>8) alter=1; }
EA=1; EX0=1;
5 总结与展望
5.1 总结
本文设计了一种基于单片机AT89C52的火灾自动报警系统,系统安全可靠,误报率低,操作方便,成本较低。本设计抛弃了传统的使用单一传感器探测报警,采用了温度传感器DS18B20和烟雾传感器MQ-2相结合的多传感器探测方法,使系统灵敏度高、响应时间短,在火灾发生的早期就能准确的报警。在系统的软件设计方面,采用了模块化程序设计方法,系统各个模块的具体功能都是通过子程序调用实现的。既使得程序结构清晰,又便于以后进一步扩展其功能,也便于系
第26页 共37页