include <AT89C51.h> #define unchar unsigned char #define uint unsigned int uchar Tem1,Tem2,Smok1,Smok2; uchar Tem=3.6,Smok=4.6; //设定温度烟雾报警阈值 uchar a,a1,a2,b,b1,b2; void caiji_wenyan(); void delay_10ms(uint i); //程序声明 void panduan ); void baojing(); void main() { P10=0;P20=0;WR=1;RD=1; P0=0XFa;P23=1;P24=1;P25=1;P26=0; //初始化 while(1) //主程序 { caiji _wenyan (); //第一次采集温度烟雾信号 Tem2=Tem1;Smok2=Smok1; delay_10ms(5); //延时50ms,让ADC0809准备好第二次数据转换 caiji _wenyan(); //第二次采集温度烟雾信号 panduan(); //将转换的数据与设定的报警阈值比较 baojing(); //报警程序 delay_10ms(1500); //系统隔15s对现场判断 }; }
void caiji_wenyan() { P0=0XF8; //选通IN-0,转换温度信号 WR=0; if(EOC=1) {RD=0;Tem1=P0}; //当ADC0809转换结束,AT89C51打开AD的三态门,AD输出数据 else RD=1; //否则,AD继续转换 delay_10ms(1); P0=0XF9; //选通IN-1,转换烟雾信号 WR=0; if(EOC=1){RD=0;Smok1=P0}; else RD=1; }
void delay_10ms(uint i) //10ms延时程序 { while(i--) { uchar i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--); } }
void panduan() { if(Tem1<Tem)a1=1; //当采集的温度高于阈值置1,否则,置0 else a1=0; if(Tem2<Tem) a2=1; else a2=0; if(Smok1<Smok)b1=1; //当采集的烟雾浓度高于阈值置1,否则,置0 else b1=0; if(Smok2<Smok) b2=1; else b2=0; }
baojing() { if(a1=a2&&b1=b2) //两次采集数据的标志位相同 { a=a1; b=b1; if(a=1&&b=1){P23=0;P10=1;P26=1}; //温度烟雾标志位都是1,发生火灾 if(a=1&&b=0){P24=0;P10=1;P26=1}; if(a=0&&b=1){P24=0;P10=1;P26=1}; //温度烟雾标志位只有一个1,异常 if(a=0&&b=0)P26=0; //温度烟雾标志位都为0,正常 }; else{P25=0;P10=1;P26=1} //两次采集
|