单片机十字路口红绿灯代码
时间: 2024-07-16 11:00:40 浏览: 86
在编写单片机控制十字路口红绿灯的代码时,我们通常会使用定时器和状态机的设计来实现交通灯的周期切换。以下是一个基本的示例,这里假设使用的是8051或类似的单片机,如Arduino Uno等:
```c
#include <avr/io.h>
#define LED_RED PB0
#define LED_YELLOW PB1
#define LED_GREEN PB2
void setup() {
DDRB = 0xFF; // 设置PB口为输出
TCCR2A = 0; // 初始化定时器2, 方式2, 分频8, CTC模式
OCR2A = 1000; // 绿灯时间为1s
sei(); // 开启全局中断
}
ISR(TIMER2_COMPA_vect) { // 当定时器2溢出时(计数到OCR2A)
switch (currentPhase) {
case 0: // 红灯
PORTB &= ~LED_RED; // 关闭红灯
currentPhase = 1; // 切换到黄灯
break;
case 1: // 黄灯
PORTB &= ~(LED_RED | LED_YELLOW); // 关闭红灯和黄灯
if (delayUntilYellow > 0) { // 如果还有黄灯延时
delayUntilYellow--;
} else { // 否则切换到绿灯
PORTB |= LED_GREEN; // 开启绿灯
currentPhase = 2;
}
break;
case 2: // 绿灯
PORTB &= ~LED_GREEN; // 关闭绿灯
currentPhase = 3; // 切换到红灯
break;
case 3: // 等待下一个周期开始
currentPhase = 0;
break;
}
}
int main() {
currentPhase = 0; // 初始状态为红灯
delayUntilYellow = 3; // 黄灯延迟时间,一般设置为3秒
sei();
while(1);
return 0;
}
阅读全文