单片机回顾(V2026)

## 模板的总结构

模板的总结构可以压成三层:

  • 驱动层:负责外设收发与底层时序

  • 用户层:负责模式逻辑、数据显示、按键响应

  • 节拍层:负责 1ms 系统节拍、动态扫描、减速计数、频率计窗口

它的主循环被压缩成三件套:

  • uart_proc

  • key_proc

  • seg_proc

它的核心思想是:

  • 驱动层尽量稳定,不随题目频繁改动

  • 题目差异主要落在 key_procseg_proc

  • 定时性任务尽量挂在统一节拍体系下运行

模板的核心设计思想

不额外引入个人调度器

V2026 明确不再额外包一层个人风格调度器,而是直接使用:

  • Timer1 1ms 节拍

  • uart_proc / key_proc / seg_proc

这说明模板追求的是比赛场景下的低认知负担,而不是为了“架构漂亮”继续抽象一层。

外设统一成“数据数组 + 接口函数”

模板中的外设尽量被压成统一形式:

  • 上层维护数据

  • 驱动负责输出

  • 上层按需刷新

例如:

  • LED 用数组统一表达整组状态

  • 数码管用 seg_buf 统一表达 8 位显示内容

  • 键盘通过统一的 key_read() 返回位掩码

这样做的价值是:

  • 上层更容易改题

  • 硬件差异更多被留在驱动层

  • 同一类外设的操作方式更统一

资源分工固定

模板对定时资源做了固定分工:

  • Timer0:NE555 频率计外部计数

  • Timer1:1ms 系统节拍

  • Timer2:串口波特率发生器

  • PCA:超声波测距计数

这个分工体现的知识点不是“某个寄存器怎么配”,而是:

  • 比赛题资源紧

  • 不同外设会争抢定时器

  • 模板必须先把资源分配关系固定,后续题目才能稳定扩展

必须先理解的硬件基础

锁存器与 74HC138

CT107D 板上,P0 不是单独只服务一个外设,而是被多组锁存器复用。P2 高三位通过 74HC138 选择当前要写入哪一组锁存器。

这带来的核心知识是:

  • 很多输出操作本质上不是“直接写某个外设”,而是“选通某个锁存器再写数据”

  • 如果不理解锁存器选通顺序,就很容易在 LED、数码管、蜂鸣器、继电器、电机之间相互干扰

pdata 的使用

V2026 大量把全局数组和状态变量放进 pdata

它背后的知识点是:

  • 8051 的片内存储区容量很小

  • data 区很容易溢出

  • 比赛里经常要维护显示缓冲、按键状态、串口缓冲、采样值等数组或状态量

  • 合理使用 pdata 能降低 DATA SPACE OVERFLOW 风险

所以 pdata 在这里不是语法细节,而是模板可扩展性的关键内存策略。

外设模块知识地图

上电初始化模块

init 模块解决的是“上电不安全”的问题。

核心作用:

  • 熄灭 LED

  • 关闭蜂鸣器、继电器、电机

它体现的知识点是:

  • 比赛板卡上很多执行器件在上电瞬间状态不确定

  • 初始化不是装饰步骤,而是必须最先做的安全控制

LED / 蜂鸣器 / 继电器 / 电机模块

这一组模块的共同特点是:

  • 都通过锁存控制输出

  • 适合封装成稳定接口

  • 上层更关心“当前状态是什么”,而不是“引脚怎么翻”

其中 LED 采用数组接口,说明它优先服务的是“整组状态表达”;蜂鸣器、继电器、电机则更像独立控制位。

Key 模块

按键模块的核心知识不是“某一行代码怎么扫键”,而是:

  • 同一块板卡可能对应三种硬件按键方案

  • 模板需要用统一返回格式屏蔽硬件差异

  • key_read() 返回位掩码,是为了兼容多键同按和上层统一判断

三种方案分别是:

  • 带 NE555 的 3 列矩阵键盘

  • 不带 NE555 的 4 列矩阵键盘

  • 独立按键

它体现出模板的一个重要知识:

  • 硬件差异优先吸收到驱动层

  • 尽量让 main.c 的上层逻辑不跟着大改

Seg 数码管模块

数码管模块负责统一显示输出。

这里的稳定知识包括:

  • CT107D 使用 8 位共阳数码管

  • 段码表是显示的基础映射

  • 小数点不是单独一种数字,而是在段码层做附加控制

  • 动态扫描依赖统一的 1ms 节拍

DS1302 模块

DS1302 模块负责实时时钟。

从知识层看,关键点是:

  • 它提供时分秒、日期、星期的读写能力

  • 涉及 BCD 码读写

  • 模板已经把 12/24 小时制兼容也封装进去了

因此上层一般不需要重复处理底层协议,而是直接使用统一接口。

DS18B20 模块

DS18B20 模块负责温度采集。

关键知识:

  • 分辨率可配置

  • 温度读取依赖单总线时序

  • 实战中要知道首次读数和分辨率会影响稳定性与精度感知

IIC / PCF8591 / EEPROM 模块

这一组模块共同挂在软件 I2C 框架下。

知识层重点不是逐句时序,而是:

  • 一套 I2C 框架下承载多个器件

  • PCF8591 提供 AD/DA 能力

  • AT24C02 提供 EEPROM 读写能力

  • 不同器件共用总线,但控制字、地址、读写流程不同

它是模板里“一个底层协议服务多个上层器件”的典型例子。

Uart 模块

串口模块解决调试输出和串口收发。

知识层重点:

  • 波特率由 Timer2 提供

  • putchar 被重写后,printf 可以直接作为调试接口

  • 接收采用“超时分帧”思想,而不是复杂协议栈

这说明模板把串口首先定义为“调试工具 + 基础交互接口”。

Ultrasound 模块

超声波模块采用 PCA 计时。

核心知识:

  • 超声波需要测量回波时间差

  • 定时器资源紧张,所以不用普通 Timer,而用 PCA

  • 0.017 * 时间(us) 是距离换算的核心关系

这部分体现的不是单个函数写法,而是“硬件资源冲突下如何给超声波留出计时能力”。

main 层的系统组织方式

main 层不是简单“把函数串起来”,而是整个模板的组织中心。

它承担四类知识:

  • 初始化顺序的组织

  • 周期任务的调度

  • 模式切换的承载

  • 多外设数据采集与显示协调

1ms 节拍体系

Timer1 的 1ms 节拍是模板最核心的系统基础设施之一。

它承载:

  • 按键减速计数

  • 数码管动态扫描

  • 串口超时计数

  • PWM 节奏

  • NE555 频率计窗口控制

这说明很多“看起来无关”的功能,其实都被统一挂在一个时间基准上。

模式化显示组织

模板通过 ex_mode 组织 8 种显示模式。

这背后的稳定知识是:

  • 比赛常常需要一个工程同时展示多类数据

  • 不同题目可以复用同一套模式切换骨架

  • S4 切模式,其余按键在不同模式下复用不同含义

也就是说,模板不仅复用了驱动,还复用了“多模式题目”的基本组织方式。

这套模板能覆盖的题目类型

从模块组成看,V2026 适合覆盖以下高频题型:

  • 时钟与日历显示

  • 温度采集

  • 光敏 / 滑变 AD 采样

  • DA 输出

  • EEPROM 读写

  • 串口调试与简单收发

  • 超声波测距

  • PWM 调光

  • NE555 频率计

  • 多模式综合显示题

所以它本质上是一套“高覆盖率综合模板”,而不是某一道题的专用工程。

常见问题反映出的知识重点

原始笔记里的常见踩坑,反过来说明了这套模板最关键的知识点:

  • 内存区选择会直接影响是否能编译通过

  • 上电初始化关系到执行器是否安全

  • 动态扫描与锁存刷新关系到显示稳定性

  • 按键边沿提取关系到单按与连按识别

  • I2C 与中断冲突关系到 EEPROM 是否可靠

  • DS18B20 分辨率和首次转换关系到温度显示是否可信

  • 串口、定时器、外部计数之间的资源分配关系到系统是否能共存

这说明模板真正重要的不只是“功能全”,而是“这些功能彼此能稳定共存”。

这份知识层笔记的边界

这份笔记只回答三个问题:

  • 这套模板解决什么问题

  • 它由哪些核心模块组成

  • 各模块各自承担什么职责与硬件约束

暂时不展开的内容:

  • 什么时候选哪套按键方案

  • 比赛现场如何决定改哪里

  • 各模块最小骨架怎么手写

  • 出错后第一检查顺序是什么

这些内容应继续放到:

  • 03-决策层

  • 04-执行层

  • 05-练习层

超短复习卡

  • 主循环三件套:uart_proc / key_proc / seg_proc

  • 时间资源分工:T0 频率计,T1 1ms节拍,T2 串口,PCA 超声波

  • 核心硬件前提:锁存器 + 74HC138 + CT107D 板卡连接

  • 核心内存策略:大数组和状态优先考虑 pdata

  • 价值:把题目差异压缩到上层逻辑,把驱动层尽量稳定化