#include<reg52.h> #include<intrins.h> #defineuint unsigned int #defineuchar unsigned char
sbitIR=P1^0; //人體紅外信號輸入 sbitLAMP=P2^0; //照明燈控制接口
bitfIR=0; //人體紅外信號標志位
unsignedint times=0; unsignedchar SetSecond=10; unsignedint SetTime=0;
voiddelayms(uint ms) //延時xx毫秒 { uchari; while(ms--) { for(i=0;i<123;i++); } }
voidTimer0() interrupt 1 //定時器0中斷,開啟定時器中斷后,每50ms中斷1次。 { TH0 = (65535-50000)/256; TL0 =(65535-50000)%256; //定時器重新加載初始值 if(fIR==0) //人體紅外信號標志位為0,人體已經離開房間 { if(++times==SetTime) //倒計時時間累計,每次中斷50ms,20次為1秒,200次為10秒 { times = 0; ////倒計時時間累計清0 TR0=0; //停止計時 LAMP=1; //照明燈熄滅 } } }
voidmain(void) //主程序 { P2=0xff;P3=0xff;P1=0xff; SetTime=SetSecond*20; //計算倒計時時間,每次中斷50ms,20次為1秒,200次為10秒 TMOD = 0x01; //設置定時器0模式 TH0 =(65535-50000)/256; TL0 =(65535-50000)%256; //定時器加載初始值 EA=1; //允許中斷觸發 ET0=1; //允許定時器0中斷 TR0=0; //停止定時器0計時 while(1) { if(IR==0) //有人體信號 { delayms(20); //延時,防止誤觸發 if(IR==0) //有人體信號 { fIR=1;TR0=1; //啟動定時器0,設置人體紅外信號標志位為1 LAMP=0; //照明燈點亮 } } else fIR=0; //沒有人體紅外信號,設置人體紅外信號標志位為0 } }
|