本例的控制程序未使用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--; } } }
上一篇:proteus7.7+Keil2仿真80C51控制路口信号灯(带左转信号灯)
下一篇:proteus7.7+Keil2仿真80C51控制流水灯
推荐阅读最新更新时间:2024-11-02 10:24
设计资源 培训 开发板 精华推荐
- BeMicro SDK,软件开发套件 SDK 嵌入式系统实验室
- DM080101,防水 2D 触摸表面开发套件
- 使用符合 EN55022 B 类(24Vin 和 48Vin,单输出)具有 EMC 滤波的 RP40-4812SFR DC/DC 转换器的典型应用
- NV890200PDR2GEVB,汽车开关稳压器,2-A,2-MHz 评估板
- TB67B000HG 三相无刷直流电机驱动器评估板
- LTC3736EUF-1、3.3V 至 2.5V 和 1.8V 双路 DC/DC 转换器,具有扩频频率调制
- ESP32-S3开发板
- 使用 Analog Devices 的 LT3470EDDB 的参考设计
- AD8313-EVAL,AD8313 评估板,0.1GHz 至 2.5GHz,70dB 对数检波器/控制器
- DC988A-C,使用 LT3585EDDB-2、400mA I 输入、具有可调输入电流限制和集成 IGBT 驱动器的闪光灯充电器的演示板