附件一:总体原理图设计
附件二:部分程序源代码
#include
#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() {
P21=1; P20=0;WR=1;RD=1;
P0=0XFa;P24=1;P23=1;P22=0; //初始化 while(1) //主程序 {
caiji _wenyan (); //第一次采集温度烟雾信号 Tem2=Tem1;Smok2=Smok1;
delay_10ms(5); //延时50ms,让ADC0809准备好第二次数据转换 caiji _wenyan(); //第二次采集温度烟雾信号
panduan(); //将转换的数据与设定的报警阈值比较 baojing(); //报警程序
delay_10ms(2000); //系统隔20s对现场判断 }; }
void caiji_wenyan() {
P0=0XF8; //选通IN-0,转换温度信号 WR=0;
if(EOC=1) {RD=0;Tem1=P0}; //当ADC0809转换结束,80C51打开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) {P22=1;P21=0;P23=1;P24=0;P25=1;}; //温度烟雾标志位都是1,发生火灾
if(a=1&&b=0) {P23=0;P21=0;P22=1;P24=1;P25=1;};
if(a=0&&b=1) {P23=0;P21=0;P22=1;P24=1;P25=1;}; //温度烟雾标志位只有一个1,异常
if(a=0&&b=0) P22=0; //温度烟雾标志位都为0,正常 };
else {P25=0;P23=1;P24=1;} //两次采集的数据标志位不同,系统故障
附件三:实物图