蓝桥杯第十三届省赛(第二次)代码错误总结
错误列表
1.
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;
}
总结
最严重的错误(直接导致扣分):
- 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
蓝桥杯第十三届省赛(第二题)代码错误总结