sbit GetLight=P2^0; //光照输入 sbit GetDis=P3^2; //测距中断
sbit Set40=P3^0;//555超声波发射使能端 //全局变量定义
uchar minutes,seconds,counter; //分、秒、时计数 uchar timeflag=0; //45分钟到标志 uchar time5sflag=0;//光照太弱 uint time=0;//超声波传播的距离 uchar backwaveflag=0;//检测到回波标志 uint distance=0;//计算的距离
uchar countwave=0;//接收到的超声波个数 忽略几个 减少干扰 void main(void) {
//变量定义
uint countlight=0,counttime=0,countdis=0; uint i=0; //端口初始化
Set40=0;//发送超声波禁止 ASoundTime=1; P1=0XFF;//关LED P2=0XFF;//准备输入 Init(); while(1) {
//光照太弱 进行报警 if(GetLight==0) {
countlight++;
if(countlight==15000){ALight=~ALight;countlight=0;}
26
} else {ALight=1;}
}
//45分钟时间到 if(timeflag==1) { }
//1s中到发射测距
for(i=0;i<10;i++)
{ASoundTime=~ASoundTime;ATime=~ATime;delayms(400);} timeflag=0;
if(time5sflag==1 ) { }
if(backwaveflag==1)//检测到回波 { }
time=TH1;
time=(time<<8)|TL1;
distance=(int)((time*170)/1000); if(distance else if(distance>DISBOUND) ADistance=1; backwaveflag=0; SendSound(8); time5sflag=0; 27 } /*********************初始化子程序*************************/ void Init(void) { TMOD=0x11;//定时器0 定时器1 16位定时模式 IT0=1;//INT0下降沿触发中断 TH0=(65536-46075)/256; TL0=(65536-46075)%6; ET0=1; //定时器0中断允许位 TR0=1;//启动定时器0 counter=0;minutes=0;seconds=0; } /**********************发射超声波***************************/ void SendSound(uchar nums) { uint i=0; Set40=0; nums=nums; Set40=1; for(i=0;i ET1=1; //定时器1中断允许位 TR1=1;//启动定时器1 EX0=1; //开启中断0 28 } /********************外部中断0计算距离***********************/ void int0srv(void) interrupt 0 { //distance=SOUNDSPEED*time/1000000/2; countwave++; if(countwave==2) { } /*****************T0计时子程序 计算是否超过45分钟******************/ void timer0() interrupt 1 using 2 //45分钟到则标志位置1报警 { TH0=(65536-46075)/256; TL0=(65536-46075)%6; ET1=0; //定时器1中断允许位 TR1=0;//启动定时器1 EX0=0;//INT0允许中断 backwaveflag=1; countwave=0; } counter++; if(counter==20) { seconds++; // if(seconds==5) {time5sflag=1;} counter=0; if(seconds==60) { 29