
#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转换结束,ATC51打开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  if(Tem2  if(Smok1  if(Smok2 } 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}  
