ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

51单片机DAC0832数模转换Proteus仿真与波形生成详解

51单片机DAC0832数模转换Proteus仿真与波形生成详解 简介这是一套面向单片机初学者的Proteus仿真实验资料围绕51单片机控制DAC0832芯片实现数模D/A转换完整展示从电路搭建、程序编写到仿真验证的全过程。资源共含21个文件包括C语言源码、A51启动文件、Proteus工程文件、Hex烧录文件以及多张仿真结果截图另有工程备份与编译日志等辅助材料压缩包整体仅638KB结构清晰、便于对照学习。目前已有5064人学习下载。通过该实验可掌握51单片机I/O口与DAC0832的接线方式、单缓冲/双缓冲工作模式配置理解数字量到模拟电压输出的转换原理同时熟悉Proteus虚拟仿真调试的完整流程。对于正在学习单片机接口技术或准备电子设计竞赛的读者是一份直观、可复现的实操练习素材。1. 51单片机D/A转换仿真的第一步让P1口的数字量真正变成电压第一次在Proteus里做51单片机D/A转换大部分人不是被代码难住而是被“明明P1口已经赋值输出电压却一直不动”卡住。这不是单片机没跑起来而是DAC0832的使能引脚没接对或者运放的电源引脚被Proteus悄悄藏起来了。数模D/A转换实验的核心是把二进制数字量映射成连续电压而在Proteus里借助虚拟直流电压表和示波器可以零成本观察这个映射过程。本文以DAC0832为转换核心从内部R-2R梯形网络原理讲起再到两级运放搭建0~5V输出电路、51单片机C语言查表生成锯齿波三角波正弦波最后落在示波器验证和校准技巧上适合课程设计、毕业仿真和自学数模转换原理的工程师。2. DAC0832数字量转模拟量的原理与Proteus选型2.1 DAC0832内部结构与输出电压公式D/A转换器的本质是按位加权求和。DAC0832内部采用R-2R梯形电阻网络把Vref参考电压按二进制权重分配到每个位上最终从Iout1引脚输出与数字量成正比的电流。这个网络只有R和2R两种阻值制造精度容易做高同时天然满足二进制分流的数学关系。DAC0832是电流输出型器件输出量不是电压而是电流。设8位数字量为D0~255等效网络电阻约为15kΩ则Iout1 (Vref × D) / (256 × R)外部必须接运算放大器把电流转成电压。DAC0832内部已经把反馈电阻Rfb做到芯片里典型接法是Iout1接运放反相输入端Rfb引脚接运放输出端内部反馈电阻完成电流到电压的闭环。此时第一级输出为反相电压Vout1 -Iout1 × Rfb ≈ -(Vref × D) / 256当Vref 5V时输出范围是0到约-4.98V是负电压。想要得到常规的0~5V正电压还需要第二级反相放大器做一次反相最终Vout (Vref × D) / 256D 0x80即128时Vout 2.5V这是验证D/A转换最直接的数值。引脚名称方向作用直通模式接法DI0~DI7输入8位数字量输入接51单片机P1口ILE输入输入锁存允许高有效接5VCS输入片选低有效接GNDWR1输入写输入寄存器接GNDWR2输入写DAC寄存器接GNDXFER输入传输控制信号接GNDVref输入参考电压接5VIout1输出电流输出1接运放反相端Iout2输出电流输出2接GNDRfb输出内部反馈电阻引出接运放输出把ILE接高、CS和WR全部接地两个内部寄存器都处于透明状态DAC0832工作在“直通模式”。程序往P1口写什么数字输出电流立即跟随变化这是做教学实验最不容易出错的接法。2.2 为什么Proteus仿真优先选DAC0832Proteus元件库里可以做D/A转换的器件不止一种常见的有DAC0832、DAC0808还有纯软件方案“PWMRC滤波”。选型时要看实验目的如果是为了讲清楚并行D/A转换原理DAC0832的双缓冲结构和Rfb反馈电阻都值得演示。方案输出类型是否需要锁存接线复杂度Proteus仿真注意事项DAC0832电流输出内置双缓冲中必须外接两级运放DAC0808电流输出无锁存中高速波形会出现毛刺PWMRC滤波电压输出不需要低精度依赖RC时间常数DAC0808没有输入锁存器数据变化时输出会短暂出现中间态毛刺仿真里用示波器能看到信号边沿的毛刺。PWMRC滤波方案虽然简单但本质上是用时间平均模拟电压带负载能力差而且没法演示D/A转换器的建立时间、双缓冲等概念。因此Proteus课程设计和51单片机数模转换实验里DAC0832始终是首选。需要说明的是Proteus中DAC0832同样需要运算放大器配合LM358是仿真中最常用的双运放后续电路搭建部分按LM358展开。3. 在Proteus中搭建DAC0832两级运放输出电路3.1 Proteus元件库中的器件准备用Proteus 8 Professional打开一个新工程在器件选择界面中搜索以下元件。元件库的搜索关键词尽量用芯片全名比如DAC0832可以缩写作DAC0832或DAC0808AT89C51在单片机分类里直接输入即可。器件Proteus关键词数量用途51单片机AT89C511输出8位数字量D/A转换器DAC08321电流输出双运放LM3581两级电流转电压电阻RES2只10kΩ第二级反相比例电源符号POWER15V接地符号GROUND若干公共地虚拟电压表DC VOLTMETER1静态电压校验虚拟示波器OSCILLOSCOPE1波形观察放置完器件后双击AT89C51在属性窗口把Clock Frequency设为12MHz。仿真中晶振电路和复位电路可以省略Proteus会自动给单片机提供默认复位如果这是用于提交的课程设计原理图再补上晶振和复位电路否则仿真运行更干净这是Proteus仿真51单片机项目与实物设计的一个明显差异。3.2 两级运放实现0~5V正电压输出电路接线的核心是运放的两个闭环。第一级运放完成电流转电压第二级把负电压反相成正电压。第一步P1.0~P1.7依次接DAC0832的DI0~DI7注意引脚顺序P1.0对应最低位DI0P1.7对应最高位DI7接反会导致输出电压数值错乱。第二步ILE接5VCS、WR1、WR2、XFER全部接地DAC0832进入直通模式。第三步Vref接5VIout2直接接地Iout1接LM358内第一个运放的反相输入端也就是U1A的2脚。U1A的3脚接地Rfb引脚接U1A的1脚输出端。此时负反馈通过DAC0832内部电阻形成不需要额外加反馈电阻。第四步U1A输出接一只10kΩ电阻到U1B的6脚反相输入端U1B的5脚接地U1B的7脚与6脚之间接另一只10kΩ反馈电阻构成放大倍数为-1的第二级反相放大器。U1B的7脚就是最终的D/A输出电压节点接虚拟电压表和示波器。需要特别提醒运放的供电问题。Proteus中的LM358符号有时不显示V和V-引脚但这不意味着它不需要电源。双击LM358查看属性里的Supply1和Supply0默认可能是5V和-5V为了给DAC输出留足裕量建议设置为12V和-12V。如果运放电源电压不够输出电压会在接近电源轨处削顶波形看起来像是被切了一刀。提示在Proteus中如果运放属性里没有Supply1/Supply0说明该模型采用默认供电此时应检查是否为默认5V导致的输出饱和。3.3 常见接法误区直通模式虽然简单但接线错误往往很隐蔽。输出始终为0V优先检查ILE是否接了高电平输出一直为满偏先怀疑Vref引脚是否悬空或运放电源是否没接输出是负电压且数值随D值变化说明第二级反相放大没搭好或是U1A输出直接接到了示波器上没有经过U1B。另外Iout2不要靠得太远尽量就近接地否则仿真中虽然不会有明显噪声但转成实际PCB时这是经常出问题的点。4. 51单片机C语言驱动DAC0832生成波形4.1 锯齿波、三角波与方波的驱动程序DAC0832工作在直通模式下51单片机程序的核心只有一条语句把数字值赋给P1口。下面是一个可以烧进Proteus仿真的完整C程序包含三种基础波形切换。#include REG52.H #define DAC_OUT P1 void delay(unsigned int t) { while (t--); } void sawtooth_wave(void) { unsigned char v; for (v 0; v 255; v) { DAC_OUT v; delay(50); } } void triangle_wave(void) { unsigned char v; for (v 0; v 255; v) { DAC_OUT v; delay(50); } for (; v 0; v--) { DAC_OUT v; delay(50); } } void square_wave(void) { DAC_OUT 0x00; delay(200); DAC_OUT 0xFF; delay(200); } void main(void) { while (1) { sawtooth_wave(); } }这段程序里sawtooth_wave让数字量从0递增到254每步延时一次D/A输出对应一个从0V起、每次上升约19.5mV的阶梯电压整体形成锯齿波。triangle_wave在前半段递增后半段递减构成三角波。square_wave直接把输出拉到0V和约5V两个状态产生方波。delay函数在12MHz晶振下一个while循环大约是几个到十几个机器周期机器周期为1μs所以delay(50)大约是0.2~0.5ms。这个延时水平既能让DAC0832有充足建立时间又能让示波器看清波形适合教学演示。把delay参数改大波形频率变低改小频率变高但当延时太短时Proteus的仿真步长会成为新瓶颈。4.2 用Python生成正弦波系数表正弦波是D/A转换进阶实验的标准内容。51单片机直接调用浮点sin函数计算会拖慢速度常见做法是在PC端把正弦表生成好作为常量数组烧进ROM。用Python生成64点正弦表只需要几行代码import math N 64 amp 127.5 offset 127.5 table [] for i in range(N): value int(round(offset amp * math.sin(2 * math.pi * i / N))) table.append(f0x{value:02X}) print(, .join(table))逻辑说明正弦函数输出范围是-1到1乘以127.5后再加上127.5偏移把结果映射到0~255范围内正好匹配8位D/A的满量程。i0时对应正弦起点输出0x80即128对应2.5V中心电压。64个点代表一个完整周期。把生成结果粘回Keil工程配合查表循环即可unsigned char code sin_table[64] { 0x80, 0x8C, 0x98, 0xA3, 0xAD, 0xB6, 0xBD, 0xC3, 0xC7, 0xCA, 0xCB, 0xCA, 0xC7, 0xC3, 0xBD, 0xB6, 0xAD, 0xA3, 0x98, 0x8C, 0x80, 0x73, 0x67, 0x5C, 0x52, 0x49, 0x42, 0x3C, 0x38, 0x35, 0x34, 0x35, 0x38, 0x3C, 0x42, 0x49, 0x52, 0x5C, 0x67, 0x73 }; void sine_wave(void) { unsigned char i; for (i 0; i 64; i) { DAC_OUT sin_table[i]; delay(50); } }在Keil C51中unsigned char后加code关键字数组会固定在程序存储区而不是占用宝贵的内部RAM。查表法输出正弦波的频率由两个因素决定查表点数和每次查表间的延时。64点、每次delay约0.3ms时一个周期大约19ms频率约50Hz在示波器上能清楚看到正弦形状。如果想要更高频率减小delay参数即可。4.3 直通模式下P1口赋值的时序含义直通模式省略了DAC0832的锁存时序程序执行“DAC_OUT v”这条语句时P1口电平变化D/A输出立即跟随。这是用D/A转换实验入门51单片机并行总线操作最容易理解的路径但也要知道实际工程中很少让DAC寄存器一直透明。真实系统中通常用CS和WR配合产生写时序把DAC0832映射到外部RAM地址空间用一条MOVX指令完成数据锁存。Proteus仿真做课程设计时直通模式已经足够演示原理但如果后续要做带缓冲的多通道D/A建议再研究双缓冲时序。5. 用Proteus示波器校验波形与D/A输出校准技巧5.1 虚拟示波器通道设置与波形观察把OSCILLOSCOPE放入原理图通道A的正极接U1B的输出端负极接地。双击示波器在通道设置里把电压档位设为1V/Div时间基准先设为5ms/Div。运行仿真后示波器上应该能看到锯齿波。如果看到的是一条水平直线先检查延时是否过大导致波形周期过长把时间基准调小再看。如果波形顶部或底部被削平说明运放供电电压不足或者Vref超过运放共模范围。如果正弦波看起来有明显台阶这是8位D/A的正常量化效果每个量化台阶约19.5mV不需要处理。波形周期可以直接从示波器网格读出。一个周期占几格乘以时间基准得到周期后取倒数就是频率。这个验证方法比估算delay内部循环周期数要可靠得多。提示Proteus仿真速度会随波形频率升高而下降锯齿波上千Hz时可以正常观察超过几十kHz时仿真会明显变慢这是解释型仿真的特性。5.2 零点校准与D/A转换精度验证静态电压验证最能暴露接线逻辑问题。修改main函数让P1口输出固定值用虚拟电压表读取实际输出。D0x80时应为2.5VD0xFF时应约为4.98V。理论值和实测值的偏差第一级运放和第二级运放都会引入。第二级比例电阻若两只10kΩ不完全相等增益就不是精确的-1输出会有几个毫伏的偏移。数字量理论电压实测电压误差0x000V0x401.25V0x802.50V0xC03.75V0xFF4.98V校准方法很直接在第二级运放反馈电阻上串联一个可调电阻万用表显示2.50V时微调直到D0x80输出精确等于2.5V再验证满量程。由于Proteus里的电阻默认精度极高仿真中看到的误差主要来自运放偏置而实物中电阻精度会成为更大误差源。一个实用的进阶技巧是把延时参数做成变量配合矩阵键盘或数码管显示当前数字量和实测电压就变成了一个可调频率、可读数值的D/A信号发生器这是51单片机数模转换课程设计中最多见的扩展方向。本文还有配套的精品资源点击获取
返回列表