## 模板的总结构
模板的总结构可以压成三层:
-
驱动层:负责外设收发与底层时序
-
用户层:负责模式逻辑、数据显示、按键响应
-
节拍层:负责 1ms 系统节拍、动态扫描、减速计数、频率计窗口
它的主循环被压缩成三件套:
-
uart_proc -
key_proc -
seg_proc
它的核心思想是:
-
驱动层尽量稳定,不随题目频繁改动
-
题目差异主要落在
key_proc和seg_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 -
价值:把题目差异压缩到上层逻辑,把驱动层尽量稳定化