基于Atmega16的交通灯仿真代码问题:同向灯同步控制需求
Atmega16交通灯仿真代码修改(南北/东西同向同步)
首先明确各方向交通灯的引脚与颜色对应关系(结合项目引脚分配及交通灯常规逻辑):
- 北向:PB0(红)、PB1(黄)、PB2(绿)
- 南向:PB7(红)、PB6(黄)、PD0(绿)
- 西向:PD3(红)、PD2(黄)、PD1(绿)
- 东向:PB5(红)、PB4(黄)、PB3(绿)
要实现南北同向同步、东西同向同步的逻辑(如南北绿灯亮时东西红灯亮,依次循环),可以通过清晰的位操作或宏定义设置端口,避免直接写二进制数出错。修改后的代码如下:
/* * Traffic Light Sync Version * Created: 9/22/2023 6:39:24 PM * Author : hp */ #define F_CPU 1000000UL #include<avr/io.h> #include<util/delay.h> // 宏定义各方向灯对应的引脚 #define NORTH_RED PB0 #define NORTH_YELLOW PB1 #define NORTH_GREEN PB2 #define SOUTH_RED PB7 #define SOUTH_YELLOW PB6 #define SOUTH_GREEN PD0 #define WEST_RED PD3 #define WEST_YELLOW PD2 #define WEST_GREEN PD1 #define EAST_RED PB5 #define EAST_YELLOW PB4 #define EAST_GREEN PB3 int main() { DDRB = 0XFF; // 设置B口为输出 DDRD = 0XFF; // 设置D口为输出 while(1) { // 状态1:南北绿灯亮,东西红灯亮(持续4秒) PORTB = (1 << NORTH_GREEN) | (1 << EAST_RED); PORTD = (1 << SOUTH_GREEN) | (1 << WEST_RED); _delay_ms(4000); // 状态2:南北黄灯亮,东西红灯亮(持续1.5秒) PORTB = (1 << NORTH_YELLOW) | (1 << SOUTH_YELLOW) | (1 << EAST_RED); PORTD = (1 << WEST_RED); _delay_ms(1500); // 状态3:南北红灯亮,东西绿灯亮(持续4秒) PORTB = (1 << NORTH_RED) | (1 << SOUTH_RED) | (1 << EAST_GREEN); PORTD = (1 << WEST_GREEN); _delay_ms(4000); // 状态4:南北红灯亮,东西黄灯亮(持续1.5秒) PORTB = (1 << NORTH_RED) | (1 << SOUTH_RED) | (1 << EAST_YELLOW); PORTD = (1 << WEST_YELLOW); _delay_ms(1500); } }
代码说明:
- 用宏定义替代直接操作引脚号,大幅提升代码可读性,也方便后续调整引脚分配。
- 每个状态严格控制同向灯的颜色同步:
- 南北绿灯/黄灯亮时,东西方向保持红灯;
- 东西绿灯/黄灯亮时,南北方向保持红灯;
- 位操作
(1 << 引脚)确保只点亮目标灯,避免误操作其他引脚。
内容的提问来源于stack exchange,提问作者Damir
相关产品推荐
相关产品推荐

