编程技术分享平台

网站首页 > 技术教程 正文

proteus7.7+Keil2仿真80C51控制路口信号灯无绿灯倒计时+绿灯倒计

xnh888 2024-11-03 15:46:02 技术教程 17 ℃ 0 评论

本例的控制程序未使用80C51的(定时器)中断功能, 而是以for循环作为延时函数, 以粗略提供0.5s和1s的时延.


本例的控制逻辑为①南北方向圆饼灯为红灯时, 南北方向车辆停止在停车线内等待. ②南北方向圆饼灯为绿灯时, 南北方向车辆(直行和左转)同时放行. ③东西方向圆饼灯为红灯时, 东西方向车辆停止在停车线内等待. ④东西方向圆饼灯为绿灯时, 东西方向车辆(直行和左转)同时放行. ⑤圆饼灯为黄灯时, 未越过停车线的车辆应停车等待. ⑥南北方向和东西方向的右转车辆在不影响交通秩序的前提下, 可不用看圆饼灯通行.


本例的设计逻辑其实并不复杂. 我先将南北方向的信号控制设计好, 之后相对于南北方向设计东西方向即可. 如果非要说明本例的设计点睛之笔的话, 那么一定是记录南北方向数码管显示数字的变量t (东西方向以南北信号灯颜色和变量t作为依据).

电路原理图:

控制程序源代码(无绿灯倒计时):


#include

#include

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

#include

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--;

}

}

}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表