单片机毕设题目避坑指南:从选题误区到可落地的技术方案
配图:选题阶段最容易踩的坑,90% 的同学在第一步就输了
1. 背景痛点:为什么“看起来酷炫”的题目往往做不完
毕设开题前,大家习惯在购物平台搜索“单片机 模块”,于是出现以下名场面:
- 把“语音识别+人脸识别+物联网云平台”写进同一张开题报告,却忽略 STM32F103 只有 20 kB RAM;
- 买了 5 块 18650 电池,却忘记给 ESP32-CAM 算功耗,结果续航 40 分钟;
- 选题里写“LoRa mesh 自组网”,实际只买到 2 片 SX1278,没研究过 CAD 版本信道冲突。
这些“拍脑袋”式选题的共同结局是:4 月底还在调 I²C 死锁,5 月答辩 PPT 只能放效果图。
2. 技术选型对比:把“能用”与“好用”量化成表格
| 维度 | 51 单片机 | STM32F1 | ESP32 |
|---|---|---|---|
| 主频 | 12 MHz | 72 MHz | 240 MHz |
| Flash | 8–64 kB | 64–512 kB | 4 MB |
| 低功耗 | 无睡眠分级 | Stop 模式 20 µA | Deep-sleep 10 µA |
| 外设 | 定时器+UART | 3×ADC、2×I²C、USB-FS | Wi-Fi+蓝牙 |
| 成本 | 3 元 | 8 元 | 20 元 |
| 推荐场景 | 单点 LED、按键 | 传感器+段码屏 | 需连云、需 OTA |
传感器与通信方式同理,先列“场景-指标-成本”三维表,再打分,能瞬间排除 70% 的“伪需求”。
3. 核心实现细节:以“智能植物养护系统”为例
3.1 系统指标
- 供电:3.7 V 18650,目标续航 ≥ 30 天;
- 采样:SHT31 温度/湿度,周期 5 min;
- 执行:5 V 微型水泵,每次浇灌 5 s;
- 通信:BLE 5.0,手机小程序查看;
- 异常:土壤干湿度超限 10 min 内短信提醒。
3.2 硬件连接
- STM32L031 做主控,使用 Stop 模式;
- SHT31 挂 3.3 V I²C,上拉 4.7 kΩ;
- 水泵由 AO3400 MOSFET 驱动,栅极限流 100 Ω;
- 电源经 SY7069 降压到 3.3 V,静态 2 µA;
- 电池电压通过 ADC_IN0 1/3 分压检测。
3.3 软件状态机(简化)
typedef enum { ST_SLEEP, ST_SAMPLE, ST_PUMP, ST_BLE_TX, ST_LOWBAT } state_t; static volatile state_t current ST_SLEEP; int main(void) { HAL_Init(); SystemClock_Config(); Periph_Init(); for (;;) { switch (current) { case ST_SLEEP: HAL_PWR_EnterSTOPMode(PWR_REGULATOR_LOWPOWER, PWR_STOPENTRY_WFI); /* RTC 唤醒后 -> ST_SAMPLE */ break; case ST_SAMPLE: if (sht31_read(&t, &h) != HAL_OK) { Error_Handler(); } if (h < 40) { current = ST_PUMP; } else { current = ST_BLE_TX;} break; case ST_PUMP: pump_on(); delay_ms(5000); pump_off(); current = ST_BLE_TX; break; /* 其余状态同理 */ } } }3.4 低功耗策略
- 外设电源由 TPS229xx 负载开关统一管控,关断后漏电流 < 50 nA;
- ADC 采样前使能 LDO,采样完关闭,平均电流降低 0.8 mA;
- 利用 STM32L0 的 Low-power run,主频降到 2 MHz,Stop 唤醒时间 < 5 µs;
- BLE 广播间隔动态调整:白天 500 ms,夜间 2 s,手机断连后 30 s 自动停播。
4. 代码示范:Clean Code 在裸机中的落地
以下模块只依赖 HAL 与 cmsis,方便移植。所有驱动与业务逻辑彻底解耦。
/* sht31.h */ typedef struct { float temp; float humi; } sht31_data_t; bool sht31_init(I2C_HandleTypeDef *hi2c); bool sht31_read(sht31_data_t *out); /* pump.h */ void pump_init(void); void pump_on (void); void pump_off(void); /* app_fsm.c */ #include "sht31.h" #include "pump.h" static void enter_pump_if_dry(const sht31_data_t *d) { if (d->humi < 40.0f) { pump_on(); delay_ms(5000); pump_off(); } }通过“接口+私有实现”方式,即使 3 年后换 MCU,也只需改驱动层,业务层无需动。
5. 性能与安全性:让板子不“死机”的四种武器
ADC 采样稳定性
- 每通道连续采 8 次,去掉最大最小后平均;
- 采样前加 10 µs 保持时间,保证采样电容充电;
- 使用内部 VREFINT 做二次校准,误差从 ±15 LSB 降到 ±3 LSB。
独立看门狗 IWDG
- 溢出时间 8 s,在 ST_SLEEP 前刷新;
- 若任务卡住,8 s 后自动复位,BLE 断开记录异常码到备份寄存器。
软件陷阱
- 在 switch-default 及 HardFault_Handler 中写入 BKPT,J-Link 可立即断住;
- 关键变量加 volatile 并做范围断言,防止 OTA 升级后指针越界。
电源与 ESD
- 电池端 TVS 5 V 反向保护,USB 口加 ESD0524;
- 水泵感性负载并联 SS14 续流,防止关断尖峰把 MOSFET 击穿。
6. 生产级避坑:从打样到答辩的 7 条军规
PCB 布局
- 晶振底下禁止走任何线,地铜完整包裹;
- 电源回路先经过电容电容再进芯片,环路面积 < 1 cm²;
- 模拟/数字地单点连接,0 Ω 电阻便于割线调试。
调试技巧
- 预留 SWD+UART 测试口,加 4 Pin 端子,毕业收回线材;
- 用 SEGGER RTT 代替串口,休眠时仍可打印,电流增加 < 100 µA;
- 逻辑仪抓 I²C,先看 ACK,再看时序,最后看数据,避免“盲人摸象”。
演示脚本
- 答辩前写“三分钟故事”:背景→方案→数据→对比→展望;
- 录屏 + 实物双窗口,防止现场连不上手机;
- 准备“失败模式”彩蛋:当场拔掉传感器,系统报警提示,展示鲁棒性。
7. 把毕设变成技术资产:下一步怎么走?
当 GitHub 出现 50 个 star、淘宝店铺开始卖你的扩展板,毕设就不再是“作业”,而是可复用的 IP。思考三个问题:
- 能否把驱动抽象成 RT-Thread 软件包,直接
menuconfig勾选? - 能否把低功耗数据发一篇 EI 会议,让简历多一行“一作”?
- 能否用同样硬件,只改 JSON 配置文件,就做出“智能猫砂盆”?
把答案写进 README,下一次面试官问“你做过最复杂的项目”时,你只需递上二维码,让代码自己说话。