include <AT89C51.h> #define unchar unsigned char #define uint unsigned int uchar Tem1,Tem2,Smok1,Smok2; uchar Tem=3.6,Smok=4.6; //設(shè)定溫度煙霧報(bào)警閾值 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 (); //第一次采集溫度煙霧信號(hào) Tem2=Tem1;Smok2=Smok1; delay_10ms(5); //延時(shí)50ms,讓ADC0809準(zhǔn)備好第二次數(shù)據(jù)轉(zhuǎn)換 caiji _wenyan(); //第二次采集溫度煙霧信號(hào) panduan(); //將轉(zhuǎn)換的數(shù)據(jù)與設(shè)定的報(bào)警閾值比較 baojing(); //報(bào)警程序 delay_10ms(1500); //系統(tǒng)隔15s對(duì)現(xiàn)場(chǎng)判斷 }; }
void caiji_wenyan() { P0=0XF8; //選通IN-0,轉(zhuǎn)換溫度信號(hào) WR=0; if(EOC=1) {RD=0;Tem1=P0}; //當(dāng)ADC0809轉(zhuǎn)換結(jié)束,AT89C51打開(kāi)AD的三態(tài)門,AD輸出數(shù)據(jù) else RD=1; //否則,AD繼續(xù)轉(zhuǎn)換 delay_10ms(1); P0=0XF9; //選通IN-1,轉(zhuǎn)換煙霧信號(hào) WR=0; if(EOC=1){RD=0;Smok1=P0}; else RD=1; }
void delay_10ms(uint i) //10ms延時(shí)程序 { 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; //當(dāng)采集的溫度高于閾值置1,否則,置0 else a1=0; if(Tem2<Tem) a2=1; else a2=0; if(Smok1<Smok)b1=1; //當(dāng)采集的煙霧濃度高于閾值置1,否則,置0 else b1=0; if(Smok2<Smok) b2=1; else b2=0; }
baojing() { if(a1=a2&&b1=b2) //兩次采集數(shù)據(jù)的標(biāo)志位相同 { a=a1; b=b1; if(a=1&&b=1){P23=0;P10=1;P26=1}; //溫度煙霧標(biāo)志位都是1,發(fā)生火災(zāi) if(a=1&&b=0){P24=0;P10=1;P26=1}; if(a=0&&b=1){P24=0;P10=1;P26=1}; //溫度煙霧標(biāo)志位只有一個(gè)1,異常 if(a=0&&b=0)P26=0; //溫度煙霧標(biāo)志位都為0,正常 }; else{P25=0;P10=1;P26=1} //兩次采集
|