纯数字电路超声波测距设计:NE555与CD4026的无单片机实现
2026/9/20 6:51:50 网站建设 项目流程

简介:面向电子综合设计与超声波测距实验的一份技术报告,旨在展示不使用单片机、仅靠纯数字电路实现超声波测距雷达的完整方案。报告以两级NE555振荡器产生驱动脉冲,经发射探头发出超声波;回波信号再经两级放大、检波后,根据发射与接收的时间差和空气中声速换算距离,最终由计数、锁存及译码电路在数码管上直接显示。内容覆盖项目计划、系统框图、单元模块设计原理与调试说明,包括超声波产生、载波发生器、发射驱动、接收电路、时间测量、计数脉冲、锁存显示和电源等章节,可帮助读者理解纯硬件测距链路。资源包共1个PDF文件,大小974KB,结构紧凑,适合数字电路课程设计、电子竞赛备赛或想摆脱单片机限制、深入理解底层测距原理的学习者。该资源已有160人学习下载,借助报告中的原理分析和模块拆解,可掌握NE555振荡参数配置、微弱回波放大与检波处理,以及计数器、锁存器和数码管协同工作的设计方法。

1. 用纯数字电路做超声波测距:比单片机方案更接近物理层

超声波测距这件事,很多开发者在车库倒车雷达、机器人避障、液位监测里都做过。常见做法是拿一块 51 或 STM32 单片机,定时器产生 40kHz 脉冲串,外部中断捕获回波,再用软件把时间差换算成距离。这方案没有错,但它把超声波测距最核心的东西——信号链、时序、盲区——全藏进了寄存器里。而标题里这个“不使用单片机的超声波测距”,用 NE555、CD4017、LM393、CD4026 一类纯数字电路搭出完整测距链路,上电即出数,不烧一行代码。它解决的不只是“能不能测距”,而是让你把发射、接收、计时、显示每一级都用示波器看明白。适合电子类学生做课程设计,也适合搞硬件但没仔细抠过时序的工程师回头补课。单片机方案里那些定时器中断的底层逻辑,其实就是这套数字电路的原型。

2. 超声波测距的纯数字架构与量程预算

2.1 测的是回波时间,不是距离本身

超声波测距的物理基础很直接:发射 40kHz 的超声脉冲,碰到障碍物反射回来,接收头捕捉到回波,记录从发射到接收的时间差 t。声波在空气中的传播速度 v 已知,距离就是时间差的一半:

d = v × t / 2

注意是“一半”,因为 t 是来回双程时间。比如 20℃ 干燥空气里 v ≈ 343m/s,如果测到回波时间 2.9ms,那么距离 d = 343 × 0.0029 / 2 ≈ 0.5m。与单片机方案不同,纯数字电路里这个“记录时间差”的动作不是靠定时器中断完成的,而是靠计数器从发射时刻开始数时钟脉冲,回波一到就停止计数。计数值 N 乘以时钟周期,就是回波时间。

声速不是常数,温度每升高 1℃,声速大约增加 0.6m/s。工程上常用经验公式:

v = 331.4 + 0.6 × T

其中 T 是摄氏温度。这个修正在后面标定的时候会用到。湿度、气压对声速的影响在通常室内环境下小于 1%,做超声波测距课程设计时基本可以忽略,但室外大风环境要考虑,不过那是后话。

2.2 四段信号链与器件划分:不是所有模拟电路都要数字化

纯数字电路做测距,不等于电路里不能有模拟器件。超声波接收头输出的是几十毫伏级的高频信号,必须经过放大和比较才能变成数字电平。这里“纯数字”指的是:从时间测量到结果显示的整条主链路完全由逻辑门、计数器、译码器完成,不包含微处理器,没有软件参与。

一段完整的超声波测距信号链可以切成四块:

功能块推荐器件作用
发射振荡NE555产生 40kHz 方波,驱动超声波发射头
脉冲串门控CD4017每轮只放行几个脉冲,控制盲区和功耗
接收调理运放 + LM393 / CX20106A把回波放大、检波、整形为数字电平
计时与显示CD4026 × 4 或 CD4020 + EPROM计数回波时间,锁存并驱动数码管

有人会质疑:CX20106A 内部是模拟电路,这算纯数字吗?严格来说,接收前端的模拟放大无法避免,因为声波本身就是模拟量。纯数字电路的意义在于时间基准、计数、锁存、译码这些测距核心动作完全由数字时序控制。只要不出现 CPU、不写代码,这个标题的定位就成立。实际制作时,CD4026 的方案最省事:它内部集成了十进制计数、锁存、七段译码和进位输出,四片级联就能做出四位数的计时显示器,省掉一大堆 74 系列芯片。

2.3 时钟频率与量程预算:先算好再焊板

纯数字电路没法像单片机那样随便改定时器预分频值,时钟频率在选器件的时候就决定了量程和分辨率。以四片 CD4026 构成的四位十进制计数器为例,最大计数值 9999。若计时时钟为 f_clk,那么最大可测回波时间:

t_max = 9999 / f_clk

对应最大单程距离:

d_max = v × t_max / 2

不同时钟频率下的参数对比如下,声速按 343m/s 估算:

计时时钟最大计数值最大回波时间最大距离每个计数对应距离
1MHz99999.999ms约 1.71m0.17mm
500kHz999919.998ms约 3.43m0.34mm
170kHz999958.8ms约 10.1m1mm
100kHz999999.99ms约 17.1m1.7mm

从表里能看出两个结论。第一,单片机能轻松做到几十厘米量程内的毫米级精度,纯数字电路只要把时钟频率选得合适也能做到,但想同时兼顾大量程和高分辨率就得增加计数器位数。第二,160kHz 左右的计时时钟可以直接让“每个计数等于 1mm”,这样数码管显示值直接就是毫米数,省去换算逻辑。这是后面第 4 章要展开的选频设计。实际选时钟时我一般先定量程,再反推频率,而不是先定频率再看能测多远。

3. 40kHz 发射链路与回波接收:NE555、放大和比较器的参数计算

3.1 NE555 做 40kHz 振荡器:RC 参数与微调方法

NE555 接成无稳态多谐振荡器,输出方波驱动超声波发射头。振荡频率由 R1、R2 和 C 决定:

f = 1.44 / ((R1 + 2 × R2) × C)

R1 是从放电端到电源的电阻,R2 是从放电端到触发/阈值端的电阻,C 是定时电容。占空比大约为 (R1 + R2) / (R1 + 2 × R2),略高于 50%,对驱动压电陶瓷片没有影响。超声波测距对频率精度要求不高,40kHz ± 1kHz 都能正常工作,但最好用示波器实测调整,因为 NE555 内部比较器的阈值离散性会导致理论值和实测值有百分之几的偏差。

下面这段 Python 脚本可以在选电阻电容前快速估算频率:

# ne555_freq.py - 计算NE555无稳态振荡频率 def ne555_freq(r1_ohm, r2_ohm, c_farad): # 公式来源:NE555数据手册中的无稳态工作频率 return 1.44 / ((r1_ohm + 2 * r2_ohm) * c_farad) # 一组常见参数:R1=1k, R2=4.7k, C=3.3nF f = ne555_freq(1000, 4700, 3.3e-9) print(f"f = {f/1000:.1f} kHz") # 如果希望微调,可以给R2串联一个2k电位器 f_low = ne555_freq(1000, 3700, 3.3e-9) f_high = ne555_freq(1000, 5700, 3.3e-9) print(f"微调范围: {f_low/1000:.1f} ~ {f_high/1000:.1f} kHz")

运行结果会显示,R1=1kΩ、R2=4.7kΩ、C=3.3nF 时,频率约为 42.0kHz,比目标 40kHz 稍高一点。给 R2 串联一个 2kΩ 电位器,微调范围大概在 38.6kHz ~ 45.5kHz 之间,足够覆盖 40kHz 点。实际焊接时,R2 可以先用 3.9kΩ 固定电阻串 2kΩ 电位器,上电后一边看示波器频率一边拧电位器,这是最稳妥的做法。注意 NE555 的供电要加 0.1μF 去耦电容,放在 VCC 与 GND 之间,否则 40kHz 的高频分量会通过电源线干扰接收链路。

3.2 用 CD4017 只发 8 个脉冲:盲区与功耗的折中

超声波发射头如果连续被驱动,回波会被发射信号淹没。常见做法是让 NE555 振荡器只在短时间内工作,输出一串固定数量的脉冲后停振,等到回波接收完毕再重新触发。CD4017 是一个十进制计数器/分配器,利用它的进位输出可以方便地实现脉冲串门控。

让 CD4017 的 Q0 到 Q7 依次输出高电平,当 Q8 变高时,用它去关断 NE555 的复位端,振荡器停止。这样每个测距周期只发射 8 个 40kHz 脉冲。为什么是 8 个而不是 40 个?因为每个脉冲周期是 25μs,8 个脉冲持续 200μs,声音在这段时间里传播约 68mm,即最近可测距离约 34mm。脉冲再多,盲区会线性增大;脉冲太少,回波能量不足,接收端难以检测。

实际电路里,压电陶瓷片在激励停止后还有余振,通常持续约 0.5ms ~ 1ms,对应单程距离 17cm ~ 34cm。所以即便用 8 个脉冲,整机盲区也在 20cm 上下,这是超声波测距的物理限制,不是电路设计缺陷。用收发分离探头可以稍微压低盲区,但直达波串扰仍然存在。做倒车雷达时一般要求最近可测 30cm 左右,这个指标刚好卡在余振边界上,因此接收电路必须能在余振衰减后尽快响应,这就引出下一节的内容。

3.3 回波调理:从微伏级正弦波到数字脉冲

接收头输出的回波信号幅度很小。1 米外的平面障碍物,反射回波经接收头转换后大约只有几毫伏到几十毫伏,需要先放大再整形。两级带通放大是常见做法,中心频率选 40kHz,每级增益 30dB 左右,两级加起来 60dB,足够把 10mV 信号放大到 10V 量程边缘。运放可以选 NE5532,带宽远高于 40kHz,噪声也低。每级用 RC 带通反馈网络,品质因数 Q 控制在 2 ~ 5,Q 太高会导致频率漂移时增益骤降,Q 太低则选择性差,环境噪声容易混进来。

放大之后不要直接把 40kHz 正弦波送给计数器,因为数字芯片会把每个过零沿都当成有效沿。正确做法是先做包络检波,再用比较器整形。包络检波用一支 1N4148 二极管加 RC 并联电路,R 取 10kΩ,C 取 10nF,时间常数 100μs,差不多是 4 个 40kHz 周期,能把正弦包络平滑成一条缓慢下降的直流曲线。比较器用 LM393,同相端接包络信号,反相端接电位器分压得到的阈值电压。阈值调在几十毫伏,太高会漏掉远距离弱回波,太低会被噪声误触发。

LM393 是开集电极输出,必须接上拉电阻到 VCC,再接一个 74HC14 施密特触发器整形,把边沿变陡。到这里,回波链路输出的就是一个干净的数字电平下降沿,可以交给计数器环节了。调试时如果发现收不到回波,先用示波器看运放输出端有没有 40kHz 正弦包络,再看比较器输出有没有脉冲,一级一级排查,问题基本都出在放大级和阈值设置上。

4. 用 CD4026 与选频把时间变成厘米:计数器、锁存与查表显示

4.1 CD4026 四位十进制计数器:清零、计数、锁存一体的最小计时器

CD4026 是一块很特别的芯片,内部集成了十进制计数器、七段锁存/译码器和进位输出,可以直接驱动共阴数码管。这意味着不需要额外的 74HC573 锁存器和 CD4511 译码器,一片芯片完成计数到显示的全部工作。四片 CD4026 级联,就能做成四位数码管的微秒计时器。

电路接法如下:第一片 CD4026 的 CLK 端接计时时钟(比如 1MHz),它的进位输出 CO 接第二片的 CLK,第二片接第三片,以此类推。所有片的 MR(复位)连在一起,测距周期开始时给一个高电平脉冲清零。所有片的 LE(锁存)连在一起,回波到来时拉高,显示值立刻被锁存,不再跟随时钟变化。

工作时序用一条线串起来就是:发射信号上升沿触发单稳电路,产生 1μs 的复位脉冲清空四片 CD4026,然后释放 LE,1MHz 时钟开始计数。回波整形后的下降沿送到触发器,把 LE 拉高,计数停止。此时数码管上显示的数字 N,就是回波时间对应的微秒数。CD4026 的计数频率上限约 2MHz(VDD=5V 时),1MHz 有充足裕量,但超过 2MHz 会导致漏计数,这一点在选择计时时钟时要留意。

4.2 锁存时机与显示稳定性:回波一到就锁,不能反复锁

为什么必须锁存?如果 LE 一直为低,计数器会一直随着 1MHz 时钟跑,数码管闪烁,人眼根本读不出数。回波到来时锁存一次,显示保持到下一次测距周期开始,这样人眼看到的是稳定读数。

关键在“锁存一次”。超声波回波往往不是只有一个脉冲,障碍物表面可能产生多次反射,比较器也可能因为噪声抖动输出几个沿。如果每个下降沿都去触发 LE,显示值会被后到的回波覆盖,测到的可能就是二次反射的距离。解决办法是用一片 D 触发器或 RS 触发器做成“只锁第一次”的逻辑:发射开始时把触发器置位,使能锁存;第一个回波沿通过触发器后,把锁存信号拉高,同时把触发器复位,使其不再响应后续的沿。这个单脉冲逻辑是纯数字电路测距成败的细节之一,比起反复判断“哪个回波是真实的”,不如在硬件上只认第一个沿。

4.3 数码管读出微秒数,怎么换算成毫米

CD4026 直接显示的是回波时间。20℃ 时声速 343m/s,1μs 对应单程距离约 0.171mm,即每 5.85μs 对应 1mm。手里如果拿着手机计算器,把读数乘 0.171 就是毫米数,但作为一台独立的测距仪,这显然不够好。

最简单的落地方法是选频法:把计时时钟设计成 171.5kHz 左右,让每个计数恰好等于 1mm。171.5kHz 不是标准晶体频率,常见做法是用 1.029MHz 有源晶振经过 6 分频得到 171.5kHz,或者用 NE555 调到一个接近值,再在标定时微调。这样数码管读出的 N 直接就是毫米,四位显示最大 9999mm,完全覆盖超声波的有效量程。表 2 里的 170kHz 行就是为这个方案预留的。

如果不想凑时钟频率,也可以用查表法:计时时钟保持 1MHz,把 CD4026 输出的 BCD 码当作地址,用一片 EPROM 存储“微秒到毫米”的映射表。EPROM 的输出就是毫米值,再接 CD4511 译码显示。温度变化导致声速改变时,重新烧录一版 EPROM 就行,不用动硬件。下面是生成映射表的 Python 脚本:

# gen_lut.py - 生成 1MHz 计时时钟的"微秒->毫米"查表 def speed_of_sound(temp_c): # 干燥空气近似公式,温度单位摄氏度 return 331.4 + 0.6 * temp_c v = speed_of_sound(20) # 20℃声速 # 往返每毫米需要的时间,单位 us/mm us_per_mm = 1000.0 / v * 2 print(f"20℃时 {us_per_mm:.2f} us = 1mm") for us in range(0, 2000, 100): mm = us / us_per_mm print(f"{us:5d}us -> {mm:6.1f}mm")

脚本输出结果可以用来核对查表数据。例如 200μs 对应约 34mm,583μs 对应约 100mm,2915μs 对应约 500mm。实际做 EPROM 表时,把全部 0 ~ 9999μs 按每 μs 一条算出毫米值,烧进 2764 之类 8KB EPROM 的低 13 位地址即可。查表法比选频法多几片芯片,但胜在改温度、改时钟频率都只是重新算表,适合做完之后还想继续扩展的人。

5. 不用单片机时的调试技巧:波形判读、两点标定与误触发抑制

5.1 用逻辑分析仪同时抓 TRIG、ECHO、LE 三条线

纯数字电路调试最大的优势是每个信号都能直接看。把逻辑分析仪的三个通道分别接到发射门控信号 TRIG、回波整形输出 ECHO、锁存信号 LE,采样率设到 10MHz 以上,触发沿设为 TRIG 上升沿,一次采 10ms。逻辑分析仪导出的 CSV 可以用下面脚本快速算出回波时间:

# parse_logic_analyzer_csv.py - 从逻辑分析仪CSV计算回波时间 import csv, sys t_trig = None t_echo = None with open(sys.argv[1]) as f: for row in csv.DictReader(f): if row['TRIG'] == '1' and t_trig is None: t_trig = float(row['time']) if t_trig is not None and row['ECHO'] == '1' and t_echo is None: t_echo = float(row['time']) break if t_trig and t_echo: dt_us = (t_echo - t_trig) * 1e6 mm = dt_us / 5.85 # 20℃声速下,5.85us/mm print(f"回波时间 {dt_us:.1f}us, 距离约 {mm:.0f}mm") else: print("未捕获到完整回波,检查ECHO通道")

值得说明的是:脚本里的 5.85μs/mm 只在 20℃ 干燥空气中成立。如果环境温度偏离,应先用公式 v = 331.4 + 0.6×T 重算。波形判读时,正常的 ECHO 应该在 TRIG 高电平结束后几百微秒到几毫秒内出现,如果不能稳定出现,优先怀疑发射频率偏差,用示波器看 NE555 输出是否在 40kHz 附近。

5.2 两点标定:用平面钢板在 0.5m 和 1.0m 处校准

任何测距系统出厂前都要标定。纯数字电路没有软件参数可改,标定就是微调硬件。取一块平整钢板或硬纸板,垂直正对探头,先放 0.5m 处记录显示值,再放 1.0m 处记录一次。20℃ 时理论回波时间分别为 2915μs 和 5831μs。如果两个点显示值都成比例偏差,说明计时时钟频率不准,调 NE555 的电位器,或者在有源晶振方案里更换分频电阻。如果 0.5m 点准、1.0m 点不准,说明声速公式里的温度设置不对,按当前室温修正 EPROM 表或选频法里的速度常数。

标定记录可以写成这样一张表:

实际距离理论回波时间实测显示偏差处理方式
0.500m2915μs2890μs-25μs微调计时频率
1.000m5831μs5810μs-21μs微调计时频率

两次偏差接近,说明系统误差主要是时钟偏快,微调后两点都会收敛。

5.3 抑制误触发:最小屏蔽时间与单脉冲锁存

误触发是纯数字电路超声波测距最常见的问题。发射探头和接收探头即使分开放置,发射瞬间的串扰也会在接收端产生一个强信号,可能让比较器误翻转。解决方法是给计时电路加一个最小屏蔽时间:发射开始后的 400μs ~ 800μs 内,强制封锁计数和锁存信号,让这段时间内的噪声直接失效。实现方式是在 TRIG 信号后接一个由 NE555 构成的单稳态电路,输出高电平期间把 CD4026 的 LE 锁死。

屏蔽时间的取值要结合盲区来定:400μs 的屏蔽时间对应约 6.8cm 盲区,800μs 对应约 13.6cm 盲区。如果实际应用要求探测 20cm 内的障碍,屏蔽时间可以适当缩短到 300μs,但如果发现近距离频繁误触发,就把屏蔽时间逐步加大到 1ms,直到稳定。这个参数没有统一最优值,和应用场景的噪声环境强相关,调的时候每次加 100μs,记录最近稳定距离,找到一个属于自己的平衡点。单脉冲锁存逻辑和前文所述的“只认首回波”触发器配合使用,基本能过滤掉绝大多数二次反射误报。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询