You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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. 用宏定义替代直接操作引脚号,大幅提升代码可读性,也方便后续调整引脚分配。
  2. 每个状态严格控制同向灯的颜色同步:
    • 南北绿灯/黄灯亮时,东西方向保持红灯;
    • 东西绿灯/黄灯亮时,南北方向保持红灯;
  3. 位操作(1 << 引脚)确保只点亮目标灯,避免误操作其他引脚。

内容的提问来源于stack exchange,提问作者Damir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:53:18