void main() { P1=0x21; //刚开始南北的红灯亮,东西的绿灯亮 TMOD=0x01; TH0=(65535-50000)/256; TL0=(65535-50000)%256; //初值 EA=1; //打开总中断 ET0=1; //定时器0允许中断 TR0=1; //定时器0开始计时 EX0=1; //外部中断0允许位 IT0=1; //外部中断0触发方式(下降沿) while(1) { if(flag) { if(!p) { shi1=time1/10; //南北十位 ge1=time1%10; //南北个位 shi2=time2/10; //东西十位 ge2=time2%10; //东西个位 display(ge1,shi1,ge2,shi2); //显示函数 } if(p) dis(); //不显示函数 if(key==3) //夜间模式 { P0=0xff; q=!q; if(q!=0) P1=0x12; else P1=0; delay(200); } } } void ext0() interrupt 0 { flag=1; status=P2; } void timer() interrupt1 //定时中断程序 { TH0=(65535-50000)/256; TL0=(65535-50000)%256; //重新赋初值 temp++; if(temp==20) //说明过去了1秒 { temp=0; //清零,重新加到20 //东西方向南北方向时间自减 time1--; time2--; if(time1>time2) //南北大于东西 { time1=time2+3; P1=0x21; //南北红灯亮起,东西绿灯亮起 if(time2==0&&time1==3) { time2=3; //重新赋南北和东西的差值,与南北方向一起倒计时 P1=0x11; //东西黄灯亮起,东西绿灯关闭 tab=0; //标志位 } } if(time1<time2) //南北小于东西 { time2=time1+3; P1=0x0c; //南北绿灯亮起,东西红灯亮起 if(time1==0&&time2==3) { time1=3; //重新赋南北和东西的差值,与东西方向一起倒计时 P1=0x0a; //南北黄灯亮起,南北绿灯关闭 tab=1; //标志位 } } if(!tab) //黄灯闪烁三秒 { if(time1==2&&time2==2) P1=0x01; if(time1==1&&time2==1) P1=0x11; } if(tab) { if(time1==2&&time2==2) P1=0x08; if(time1==1&&time2==1) P1=0x0a; } if(time1==0&&time2==0&&tab==0) //东西倒计时结束 { time1=t1; time2=t1+3; P1=0x0c; //东西红灯,南北绿灯 } if(time1==0&&time2==0&&tab==1) //南北倒计时结束 { time1=t2+3; time2=t2; P1=0x21; //南北红灯,东西绿灯 } }
}
|