📈 GH Trending Explorer 🎲 Surprise me

← all repos

L110011101c / mcu-timer-calc

git clone https://github.com/L110011101c/mcu-timer-calc.git

8051 定时器初值计算器:零第三方依赖、可全量单元测试的命令行工具,同时是一个 Agent Skill。

—
stars, 24h
+32
stars, 7 days · #1,260
+32
stars, 30 days · #8,495
32
★ total · +32% this week
0
forks · 0 open issues

Star history starts 2026-10-20; the chart appears after the second daily snapshot.

LanguagePython
LicenseMIT
Created2026-10-13 (7d ago)
Last push7d ago
Watchers0
OwnerUser

Links

README excerpt
# mcu-timer-calc
8051 系列单片机定时器初值计算器 —— 零第三方依赖、可全量单元测试的命令行工具,同时是一个 Agent Skill。
## 为什么需要它
51 单片机定时器初值要经过"机器周期换算 → 计数值取整 → 2ⁿ 补码运算"三步,其中任何一步算错,定时就会整倍偏差。三个最常见的坑:
- **分频搞错**:标准 8051 是 12T,但 STC 系列可通过 STC-ISP 改成 6T/1T,按 12T 算出的初值会整倍错误。
- **方式 0 的 13 位编码**:TH0 存高 8 位、TL0 只存低 5 位,这是最容易写错的地方。
- **量化误差被忽略**:目标时间不是机器周期的整数倍时,误差客观存在,需要知道有多大。
本工具把这三件事都做成确定性计算,并如实输出误差,而不是"凑一个看起来对的数"。
## 特性
- 支持定时器**方式 0(13 位)/ 方式 1(16 位)/ 方式 2(8 位自动重装)**
- 支持 **12T / 6T / 1T** 分频,**必须显式指定**,不设默认值
- 正向计算:给定晶振 + 目标时间 → 初值、TH0/TL0 字节、实际时间、误差
- 反向计算:给定初值 → 实际定时时间
- 越界保护:超出方式能力范围时明确报错(例如方式 1 在 12MHz/12T 下最大 65.536 ms)
- 误差 > 2% 时给出提示;方式 0 / 方式 2 附带编码注意事项
- 支持 `--json` 机器可读输出
- **仅依赖 Python 标准库**,无需 pip 安装任何东西
## 环境要求
Python 3.8 或更高版本。无第三方依赖。
## 快速开始
 [code] 
## 使用示例
### 1. 12MHz 晶振,方式 1,定时 10ms
 [code] 
 [code] 
对应初始化代码:
 [code] 
### 2. 经典验证:11.0592MHz 晶振定时 10ms
 [code] 
初值为 **0xDC00** —— 这是 51 教材里最常见的验证值,可直接用来判断工具是否正确。
### 3. 方式 0(13 位)的编码
 [code] 
初值 7192 = `0x1C18`,拆成 **TH0 = 0xE0、TL0 = 0x18**(TL0 只用低 5 位)。
### 4. 由初值反算定时时间
 [code] 
### 5. JSON 输出
 [code] 
 [code] 
## 参数
| 参数 | 必填 | 说明 |
|---|---|---|
| `--fosc` | 是 | 晶振频率。接受 `12MHz` / `12M` / `11059200` / `8kHz` |
| `--mode` | 是 | 定时器工作方式:`0` / `1` / `2`(方式 3 拆分模式不支持) |
| `--prescaler` | 是 | 分频模式:`12T` / `6T` / `1T` |
| `--time` | 二选一 | 目标定时时间,必须带单位:`ns` / `us` / `ms` / `s` |
| `--init` | 二选一 | 定时器初值,触发反向计算 |
| `--json` | 否 | JSON 输出 |
**退出码**:`0` 成功;`2` 输入非法或超出方式能力范围。
## 计算原理
 [code] 
初值拆字节:
| 方式 | 位宽 | TH0 | TL0 |
|---|---|---|---|
| 方式 0 | 13 位 | `初值 >> 5` | `初值 & 0x1F`(仅低 5 位) |
| 方式 1 | 16 位 | `初值 >> 8` | `初值 & 0xFF` |
| 方式 2 | 8 位 | `初值` | `初值`(自动重装) |
## 已知局限
- **不假设分频**:12T/6T/1T 必须由使用者确认。STC89C52 出厂默认 12T,但可被改写。
- **不做晶振误差分析**:假定晶振频率精确。实际晶振有 ±20ppm 量级的频差,未计入。
- **方式 3 不支持**:方式 3 把定时器 0 拆成两个 8 位计数器,行为与其余方式差异较大。
- **只覆盖 8051 家族**:STM32 等 ARM Cortex-M 的 PSC/ARR 计算不在本工具范围内。
- **误差只能量化、无法消除**:目标时间不是机器周期整数倍时,工具会如实报出误差,
 不会为了"看起来整除"而调整初值。
## 测试
 [code] 
35 项测试全部通过,覆盖:
- 经典手算基准(12MHz / 11.0592MHz / 6T / 1T)
- 三种方式的上边界(计满一整圈)与越界报错
- 量化误差上报与四舍五入行为(避免 Python 银行家舍入带来的意外)
- 正向 ↔ 反向计算的往返一致性
- CLI 的文本输出、JSON 输出、退出码
## 作为 Agent Skill 使用
本仓库同时是一个 Skill 包:`SKILL.md` 描述了技能触发条件与调用方式,`scripts/timer_calc.py`
是确定性计算脚本。将整个目录放入 Agent 的 skills 目录即可使用。
## 许可证
MIT