公司动态

电赛G题单片机方案设计与备赛全攻略

📅 2026/9/1 2:54:38
电赛G题单片机方案设计与备赛全攻略
在实际电赛备赛过程中G 题往往属于典型的控制类或仪器仪表类题目。2026 年电赛 G 题的具体任务还没有在赛前公布但这类题目历年都围绕“采集信号、处理数据、控制对象、显示状态”展开。单片机方案的价值不在于赛前押中某道题而在于建立一套可复用的软硬件框架无论现场题目换成加热台、小车、倒立摆还是信号检测模块你都能用同一套单片机系统快速搭出原型。这篇文章从电赛 G 题常见选题方向出发给出完整的单片机方案设计思路。内容包括单片机选型、最小系统硬件设计、程序架构、关键驱动代码、联调方法与常见问题排查。全文以 51 单片机为主线同时说明什么时候必须换用 STM32。适合正在备赛 2026 电赛、对单片机开发有一定基础但不熟悉竞赛节奏的同学参考。1. 先判断 G 题的考查方向再决定单片机选型电赛题目的难点往往不在单片机本身而在传感器选型、控制策略和软硬件联调。G 题如果属于控制类通常会有明确的被控对象和性能指标如果属于仪器仪表类则往往要求测量精度、显示刷新率和操作交互。选单片机之前先分析题目到底考什么。1.1 G 题通常考什么输入、处理、输出三类闭环无论是加热控制、电机调速还是信号检测G 题的任务都可以拆成三部分。输入部分包括按键、编码器、温度传感器、光电传感器、电压采集、电流采集等。处理部分包括闭环控制算法、状态判断、数据换算、报警逻辑、显示刷新。输出部分包括 LCD 显示、LED 指示、蜂鸣器、PWM 驱动、舵机控制、继电器开关、MOS 管功率输出。这三部分形成一个完整闭环。备赛时不需要猜测具体题目而要把每一类输入输出都提前写好驱动模块。到赛场上根据题目需求重新组合这些模块就能节省大量时间。1.2 51 单片机与 STM32 的选型边界很多同学习惯用 51 单片机因为教材多、例程多、上手快。51 在这类比赛中的优势是逻辑简单、寄存器少、电路可靠适合完成按键、显示、温控、PWM 调速等常见任务。缺点也很明显主频低、内存小、外设资源有限复杂控制算法和大量浮点运算会让程序响应变慢。STM32 的优势在于主频高、定时器多、ADC 精度高、有硬件 IIC、SPI、DMA 等资源适合处理编码器测速、语音识别、图像采集、复杂 PID 运算等任务。缺点是初始化配置复杂环境搭建成本高比赛现场出错后排查时间更长。从实际参赛角度可以参考这个判断标准判断条件推荐方案原因任务以按键、显示、温控、简单调速为主51 单片机开发快代码直观硬件稳定需要多路 ADC 同步采集且精度要求高STM32内置 ADC 支持多通道规则组采样需要编码器测速、PWM 闭环、高速计数STM32定时器编码器模式可以节省 CPU 开销题目涉及图像、语音、复杂数据处理STM32 或更高性能 MCU51 的资源不足以支撑完整处理备赛时间充足希望一套代码应对多类题目STM32外设丰富复用性好平时最熟悉 51且现场不允许出大错51 单片机稳定性优先于性能这里有一个建议不要同时准备多块开发板。比赛前一周最忌讳反复切换开发环境。选定一个平台后把所有常用模块都在这套平台上跑通比临时比较哪块芯片更强更有价值。1.3 无论选哪种核心板都要具备这些资源G 题现场搭建时间通常只有四天三夜硬件基础越简单越好。核心板必须具备以下资源稳定的电源入口。至少能接受 5V 和 12V 两种外部供电板上带 3.3V 稳压电路。充足的 IO 引出。显示模块、按键、传感器、PWM 输出、串口这五类外设会占用大部分引脚不能连完显示后没有引脚接编码器。一键复位按键和状态指示灯。调试时最需要的就是快速复位和观察程序是否在运行。串口下载或调试接口。当前多数 51 开发板使用 CH340 串口下载STM32 使用 ST-Link。比赛前要确认电脑驱动正常下载线稳定可靠。可拆卸的晶振或贴片晶振。使用外部晶振时要确认晶振频率与代码中的宏定义一致否则串口波特率和定时器时间都会错。注意芯片本身不能决定成绩能否在规定时间内稳定跑通闭环系统才是关键。核心板越少改动、越接近模块化现场的容错率越高。2. 最小系统与常用模块的硬件设计电赛要求在三到四天内完成从硬件搭建到软件调试。硬件设计越简单越不容易出问题。不要追求把所有功能集成在一块自绘电路板上优先采用“核心板加模块”的方式。2.1 最小系统不能省的部分电源、晶振、复位、下载电路如果现场需要自制单片机最小系统至少包含以下部分电源电路。一般使用 AMS1117-3.3 或 LM2940-5.0 稳压。输入侧加一个极性电容和一个 0.1uF 去耦电容输出侧同样加电容。电源指示灯能帮助快速判断供电是否正常。晶振电路。51 常用 11.0592MHzSTM32 常用 8MHz 外部晶振。晶振旁边两个负载电容取值一般在 20pF 到 30pF具体以数据手册为准。负载电容不匹配会造成时钟偏差最直接的表现就是串口乱码和定时时间不准。复位电路。51 单片机一般用 10uF 电容配合 10k 电阻构成上电复位。STM32 的 NRST 引脚接按键到地即可。下载电路。51 保留串口下载接口STM32 保留 SWD 四线接口。如果在开发板上做比赛不需要重新制作最小系统。但要对开发板的供电方式有清晰认识。例如某些 51 开发板通过 USB 供电板载 5V 和 3.3V 输出电流有限外接多个传感器模块时可能出现电压跌落导致模块工作异常。遇到这种情况应改用外部 5V 电源给传感器单独供电并将单片机和传感器共地。2.2 显示、按键、传感器接口设计要点G 题最常见的显示设备是 LCD1602。它的优点是有 16 根引脚逻辑简单可以直接用 GPIO 并口驱动缺点是占用引脚多刷新速度慢。OLED 屏使用 IIC 或 SPI 接口占引脚少显示内容更灵活但驱动代码相对复杂。建议在备赛时同时准备好两套显示方案一套基于 LCD1602 的基础调试显示一套基于 OLED 的状态监控显示。比赛现场用 LCD1602 做主界面用 OLED 或串口输出内部变量会方便很多。按键设计要注意防抖。硬件上可以在按键两端并联 0.1uF 电容软件上做 10ms 到 20ms 延时消抖。按键数量一般不超过 6 个每个按键需要占用一个独立 GPIO。如果题目要求的按键较多使用矩阵键盘或按键扫描芯片但要提前写通例程。传感器接口方面温度传感器 DS18B20 是单总线协议占用一个 GPIO温度传感器使用 ADC 采集时需要与单片机共地否则电压参考不一致光电编码器和红外对管需要配置上拉电阻否则信号沿不干净。2.3 功率输出模块PWM 调压与 MOS 管驱动G 题中经常出现加热、电机或风扇等功率输出设备。单片机 GPIO 不能直接驱动大电流负载必须经过驱动电路。直流电机和加热丝最常见的驱动方式是 PWM 加 MOS 管。N 沟道 MOS 管适合低端驱动即负载接电源正极MOS 管放在负载和地之间。栅极接单片机 PWM 输出源极接地漏极接负载下端。为了避免 MOS 管栅极悬空导致误导通单片机与栅极之间需要串一个 100 欧姆到 1k 欧姆的电阻。必要时在栅源之间加一个 10k 下拉电阻保证上电瞬间 MOS 管处于关断状态。电感类负载如电机、继电器线圈必须在负载两端反向并联一个续流二极管否则关断瞬间会产生高压反电动势容易击穿 MOS 管或造成单片机复位。使用集成电机驱动芯片如 TB6612、L298N 时要注意逻辑电源电压和电机电源电压要分别接线不能混用。PWM 输出频率也需要根据负载选择。电机调速常用 10kHz 到 20kHz加热控制可以用更低频率如 1Hz 到 100Hz舵机控制频率固定为 50Hz。把 PWM 频率、占空比和定时器重装值之间的关系算清楚能减少现场调试时间。3. 程序架构主循环、定时器中断与状态机电赛单片机程序最怕的是“一个延时函数卡死所有任务”。现场调试时经常出现按下按键无反应、LCD 不刷新、PWM 输出停顿原因往往不是某个外设坏了而是程序结构让 CPU 长时间阻塞在延时或等待函数中。3.1 为什么不能把所有功能都写在主循环里如果把按键检测、显示刷新、传感器读取、PWM 更新全部按顺序放在主循环里当某个函数内部有 while 等待标志位整个程序就会停下来。例如读取 DS18B20 温度时单总线协议要求等待几百微秒执行按键消抖时又要延时 10ms。这些延时叠加起来会导致显示刷新变慢PWM 输出不连续编码器计数丢失。正确的做法是把任务按时间要求拆分。实时性要求高的任务放进定时器中断或捕获中断例如编码器计数、PWM 占空比更新、按键扫描。实时性要求低的任务放在主循环中例如 LCD 显示刷新、状态判断、报警逻辑。51 单片机在 Keil 中常见的简化写法是使用一个全局定时器节拍例如每 1ms 产生一次中断在中断中累加时基变量。主循环根据时基变量调度各任务。3.2 定时器做时间基准避免 delay 阻塞以 51 单片机为例使用定时器 0 产生 1ms 中断。代码结构如下unsigned int sys_tick_1ms 0; void Timer0_Init(void) { TMOD 0xF0; // 定时器0工作在模式116位定时 TMOD | 0x01; TH0 0xFC; // 11.0592MHz下初值约为1ms TL0 0x66; ET0 1; EA 1; TR0 1; } void Timer0_ISR(void) interrupt 1 { TH0 0xFC; TL0 0x66; sys_tick_1ms; }主循环中通过判断时间差值决定是否执行某段代码unsigned int last_key_time 0; void main(void) { Timer0_Init(); while (1) { if (sys_tick_1ms - last_key_time 10) { last_key_time sys_tick_1ms; KeyScan(); } if (sys_tick_1ms % 50 0) { LCD_Refresh(); } } }这种方式的关键在于主循环不能有死等。串口接收数据时也要使用接收中断加缓冲队列不能在主循环中等待串口数据到来。这里有一个容易忽视的细节sys_tick_1ms是 unsigned int 类型当它从 65535 回到 0 时差值判断依然能正常工作因为无符号减法的回绕结果是正确的时间差。但要注意不要把时间比较写成“相等”判断因为主循环可能错过某一拍的相等条件。3.3 状态机处理多步骤任务G 题中很多操作都有明显步骤例如“按设置键进入参数设置按加键增加数值按确认键保存并退出”。这种逻辑非常适合用状态机描述。用枚举定义状态typedef enum { STATE_RUN, STATE_SET_MIN, STATE_SET_MAX, STATE_ALARM } SysState; SysState current_state STATE_RUN;运行状态只处理正常的采集和控制逻辑。进入设置状态后显示当前设定值等待加键、减键和确认键。这样每个状态内部只关心自己的任务代码可读性高也不容易出现全局标志位交叉干扰的问题。状态机的一个好处是便于排查。现场程序跑飞时只要查看当前状态变量就能确定程序停在哪一步。因此建议在调试接口或 LCD 上实时显示当前状态值。3.4 事件调度合适时机把任务交给中断或主循环并不是所有任务都适合放进中断。例如 LCD 写入操作耗时较长放进中断会影响其他高优先级中断的响应。合理的做法是中断中只设置标志位或保存测量值主循环检测到标志后再完成显示或控制。volatile unsigned char event_encoder 0; void Encoder_ISR(void) { event_encoder 1; } void main(void) { while (1) { if (event_encoder) { event_encoder 0; GetEncoderSpeed(); } } }用 volatile 修饰跨中断使用的变量避免编译器优化后读取不到最新值。初始化全局变量时也要在主程序第一次使用前完成赋值不要在中断里依赖未初始化的变量。事件调度做得好51 单片机也能并行处理多任务定时器负责时基外部中断负责编码器计数串口中断负责接收数据主循环负责显示和控制。这比硬要在同一时间执行两个任务更可行。4. 关键驱动代码与参数设计把常用外设驱动写好并验证通过是赛前最重要的工作。下面给出几个 G 题高频模块的驱动思路和关键参数。4.1 LCD1602 显示驱动LCD1602 的数据传输是并行 8 位或 4 位推荐使用 4 位模式以节省引脚。需要初始化时序写入命令和写入数据两个函数。初始化代码中延时时间要严格按照数据手册。sbit RS P2^6; sbit RW P2^5; sbit EN P2^7; #define LCD_DATA P0 void LCD_WriteCmd(unsigned char cmd) { RS 0; RW 0; LCD_DATA cmd; EN 1; delay_us(10); EN 0; delay_ms(1); } void LCD_WriteData(unsigned char dat) { RS 1; RW 0; LCD_DATA dat; EN 1; delay_us(10); EN 0; delay_ms(1); }4 位模式初始化时需要分两次发送高 4 位和低 4 位。很多新手初始化失败是因为第一次写 0x28 前没有先发 0x03 三次进入 4 位模式。建议直接使用开发板自带例程验证不要现场重新推导时序。4.2 按键消抖与长按判断按键消抖不能只是简单延时。在没有操作系统的单片机中推荐用定时器轮询方式做消抖unsigned char key_scan(void) { unsigned char key 0; if (key_pin 0) { delay_ms(10); if (key_pin 0) { key 1; } } return key; }长按判断则要记录按下持续的时间。在定时器中断中每 1ms 扫描一次按键状态按下时累加press_count超过 1000 视为长按否则短按。需要注意按键检测不要放在同一个延时函数中反复调用。否则按键响应时间会受主循环其他耗时函数影响。4.3 PWM 输出与舵机控制51 单片机没有硬件 PWM需要使用定时器中断翻转引脚或使用 PCA 模块。40PIN 的 STC 系列部分型号支持硬件 PWM配置方式各不相同赛前要查清器件手册。舵机控制是典型的 50Hz 方波控制周期 20ms高电平时间 0.5ms 到 2.5ms 对应 0 到 180 度。以 1ms 定时器中断为例可以这样实现unsigned int pwm_count 0; unsigned int pwm_period 200; unsigned int pwm_high 15; void Timer0_ISR(void) interrupt 1 { pwm_count; if (pwm_count pwm_period) { pwm_count 0; SERVO_PIN 1; } if (pwm_count pwm_high) { SERVO_PIN 0; } }修改pwm_high即可改变高电平时间实现角度调节。这个方法在小车转向和云台控制中非常常用。4.4 编码器测速与定时器捕获编码器测速有两种常用方式。第一种是外部中断计数在中断中累计脉冲数每 1 秒计算一次速度volatile unsigned int encoder_count 0; void EX0_ISR(void) interrupt 0 { encoder_count; }第二种是使用定时器的编码器模式适合 STM32。通过TIM_EncoderInterfaceConfig让硬件直接根据编码器相位差方向计数不再占用 CPU 中断资源。G 题如果包含小车直线行驶、角度测量等任务STM32 定时器编码器模式是最稳定的选择。51 单片机没有硬件编码器模式只能用外部中断配合方向引脚判断。判断原理是读取另一相电平当 A 相上升沿到来时如果 B 相为高电平则正转低电平则反转。这个逻辑在代码里是几行但能大大简化现场传感器接线的适配问题。5. 联调、仿真与验证写完成代码后必须在真实硬件上做联调。电赛现场最怕“程序编译通过但硬件没反应”。这通常不是程序的问题而是硬件接线、电平匹配或供电的问题。5.1 用逻辑分析仪或示波器验证波形PWM 和舵机控制是否正确不应该靠感觉判断要用示波器或逻辑分析仪观察波形。重点看三个参数PWM 频率是否正确。计算方法和示波器测量值对比偏差过大说明定时器初值或晶振频率有问题。占空比是否随代码变化。占空比不变时先检查修改占空比的变量是否真的被主循环更新。舵机控制信号周期是否为 20ms。周期不对会导致舵机抖动或直接无响应。没有示波器时可以用 LED 串联限流电阻观察 PWM 亮度变化但只能做粗略判断无法验证精确频率。5.2 利用串口和 LCD 输出调试信息把所有内部变量的实时值通过串口输出是电赛调试最有效的手段。在 PC 端使用串口助手观察数据可以在不改动主程序逻辑的情况下快速排查传感器值是否读取正确。void UART_SendByte(unsigned char dat) { SBUF dat; while (!TI); TI 0; } void Debug_Print(unsigned char *str) { while (*str) { UART_SendByte(*str); } }注意串口波特率与晶振频率的匹配。51 单片机使用 11.0592MHz 晶振时9600 波特率的定时器初值误差很小如果使用 12MHz 晶振波特率会有偏差容易产生乱码。5.3 Keil 调试中 SysView 空白问题处理搜索材料中提到的“8051 单片机在 Keil 仿真时 System View 是空白的”实际是 Keil 调试界面中外设寄存器窗口不显示数据的现象。常见原因是调试接口没有正确配置或选择的目标器件与实际芯片不一致。检查方式如下确认在 Options for Target 中选择了正确的 Device 型号。确认 Debug 选项卡下选择了正确的仿真器类型并勾选 Run to main()。确认程序在运行时确实执行到了断点位置而不是停留在复位后第一条指令。部分国产 51 芯片需要使用厂家提供的头文件和仿真配置直接用标准 8051 型号仿真可能看不到完整外设寄存器。仿真器只能辅助理解程序执行逻辑最终必须以真实硬件测试结果为准。6. 常见问题排查电赛现场的问题往往不复杂但容易被紧张情绪放大。下面汇总几类高发问题及排查路径。问题现象常见原因检查方式处理建议引脚没有输出电平引脚配置错误或代码未执行到该行在关键位置加 LED 翻转测试检查 IO 寄存器对照原理图确认引脚编号逐段单步调试定时器中断不触发中断未使能、初值计算错误、没有启动定时器在中断函数中翻转 LED查看是否闪烁核对 TMOD、TH0、TL0、ET0、EA、TR0 六个配置LCD1602 显示乱码时序延时不足、引脚接错、四线模式初始化错误对比开发板例程确认接线序号降低写入速度增大延时重新初始化PWM 输出频率不对定时器初值根据晶振频率计算错误用示波器测频率先测晶振频率再按公式重算初值按压键无反应按键接的是低电平触发代码却检测高电平万用表测量引脚按下前后的电平变化调整检测逻辑增加内部或外部上拉电阻单片机反复复位电源电流不足MOS 开启瞬间拉低电压示波器观察复位引脚波形测量电源电压跌落加大电源功率给电机使用独立电源并共地程序下载不进去下载电路接触不良GPIO 被占用检查下载器连接断开板载外设再下载项目代码中避免占用下载相关引脚这条链路可以概括为先确认硬件有没有供电再确认引脚电平是否变化最后确认程序执行到了哪一行。不要一上来就怀疑算法和逻辑先排除最基础的硬件问题。提示现场修改程序后不要只重新编译下载还要按新逻辑完整走一遍功能测试。很多“改了没反应”的原因是程序没有成功写入芯片或者写入了旧程序。7. 备赛清单与扩展方向赛前一周的准备工作比现场熬夜更关键。下面这份清单可以直接打印出来在进入赛场前逐项核对。7.1 赛前软硬件检查清单单片机最小系统和下载器驱动确认可用。LCD1602 或 OLED 显示模块例程在核心板上跑通。按键扫描、消抖、长短按功能已测试。至少一个定时器中断例程验证通过时间为 1ms 或 10ms。PWM 输出例程在示波器上确认频率和占空比可调。舵机控制例程验证 0 到 180 度可调。编码器或光电测速模块计数准确方向判断正确。DS18B20 温度读取例程已跑通温度值与实际温度一致。串口调试输出正常备用串口助手软件已测试。电源模块能稳定输出 5V能驱动比赛所需功率负载。准备常用备用件按键、排针、杜邦线、电阻、电容、MOS 管、蜂鸣器、传感器模块。工程代码做好备份分别保存改动前和改动后的版本。这份清单的核心原则是“比赛当天只做组合和联调不现场写新驱动的思路”。驱动没有跑通前不要急着写完整应用程序。7.2 从 G 题延伸出去的进阶方向如果 51 单片机备赛时间充裕建议进一步学习以下内容定时器捕获模式。它不仅能测脉宽还能测量编码器脉冲频率和外部信号周期。串口通信协议。使用简单的帧头加数据加校验格式可以在单片机和 PC 或两块单片机之间可靠传数据。PID 控制算法。温度控制、电机调速、循迹纠偏都离不开 PID。先在仿真环境中调通参数再移植到单片机上。电源与驱动电路设计。掌握 MOS 管推挽输出、续流二极管、栅极电阻的选型方法可以应对功率控制类题目。状态机与任务调度。从51的单定时器时基过渡到裸机事件驱动架构能明显提升程序的稳定性和可维护性。对于想要挑战更高性能题目的同学建议在赛前两个月转向 STM32 平台。学习重点按以下顺序GPIO、外部中断、定时器、ADC、UART、PWM、编码器模式。不要一上来就研究复杂操作系统电赛现场最可靠的是裸机状态机加定时器轮询。2026 电赛 G 题的最终裁判标准是现场演示和指标测试。单片机方案做得再炫如果关键指标不稳定仍然拿不到高分。备赛时多花时间在硬件可靠性、程序健壮性和调试效率上比赛时的输出自然会更稳定。最有效的练习方式是把往年 G 题找出来用自己准备的这套软硬件框架重新实现一遍然后记录每次测试的数据和问题逐步完善自己的方案模板。