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} //兩次采集
|