拓冰建站拓冰建站
首页 / 资讯中心 / 正文

电赛G题备赛:从51到STM32的单片机稳定方案框架

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题调试时最危险的行为是“感觉不对就改代码”。每次改动前先确认现象从哪一层产生。我习惯的排查链路描述现象是完全没反应、偶发重启、数值乱跳、动作偏差还是只有一个模块不工作。检查输入供电电压是否稳定传感器是否上电信号线是否接对共地是否完成。检查环境下载器是否识别芯片型号是否选对系统时钟是否正常。检查参数定时器分频、自动重装载值、PWM占空比、ADC采样时间、串口波特率是否按预期设置。最后怀疑程序逻辑用串口打印或断点定位到具体函数。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题到底考什么”不如先把自己手里的单片机方案跑通。等题目出来你会发现大部分技术底子其实已经准备好了。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门