本例的控制程序未使用80C51的(定时器)中断功能, 而是以for循环作为延时函数, 以粗略提供0.5s和1s的时延.
本例的控制逻辑为①南北方向圆饼灯为红灯时, 南北方向车辆停止在停车线内等待. ②南北方向圆饼灯为绿灯时, 南北方向车辆(直行和左转)同时放行. ③东西方向圆饼灯为红灯时, 东西方向车辆停止在停车线内等待. ④东西方向圆饼灯为绿灯时, 东西方向车辆(直行和左转)同时放行. ⑤圆饼灯为黄灯时, 未越过停车线的车辆应停车等待. ⑥南北方向和东西方向的右转车辆在不影响交通秩序的前提下, 可不用看圆饼灯通行.
本例的设计逻辑其实并不复杂. 我先将南北方向的信号控制设计好, 之后相对于南北方向设计东西方向即可. 如果非要说明本例的设计点睛之笔的话, 那么一定是记录南北方向数码管显示数字的变量t (东西方向以南北信号灯颜色和变量t作为依据).
电路原理图:
控制程序源代码(无绿灯倒计时):
#include <REG51.H>
#include <math.h>
void delay()//时延1s
{
int i, j;
for(i=0;i<124;i++)
for(j=0;j<1000;j++)
;
}
void main()
{
short int t=0;
P1=0;
P2=0;
P3=0;
while(1)
{
//南北方向绿灯周期
P2=0x14;//南北方向绿灯亮+东西方向红灯亮
t=14;
while(t>=0)
{
P1=t/10*pow(2,4)+t%10;//南北方向数码管设置
P3=(t+3)/10*pow(2,4)+(t+3)%10;//东西方向数码管设置
delay();
t--;
}
//南北方向黄灯周期
P2=0x12;//南北方向黄灯亮+东西方向红灯亮
t=2;
while(t>=0)
{
P1=t/10*pow(2,4)+t%10;//南北方向数码管设置
P3=t/10*pow(2,4)+t%10;//东西方向数码管设置
delay();
t--;
}
//南北方向红灯周期
P2=0x41;//南北方向红灯亮+东西方向绿灯亮
t=16;
while(t>=0)
{
if(t>2)
{
P1=t/10*pow(2,4)+t%10;//南北方向数码管设置
P3=(t-3)/10+pow(2,4)+(t-3)%10;//东西方向数码管设置
}
else//南北方向红灯亮+东西方向黄灯亮
{
P2=0x21;//南北方向红灯亮+东西方向黄灯亮
P1=t/10*pow(2,4)+t%10;//南北方向数码管设置
P3=t/10*pow(2,4)+t%10;//东西方向数码管设置
}
delay();
t--;
}
}
}
控制程序源代码(绿灯倒计时):
#include <REG51.H>
#include <math.h>
void delay()//时延0.5s
{
int i, j;
for(i=0;i<124;i++)
for(j=0;j<500;j++)
;
}
void main()
{
short int t=0;
P1=0;
P2=0;
P3=0;
while(1)
{
//南北方向绿灯周期
P2=0x14;//南北方向绿灯亮+东西方向红灯亮
t=29;
while(t>=0)
{
P1=t/2/10*pow(2,4)+t/2%10;//南北方向数码管设置
P3=(t/2+3)/10*pow(2,4)+(t/2+3)%10;//东西方向数码管设置
if(t<=5)//南北方向绿灯最后3s
{
if(t%2!=0)
{
P2=0x10;//南北方向绿灯灭+东西方向红灯亮
}
else
{
P2=0x14;//南北方向绿灯亮+东西方向红灯灭
}
}
delay();
t--;
}
//南北方向黄灯周期
P2=0x12;//南北方向黄灯亮+东西方向红灯亮
t=5;
while(t>=0)
{
P1=t/2/10*pow(2,4)+t/2%10;//南北方向数码管设置
P3=t/2/10*pow(2,4)+t/2%10;//东西方向数码管设置
delay();
t--;
}
//南北方向红灯周期
P2=0x41;//南北方向红灯亮+东西方向绿灯亮
t=33;
while(t>=0)
{
if(t/2>2)
{
P1=t/2/10*pow(2,4)+t/2%10;//南北方向数码管设置
P3=(t/2-3)/10*pow(2,4)+(t/2-3)%10;//东西方向数码管设置
if(t/2<=5)//东西方向绿灯最后3s
{
if(t%2!=0)
{
P2=0x01;//南北方向红灯亮+东西方向绿灯灭
}
else
{
P2=0x41;//南北方向红灯亮+东西方向绿灯亮
}
}
}
else//南北方向红灯亮+东西方向黄灯亮
{
P2=0x21;//南北方向红灯亮+东西方向黄灯亮
P1=t/2/10*pow(2,4)+t/2%10;//南北方向数码管设置
P3=t/2/10*pow(2,4)+t/2%10;//东西方向数码管设置
}
delay();
t--;
}
}
}