结合非阻塞动态扫描架构与单总线读忙检测,实现 0~99.9℃ 测温、0.1℃ 分辨率与极速响应
向 DS18B20 写入配置寄存器(默认 12 位精度 0x7F),取消开机死等,通电即开始测温。
开机执行 1 次发送 0xCC 跳过 ROM 和 0x44 启动转换,随后进入 while(!ds_read_bit()) 轮询转换完成信号。
主循环第 1 步在等待传感器转换的每一毫秒里,穿插点亮 1 位数码管(先消隐、再送段码、后开位选),屏幕持续高亮不闪烁。
嵌入等待循环中转换完成瞬间立刻读取高低两字节拼成 raw,用纯整数公式 (raw*10+8)/16 四舍五入到 0.1℃。
主循环第 2 步拆解十位、个位、十分位,查 seg_map 重映射后存入 disp_buf[4],供下一轮扫描显示。
主循环第 3 步原理图中 P0.0~P0.7 与数码管 A~DP 是交叉连接的。点击下方字符,观察逻辑字模如何经 seg_map = {0,2,6,4,3,1,7,5} 和共阳取反变成 P0 实际输出:
| P0引脚 | P0.7 | P0.6 | P0.5 | P0.4 | P0.3 | P0.2 | P0.1 | P0.0 |
|---|---|---|---|---|---|---|---|---|
| 对应笔画 | G | C | DP | D | E | B | F | A |
| 电平(0亮) | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
拖动滑块模拟 DS18B20 测得的环境温度,观察 th/tl 原始寄存器值如何不借助浮点数、纯靠整数运算完成四舍五入与数码管拆位: