简介这是一份基于51单片机的超声波测距系统仿真资源面向单片机初学者及课程设计人员帮助掌握HCSR04超声波测距原理与LCD1602显示驱动的完整实现。压缩包共31个文件约102KB包括C源码main.c、hcsr04.c等、Keil工程文件、hex烧录文件及Proteus仿真文件从代码到仿真验证一应俱全。资源已有1412人学习具有不错的参考热度。通过该资源读者可获得可直接运行的工程和仿真电路学习超声波发射、回波接收及定时计算距离的方法并在LCD1602上实时显示结果。内置的Proteus仿真图便于无硬件环境时验证逻辑对理解中断服务、GPIO控制和模块化编程也很有帮助适合课程设计或入门实践。1. 超声波测距系统仿真不焊一块板子先把测距代码跑通做 51 单片机项目最难受的不是写代码而是“代码写完不敢上电”。超声波测距这种带时序的模块Trig 发脉冲、Echo 等回波中间差几微秒结果就差几毫米板子一焊错就得拆。基于51单片机的超声波测距系统仿真就是让你在 Proteus 里把电路画出来、把程序烧进去、把障碍物摆到传感器前面直接看到距离值在数码管上跳——全程不碰烙铁不烧单片机。这套方案适合三类人刚学完 GPIO 和定时器、想拿个完整项目练手的学生手头有 HC-SR04 但不敢直接接开发板、怕烧引脚的入门者以及想在生产前验证逻辑、又懒得反复焊线的在职开发。它解决的核心问题只有一个把“距离测量”这个物理量变成一串可观察、可调试、可复现的数字。2. 从声速到距离HC-SR04 测距时序与 51 单片机的选型逻辑2.1 为什么用 51 单片机做超声测距而不是直接上 STM32很多人一上手就想着用 STM32觉得主频高、外设多、以后好扩展。但超声波测距这个场景恰恰是 51 单片机的舒适区。HC-SR04 的测距过程只有两件事发一个 10us 以上的 Trig 高电平然后测量 Echo 引脚高电平的持续时间。这个时间在几百微秒到几十毫秒之间51 单片机用定时器完全可以覆盖根本不需要高主频。51 单片机采用的哈佛结构指令和数据分开存储配合 12T 的经典时序一个机器周期正好是晶振周期的 12 倍。这意味着你用 12MHz 晶振时定时器每计一个数就是 1us回波时间直接读 TH0 和 TL0 就能得到微秒数换算距离只需要做一次乘除法。相比之下STM32 的定时器虽然更精密但配置时钟树、选择预分频、设置捕获模式这一套下来学习成本翻了几倍对“测个距离”来说属于杀鸡用牛刀。我做这个项目时选的是 STC89C52——兼容传统 51 引脚Keil 里直接选 AT89C52 就能编译烧录。Proteus 仿真里用 AT89C52 的库模型行为上完全一致。如果你手头是江科大那套学习笔记里的开发板用的也是这个芯片照着改引脚定义就能把程序移植过去。2.2 回波时间怎么算成距离必须理解的公式与单位换算HC-SR04 的测距原理说白了就是回声定位超声波从触发到收到回波走了两趟路程。声速在 20℃ 空气中约为 340m/s换算成方便计算的单位就是 0.034cm/us。公式是距离 回波时间(us) × 0.034(cm/us) ÷ 2除以 2 是因为声波去了再回来走了双倍距离。在代码里这个公式可以简化成“回波时间 × 0.017”单位直接就是厘米。但这里有个新手最容易踩的坑0.017 这个系数只在晶振为 12MHz、定时器每计数一次恰好 1us 时才成立。如果用的是 11.0592MHz 晶振为了串口波特率精确机器周期是 12 ÷ 11.0592 ≈ 1.085us真实的回波时间是计数值 × 1.085距离则要按这个基数算。C51 里浮点运算虽然慢但测距场景每秒只触发几次完全跑得动。我一般用 unsigned long 保存时间再转成浮点算距离最后四舍五入取整。不要用整型直接做除法否则 1.5 米以上的值会舍入得很难看。2.3 Proteus 仿真里的关键器件SRF04 模型与 HC-SR04 的真实差异Proteus 的元件库搜索 “SRF04” 或 “Ultrasonic Ranger”能找到超声波测距传感器模型。它和 HC-SR04 引脚兼容VCC、GND、Trig、Echo时序也几乎一模一样——Trig 输入高电平触发Echo 输出高电平时间与到障碍物距离成正比。仿真时把 SRF04 放在电路里正前方再放一块“墙”模型在 2D 图形工具里画矩形就行调整墙与传感器的距离Echo 输出的高电平宽度就会跟着变。这里要注意一个仿真和实物的关键差异HC-SR04 实测时即使前方没有障碍物Echo 也会在大约 38ms 后返回一个高电平表示“超时”而 Proteus 的 SRF04 模型在没障碍物时可能一直保持低电平。这就导致程序里经典的 while(!Echo); 卡死循环在仿真中更容易出现必须在代码里加超时保护。这个问题后面第五章专门展开。3. 在 Proteus 里搭出可仿真的超声波测距系统最小电路与完整工程3.1 新建工程与器件清单五个元件就能跑起来用 Proteus 8 新建工程选 “New Project”芯片选 AT89C52。最小系统只需要五类东西单片机、SRF04 超声波模块、两个数码管显示距离、一颗 11.0592MHz 晶振、两个 30pF 电容。复位电路可以省略——仿真时程序是从头开始跑的不像实物需要上电复位。器件在 Proteus 里通过输入关键字添加AT89C52、SRF04、7SEG-MPX2-CA两位共阳数码管、CRYSTAL、CAP。晶振和电容接在单片机的 XTAL1 和 XTAL2 引脚上两个电容一端接地一端接晶振两端。SRF04 的 Trig 接 P1^0Echo 接 P1^1数码管段选接 P0要加 220Ω 排阻仿真里不加也能跑但实物必须加位选接 P2^0 和 P2^1。连线时有个细节Proteus 的 SRF04 模型默认“前方”是哪个方向取决于放置时引脚的朝向。我是把 Trig 放左侧、Echo 放右侧然后在 SRF04 右侧大概 20cm 处放一块矩形障碍物。这个距离会直接影响 Echo 的高电平时间放好后可以先运行一下用示波器点住 Echo 引脚看波形宽度是否合理。3.2 程序框架触发、计时、换算、显示四件事的顺序主程序的结构其实非常简单但顺序错了就会出玄学问题。我的顺序是初始化定时器和串口 → 主循环里发 Trig → 等 Echo 变高 → 开定时器 → 等 Echo 变低 → 关定时器 → 读 TH0/TL0 → 换算距离 → 送数码管显示 → 延时 100ms → 再来一次。完整的主程序代码如下#include reg52.h #include intrins.h sbit Trig P1^0; // 触发引脚 sbit Echo P1^1; // 回波引脚 unsigned int time 0; // 回波时间计数值 unsigned long distance 0; // 计算出的距离单位 cm void Timer0_Init(void) { TMOD 0xF0; // 清空定时器0控制位 TMOD | 0x01; // 定时器0方式116位不自动重装 TH0 0x00; // 清零计数值 TL0 0x00; ET0 1; // 开启定时器0中断 EA 1; // 开启总中断 } void Start_Wave(void) { Trig 1; _nop_(); _nop_(); _nop_(); _nop_(); // 约10us以上 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig 0; // Trig 回落模块开始发超声波 } void main(void) { unsigned long temp; Timer0_Init(); while(1) { Start_Wave(); while(!Echo); // 等待Echo变高进入测距窗口 TR0 1; // 启动定时器0开始计时 while(Echo); // 等待Echo变低回波结束 TR0 0; // 停止计时 time (TH0 8) | TL0; // 取出16位计数值 temp time * 17; // 时间(us) × 0.017cm/us ≈ 距离 distance temp / 10; // 因为time是整数先乘17再除10 Display_Distance(distance); // 数码管显示函数 Delay_100ms(); } }代码的逻辑分为三段Start_Wave 里用连续几个nop() 填充出至少 10us 的高电平这是 HC-SR04 时序的硬性要求太短模块不触发。中间两个 while 是关键第一个 while 等 Echo 从 0 变 1变高瞬间开启定时器第二个 while 等 Echo 从 1 变 0变低瞬间关闭定时器这样 TH0:TL0 里锁存的值就是回波高电平的持续时间。这里解释一下距离换算为什么要写成 time × 17 ÷ 10。time 是 16 位整数0.017 是小数C51 里整数乘浮点数会触发浮点运算慢而且可能出现精度损失。我把 0.017 拆成 17÷1000先把 time 乘 17 得到千分之一厘米的值再除以 10 得到厘米值全程整型运算速度又快结果又稳。注意这个系数只适用于 12MHz 晶振如果是 11.0592MHz要把 17 改成 18。3.3 用 Keil 生成 HEX 文件并加载到 Proteus三步完成联调程序写好后打开 Keil C51新建工程选 AT89C52把上面的代码复制进去。点魔术棒Options for Target在 Output 选项卡里勾选 “Create HEX File”然后编译。编译成功后工程目录下会生成 .hex 文件。回到 Proteus双击 AT89C52 芯片在 Program File 一栏点文件夹图标选中刚才生成的 HEX 文件。然后点左下角的运行按钮。如果电路和程序都没问题数码管会显示一个稳定的距离值。这时你去拖动障碍物距离值就会跟着变——如果没变大概率是 Trig 和 Echo 接反了或者障碍物放在了传感器背面。仿真跑通后我建议做一件事把障碍物从 5cm 开始每隔 5cm 挪一次记录数码管显示的数值和实际距离对比。误差在 ±1cm 以内说明时序和换算系数都对了如果差 2cm 以上先检查晶振频率和换算系数是否匹配。4. 让仿真跑得更准三个必调参数与一组测试用例4.1 定时器方式 2 与自动重装为什么 TMOD 0x20 不只是个示例网上搜 51 单片机定时器初始化最常见的写法是 TMOD 0x20也就是定时器 1 工作在方式 2——8 位自动重装。这个写法本身没错但它通常是用在串口波特率发生器上的。超声波测距要测的是几百微秒到几十毫秒的高电平宽度8 位定时器最大只能计 255us根本不够用所以测距必须用定时器 0 的方式 116 位不自动重装最大计 65535us 65.535ms刚好覆盖 HC-SR04 的 4 米量程。我在项目里的做法是分开配置定时器 0 用于测距TMOD 低四位设成 0x01定时器 1 用于串口波特率TMOD 高四位设成 0x20。所以初始化语句写的是 TMOD 0x21 而不是 0x20。如果你只写 TMOD 0x20定时器 0 会变成方式 0——13 位计数器最大只能计 8191us测 1.4 米以上的距离就会溢出显示值突然跳回一个很小的数。这个问题在仿真中尤其隐蔽因为 Proteus 不会报错只有你对着滚动的数码管发呆。另外方式 2 的“自动重装”特性只对定时器 1 有意义。测距场景里 Echo 高电平宽度每次都不一样定时器 0 必须从 0x0000 开始计所以每次启动前都要重新赋值 TH0 0; TL0 0;。我的代码里把清零放在最后而不是最开始是为了避免程序主循环跑得慢导致清零和启动之间漏掉几个微秒——先清零再启动时间误差最小。4.2 声速补偿0℃ 和 30℃ 测出来的距离能差 8 厘米很多人写完超声波程序就以为完工了其实还差一步声速不是恒定的。空气中的声速与温度的关系近似是 V 331.4 0.607 × T单位 m/s。0℃ 时声速 331.4m/s30℃ 时 349.6m/s差了 5.5%。在 1.5 米处用 20℃ 的 340m/s 去算0℃ 和 30℃ 的真实距离误差差不多有 8 厘米。对要求不高的测距可以忽略但如果你做的是循迹小车避障或液位检测这个误差可能导致误判。仿真里怎么验证温度影响用查表法把几个温度点的距离修正系数列出来在代码里做成常量数组温度声速(m/s)系数(cm/ms)1.5m 处误差(cm)0℃331.416.573.820℃340.017.00030℃349.617.48-2.240℃355.217.76-4.6代码里加温度补偿的常见做法是留一个全局变量 temp_offset显示距离时先查表再修正unsigned int temp_comp(unsigned int raw_dist) { // 假设当前温度 25℃查表得系数 17.31cm/ms // 原系数17.00差0.31每米修正约1.8cm return raw_dist (raw_dist * 18 / 1000); }这个函数和前面的整型换算思路一致先把偏差率放大 1000 倍变成整数再乘距离最后除以 1000。温度值从哪里来实物上用 DS18B20 采集仿真里直接改宏定义就行。注意一点系数查表法只适合温差 ±10℃ 的粗略补偿想要精确到毫米级就得用浮点运算把公式完整展开但这对 51 单片机来说有点吃力通常没必要。4.3 用两位数码管加 LED 做输出怎么验证结果而不是干看数字数码管动态扫描是 51 单片机的经典练习但放在测距项目里有个坑如果显示刷新和 Trig 触发放在同一个主循环里数码管闪烁会干扰你对距离变化的判断。我习惯用定时器中断做扫描主循环只负责测距和更新显示缓冲区。unsigned char display_buf[2]; // 十位、个位 void Timer1_ISR(void) interrupt 3 { static unsigned char pos 0; P2 0x00; // 关闭位选消隐 P0 seg_table[display_buf[pos]]; P2 (1 pos); // 打开对应位 pos (pos 1) 0x01; }显示缓冲区的更新在主循环里把 distance 拆成十位和个位存入 display_buf。中断里每 2ms 切换一位肉眼看起来就是两个稳定的数字。加 LED 阈值报警更直观距离小于 20cm 时点亮 P2^2 上的 LED仿真里能通过 LED 颜色变化快速确认程序逻辑对不对不需要一直盯着数码管看。跑仿真时建议用一组固定测试用例把障碍物分别放在 10cm、25cm、50cm、100cm 处记录数码管读数。理论回声宽度分别是 588us、1471us、2941us、5882us按 340m/s 算。读数对应准确说明定时器配置正确。这里注意 Proteus 默认仿真速度可能不是实时速度数码管读数看起来会忽快忽慢这不影响距离值本身的正确性只看值跳不跳就行。5. 避坑超声波测距仿真的五个常见问题与排查5.1 现象Echo 一直是低电平程序卡死在等待回波仿真运行时数码管不亮程序像是冻住了。暂停仿真发现 PC 指针停在 while(!Echo); 这一行。原因是 SRF04 模型没有接收到 Trig 脉冲或者 Trig 引脚信号根本没起作用。常见原因有两个一是 Trig 接了 P1^0但代码里写成了别的引脚检查 sbit 定义和原理图是否一致二是 Trig 脉冲宽度不够SRF04 要求至少 10us如果你的系统用了 12MHz 晶振但代码里只写了两个nop()实际脉宽只有 2us模型不触发。解决在代码里把 Trig 高电平延长到至少 15us多写几个nop()或者用一个 20us 左右的延时函数。同时在 while(!Echo) 前加一个超时计数器如果超过 50ms 还没等到高电平强制跳过本次测距避免程序永久卡死——这在实物上尤其重要因为探头前无障碍物时 Echo 也可能长时间无响应。5.2 现象距离值跳变每隔几秒出现一个异常大数测距基本正常但偶尔冒出一个几十厘米甚至上米的数在屏幕上闪一下就变回去。排查后发现 TH0/TL0 在二次赋值时没有清零导致上一次测量的残留值干扰了本次结果。细看我的代码每次进入主循环前 TH0 和 TL0 已经在上一次结束时保存过但定时器还在跑。如果第二次测距触发时 Echo 变高的瞬间和定时器溢出的瞬间撞在一起读到的合成值就是乱的。解决启动定时器前强制 TH0 0; TL0 0;然后在读取计数值后立即关闭定时器中断标志。另外软件滤波也很有效连续采五次去掉最大值最小值再取平均跳变值基本能滤掉。这个滤波函数不需要很复杂五个数排序后取中间值就行。5.3 现象数码管亮度不均、闪烁数字带重影仿真里数码管闪烁最常见原因是动态扫描频率太低。主循环里测距加延时一次要 100ms扫描周期被拖到了 50ms 以上人眼已经能分辨出闪烁。另一个原因是位选和段选切换时没有消隐导致前一位的残影叠到后一位上。解决把数码管扫描从主循环挪到定时器中断里每 2ms 切换一位中断优先级高于主循环的测距逻辑。切换顺序必须是先关闭位选P2 0x00再送段码最后打开位选——顺序反了就会出重影。我前面给的 Timer1_ISR 里就是标准的“关位选 → 送段码 → 开位选”三步。5.4 现象仿真运行极慢一个测距周期要等好几秒Proteus 仿真速度和电脑性能、电路复杂度直接相关。动态数码管扫描 定时器中断 主线循环里的延时函数全部叠加实时仿真模式下每秒只能跑几百条指令整个系统慢得像放幻灯片。很多人误以为是程序死循环其实只是仿真太慢。解决Proteus 菜单 Debug → Animate 里调整仿真速度或者直接关闭动画帧率显示把数码管扫描频率降到 1ms 一次可以明显提速。还有一个技巧仿真验证逻辑阶段把主循环里的延时从 100ms 临时改成 10ms跑通了再改回来。如果还是慢尝试用 Paste 模式Debug → Execute只跑几个毫秒仿真时间观察关键引脚波形。5.5 现象用 11.0592MHz 晶振测出来的距离整体偏大实物上验证时用尺子量 50cm数码管显示 54cm而且距离越远偏差越大成比例增长不是固定偏差。这是定时器时间单位搞错了11.0592MHz 晶振下机器周期是 12 ÷ 11.0592 ≈ 1.085us定时器每计一个数代表 1.085us而代码里按 1us 算距离自然偏大 8.5%。解决要么换回 12MHz 晶振咕咚咕咚把串口波特率不准的问题另想办法要么改换算系数。把我前面代码里的 time × 17 ÷ 10 改成 time × 18 ÷ 10因为 1.085 × 0.017 ≈ 0.0184。这也是为什么我做单片机项目时如果不涉及串口通信就一律用 12MHz省心。6. 从仿真走向实物验证声速补偿与串口回显的最后一公里仿真跑通不代表实物就能直接跑。我在从 Proteus 移植到真实 HC-SR04 时踩过一个印象很深的坑仿真里障碍物是理想反射面回波信号干净利落而实物的 Echo 引脚在探头正对桌面时会在距离小于 3cm 时出现“盲区”——超声波还没发完就返回了测距值变成乱码。所以实物验证时第一件事不是看代码而是把探头抬到离地 10cm 以上对准一面平整的墙。实物的验证方法我推荐三管齐下第一串口回显距离值到电脑上位机这样能看到连续变化曲线判断是否跳变第二用尺子量五个固定距离点10cm、20cm、50cm、100cm、150cm记录误差并画出来看是不是线性递增线性递增就是声速补偿没做第三对着风扇吹风改变环境温度看距离值是否稳定这能间接验证温度补偿代码有没有生效。最后说一个习惯我每次做完仿真项目都会在代码开头留下一个“仿真/实物”切换宏定义比如 #define HARDWARE_VERSION 1。仿真时用 12MHz 的系数实物切换到 11.0592MHz 的系数。有这个开关后续改程序、调参数时就不用到处翻计算过程。这个小习惯不知道救了我多少次——至少那次 8.5% 的偏差我当时只需要改一个宏就完成了修正而不是把三处系数全部重算一遍。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
51单片机超声波测距系统仿真:HC-SR04与LCD1602完整实现 简介:基于51单片机的超声波测距系统仿真工程包,面向51单片机入门学习者与电子爱好者,以HCSR04超声传感器完成距离检测,并用LCD1602显示屏实时呈现测量数值。配套Keil开发工程与Proteus仿真电路,可在虚拟环境下验证程序… · 2026/11/3 7:52:01
“臻”未来招聘主题项目:从口号到落地全流程解析 “臻”未来——等你改变世界,这句话放在招聘页面上,第一眼看上去像一句宏大的口号。但干过招聘的人都懂,越是这种带点理想主义的文案,背后越是要有实打实的东西托底,否则候选人面试完出门就会觉得被骗了。我过去几年参… · 2026/11/3 7:51:01
Claude Code源码泄露全解析:终端AI编程代理架构与安全边界 最近技术圈最热的话题,绕不开Claude Code。安装教程到处都是,接DeepSeek的折腾帖一个接一个,突然“Claude Code源码泄露”的消息又冲上热门,直接把这款AI编程工具推到风口浪尖。我也花了不少时间把社区里流传的零碎信息翻来覆去看… · 2026/11/3 7:51:01
宏智树AI如何革新学术研究流程 1. 项目概述:重新定义AI辅助学术研究的边界 去年帮导师带本科生论文时,发现一个有趣现象:学生们使用AI工具时普遍存在两极分化——要么完全依赖生成内容导致学术事故,要么因担心抄袭彻底拒绝技术辅助。这促使我系统测试了市面上12… · 2026/11/3 15:56:52
OIF-CEI-05.2电气契约解析:高速SerDes互操作的物理层底线 简介:本资源为光学互联论坛(OIF)于2024年1月正式发布的最新版CEI高速电气接口标准——OIF-CEI-05.2实施协议官方PDF文档,面向芯片设计、高速互连系统开发、数据中心架构及光模块研发等领域的工程师与标准研究者。该标准统一规范了… · 2026/11/3 15:56:52
AI学术研究助手:从文献检索到论文写作的全流程解决方案 1. 项目概述:重新定义AI在学术研究中的角色"数字科研伙伴"这个概念正在颠覆传统认知中AI辅助写作的工具属性。作为一名在学术写作和AI交叉领域深耕多年的研究者,我见证了从早期简单的语法检查工具到如今具备全流程研究辅助能力的智能系统演进过… · 2026/11/3 15:56:52
nerf-slam复现编译排错:依赖、CMake与CUDA/torch 简介:面向希望从零复现 NeRF-SLAM 的研究者与三维重建方向的学习者,这份 docx 文档以实操记录加原理解读的方式,梳理了神经辐射场与 SLAM 结合的完整链路。包内共 1 个 docx 文件,约 11.01MB,内容兼顾公式推导与工程细… · 2026/11/3 15:56:52
CSP-J/S第一轮分数线深度解析:省际差异、划线逻辑与预估方法 每年到了第一轮成绩公布那几天,后台总会被同一类问题刷屏:某个省今年大概多少分能进第二轮、为什么隔壁省分数差那么多、孩子考了多少分到底稳不稳。这类问题看着简单,真要回答清楚,得把分数线背后的东西掰开揉碎讲。2019年那一届… · 2026/11/3 15:56:52
链表操作精要:快慢指针与回文判断实战 1. 链表基础与问题概述 链表作为一种基础数据结构,在实际编程和算法面试中出现频率极高。今天我想和大家分享两个经典的链表问题:寻找链表的中间节点(876题)和判断链表是否为回文(234题)。这两个问题看似简… · 2026/11/3 15:55:51
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46