# 验证记录

日期：2026-11-07。环境：Windows、Node.js、本机 Chromium。没有修改或重新编译课程源码；未连接实物开发板。项目为纯静态文件，未运行 build，也没有构建步骤。

## 核心：18项通过

运行 `node tests/core.mjs`，约1秒完成：HEX校验与拒绝非法输入；ADD/ADDC/SUBB边界结果与标志；IRAM/SFR隔离与寄存器组；调用返回栈；若干STC指令周期；pdata与P2隔离；端口读改写及键盘；T0自动重装1T/12T；外部计数/PCA溢出；定时中断与演示按键；UART时序；Timer2 IE2使能及0063H向量；I²C EEPROM写忙、页回卷、随机读；RTC日期进位与写保护；DS18B20负温度时隙转换、转换结束时采样与被拉长的写1时隙；超声波40kHz脉冲串容忍个别拉长半周期；T0计数程序自身拉低P3.4的下降沿；按键事件按页面时间戳换算到仿真时刻、不落到过去也不乱序；复位和断电保持。新增断言均先在修复前的代码上确认失败。

这是针对关键风险的检查集，不是穷尽255条有效指令、所有寄存器组合和所有器件命令的符合性认证。

## 用户现有HEX：7份通过

使用 `tests/firmware.mjs` 从本地原目录读取，约10秒完成。未将HEX放入站点或交付包。

| 固件 | 验证结果 |
| --- | --- |
| DS1302时钟模块 | 13:59:50→13:59:51；14:00:00蜂鸣器和继电器开启 |
| DS18B20温度模块 | 25→30°C；S4切换86°F。使用默认忙时保持兼容策略，等待转换和滑动平均 |
| EEPROM存储模块 | S5选择5，S4写入；断电重启读回5，显示005  000 |
| PCF_AD与DA模块 | AIN1/AIN3输入1V/4V显示204/051，改2V/3V显示153/102；DAC为0.99609375V。保留首字节上一转换值行为 |
| 超声波测距模块 | 默认板载脉冲串模型，100cm显示99，200cm显示199；无回波显示0。差值与程序计时/取整有关，未实物标定 |
| 串口模块 | 输入OK收到hello；按S4收到You pressed it 4 |
| 大模板 | pdata综合程序；1234Hz显示1230；25→32.50°C；串口OK回显。接入T0频率输入，选择单脉冲模型；未宣称距离case7可经正常菜单到达 |

二进制指纹（SHA256，原HEX文件字节；代码字节数为HEX载入记录累计有效字节）：

| 固件 | 代码字节数 | SHA256 |
| --- | ---: | --- |
| DS1302 | 1315 | `cb45d673e8276043b9ff917a910dd6f79312517db6fe5600de8807811d924e08` |
| DS18B20 | 2083 | `c826fe72a0d8d14d464888fba86dd08c006713980177ac59550cf9c2d2648d87` |
| EEPROM | 1333 | `96088ba580bf6d01061d6357cf8ae40e7e9f306a3caa023a84480f2cc2f2af85` |
| PCF | 1302 | `b0e58b7b00636beda2e7e3c64773339b337e009d37db1b5bcd09b371df6b8bd9` |
| 超声波 | 1496 | `6252d754b6804457d8d34a4da549c02d6db0e77f97ae68465d768cecb944a641` |
| UART | 2015 | `7e65f7f8d12c2c6d95151e1e9efce7cd7927efe72a054e79090607c70bcebd3e` |
| 大模板 | 7552 | `b40c6902a3df8b78a28985114de82df2f818e244ea0a252cd1f40ab96bc56db0` |

## 浏览器交互：9组通过

真实Chromium页面与Web Worker执行：内置机器码演示；按键锁定/释放；暂停时虚拟时间不变；错误校验和HEX被拒绝且保留旧固件；地址0000断点与单步到0030；上传串口HEX并收发OK/hello；EEPROM写5后刷新保持；1440×900、1920×1080、390×844无横向溢出；使用说明弹窗。期间未捕获页面JavaScript异常。

桌面采用三列，手机采用可纵向滚动单列。截图经视觉检查；没有要求全部面板必须在一个首屏内。按键LED检查采用亮度阈值，动态执行下占空比不必恰为100%。

## 未验证与限制

- GitHub Pages 已发布（https://zuoliangyu.github.io/lanqiao-mcu-lab/），公网仅检查了页面与脚本可加载，未重复上述浏览器交互流程。
- 未在Firefox、Safari或真实手机硬件执行完整交互流程。
- DS18B20忙时重复转换的默认兼容策略未实物核对；超声波单脉冲模式是显式兼容模型。
- 以下三项按器件手册取值，未实物核对：单总线写时隙在约30µs采样；超声波板载模式接受5～50µs的高电平脉冲；P3.4上单片机拉低优先于555输出。
- 没有做模拟电路、电气波形、晶振容差或所有STC外设的准确性保证。支持边界见README。
- 验证对象为上述SHA256对应的现有HEX；源码与HEX可能不同步，不保证源文件重新编译后的行为相同。

## 频率输入交互更新验证

P3.4频率输入与矩阵第四列互斥：开启时释放并禁用S16～S19，其他列仍可用；切换独立/矩阵模式不会绕过互斥，关闭频率后不会恢复旧按下状态。已验证100、1234、38000Hz的一秒T0实际计数。Chromium检查手动输入与滑块双向同步、上下限钳制、空值恢复及手机布局，均通过。

## 真题与满分解答验证

资料：官方第17届BSP、大模板v2026、全模块测试例程、学员满分解答与历年真题，均从本地读取，未放入仓库。大模板驱动与官方第17届BSP逐字节一致。

- 冒烟：151份解答HEX各运行数秒，全部载入并执行，无PC越界或运行诊断以外的异常。
- 按题目要求逐条检查（按键、显示、温度、ADC/DAC、测距、测频、EEPROM、串口）：覆盖第十一届第二场、第十二届至第十四届省赛、第十五届省赛第二场、第十三届至第十五届国赛，共19份解答。

本轮发现并修复4处仿真问题：

| 问题 | 修复前现象 | 修复 |
| --- | --- | --- |
| DS18B20在收到44H时采样温度 | 读数多滞后一次转换，最长约1.5s；第十五届省赛第二场解答6项失败 | 改为转换结束时采样，修复后全部通过 |
| T0不计程序自己拉低P3.4的下降沿 | 键盘扫描写 `P34=0` 产生的下降沿漏计，比实物少计数 | 按引脚电平计数 |
| 超声波板载模式拒绝超过25µs的高电平 | 发送脉冲串时未关中断的解答（第十三届国赛）11项失败 | 放宽到50µs，修复后全部通过 |
| 单总线写1被中断拉长到约25µs时读作0 | 两份解答温度偶发跳变（约5%、1.3%） | 采样点改为约30µs，300次采样无跳变 |

修复后：5份解答全部通过，其余14份的失败项均已追溯到解答源码，不是仿真问题。主要原因：区间开闭或 `>`/`≥` 边界、浮点比较、无回波或计数溢出处理、PCF8591控制字关闭了DAC输出、中断服务里读P2破坏I²C的SDA、长中断导致Timer2请求丢失、题目要求独立按键却使用矩阵扫描、湿度公式自带经验偏移。另有两份解答附带的HEX是同一份过期编译结果，按键无响应；同目录另一HEX正常。

未覆盖：第十二届国赛（无解答）、第十六届和第十七届真题；修复后未重新跑浏览器交互。
