☰
电赛G题备赛:从51到STM32的单片机稳定方案框架
2026/10/17 14:28:30 网站建设 项目流程

2026电赛G题目前谁也说不准具体会考什么,但备赛完全不需要等题目。很多队伍最大的问题是到了现场才把开发板和传感器拼起来,结果测试时间一到,连基础功能都跑不稳。G题的难点通常不是某一个电路原理,而是把单片机、传感器、执行器、电源、显示模块在有限时间里整合成一套能稳定演示的系统。这篇文章我打算给出一套可复用的单片机方案框架:选型、最小系统、定时器、任务调度、调试方法、常见坑和备赛流程。不管G题最终偏向控制、信号测量还是电源管理,这套框架都能直接套用。适合准备电赛G题、平时在用51或STM32做开发、想系统梳理单片机项目的人看。看完你至少能回答一个问题:拿到题目后,技术方案应该怎么拆。

1. 先判断G题可能落在哪里,再定技术路线

1.1 近几年G题并不只有一种形态

电赛G题在不同年份的形态差异很明显。它不是固定的“某个方向专属题号”。我印象里出现过控制类味道很重的题目,也出现过和信号测量、通信传输有关的题目。如果只按“G题=控制题”去准备,比赛时拿到一个信号测量题就容易慌;反过来只准备测量,结果题目里带着小车或舵机,也会措手不及。

所以备赛的核心不是猜题,而是掌握一套能快速适配不同题型的单片机方案。G题不管怎么变,题目基本都包含几个通用模块:主控、电源、传感器、执行器、人机交互、输出结果。区别在于哪个模块是主考,哪个模块只是辅助。

1.2 从题目要求倒推方案

拿到题目之后,不要先想用什么板子,先把所有功能要求列出来,再逐条翻译成单片机资源需求。例如:

  • 题目要求电机、舵机、继电器、MOS管这类执行机构,就需要PWM通道、GPIO或电机驱动电路。
  • 题目要求测电压、电流、温度、距离、转速、光强,就需要ADC、定时器捕获、外部中断或对应传感器。
  • 题目要求显示、按键、声光提示,就需要LCD、数码管、按键输入、蜂鸣器驱动。
  • 题目要求和上位机或另一块板子交互,就需要串口、SPI、IIC或无线模块。

可以画一张简单的资源需求表。每项功能后面写上:需要的单片机外设、需要的硬件模块、重点验证点。做这一步的主要目的是防止到比赛现场才发现某个引脚被占用,或者PWM通道数量不够用。

功能要求对应单片机资源容易忽略的点
电机调速定时器PWM、GPIO驱动板使能脚,不是只要有PWM就行
转速测量外部中断、定时器捕获编码器供电共地
温度采集ADC或单总线传感器供电和分压电阻
按键扫描GPIO输入上拉/下拉和消抖
LCD显示GPIO/SPI/IIC初始化时序和对比度电位器

这张表在比赛第一天就做出来,能省下很多麻烦。不要等到代码写了一半再回头查引脚定义,那时候改一处往往牵动全盘。

2. 单片机选型:51能打,但别硬扛

2.1 51单片机在电赛里的真实上限

初学阶段用51完成电磁炉模拟、温度上下限报警、LCD1602计时器等练习,对理解单片机基本流程很有帮助。很多人都是从51开始准备的,这条路没问题。但选型一定要分场景。

如果G题属于简单控制类,比如几个按键、液晶显示、一个舵机或小电机,51单片机能完成。但要注意,传统8051的主频通常不高,内部没有硬件PWM和硬件乘除法时,软件模拟PWM和一些计算会占用大量CPU。题目如果包含较复杂的测量或闭环控制,51就会明显吃力。

另外,市面上有很多低成本单片机,比如某些小封装型号、老款STC芯片。这类芯片不是不能用,但比赛前必须确认三件事:有没有稳定下载工具、是否支持调试、开发资料是否齐全。一个很偏的型号,就算功能很强,比赛现场一上午没找到正确配置,也白搭。

2.2 更稳妥的选择:STM32 和同级别平台

正式比赛队伍里最常用的是STM32F103这类入门级ARM Cortex-M3。它的定时器资源多,有硬件PWM、输入捕获、编码器模式、多路ADC,价格也不高,学习资料多到不容易翻车。从51过渡到STM32时,重点不是重新学C语言,而是理解时钟树、复用功能、中断优先级这几个新概念。

选型不要追求独树一帜。MSP430在低功耗和混合信号上有优势,树莓派Pico用MicroPython开发很快,但如果队伍里没人真正熟悉它们的下载配置和调试环境,比赛时压力会非常大。方案稳定比功能花哨重要。

平台主频/资源适合场景需要重点确认
STC89C52低,外设少入门、简单控制是否够用、仿真和下载
STC8中,51生态从51过渡资料完整度
STM32F103中高,外设全电赛主流时钟、调试、启动配置
MSP430中,低功耗低功耗测量调试器兼容
树莓派Pico中高,Python方便快速原型实时性和外设是否满足

3. 最小系统和电源设计是整个方案的底盘

3.1 最小系统最常见的三个坑

很多队伍把大量时间花在功能模块上,结果系统上电就重启、下载老失败、程序跑飞,最后才发现是最小系统本身的问题。排查顺序我建议固定为:电压、时钟、复位、下载。

电压不稳会让单片机表现得很诡异。比如驱动电机时单片机会重启,往往是电机大电流把电源拉低,而不是程序逻辑问题。时钟不对会让串口波特率、定时器定时全乱,这时候先看晶振和内部时钟配置。复位电路不标准,有时候能跑有时候不能跑,因为外部干扰把复位脚拉低了。

下载器连不上是另一个常见问题。先确认芯片型号选对,再确认下载器驱动,然后量下载接口的供电和地线。不要一下载失败就怀疑芯片坏了。

3.2 电源模块按功率设计,不按“能亮”设计

G题中电源题频出,但即便不是电源题,整个系统也必须要有多路电源。常见的做法是外部输一路直流电压,经过降压模块分出主控电压、传感器电压、执行机构电压。低压差场景用AMS1117这类线性稳压就可以;电流大又发热的场景,用DC-DC更合适。

电源设计里最容易忽略的几点:

  • 大电流执行机构的地线要和主控地线分开走,再单点汇合。
  • 电源模块输出端要加滤波电容,尤其是给传感器供电时。
  • 电机、继电器、电磁铁这些感性负载,必须加续流二极管或吸收电路,否则反向电动势容易打坏单片机。

网上关于“电赛电源模块”的参考资料很多,可以找几个成熟模块研究,但不要直接照搬体积很大的板子,要结合自己的底板做整合。现场比赛不是做工程样板,能稳定供电才是第一位的。

3.3 GPIO 接口分配要提前画表

一个项目最怕做到一半发现引脚冲突。比赛时应该第一天就把引脚分配表写清楚。我习惯用一张Excel或手写表格,包含引脚编号、连接模块、输入输出方向、电平逻辑、是否复用定时器/ADC/串口。这样焊接、接线、写代码都不会乱。

具体做分配时要注意:

  • 先把特殊功能引脚留好,比如串口下载、外部晶振、ADC参考电压。
  • 把PWM通道和定时器通道对应清楚,不要在代码里随便改。
  • 传感器信号线尽量短,模拟信号线和电机线不要并排走。
  • 预留几个空闲引脚,专门给蜂鸣器、LED指示灯和备用功能。

4. 定时器、PWM、捕获和测速:控制类题目的核心

4.1 定时器不只是延时,它是一套任务时钟

经常有人问“51单片机定时器计数器工作原理”,也有人在STM32里问“当CNT达到ARR会怎样”。这些问题的本质是:你还没有理解定时器是硬件计数器。定时器本质上就是一个持续计数的硬件设备,计数到目标值后产生更新事件,清零或自动重装。这个机制可以用于产生定时中断、PWM波形、测量输入脉宽、测量频率。

如果只是拿定时器做软件延时,等于把硬件外设当成一个简单的等待工具,很浪费。比赛方案里应该把定时器当作整个系统的基准时钟,而不是只在需要延时的时候打开它。

4.2 用定时器实现测速、测脉宽

单片机小车测速是经典练习。常见方式有两种:

  • 固定时间内统计脉冲个数,适合速度较快的场景,简单但低速时误差大。
  • 测量相邻两个脉冲的间隔,适合低速和精确测速,需要输入捕获或外部中断记录时间戳。

在STM32里,输入捕获的原理就是检测到边沿时把当前计数值存下来,下一次边沿再存一次,两次差值乘以时间基准就是周期。这里有个细节:如果计数发生了自动重装,要处理溢出,不然测出来会突然跳一下。经常听人说“捕获时当计数器达到ARR”,严格说是“CNT达到ARR发生溢出”。这个概念搞混了,代码里就会出现莫名其妙的跳变。

测速时不要只看脉冲数,还要看码盘线数或编码器分辨率。比如码盘一圈20个脉冲,定时100ms取样,那么速度计算公式里就要乘上一个系数。这个系数提前在代码里写清楚,不然换了码盘后显示值会偏差很大。

4.3 PWM 控制电机、舵机和 MOS 管

很多题目离不开PWM。51单片机内部没有硬件PWM时,可以在定时器中断里翻转IO口,但中断频率越高,CPU占用越大。所以如果题目里需要多路PWM,或者PWM频率较高,建议直接选带硬件PWM的芯片。

PWM控制MOS管时,要注意栅极驱动电压。有些MOS管需要10V以上才能完全开通,单片机IO口直接输出3.3V或5V,可能只是半开,导致管子发热甚至烧掉。最好用专用的MOS驱动芯片,或者选择逻辑电平MOS。不要以为只要接上线就能工作,先看数据手册的Vgs阈值。

控制电机时,不要一上来就给大占空比。先给一个比较低的占空比测试方向,确认电机和驱动板接线正确后,再逐渐加大。直接全速启动容易让电源瞬间跌落,也会让机械结构受到冲击。如果电机反转,优先检查驱动板方向引脚,而不是改程序里的占空比正负号。

5. 裸机多任务调度:主循环、中断和时间片

5.1 单片机怎么“同时”做多件事

很多人问“单片机如何实现同时运行多个任务调度机制”。答案很简单:单片机并不是真的同时执行多段代码,而是通过中断和时间片快速切换。

最常见的裸机调度模式是时间片轮询。用一个定时器产生固定周期中断,比如1ms。主循环里维护多个计数变量:每10ms扫描一次按键,每20ms刷新LCD,每100ms读取传感器,每1ms执行PID。这样每个任务都有固定的更新频率,代码结构也清楚。

// 伪代码示意,实际参数以你的芯片和需求为准 volatile unsigned int tick_1ms; void SysTick_Handler(void) { tick_1ms++; } void main(void) { init_system(); while (1) { if (tick_1ms % 10 == 0) key_scan(); if (tick_1ms % 20 == 0) lcd_refresh(); if (tick_1ms % 100 == 0) sensor_read(); if (tick_1ms % 1 == 0) pid_update(); } }

这个伪代码只适合说明思路,不能直接当工程代码用。因为取余判断不够精确,而且主循环某个任务耗时过长会阻塞其他任务。更严格的写法是用递增的时间片调度标志,每个任务设置不同的执行周期。比如用多个uint8_t变量计数,达到设定周期就清零并置对应标志位。

5.2 中断里只做最轻量的事

不管用不用操作系统,中断资源都应当遵守一个原则:中断函数尽可能短,中断里只置标志位、记录时间戳、保存数据,真正的处理放到主循环。

比如外部中断检测到一次脉冲时,不要在里面做复杂滤波或计算,只记录当前时间或计数加一。串口接收中断也不要在里面直接解析完整数据帧,先用缓冲区存下字节,主循环再按帧头、帧尾去解析。

这样做的原因是:中断里做耗时任务会延长中断关闭时间,导致其他中断响应不及时,甚至丢脉冲。尤其是在测速和PWM同时工作的场景,丢失一个脉冲都会让数值跳变。

5.3 用状态机管理复杂流程

G题方案到了比赛后期,往往不是只做一件事,而是类似“按键启动—装置移动到指定位置—采集数据—显示结果”这种流程。用状态机能让流程清晰很多。

可以把状态定义为枚举变量,比如:INIT、WAIT_START、RUNNING、FINISH、ERROR。主循环里根据当前状态决定执行什么子程序,每个事件触发状态跳转。这样无论调试哪一段,都能通过打印状态变量快速定位。这比在主程序里写一大串if-else嵌套要可靠。

热搜词里还有“单片机主程序和子程序”,这其实是老教材里的概念。放到现代开发里,就是模块化编程:每个功能一个.c文件,主程序只负责初始化和调度,子程序负责具体动作。比赛代码一定要模块化,不然到第四天发现问题时,找bug会非常痛苦。

6. 人机交互和调试手段

6.1 LCD1602 显示方案

LCD1602是电赛最常见的显示模块之一。很多人用4线模式,省IO。调试时最常遇到的现象是:Proteus仿真正常,实物不显示。这通常不是程序时序问题,而是实物对比度电位器没调好,或者背光和电源引脚没接对。建议先把对比度调节电位器放到板上,别用固定电阻。

LCD初始化时要先等待上电稳定,再按数据手册的初始化时序发送功能设置指令。如果直接照抄某段代码但用的单片机主频不同,最好在每条指令之间加足够延时。

如果用IIC接口的LCD1602,要注意IIC地址,常见是0x27或0x3F。地址不对时屏幕可能完全没有反应,先扫描地址,再怀疑时序。热词里有人专门搜“LCD1602显示器设计 博客”,说明这个模块确实是很多人的第一道坎。

6.2 按键、蜂鸣器和数码管

按键扫描不要忘记上拉或下拉电阻,内部上拉能用但不一定稳定,特别是按键线比较长时。消抖有两种方法:简单的延时消抖适合实验,正式比赛建议用状态机或定时扫描消抖。

蜂鸣器不要直接接在GPIO上,电流不够且反向电动势危险。要用三极管或专用驱动芯片。有的蜂鸣器是有源型,上电就响;有的是无源型,需要PWM信号。这俩接反了,一个响不了,一个乱响。

数码管适合显示数值,但占用IO口也多。如果想省引脚,可以用移位寄存器或IIC转数码管模块。比赛时优先选择自己最熟的方式,不要现场学新模块。

6.3 串口和引脚监控

调试时最有用的工具是串口日志。把printf重定向到串口,程序里打关键变量和状态,能解决大部分问题。但注意printf可能比较占用时间,不要在中断里直接调用。

有人问Keil5怎么监控一个单片机引脚的高低电平。如果使用仿真器在调试模式下,可以在Peripherals窗口找到对应GPIO寄存器,或者使用逻辑分析仪功能,但前提是配置正确。热词里提到“System View是空白的”,这个现象我遇到过,多半是调试配置里没有勾选外设,或者启动文件里没有正确初始化相关配置。实际上,最接地气的做法是:把引脚接一个LED,或者把电平变化通过串口打出来,肉眼判断。

没有逻辑分析仪时,用示波器看PWM波形,用万用表量电平,都是可行的。电赛现场不一定有高级设备,所以代码里一定要有串口日志开关,方便在无显示器环境下排查。

7. 常见报错和现场排查顺序

7.1 从现象开始排查,不要急着改代码

G题调试时,最危险的行为是“感觉不对就改代码”。每次改动前,先确认现象从哪一层产生。

我习惯的排查链路:

  1. 描述现象:是完全没反应、偶发重启、数值乱跳、动作偏差,还是只有一个模块不工作。
  2. 检查输入:供电电压是否稳定,传感器是否上电,信号线是否接对,共地是否完成。
  3. 检查环境:下载器是否识别,芯片型号是否选对,系统时钟是否正常。
  4. 检查参数:定时器分频、自动重装载值、PWM占空比、ADC采样时间、串口波特率是否按预期设置。
  5. 最后怀疑程序逻辑:用串口打印或断点定位到具体函数。

7.2 几个高频现场问题

温度采集数值总是不准:先看传感器型号和电路接法,再看是否做了滤波,最后看ADC的参考电压是否稳定。如果只是软件里加上一个常数修正,治标不治本。

电机或舵机动作不对:手动给一个固定PWM值,确认执行器是否正常。如果手动可以,说明PWM配置或控制算法有问题;如果手动都不动,先查驱动板供电和方向引脚。

LCD不显示:先量LCD电源,再调对比度,然后确认数据线和使能线,最后查初始化时序。不要一上来就怀疑单片机IO口烧了。

系统运行一会儿就死机:大概率是任务调度被阻塞、看门狗没喂、中断冲突、电源跌落或数组越界。先串口打印状态变量,缩小范围。

7.3 比赛现场的快速验证方法

正式测试前,一定要做连续运行测试。比如开机让系统自己跑20分钟,看是否复位、是否漂移、是否卡死。比赛现场最怕问题不是功能没有,而是演示时突然崩溃。

同时准备一套“最小演示流程”:题目评分点对应的功能,必须能用一个按键或一条指令快速进入。不要在现场临时重新编译、重新下载程序。

8. 备赛流程和赛前清单

8.1 分四个阶段备赛

第一个阶段是基础模块,把GPIO、定时器、外部中断、串口、ADC、PWM都过一遍。第二个阶段是做综合小项目,比如温度上下限报警、小车测速、电磁炉功能模拟、追光舵机。这些项目看起来小,但能把传感器、执行器、显示和调度串起来。

第三个阶段是找历年电赛题目练习,不要求完整做出来,重点是2到3小时内输出一个能初步演示的原型。第四个阶段是赛前两周,把常用代码模块整理成自己的库,包括底层驱动、显示、按键、串口打印、常见传感器读取。

8.2 赛前要确认的清单

  • 至少两块主控板、两个下载器、一袋备用杜邦线。
  • 常用电源模块、传感器、执行器各准备一到两套。
  • 代码备份到U盘和网盘。
  • 赛前把关键参数的修改位置注释清楚,比如PWM频率、PID参数、传感器地址。
  • 现场电源输出能力要提前测试,有些题目要求的电机或加热模块启动电流很大,电源不足会让整个系统直接掉电。

8.3 给所有准备G题队伍的建议

我个人更建议先把单任务跑稳,再扩展复杂流程。很多人习惯一开始就把所有功能堆上去,结果出问题时根本不知道是哪一块引入的。电赛G题比的不是谁功能列表更长,而是在有限时间内谁能交付一套稳定、可演示、逻辑清楚的系统。

踩过几次之后我发现,很多问题不是工具能力不够,而是电源、接线、时钟和任务调度没有提前处理好。如果你现在还在纠结“2026电赛G题到底考什么”,不如先把自己手里的单片机方案跑通。等题目出来你会发现,大部分技术底子其实已经准备好了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询