交通红绿灯控制设计1、任务1目标描述:设计并实现单片机交通灯控制系统,实现以下三种情况下的交通灯控制。(1)正常情况下双方向轮流通行(绿灯和红灯之间转换间隔5s,黄灯和红灯之间转换间隔2s)(2)特殊情况时,东西方向通行(控制按键接P3.3)(3)紧急情况时,东西方向和南北方向都不通行(控制按键接P3.2)51单片机
时间: 2024-02-24 20:00:34 浏览: 171
下面是一个简单的51单片机交通灯控制程序,可以实现任务1的要求:
```c
#include <reg51.h>
sbit LED_R_N = P1^0; // 南北路口红灯
sbit LED_Y_N = P1^1; // 南北路口黄灯
sbit LED_G_N = P1^2; // 南北路口绿灯
sbit LED_R_E = P1^3; // 东西路口红灯
sbit LED_Y_E = P1^4; // 东西路口黄灯
sbit LED_G_E = P1^5; // 东西路口绿灯
sbit KEY_SPEC = P3^3; // 特殊情况按键
sbit KEY_EMER = P3^2; // 紧急情况按键
unsigned char state = 0; // 状态标志
unsigned char timer_count = 0; // 定时器计数器
unsigned char switch_count = 0; // 翻转间隔计数器
void delay(unsigned int n)
{
unsigned int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 125; j++);
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 定时器0初值
TL0 = 0x18;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 打开总中断开关
while (1)
{
switch (state)
{
case 0: // 正常情况
LED_R_N = 1;
LED_Y_N = 0;
LED_G_N = 0;
LED_R_E = 0;
LED_Y_E = 0;
LED_G_E = 1;
if (switch_count >= 100) // 绿灯5秒
{
state = 1;
switch_count = 0;
}
break;
case 1: // 正常情况
LED_R_N = 1;
LED_Y_N = 1;
LED_G_N = 0;
LED_R_E = 0;
LED_Y_E = 0;
LED_G_E = 1;
if (switch_count >= 40) // 黄灯2秒
{
state = 2;
switch_count = 0;
}
break;
case 2: // 正常情况
LED_R_N = 0;
LED_Y_N = 0;
LED_G_N = 1;
LED_R_E = 1;
LED_Y_E = 0;
LED_G_E = 0;
if (switch_count >= 100) // 绿灯5秒
{
state = 3;
switch_count = 0;
}
break;
case 3: // 正常情况
LED_R_N = 0;
LED_Y_N = 0;
LED_G_N = 1;
LED_R_E = 1;
LED_Y_E = 1;
LED_G_E = 0;
if (switch_count >= 40) // 黄灯2秒
{
state = 0;
switch_count = 0;
}
break;
case 4: // 特殊情况
LED_R_N = 1;
LED_Y_N = 0;
LED_G_N = 0;
LED_R_E = 0;
LED_Y_E = 0;
LED_G_E = 1;
if (KEY_SPEC == 0) // 按键按下,回到正常情况
{
state = 0;
switch_count = 0;
}
break;
case 5: // 紧急情况
LED_R_N = 1;
LED_Y_N = 0;
LED_G_N = 0;
LED_R_E = 1;
LED_Y_E = 0;
LED_G_E = 0;
if (KEY_EMER == 0) // 按键按下,回到正常情况
{
state = 0;
switch_count = 0;
}
break;
}
}
}
void timer0_isr() interrupt 1
{
TH0 = 0xFC; // 定时器0重新赋值
TL0 = 0x18;
timer_count++; // 定时器计数器加1
if (timer_count >= 20) // 定时1秒
{
timer_count = 0;
switch_count++; // 翻转间隔计数器加1
}
if (KEY_SPEC == 1 && KEY_EMER == 1) // 正常情况
state = 0;
else if (KEY_SPEC == 0) // 特殊情况
state = 4;
else if (KEY_EMER == 0) // 紧急情况
state = 5;
}
```
该程序中,使用定时器0控制灯的翻转间隔,同时检测按键状态判断是否需要切换状态。其中,state变量表示当前状态,0-3表示正常情况下南北路口和东西路口的灯的状态,4表示特殊情况下东西路口的灯绿灯常亮,5表示紧急情况下南北路口和东西路口的灯红灯常亮。switch_count变量表示翻转间隔计数器,每翻转一次加1,当计数器达到一定值时切换到下一个状态。
需要注意的是,此程序仅为示例,实际应用需要根据实际情况进行修改和优化。
阅读全文