蓝桥杯第十三届省赛(第二次)代码错误总结

蓝桥杯第十三届省赛(第二次)代码错误总结

错误列表

1. :cross_mark: L8停止时未清零导致LED状态异常(84.1分→85分的关键)

错误代码:

// ❌ 只处理了启动状态,停止时不清零!
void Timer1_Isr(void) interrupt 3
{
    uwTick++;
    Seg_Pos = (++Seg_Pos) % 8;
​
    if (Seg_Buf[Seg_Pos] > 20)
        Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos] - ',', 1);
    else
        Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos], 0);
​
    if(Detect_Flag==1)  // 只有启动时的处理
    {
        Time_100ms++;
        if(Time_100ms==100)
        {
            Time_100ms=0;
            Led8_Flag^=1;
        }
    }
    // ❌ 缺少 else 分支清零!
}

错误原因:

题目要求(4.6 LED彩虹功能):

  • “启动连续测量功能时,车道L8以0.1秒为间隔,切换亮灭状态”

  • “停止时,L8熄灭”

Detect_Flag 从 1 变为 0(测距停止)时:

  • Time_100ms 不会被清零,保留上次的值

  • Led8_Flag 不会被清零,可能停留在1(亮)的状态

  • 导致停止后 L8 不熄灭或状态不确定

测评流程示例:
  1. 启动测距 → L8开始闪烁 → Led8_Flag在0和1之间切换
  2. 测距过程中 Led8_Flag 可能为0或1
  3. 停止测距 → Detect_Flag=0
  4. 如果此时 Led8_Flag=1 → L8保持亮!❌
  5. 4T期望:L8应该熄灭 ✓

4T测评失败原因:

停止测距后,L8状态不确定:
- 有50%概率停留在亮的状态 → 扣分 ❌
- 有50%概率停留在灭的状态 → 运气好通过 ✓
因此得分不稳定:84.1分(扣0.9分)

正确代码:

// ✓ 添加 else 分支,停止时清零
void Timer1_Isr(void) interrupt 3
{
    uwTick++;
    Seg_Pos = (++Seg_Pos) % 8;
​
    if (Seg_Buf[Seg_Pos] > 20)
        Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos] - ',', 1);
    else
        Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos], 0);
​
    if(Detect_Flag==1)
    {
        Time_100ms++;
        if(Time_100ms==100)
        {
            Time_100ms=0;
            Led8_Flag^=1;
        }
    }
    else  // ✓ 停止时清零
    {
        Time_100ms=0;
        Led8_Flag=0;  // 确保L8熄灭
    }
}

四份满分代码全部在停止时清零:

满分代码 停止时的处理
lsb if(Measure_Flag==1) {...} // 无else分支,但Led_Proc中用了 ucLed[7]=LED_Star_Flag; 且在AD_DA中未启动时不修改
K if(star_flag) {...} else { led_flag=0; time_count=0; }
emo哥 if(start==0) {...} else ucled &=(~0x80);
凡星点点 if(Start_Distance==1) {...} else { Timer_100ms=0; LED_Star_Flag=0; }

关键点:

  • LED闪烁停止时,必须清零计数器和标志位

  • 否则LED会保持在最后一次的状态(可能是亮或灭)

  • 4T测评会严格检查停止后的LED状态

  • 这个细节决定了84.1分和85分满分的差距!

记忆规则:

LED闪烁的标准模式:
  启动条件满足时:
    ✓ 累加计数器
    ✓ 到达时间后翻转标志位
​
  停止条件满足时:
    ✓ 清零计数器(避免下次启动继承旧值)
    ✓ 清零标志位(确保LED熄灭)
​
模板代码:
  if(启动条件)
  {
      time_count++;
      if(time_count==阈值)
      {
          time_count=0;
          led_flag^=1;
      }
  }
  else  // 必须有!
  {
      time_count=0;
      led_flag=0;
  }

总结

最严重的错误(直接导致扣分):

  1. L8停止时未清零 — 84.1分→85分的关键,必须添加else分支清零计数器和标志位!

学到的经验

1. LED闪烁停止时必须清零

LED闪烁的完整处理:
​
启动时:
  ✓ 累加计数器
  ✓ 到达时间翻转标志位
​
停止时(必须有!):
  ✓ 清零计数器
  ✓ 清零标志位(确保LED熄灭)
​
模板代码:
  if(启动条件)
  {
      time_count++;
      if(time_count==100)
      {
          time_count=0;
          led_flag^=1;
      }
  }
  else  // 绝对不能省略!
  {
      time_count=0;
      led_flag=0;
  }

复盘检查清单

在蓝桥杯单片机比赛中,遇到类似题目时,务必检查:

  • LED闪烁启动时:累加计数器,翻转标志位

  • LED闪烁停止时:清零计数器,清零标志位(关键!)

  • 必须有else分支处理停止状态


生成时间: 2026-02-11
蓝桥杯第十三届省赛(第二题)代码错误总结

1 个赞