写基于51单片机的十字路口交通灯程序
时间: 2024-06-12 10:06:30 浏览: 176
本程序基于51单片机,实现了十字路口交通灯的控制,包括了红绿灯的时序控制、黄灯的闪烁控制、人行横道和车辆通行的优先级控制。
程序流程:
1. 初始化各个端口和变量。
2. 车辆通行的优先级控制:
1)当车辆通行方向绿灯亮时,其他方向红灯亮。
2)当车辆通行方向黄灯亮时,其他方向红灯亮,黄灯闪烁。
3)当车辆通行方向红灯亮时,其他方向绿灯亮。
3. 人行横道的优先级控制:
1)当人行横道按钮按下时,所有红灯亮,黄灯闪烁。
2)当人行横道通过时间到达时,红灯继续亮,其他方向绿灯亮。
4. 循环执行以上步骤。
程序代码如下:
```c
#include <reg52.h>
// 定义IO口
sbit W1 = P1^0; // 车辆通行方向红灯
sbit W2 = P1^1; // 车辆通行方向黄灯
sbit W3 = P1^2; // 车辆通行方向绿灯
sbit N1 = P1^3; // 车辆通行方向红灯
sbit N2 = P1^4; // 车辆通行方向黄灯
sbit N3 = P1^5; // 车辆通行方向绿灯
sbit E1 = P1^6; // 车辆通行方向红灯
sbit E2 = P1^7; // 车辆通行方向黄灯
sbit E3 = P2^0; // 车辆通行方向绿灯
sbit S1 = P2^1; // 车辆通行方向红灯
sbit S2 = P2^2; // 车辆通行方向黄灯
sbit S3 = P2^3; // 车辆通行方向绿灯
sbit PW1 = P2^4; // 人行横道按钮
sbit PW2 = P2^5; // 人行横道红灯
sbit PW3 = P2^6; // 人行横道绿灯
// 定义变量
unsigned char count = 0; // 计时器
unsigned char time = 0; // 时间
unsigned char flag = 0; // 标志位,用于判断当前状态
// 函数声明
void delay(unsigned int t);
void car_priority();
void pedestrian_priority();
void yellow_twinkle();
void main()
{
// 初始化
W1 = W2 = W3 = N1 = N2 = N3 = E1 = E2 = E3 = S1 = S2 = S3 = PW1 = 1;
PW2 = PW3 = 0;
while(1)
{
// 车辆通行优先级控制
car_priority();
// 人行横道优先级控制
pedestrian_priority();
}
}
// 延时函数,t为延时时间
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i<t; i++)
{
for(j=0; j<120; j++);
}
}
// 车辆通行优先级控制
void car_priority()
{
if(flag != 1) // 当前状态不是车辆通行时
{
// 车辆通行方向绿灯亮,其他方向红灯亮
W1 = N2 = E1 = S2 = 0;
W3 = N1 = E3 = S1 = 1;
delay(200); // 绿灯时间200s
// 车辆通行方向黄灯亮,其他方向红灯亮,黄灯闪烁
W3 = N1 = E3 = S1 = 1;
yellow_twinkle();
delay(50); // 黄灯时间50s
// 车辆通行方向红灯亮,其他方向绿灯亮
W2 = N2 = E2 = S2 = 0;
W1 = N1 = E1 = S1 = 1;
delay(200); // 红灯时间200s
}
}
// 人行横道优先级控制
void pedestrian_priority()
{
if(PW1 == 0) // 人行横道按钮按下时
{
// 所有红灯亮,黄灯闪烁
W1 = W2 = W3 = N1 = N2 = N3 = E1 = E2 = E3 = S1 = S2 = S3 = 1;
PW2 = 0;
yellow_twinkle();
// 红灯继续亮,其他方向绿灯亮
W1 = N2 = E1 = S2 = 0;
W2 = N1 = E2 = S1 = 1;
PW2 = 1;
delay(10); // 红灯持续时间10s
}
else if(PW2 == 1) // 人行横道通过时间到达时
{
// 红灯继续亮,其他方向绿灯亮
W1 = N2 = E1 = S2 = 0;
W2 = N1 = E2 = S1 = 1;
PW2 = 1;
delay(10); // 红灯持续时间10s
}
}
// 黄灯闪烁
void yellow_twinkle()
{
count = 0;
while(count < 5) // 闪烁5次
{
if(time == 0) // 时间为0时
{
// 黄灯亮
W2 = N2 = E2 = S2 = 0;
delay(50); // 闪烁时间50ms
// 黄灯灭
W2 = N2 = E2 = S2 = 1;
delay(50); // 闪烁时间50ms
count++; // 闪烁次数加1
}
}
}
```
注:以上代码仅为示例,具体实现方法可能因实际情况而异。
阅读全文