#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 } }
|