蓝桥杯十六届第二次省赛梳理!超级小的细节吗?小小的也很可爱!!

第十六届省赛二 —— 默写错误整理


一、main.c(底层框架)

# 位置 错误写法 正确写法 错误类型
1 struct 成员顺序 last_ms → rate_ms → task_func task_func → rate_ms → last_ms 逻辑错误
2 struct 成员类型 unsigned int last_ms / unsigned int rate_ms unsigned long int rate_ms / unsigned long int last_ms 逻辑错误(溢出风险)
3 typedef 名字 } time_t; } task_t; 编译报错
4 sizeof 关键字 (size of)(Scheduler_Task) sizeof(Scheduler_Task) 编译报错(中间不能有空格)
5 sizeof 类型参数 (size of)(time_t) sizeof(task_t) 编译报错
6 Scheduler_Run 更新时间 now = Scheduler_Task[i].rate_ms; Scheduler_Task[i].last_ms = now; 逻辑错误(调度完全失效)
7 Scheduler_Run 调用函数 Scheduler_Task[i].task_func; Scheduler_Task[i].task_func(); 逻辑错误(缺括号不调用)
8 Timer1_Init AUXR AUXR |= 0x40;(1T 模式) AUXR &= 0xBF;(12T 模式) 功能错误(定时不准)
9 Timer1_Init 初值 TL1=0x20; TH1=0xD1; TL1=0x18; TH1=0xFC; 功能错误(1ms 时间不准)
10 main() 只调用了 System_Init() 还需调用 Timer1_Init() / Scheduler_Init() / Scheduler_Run() 逻辑错误(程序不运行)

二、init.c

# 位置 错误写法 正确写法 错误类型
11 初始化顺序 先关继电器(0xa0),再关 LED(0x80) 先关 LED(0x80),再关继电器(0xa0) 与参考不一致

三、led.c

# 位置 错误写法 正确写法 错误类型
12 全局变量存储位置 unsigned char temp_1 idata unsigned char temp_1 性能问题(未放内部 RAM)
13 全局变量存储位置 unsigned char temp_1_old idata unsigned char temp_1_old 性能问题

四、iic.c(最多错误)

# 位置 错误写法 正确写法 错误类型
14 引脚定义 SBIT SCL=P2^0; sbit scl=P2^0; 编译报错(SBIT 不存在)
15 引脚定义 sbit SDA=P2^1; sbit sda=P2^1; 编译报错(大写与函数内小写不匹配)
16 Ad_Read 末尾 I2CStop; I2CStop(); 逻辑错误(缺括号未调用,总线不释放)
17 Da_Write 末尾 I2CStop; I2CStop(); 逻辑错误(同上)
18 Da_Write 发数据 I2CSendAck(addr); I2CSendByte(dat); 逻辑错误(函数名和参数都错了)
19 EEPROM_Write 延时 IICDelay(200); / IICDelay(250); I2C_Delay(200); / I2C_Delay(250); 编译报错(函数名拼错)
20 EEPROM_Read 接收 *str++ = I2CSendByte(); *str++ = I2CReceiveByte(); 逻辑错误(发送函数无法接收数据)
21 EEPROM_Read 停止 I2CStop() 在 while 循环内 I2CStop() 在循环外 逻辑错误(每次循环都发停止信号)

五、iic.h

# 位置 错误写法 正确写法 错误类型
22 函数声明 EERROM_Write(3 个 R) EEPROM_Write 编译报错(函数名拼写错误)

六、key.c

# 位置 错误写法 正确写法 错误类型
23 第二行扫描前 缺少串口冲突检测 换行前加 P44=1;P42=1;P35=1; 再检测 if(P30==0)return 0; 逻辑错误(误判按键)
24 第三行扫描前 缺少串口冲突检测 同上 逻辑错误
25 S8+S9 同时按下 if(P32==0&&P33==0) temp=89; 写在单键判断之后 if((P32==0)&&(P33==0)) return 89; 写在单键判断之前 逻辑错误(会被单键结果覆盖)
26 函数末尾 缺少引脚恢复 P44=1;P42=1;P35=1;P3=P3|0xef; 逻辑错误(影响后续扫描)

七、Ultrasound.c

# 位置 错误写法 正确写法 错误类型
27 触发引脚定义 sbit US_TX=P0^0; sbit US_TX=P1^0; 功能错误(接到错误引脚)
28 Ultra_Wave_Data 未调用 Ultra_Wave_Init() CR = 1 之前必须先调用 Ultra_Wave_Init() 逻辑错误(没有触发脉冲就没有回波)
29 while 等待回波 while((US_RX==1)&&(CF==0)) CR=0; while((US_RX==1)&&(CF==0)); 逻辑错误(缺分号导致 CR = 0 成了循环体,计数器立即停止)

错误类型统计

错误类型 数量
编译报错 8 处
逻辑错误(运行异常) 17 处
功能错误(结果不准) 3 处
性能问题(可运行但不规范) 2 处
合计 29 处

高频易错点总结

  1. 函数指针调用必须加括号func; 只是取地址,func(); 才是调用。
  2. sbit 变量名大小写必须全局统一:定义和使用的大小写必须完全一致。
  3. sizeof 是关键字,中间没有空格
  4. I2CStop / 其他函数调用别忘括号,尤其在末尾容易漏写。
  5. while 空循环等待必须有分号while(条件); 不能省略分号。
  6. 调度器三要素last_ms = now(更新时间)+ task_func()(调用函数)+ main 里调 Scheduler_Run()