#include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char #define key_io P1 uchar key_can; unsigned char tmp; unsigned int k; void delay(unsigned int x) { unsigned int i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } sbit LED1=P0^0;//指示燈0 sbit LED2=P0^1;//指示燈1 sbit LED3=P0^2; //指示燈2 sbit LED4=P0^3; sbit LED5=P0^4; sbit LED6=P0^5; sbit LED7=P0^6; sbit hw=P2^4; sbit beep=P2^3; sbit red=P2^2; sbit green=P2^1; sbit yellow=P2^0; bit flag_300ms=0; sbit fm=P2^5; //定義單片機(jī)P1口的第1位 (即P1.0)為蜂鳴器 sbit qd=P2^6;// 定義單片機(jī)P1口的第2位 驅(qū)動(dòng)風(fēng)扇 sbit DOUT=P2^7; //定義單片機(jī)P2口的第1位 (即P2.0)為傳感器的輸入端 void delay1()//延時(shí)程序 { uchar m,n; for(n=20;n>0;n--) for(m=125;m>0;m--); } void key() { static uchar key_new=0,key_old=0,key_value=0; if(key_new==0) { if((key_io&0x07)==0x07) key_value++; else key_value=0; if(key_value>=5) { key_value=0; key_new=1; } } else { if((key_io&0x07)!=0x07) key_value++; else key_value=0; if(key_value>=5) { key_value=0; key_new=0; } } key_can=20; if((key_new==0)&&key_old==1) { switch(key_io&0x07) { case 0x06:key_can=1;break; case 0x05:key_can=2;break; case 0x03:key_can=3;break; } } key_old=key_new; } void time_init() { EA=1; TMOD=0X01; ET0=1; TR0=1; } uchar flag_alarm; uchar flag_bufang; uchar flag_bufang_en; uchar flag_value; void hongwai_dis() { uint k; if(flag_alarm==1) { red=0; beep=1; } if(flag_bufang_en==1) //準(zhǔn)備開始防御 { green=0; red=1; yellow=1; k=1; } if((k==1)&&(hw==1)) { k=2 ; red=~red; beep=1; } if((k==1)&&(hw==0)) { k=2 ; beep=0; } if((k==2)&&(flag_alarm==1)) { red=~red; beep=~beep; } } void key_with() { if(key_can==1) { flag_alarm=1; } if(key_can==2) { flag_bufang_en=1; } if(key_can==3) { flag_alarm=0; flag_bufang=0; flag_bufang_en=0; flag_value=0; P2=0xf7; } } void time0_int() interrupt 1 { static uint value; TH0=0x3c; TL0=0xb0; //50ms value++; if(value%6==0) { flag_300ms=1; } if(flag_bufang_en==1) { flag_value++; if(flag_value>=600) { flag_bufang=1; flag_bufang_en=0; flag_value=0; } } } void main() { beep=0; time_init(); TMOD=0x20;//定時(shí)器1工作于方式2,8位自動(dòng)重載模式,用于產(chǎn)生波特率 TH1=0xfd; TL1=0xfd; SCON=0X50; PCON=0X00; TR1=1; while(1) { if(RI==1) { RI=0; tmp=SBUF; switch(tmp) { case 1: LED1=0;break; case 2: LED2=0;break; case 3: LED3=0;break; case 4: LED4=0;break; case 5: LED5=0;break; case 6: LED6=0;break; case 7: LED7=0;break; case 8: P0=0x00;break; default : P0=0xff;break; } } if(DOUT==1) { fm=0; qd=0; } else if(DOUT==0) { delay(); //防止誤判 if(DOUT==0) { qd=1; fm=1; delay1();} else { fm=0; qd=0;} } key(); yellow=hw;//紅外熱釋電指示燈,有輸出亮黃燈 if(key_can<10) { key_with(); } if(flag_300ms==1) { flag_300ms=0; hongwai_dis(); //紅外報(bào)警函數(shù) } } }
|