- #include<at89s53.h>
- #include<absacc.h>
- #define uchar unsigned char
- #define CO XBYTE[0x9fff]
- #define yanw XBYTE[0xafff]
- sbit R=P1^0;
- sbit Y=P1^1;
- sbit G=P1^2;
- sbit ring=P1^3;
- bit flag=0; //檢測一氧化碳還是煙霧的標志位,0為一氧化碳;1為煙霧
- uchar result; //AD轉換后的結果
- uchar Cmax=0x20,Ymax=0x30;/*Cmax為一氧化碳的下限值,Ymax為煙霧濃度的上限值,如果超出了這兩個值,則報警器發出
- 報警信號 */
- uchar times=0;
- delay()
- {
- uchar i,j;
- for(i=200;i--;i>0)
- for(j=10;j--;j>0);
- }
- main()
- { P1=0xFF;
- TCON=0X00;
- PCON=0X00;
- TMOD=0X21;
- TH0=0X3C;
- TL0=0XB0;
- TH1=0xe6;
- TL1=0xe6;
- SCON=0X40;
- IE=0X93;
- TR0=1;
- TR1=1;
- while(1)
- {if(flag==0)
- {
-
- if(result>Cmax)
- { R=0;
- Y=1;
- G=0;
- ring=1;
- }
-
- else if(result<=Cmax)
- { R=1;
- Y=0;
- G=0;
- ring=0;
- }
-
- }
-
-
- else if(flag==1)
- {
-
- if(result>Ymax)
- { R=0;
- Y=0;
- G=1;
- ring=1;
- }
- else if(result<=Ymax)
- { R=1;
- Y=0;
- G=0;
- ring=0;
- }
- }
- }
- }
- void tn() interrupt 4
- {
- if(TI==1)
- TI=0;
- }
- /* 綠色燈亮即 P1。0為低電平則正常,
- 紅色燈亮即P1。1為低電平則一氧化碳濃度超出范圍,并蜂鳴器響
- 黃色燈亮即P1。2為低電平則煙霧濃度超出范圍,并蜂鳴器響
- */
- void end0809() interrupt 0
- {
- enable=1;
- _nop_();
- _nop_();
- result=P0;
- enable=0;
- ACC=flag;
- SBUF=ACC;
- delay();
- ACC=result;
- SBUF=ACC;
-
- }
- void t0() interrupt 1
- {
- TH0=0X3C;
- TL0=0XB0;
- if(times==0) times++;
- else
- {
- times=0;
- if(flag==0)
- {
-
- ada=0;
- adb=0;
-
- }
- else
- {
- ada=1;
- adb=0;
- }
- start=0;
- _nop_();
- _nop_();
- _nop_();
- start=1;
- _nop_();
- _nop_();
- start=0;
-
- flag=~flag;
- }
- 2. 上位PC機程序
- #include<stdio.h>
- #include<dos.h>
- #define port 0x03f8
- main()
- {
- unsigned int result,n=0;
- unsigned int flag,i,j,k;
- char ch;
- struct date d;
- struct time t;
- clrscr();
- outportb(port+3,0x80);
- outportb(port,0x60);
- outportb(port+1,0x00);
- outportb(port+3,0x03);
- outportb(port+4,0x03);
- outportb(port+2,0x0f);
- outportb(port+1,0x00);
- printf("\n\n*****type*****chroma(PPM)*******state*********time**************address********");
- for(;;)
- {
- if(n==0)
- {
- while(!(inportb(port+5)&0x20));
- flag=inportb(port);
- n++;
- }
- else
- {
- while(!(inportb(port+5)&0x20));
- result=inportb(port);
- n=0;
- if(flag==0)
- {
- getdate(&d);
- gettime(&t);
- if(result>90)
- {
- printf("\n\n co%11d dangerous%9d.%d.%d--%d:%d:%d 1",result,d.da_year,d.da_mon,d.da_day,t.ti_hour,t.ti_min,t.ti_sec);
- }
- else
- {
- printf("\n\n co%11d natural%13d.%d.%d--%d:%d:%d 1",result,d.da_year,d.da_mon,d.da_day,t.ti_hour,t.ti_min,t.ti_sec);
- }
- }
- else
- {
- getdate(&d);
- gettime(&t);
- if(result>90)
- {
- printf("\n\n flog%11d dangerous%9d.%d.%d--%d:%d:%d 1",result,d.da_year,d.da_mon,d.da_day,t.ti_hour,t.ti_min,t.ti_sec+1);
- }
- else
- {
- printf("\n\n flog%9d natural%10d.%d.%d--%d:%d:%d 1",result,d.da_year,d.da_mon,d.da_day,t.ti_hour,t.ti_min,t.ti_sec+1);
- }
- }
- }
- }
- }
復制代碼
|