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