
简介压缩包内含一套基于ADC0808的简易示波器修改版工程面向电子、通信及单片机学习者用于在计算机上仿真真实示波器的波形采集与显示帮助理解垂直系统、水平系统、触发等核心概念同时解决实物仪器昂贵、实验条件受限的问题。包内共19个文件约71KB主要包含Keil C51工程文件如.c源码、.a51启动代码、.hex烧录文件、.uv2工程、Proteus仿真设计文件.DSN、.PWI以及编译过程生成的.lst、.obj、.m51等辅助文件足以完整还原仿真环境。当前已有155人学习下载适合配合示波器原理教程进行实操也可用于课程设计或电子竞赛备赛。通过该工程读者能学习信号采集与ADC转换、波形显示算法、触发控制逻辑以及Keil与Proteus联合仿真流程掌握简易数字示波器的软硬件协同设计思路并可直接修改参数进行二次开发。1. 为什么我选择用仿真来学示波器手里有个“shiboqi.rar_示波器 仿真”的压缩包刚打开时以为里面只是几个Multisim文件翻完才发现是把示波器的主要测量场景都给整合进来了从最基础的正弦波观测到电源纹波、上升沿、眼图甚至和Simulink联合仿真的模型都有。对于刚入门的电子爱好者或者还没买到示波器的学生来说这个包的价值不在于文件本身而在于它提供了一套“没有硬件也能练手”的完整路径。很多人觉得示波器仿真没意义毕竟真实波形里面全是噪声和毛刺仿真太“干净”了。但我自己的经验是仿真恰恰是理解示波器工作原理的最快方式。你在真实示波器上按下一堆旋钮可能只记得“波形出来了”但不清楚带宽、采样率、存储深度之间怎么互相制约。仿真软件里你可以把每一个参数拎出来单独调看到它带来的直观影响这种“拆开揉碎”的学习方式在真实仪器上反而很难做到。这个包适合三类人一是刚学电路基础、还没入手示波器的学生二是需要验证电路设计、但手头仪器不够用的工程师三是想快速搞清楚眼图、FFT这些进阶功能到底在测什么的人。下面我把自己的使用过程和踩过的坑都写出来希望能帮你省点时间。2. 示波器仿真的核心原理与实现方式2.1 示波器到底在测什么先回到最根本的问题示波器测的是电压随时间变化的曲线。听起来简单但“怎么测”里面藏着很多门道。在真实示波器里探头会先把电压信号衰减或放大到ADC能接收的范围然后以固定时间间隔采样再把采样点拼接起来显示。关键点在于采样频率必须足够高否则高频信号会被“混叠”波形看起来频率变低了。这个现象在仿真里同样存在很多仿真软件提供的虚拟示波器模型也会模拟ADC的采样过程只是默认参数设置得比较理想化。2.2 仿真软件中的示波器模型不同软件对示波器的仿真方式差别很大。Multisim自带的虚拟示波器是最常见的它的模型偏“教学向”界面和真实示波器有些差距但胜在直观。Proteus里的虚拟仪器则更适合和单片机联调比如用传感器采集信号再通过示波器观察。还有LTspice它本身没有花哨的示波器界面更侧重仿真数据的后处理通常要把波形数据导出来再用其他工具画。这个“shiboqi.rar”包里主要用的是Multisim的模型这一点在文件名后缀上就能看出来。实际上包里的文件组织方式很值得参考它把不同的测量场景分成了独立文件夹每个文件夹里有电路图和一份简要说明这样你可以在不破坏原文件的情况下随意修改电路。2.3 关键参数采样率、带宽、存储深度这三个参数是理解示波器仿真的钥匙也是判断一个模型“真不真”的标尺。采样率Sample Rate每秒采集多少个点。仿真模型里如果设置过低正弦波会变成折线设置过高则会拖慢仿真速度因为要处理的数据量变多了。带宽Bandwidth示波器能准确显示的最高信号频率。一般来说要测的信号频率不能超过示波器带宽的三分之一到五分之一否则幅度测量误差会超过3%。存储深度Memory Depth一次能保存多少个采样点。它决定了你在高采样率下能观察多长的时间窗口。很多仿真默认不限制存储深度但这和真实情况不符建议自己在心里有个数。我记得自己第一次用Multisim仿真一个10MHz的方波时发现上升沿怎么都测不准后来才意识到虚拟示波器的默认带宽可能只有几百kHz需要在仪器属性里手动改。这一点和真实示波器完全一致测量高频信号时带宽不够会导致上升沿变缓、幅度偏低。这些细节如果你没在仿真里留意过上手真机时很容易被误导。3. 实操从shiboqi.rar搭建你的第一个测量场景3.1 资源包内容与解压第一步当然是解压。注意这个包的名字是“shiboqi.rar”解压后建议不要直接在压缩包里打开文件因为Multisim这类软件在工作时会产生临时文件如果路径里有中文或者特殊字符很容易出现模型加载报错。我习惯先把整个文件夹复制到某个纯英文路径下比如D:\simulation\oscilloscope再开始操作。解压后你会看到类似下面的文件结构oscilloscope/ ├── 01_basic_sine │ ├── sine_wave.ms14 │ └── readme.txt ├── 02_power_ripple │ ├── ripple_circuit.ms14 │ └── readme.txt ├── 03_edge_measurement │ ├── edge_test.ms14 │ └── readme.txt └── 04_eye_diagram ├── eye_pattern.ms14 └── readme.txt每个文件夹对应一个独立的实验场景。我用的是Multisim 14如果你用更高版本打开旧版文件一般没什么问题但可能会提示“模型版本过于老旧”这时候可以选择“保留原格式打开”或者干脆重新创建一个电路图把里面的元件复制过去。3.2 以Multisim为例搭建电路如果你打开01_basic_sine看到的应该是类似这样的电路一个信号发生器Function Generator通过电阻分压网络连接到虚拟示波器的通道A地面共用。这个电路很简单但有几个地方值得注意。第一信号发生器的“Amplitude”幅度参数在Multisim里默认是峰值Vp不是有效值Vrms。很多人习惯在设定信号源时直接填有效值比如“1V”结果一看示波器上是1.414V的峰值还以为电路有问题。这里要养成习惯先确认软件里的单位是峰值、峰峰值还是有效值再开始测量。第二虚拟示波器的“Channel Settings”里有一个“Scale”参数对应的是每格代表的电压值。如果设置得太大波形看起来就是一条直线设置得太小波形又会超出屏幕顶部。通常做法是先设为自动等波形出现后再手动微调。打开仿真开关后如果一切正常你应该能看到一条正弦波。这时候可以试着调整信号源的频率从1kHz逐步提高到1MHz同时观察波形显示的变化。这个过程能帮你熟悉一个概念观察快速变化的信号时需要增大水平方向的时间刻度Time Scale才能看清波形的完整周期观察慢速信号时则需要缩小时间刻度才能看到多个周期。3.3 测量电源纹波与上升沿接下来重点说两个高频场景电源纹波测量和上升沿测量。这两个都是实际工作中最常遇到也最容易在仿真里“翻车”的。电源纹波测量在02_power_ripple文件夹里。典型电路是一个AC源经过二极管整流桥、电容滤波后给负载供电输出端会有微小的波动。仿真示波器测这个纹波时有一个关键窍门必须把通道的“耦合方式”Coupling改成“AC”才能滤掉直流分量看到微弱的交流纹波。如果你用DC耦合直流电压会把波形顶到屏幕外纹波根本看不见。我在实际使用中试过用虚拟示波器直接测量一个DC-DC仿真模型的输出发现纹波波形很不平滑原因是Multisim自带的虚拟示波器在显示高频噪声时绘制算法会把一些像素点连成锯齿状。这不是测量错误而是显示分辨率问题。解决办法是减少显示波形的时间窗口让细节放大或者改用“Simulate - Analysis - Transient Analysis”来查看数据这样能导出更精确的波形点。上升沿测量在03_edge_measurement文件夹里。方波从低电平跳变到高电平的时间就是上升沿。仿真中我习惯在信号发生器里选择“Square”波形然后观察虚拟示波器上的跳变沿。你会发现一个问题虚拟示波器默认的显示级别下上升沿看起来几乎是垂直的根本没法具体读数。这时候需要用游标Cursor功能把游标分别放在波形10%和90%电平的位置软件会自动计算时间差。这个测量过程里最容易被忽视的是“带宽限制”选项。很多虚拟示波器模型默认没有开启带宽限制导致方波的高频分量被全部显示出来上升沿测量结果会比真实示波器测得的值更陡。如果你要对比仿真和实测数据一定要在示波器属性里把带宽限制设置成一个合理的值比如100MHz这样才能模拟真实仪器的响应。3.4 保存与导出数据仿真完成后的数据保存是个容易被忽略的环节。Multisim里的虚拟示波器可以直接截屏但截屏图没法数字化处理。更好的方式是使用“Simulate - Analysis - Transient Analysis”的“Output”选项卡选择要导出的节点软件会把数据保存为文本文件或CSV。导出的数据包含时间和电压两列直接用文本编辑器打开就能看到原始数值。如果你后续要用MATLAB做FFT分析这一步非常重要。因为Multisim自带的FFT功能比较弱而且界面不直观我通常会把CSV数据导入MATLAB再用fft()函数做频谱分析。这里要提醒一下导出数据的采样间隔必须保持恒定否则FFT结果会出现严重失真。Multisim的瞬态分析默认采用变步长算法导出的时间序列可能不是等间隔的。处理办法是在瞬态分析设置里把“Maximum time step”设为一个固定值比如0.001秒这样导出的数据点时间间隔就均匀了。4. 仿真中常见的坑与排查技巧4.1 波形不显示的常见原因我遇到过好几次仿真开始后虚拟示波器屏幕上一片空白但电路明明在运行。排查了一遍发现原因五花八门。最常见的是通道没接对。Multisim的虚拟示波器每个通道都有“”和“-”两个端点很多人只接了正端负端悬空。虽然仿真里悬空不一定报错但波形会变得极其微弱或者干脆是一条直线。正确做法是把负端接到电路的参考地正端接测量点。第二个原因是时间刻度设置不合理。如果示波器的Time Scale设为10ms/Div而信号周期是1kHz即1ms屏幕上只能看到一个小起伏像是一条线。解决办法是先把Time Scale调大比如调到0.1ms/Div看到完整波形后再微调。第三个原因是触发电平Trigger Level设置过高。虚拟示波器也有触发机制如果触发电平高于信号的最大值就无法触发波形不会稳定显示。把触发模式设置为“Auto”电平设到波形中间值附近问题基本就解决了。4.2 仿真速度慢怎么办仿真一个含有复杂芯片或高频信号源的大电路时Multisim可能会卡得让人怀疑人生。我试过仿真一个带PWM控制的电源电路加上虚拟示波器后速度慢到每秒只能刷几帧用鼠标拖动一个元件都要等两秒。这里有两个实用的提速技巧。第一降低信号源的频率或者增大仿真步长。虚拟示波器采集的点数和信号频率直接相关频率越高单位时间内需要处理的数据量越大。如果只是验证波形形态可以把频率降低到原来的十分之一仿真速度会立刻上来。第二关闭不必要的实时显示。在仿真设置里把“Curve resolution”调低或者暂时关闭其他仪器的显示窗口只留一个示波器界面能减少很多图形渲染开销。如果还不行可以用Transient Analysis替代虚拟示波器进行仿真它不需要实时刷新波形数据计算完成后一次性绘制速度会快很多。4.3 测量结果和理论差一倍可能是触发电平问题有朋友跟我说他仿真一个正弦波通过半波整流电路结果测到的输出电压比理论计算值正好低了一倍。起初以为电路搭错了检查了一遍完全正确后来发现是虚拟示波器的测量方式出了问题。原来Multisim的虚拟示波器在默认情况下显示的是“峰值”而不是“有效值”。理论计算用的是电压有效值而示波器上看的却是电压峰值两者之间相差根号2倍看起来就像“差了一倍”。这个现象在真实示波器中也存在示波器默认显示的是幅度不会自动给你算有效值。许多刚接触示波器的人容易在这里犯迷糊。解决办法很简单在示波器的测量栏里选择“Vrms”或“Vpp”或者在仿真后通过游标读取理想的电压值再手动换算。还有个类似情况是测方波平均电压。如果方波不是50%占空比示波器上显示的均值会随占空比变化而很多人直接读取“幅度”就会和万用表测到的直流值对不上。记住一句口诀示波器擅长看“形”万用表才擅长读“准”。仿真里也一样如果你需要精确的有效值或平均值最好让软件帮忙计算不要肉眼读数。5. 几个进阶玩法眼图、联合仿真与外部数据导入5.1 眼图分析与算法眼图不是某个具体波形而是一种把大量数字信号比特周期重叠在一起显示的统计图形。在仿真里生成眼图的方法是把一串伪随机二进制信号输入到被测系统中在示波器上把每个比特周期对齐重叠显示。通过观察眼图张开度可以判断信道质量的优劣比如噪声大小、码间干扰程度等。在shiboqi.rar包里04_eye_diagram这个文件应该就包含了一个简单的眼图生成电路信号源产生2-PAM信号经过一个低通滤波器再接入虚拟示波器。但直接用Multisim的虚拟示波器看眼图效果并不好因为它没有专门的“无限余辉”Persistence功能重叠波形很快就会糊成一片。这时候更好的做法是把仿真的波形数据导出再用Python或者MATLAB画眼图。我自己用Python写过几行简单的眼图绘制代码先将CSV数据按符号周期分段然后每段画成一条线叠加在同一坐标系中。注意要先对采样点做重采样确保每段包含相同的点数否则对不齐。这个脚本在我的日常信号完整性分析中已经替代了半部分商用软件的功能。5.2 和Simulink/CARSIM联合仿真很多人不知道Multisim的数据其实可以实时传到Simulink里做联合仿真。方法不算复杂在Multisim和Simulink之间通过一个共享接口推荐用标准TCP/IP通信交换数据。Multisim负责电路级仿真Simulink负责系统级控制算法验证。比如你想验证一个PID控制器驱动直流电机的效果就可以在Simulink里搭PID算法把控制信号发给Multisim中的电机模型电机反馈的电流电压再传回Simulink。示波器在中间起到“监视器”的作用。几个常用的仿真软件也有类似的联合仿真接口比如CARSIM和Simulink联合仿真主要用在汽车动力学控制领域。虽然CARSIM和Multisim没有直接关系但思路是一致的联合仿真的核心是“数据流顺畅”两端的数据类型、通信周期、端口映射必须提前设计好。我第一次做联调时就是因为Simulink的固定步长和Multisim的可变步长不一致导致数据不同步波形一直对不上。解决办法是把Simulink的求解器设为固定步长步长大小与Multisim的数据导出间隔一致。5.3 把CSV导入MATLAB做FFT最后一个进阶玩法也是我工作中最常用的一招把示波器仿真导出的CSV数据拿到MATLAB里做FFT分析。前面已经提到导出时一定要注意固定时间步长这里再补充一个实际操作中的经验最好先把CSV文件里的表头信息删掉只留纯数值这样MATLAB的readmatrix函数读起来不会遇到数据类型问题。导入后用N length(data); Fs 1/(time(2)-time(1)); f (0:N-1)*Fs/N;计算频率轴再对电压数据进行FFT取幅值谱画出来你就能看到波形的频谱分布。我常拿这个方法来验证一个信号发生器产生的方波到底含有哪些谐波以及无源滤波器对各次谐波的抑制效果。如果你的目标是低通滤波器的截止频率就可以用这个方法快速扫频一次仿真得到频响曲线。需要注意的是FFT结果会受“频谱泄漏”影响。如果信号频率不是FFT频率分辨率的整数倍主峰会向两边扩展。解决办法是在做FFT前给数据加一个汉宁窗Hanning window这样可以有效减小旁瓣泄漏。具体的窗函数选择和信号类型有关测稳态正弦波用汉宁窗很合适测瞬态脉冲则更适合用矩形窗不要一概而论。写在最后这个“shiboqi.rar_示波器 仿真”包看起来只是几个仿真文件但用熟练了之后你会发现它就像是一个随身携带的波形实验室。我在没有示波器的那段时间就是用这类仿真工具练出了读波形的直觉看到一条波先猜它的频率、幅度、上升沿再去仿真正验证。时间长了再上真实示波器时基本不会手忙脚乱。最后再分享一个小技巧仿真示波器的数据导出功能不只是为了“交作业”更是为了培养“数据化”的思维。不管你以后是调电路、做嵌入式还是搞信号处理能快速从一个波形文件里提取出有效信息永远是受用不尽的底层能力。希望这份内容能帮你少走一点弯路把示波器真正“玩明白”。本文还有配套的精品资源点击获取