带STM32的交通灯

问题描述 投票:0回答:1

我正在设计一个交通灯控制系统,其描述如下:

  1. 按下按钮1(此按钮先命名:复位),红绿灯系统立即进入控制状态(编程防振按钮),南北方向绿灯亮起,南北方向灯转相反的方向。东方和西方都会明亮
  2. 当开关1打开时,南北方向的黄灯会亮起3秒,倒数到0然后再切换回红灯,而东西方向的红灯会等到南北方向出现红灯,3秒后又回到红灯。返回到 0,然后切换回绿灯。
  3. 当开关1关闭时,东西方向的黄灯会亮起3秒,倒数到0然后再切换回红灯,而南北方向的红灯会等到东西方向的红灯出现,然后再回到红灯,持续3秒。返回到 0,然后切换回绿灯。
  4. 当按下重置按钮时,一切都会从步骤2返回 然而,当我运行代码时,我的 4 个黄灯全部亮起,我无法控制我的灯。请帮助我

我尝试修复我的代码,我已经修复了代码并编写了防振按钮,但这一切都是徒劳的,这是我的代码:

uint8_t direct = HAL_GPIO_ReadPin(direct_GPIO_Port, direct_Pin);
uint8_t rst = HAL_GPIO_ReadPin(rst_GPIO_Port, rst_Pin);
uint8_t i;
uint8_t j;
uint8_t pre_state = GR;
uint8_t next_state;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1){
      if (rst == 1) {
          pre_state = GR;
      } else {
          pre_state = next_state;
      }

      switch (pre_state) {
          case GR:
              if (direct == 0) {
                  next_state = GR;
              } else {
                  next_state = YR;
                  i = 3;
              }
              break;

          case YR:
              if (i != 0) {
                  next_state = YR;
                  i = i - 1;
              } else if  (i == 0){
                  pre_state = RR1;
                  next_state = RR1;
                  j = 3;
              }
              break;

          case RR1:
              if (j != 0) {
                  next_state = RR1;
                  j = j - 1;
              } else if (j == 0){
                  pre_state = RG;
                  next_state = RG;
              }
              break;

          case RG:
              if (direct == 1) {
                  next_state = RG;
              } else {
                  next_state = RY;
                  j = 3;
              }
              break;

          case RY:
              if (j != 0) {
                  next_state = RY;
                  j = j - 1;
              } else if (j == 0){
                  pre_state = RR2;
                  next_state = RR2;
                  i = 3;
              }
              break;

          case RR2:
              if (i != 0) {
                  next_state = RR2;
                  i = i - 1;
              } else if (i == 0){
                  pre_state = GR;
                  next_state = GR;
              }
              break;
      }
      if (pre_state == GR) {
              HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_SET);
              HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_RESET);

              HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET);
              HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_RESET);
          } else if (pre_state == YR) {
              HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_SET);

              HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET);
              HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_RESET);
          } else if (pre_state == RR1) {
              HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET);
              HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_RESET);

              HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET);
              HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_RESET);
          } else if (pre_state == RR2) {
              HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET);
              HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_RESET);

              HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET);
              HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_RESET);
          } else if (pre_state == RG) {
              HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET);
              HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_RESET);

              HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_SET);
              HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_RESET);
          } else {
              HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_SET);

              HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_SET);
          }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
stm32cubeide stm32f1
1个回答
0
投票

由于您只读取

uint8_t direct = HAL_GPIO_ReadPin(direct_GPIO_Port, direct_Pin);
uint8_t rst = HAL_GPIO_ReadPin(rst_GPIO_Port, rst_Pin);
一次,并且在
while(1)
循环之外,您只需将这些引脚的初始状态放入上述变量中。 要解决此问题,请将 while 循环中的
rst
direct
替换为
HAL_GPIO_ReadPin(...)

© www.soinside.com 2019 - 2024. All rights reserved.