第十六届省赛二 —— 默写错误整理
一、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 处 |
高频易错点总结
- 函数指针调用必须加括号:
func;只是取地址,func();才是调用。 - sbit 变量名大小写必须全局统一:定义和使用的大小写必须完全一致。
- sizeof 是关键字,中间没有空格。
- I2CStop / 其他函数调用别忘括号,尤其在末尾容易漏写。
- while 空循环等待必须有分号:
while(条件);不能省略分号。 - 调度器三要素:
last_ms = now(更新时间)+task_func()(调用函数)+ main 里调Scheduler_Run()。