1. 第十四届省赛整体回顾
作为参加过多次蓝桥杯和省赛的老选手,这次第十四届省赛给我留下了深刻印象。比赛采用线下集中形式,在省内某高校实验室进行,从早上8点持续到下午5点,中间只有1小时午餐时间。组委会提供的硬件平台是基于STC15W4K56S4单片机开发板,这块板子集成了LED、数码管、矩阵键盘、EEPROM等常用外设,与往届相比最大的变化是新增了无线通信模块(NRF24L01)和OLED显示屏的考核内容。
比赛题目分为三个部分:客观题(30分)、程序设计题(40分)和综合设计题(30分)。客观题主要考察单片机基础知识,包括定时器配置、中断优先级、串口通信协议等;程序设计题要求实现一个带菜单系统的温度监控程序;综合设计题则结合无线通信和OLED显示,完成一个简易的物联网数据采集系统。
特别提醒:省赛环境使用的Keil uVision5版本是V5.26,与学校实验室常用的V5.14存在一些界面差异,建议提前适应新版开发环境。
2. 客观题高频考点解析
2.1 定时器配置计算
这次省赛的客观题中,定时器相关题目占了8分。其中一道经典题型是:
"已知STC15W4K56S4单片机使用内部22.1184MHz晶振,定时器0工作在模式1(16位自动重装),要求产生50ms定时中断,请计算TH0和TL0的初值。"
解题步骤如下:
- 计算机器周期:T = 12 / 22.1184MHz ≈ 0.5425μs
- 50ms需要的机器周期数:N = 50ms / 0.5425μs ≈ 92160
- 由于16位定时器最大计数值65536,需使用自动重装模式:
c复制#define FOSC 22118400L #define T50MS (65536 - FOSC/12/20) // 20Hz即50ms TH0 = T50MS / 256; TL0 = T50MS % 256;
2.2 中断优先级陷阱
有一道4分的选择题考察中断优先级设置:
"当IP=0x04时,哪个中断源具有最高优先级?"
选项包括:外部中断0、定时器0、串口1、ADC中断。
正确答案是定时器0(IP.2=1),但很多同学误选了串口1。这里的关键是要记住STC15系列的中断优先级寄存器IP的位定义:
- IP.0:PX0(外部中断0)
- IP.1:PT0(定时器0)
- IP.2:PX1(外部中断1)
- IP.3:PT1(定时器1)
- IP.4:PS(串口1)
- IP.5:PT2(定时器2)
3. 程序设计题实战复盘
3.1 温度监控系统架构
程序设计题要求用DS18B20温度传感器和LCD1602实现一个分级报警系统:
- 温度<20℃:蓝色LED慢闪(1Hz)
- 20℃≤温度<30℃:绿色LED常亮
- 30℃≤温度<40℃:黄色LED快闪(5Hz)
- 温度≥40℃:红色LED闪烁+蜂鸣器报警
我的实现方案采用状态机模式,核心代码如下:
c复制enum TEMP_STATE {COLD, NORMAL, WARM, HOT};
enum TEMP_STATE temp_state = NORMAL;
void check_temp(float temp) {
static uint8_t last_state = 0xFF;
if(temp < 20) temp_state = COLD;
else if(temp < 30) temp_state = NORMAL;
else if(temp < 40) temp_state = WARM;
else temp_state = HOT;
if(last_stat
