c51实现:东西向绿灯亮若干秒(大于15秒),黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5次后变红灯,东西向变绿灯,如此重复,使用1个按键调节红绿灯紧急情况,如果按下该按键,可通行方向(绿灯状态)立刻进入绿灯倒数10秒状态并黄灯闪烁5次后转为红灯
时间: 2024-04-30 20:21:04 浏览: 234
使用51定时器实现红绿灯控制
以下是基于C51单片机的代码实现,实现了题目所要求的交通信号灯控制和紧急情况调节功能:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key = P3^2; // 紧急情况按键
sbit g_east_west = P2^0; // 东西向绿灯
sbit y_east_west = P2^1; // 东西向黄灯
sbit r_east_west = P2^2; // 东西向红灯
sbit g_north_south = P2^3; // 南北向绿灯
sbit y_north_south = P2^4; // 南北向黄灯
sbit r_north_south = P2^5; // 南北向红灯
void delay(uint t) // 延时函数,单位为10ms
{
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void light_control() // 交通信号灯控制函数
{
while (1) {
g_east_west = 1; // 东西向绿灯亮
delay(20); // 绿灯亮20s以上
y_east_west = 1; // 东西向黄灯闪烁5次
delay(2); // 黄灯亮0.5s
y_east_west = 0; // 黄灯熄灭
delay(2); // 黑灯不亮0.5s
y_east_west = 1; // 黄灯闪烁
delay(2);
y_east_west = 0;
delay(2);
y_east_west = 1;
delay(2);
y_east_west = 0;
delay(2);
y_east_west = 1;
delay(2);
y_east_west = 0;
delay(2);
y_east_west = 1;
delay(2);
y_east_west = 0;
delay(2);
r_east_west = 1; // 东西向红灯亮
delay(2); // 红灯亮0.5s
g_north_south = 1; // 南北向绿灯亮
delay(20); // 绿灯亮20s以上
y_north_south = 1; // 南北向黄灯闪烁5次
delay(2); // 黄灯亮0.5s
y_north_south = 0; // 黄灯熄灭
delay(2); // 黑灯不亮0.5s
y_north_south = 1; // 黄灯闪烁
delay(2);
y_north_south = 0;
delay(2);
y_north_south = 1;
delay(2);
y_north_south = 0;
delay(2);
y_north_south = 1;
delay(2);
y_north_south = 0;
delay(2);
y_north_south = 1;
delay(2);
y_north_south = 0;
delay(2);
r_north_south = 1; // 南北向红灯亮
delay(2); // 红灯亮0.5s
}
}
void emergency() // 紧急情况调节函数
{
uint i;
while (1) {
if (key == 0) { // 检测到按键按下
g_east_west = 1; // 东西向绿灯亮
y_east_west = 0;
r_east_west = 0;
r_north_south = 1; // 南北向红灯亮
g_north_south = 0;
y_north_south = 0;
for (i = 10; i > 0; i--) { // 绿灯倒数10s
delay(1);
}
y_east_west = 1; // 东西向黄灯闪烁5次
for (i = 0; i < 5; i++) {
delay(1);
y_east_west = ~y_east_west;
}
r_east_west = 1; // 东西向红灯亮
g_north_south = 1; // 南北向绿灯亮
y_north_south = 0;
for (i = 20; i > 0; i--) { // 绿灯亮20s以上
delay(1);
}
y_north_south = 1; // 南北向黄灯闪烁5次
for (i = 0; i < 5; i++) {
delay(1);
y_north_south = ~y_north_south;
}
r_north_south = 1; // 南北向红灯亮
}
}
}
void main()
{
key = 1; // 紧急情况按键初始化
g_east_west = 0; // 东西向绿灯初始化
y_east_west = 0; // 东西向黄灯初始化
r_east_west = 1; // 东西向红灯初始化
g_north_south = 1; // 南北向绿灯初始化
y_north_south = 0; // 南北向黄灯初始化
r_north_south = 0; // 南北向红灯初始化
while (1) {
light_control(); // 交通信号灯控制
emergency(); // 紧急情况调节
}
}
```
代码中使用了两个函数,一个是交通信号灯控制函数 light_control(),另一个是紧急情况调节函数 emergency()。在 main() 函数中,先对各个引脚进行初始化,然后循环调用交通信号灯控制函数和紧急情况调节函数。
交通信号灯控制函数的实现中,先让东西向绿灯亮20s以上,然后让东西向黄灯闪烁5次,接着让东西向红灯亮,然后让南北向绿灯亮20s以上,最后让南北向黄灯闪烁5次后,让南北向红灯亮。然后函数会一直循环执行这个过程。
紧急情况调节函数的实现中,先检测到紧急情况按键按下后,让东西向绿灯亮,南北向红灯亮,然后让东西向绿灯倒数10s并且黄灯闪烁5次,最后让东西向红灯亮,南北向绿灯亮20s以上,然后南北向黄灯闪烁5次后,南北向红灯亮。然后函数会一直循环执行这个过程。
代码中使用了 delay() 函数来实现延时,这个函数的单位是10ms,所以在代码中出现的数字都需要乘以10才能得到实际的延时时间。例如 delay(20) 表示延时2s。
阅读全文