news 2026/5/1 4:03:41

51单片机汇编实验:基于AT89C51微控制器与DAC0832的波形发生器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
51单片机汇编实验:基于AT89C51微控制器与DAC0832的波形发生器

【声明】该博客仅供个人学习参考与研究,禁止进行任何方式的学术剽窃(如直接抄袭、盗用电路设计等),由于读者自身造成的一切学术不端行为与原作者无关。

实验要求

1.利用AT89C51微控制器和DAC0832构成波形发生器,能至少输出方波、锯齿波、三角波和正弦波中的一种。

2.让DAC0832工作于直通方式,利用AT89C51微控制器的P0口直接输给DAC0832数据口;

3.画出AT89C51实现上述功能的完整电路图,包括微控制器电源、复位电路、晶振电路和控制电路。

4.完成全部程序和电路调试工作。

说明:DAC0832的参考电平引脚Vref=0~+5V可调,输出运放电源采用+15V和-15V双极性供电。

拓展需求(选做)

1.分别用P1.0、P1.1、P1.2和P1.3控制方波、锯齿波、三角波和正弦波输出的选择开关,低电平有效。

2.分别用P1.4、P1.5、P1.6和P1.7控制方波、锯齿波、三角波和正弦波的指示灯,低电平有效。)

3.利用AT89C51微控制器P2口作为频率选择的输入口,输入数据范围0~255,值越大频率越高。(选做)

实验目的

1.了解D/A转换的基本原理;

2.了解D/A转换芯片0832的性能及编程方法;

3.了解波形发生器的工作原理。

实验设计

1硬件电路图

2程序

;--- 寄存器定义 --- DAC_PORT EQU P0 ; DAC0832 数据口 SW_INPUT EQU P1 ; P1.0-P1.3 为波形选择开关 LED_PORT EQU P1 ; P1.4-P1.7 为波形指示灯 FREQ_PORT EQU P2 ; 频率控制输入口 ;--- 程序入口 --- ORG 0000H LJMP START ORG 0030H START: ; 初始化 MOV DAC_PORT, #80H ; DAC输出中间值 MOV P1, #0FFH ; P1口置高:低4位做输入准备,高4位LED全灭(设LED低电平亮) MAIN_LOOP: ; --- 流程图逻辑开始 --- ; 1. 检测方波开关 (P1.0) JB P1.0, CHK_SAW ; 如果P1.0是高电平(未按下),跳转检查锯齿波 ; P1.0按下 (方波选择) CLR P1.4 ; 点亮方波指示灯 (P1.4) SETB P1.5 ; 熄灭其他灯 SETB P1.6 SETB P1.7 LCALL WAVE_SQUARE ; 调用方波子程序 SJMP MAIN_LOOP ; 执行完一周期后重新检测(实现循环) CHK_SAW: SETB P1.4 ; 熄灭方波灯 ; 2. 检测锯齿波开关 (P1.1) JB P1.1, CHK_TRI ; 未按下,查三角波 ; P1.1按下 (锯齿波选择) CLR P1.5 ; 点亮锯齿波指示灯 SETB P1.6 SETB P1.7 LCALL WAVE_SAW ; 调用锯齿波子程序 SJMP MAIN_LOOP CHK_TRI: SETB P1.5 ; 熄灭锯齿波灯 ; 3. 检测三角波开关 (P1.2) JB P1.2, CHK_SINE ; 未按下,查正弦波 ; P1.2按下 (三角波选择) CLR P1.6 ; 点亮三角波指示灯 SETB P1.7 LCALL WAVE_TRI ; 调用三角波子程序 SJMP MAIN_LOOP CHK_SINE: SETB P1.6 ; 熄灭三角波灯 ; 4. 检测正弦波开关 (P1.3) JB P1.3, ALL_OFF ; 未按下,去全灭逻辑 ; P1.3按下 (正弦波选择) CLR P1.7 ; 点亮正弦波指示灯 LCALL WAVE_SINE ; 调用正弦波子程序 SJMP MAIN_LOOP ALL_OFF: SETB P1.7 ; 熄灭正弦波灯 ; 如果没有按键按下,保持输出不变或输出0,这里选择循环检测 SJMP MAIN_LOOP ;==================================================================== ; 通用延时子程序 (频率控制) ; P2值越大 -> 频率越高 -> 延时越短 算法: 延时次数 = (255 - P2值) ;==================================================================== DELAY_FREQ: PUSH ACC ; 保护累加器 PUSH 07H ; 保护R7 MOV A, FREQ_PORT ; 读取P2口频率设定值 CPL A ; 取反 (例如: P2=255(FF) -> A=0; P2=0 -> A=255) JZ DELAY_MIN ; 如果结果为0,说明P2是255(最高频),直接返回 MOV R7, A ; 将反码存入R7作为循环次数 DLY_LOOP: DJNZ R7, DLY_LOOP ; 简单的软件延时循环 DELAY_MIN: POP 07H POP ACC RET ;==================================================================== ; 1. 方波生成子程序(输出00H -> 延时 -> 输出FFH -> 延时) ; 与其他波形频率近似(每周期约256步),循环调用延时128次高电平/128次低电平 ;==================================================================== WAVE_SQUARE: MOV R6, #128 ; 半周期计数 SQ_HIGH: MOV DAC_PORT, #0FFH ; 输出最大值 LCALL DELAY_FREQ DJNZ R6, SQ_HIGH MOV R6, #128 ; 半周期计数 SQ_LOW: MOV DAC_PORT, #00H ; 输出最小值 LCALL DELAY_FREQ DJNZ R6, SQ_LOW RET ;==================================================================== ; 2. 锯齿波生成子程序(0 -> 255, 步长2) ;==================================================================== WAVE_SAW: MOV A, #00H ;以此为起点 SAW_LOOP: MOV DAC_PORT, A ; 输出当前值 LCALL DELAY_FREQ ; 延时 ADD A, #02H ; 步长 +2 JNZ SAW_LOOP ; 如果没溢出回0,继续循环 RET ;==================================================================== ; 3. 三角波生成子程序(0 -> 254 (上升), 254 -> 0 (下降), 步长2) ;==================================================================== WAVE_TRI: MOV A, #00H ; 起点 ; 上升段 (0 -> 254) TRI_UP: MOV DAC_PORT, A LCALL DELAY_FREQ ADD A, #02H CJNE A, #0FEH, TRI_CHK_UP ; 判断是否达到254 (0FEH) SJMP TRI_DOWN_START ; 达到顶点,开始下降 TRI_CHK_UP: JC TRI_UP ; 如果A < FE,继续上升 ; 下降段 (254 -> 0) TRI_DOWN_START: MOV A, #0FEH TRI_DOWN: MOV DAC_PORT, A LCALL DELAY_FREQ CLR C SUBB A, #02H JNZ TRI_DOWN ; 直到减到0 MOV DAC_PORT, A ; 输出最后的0 LCALL DELAY_FREQ RET ;==================================================================== ; 4. 正弦波生成子程序 (查表法) ; 逻辑: 查表输出0-255个点 ;==================================================================== WAVE_SINE: MOV DPTR, #SINE_TABLE ; 指向表头 MOV R6, #0 ; 计数器 0-255 SINE_LOOP: MOV A, R6 MOVC A, @A+DPTR ; 查表 MOV DAC_PORT, A ; 输出 LCALL DELAY_FREQ INC R6 MOV A, R6 JNZ SINE_LOOP ; 循环256次 RET ;==================================================================== ; 正弦波数据表 (0-360度,256个采样点,幅值0-255) ; y = 128 + 127 * sin(x) ;==================================================================== SINE_TABLE: DB 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 162, 165, 168, 171, 174 DB 176, 179, 182, 185, 188, 191, 193, 196, 199, 201, 204, 206, 209, 211, 213, 216 DB 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 237, 239, 240, 242, 243, 245 DB 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 254, 255, 255, 255, 255, 255 DB 255, 255, 255, 255, 255, 255, 254, 254, 253, 252, 252, 251, 250, 249, 248, 247 DB 246, 245, 243, 242, 240, 239, 237, 236, 234, 232, 230, 228, 226, 224, 222, 220 DB 218, 216, 213, 211, 209, 206, 204, 201, 199, 196, 193, 191, 188, 185, 182, 179 DB 176, 174, 171, 168, 165, 162, 158, 155, 152, 149, 146, 143, 140, 137, 134, 131 DB 128, 125, 122, 119, 116, 113, 110, 107, 104, 101, 98, 94, 91, 88, 85, 82 DB 80, 77, 74, 71, 68, 65, 63, 60, 57, 55, 52, 50, 47, 45, 43, 40 DB 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 19, 17, 16, 14, 13, 11 DB 10, 9, 8, 7, 6, 5, 4, 4, 3, 2, 2, 1, 1, 1, 1, 1 DB 1, 1, 1, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 9 DB 10, 11, 13, 14, 16, 17, 19, 20, 22, 24, 26, 28, 30, 32, 34, 36 DB 38, 40, 43, 45, 47, 50, 52, 55, 57, 60, 63, 65, 68, 71, 74, 77 DB 80, 82, 85, 88, 91, 94, 98, 101, 104, 107, 110, 113, 116, 119, 122, 125 END

实验调试与结果分析

1调试过程中遇到的问题及其解决办法

问题1:频率控制逻辑相反(P2口值越大,频率越低)。

实验要求P2口输入值越大频率越高,但在初步编程时发现,当P2设置为255(全1)时,波形变化极慢;设置为0时反而最快。

原因分析:在编写延时子程序时,直接将P2口的数值作为循环减法的初始值。数值越大,DJNZ循环次数越多,导致延时越长,频率自然越低。

解决办法:在读取P2口数据后,增加了一条CPL A(取反)指令。例如输入255(FFH),取反后为0,延时最短,频率最高;输入0,取反后为255,延时最长。从而满足了实验要求的逻辑。

DELAY_FREQ: PUSH ACC PUSH 07H MOV A, FREQ_PORT CPL A ; 【新增】取反 (例如: P2=255(FF) -> A=0; P2=0 -> A=255) JZ DELAY_MIN MOV R7, A

问题2:三角波与锯齿波波形顶部出现“削顶”或频率过低。

生成的三角波周期过长,且在仿真中观察到波形不够平滑。

原因分析:最初采用步长为1INC A的方式累加。由于0-255需要循环256次,导致波形周期较长。

解决办法:步长调整为2ADD A, #02H,虽然采样点减少了一半(每周期约128点),但在8051较低的主频下,这样既提高了波形的刷新率,又保证了肉眼观察的平滑度,同时避免了累加溢出导致的波形畸变

SAW_LOOP: ...... ADD A, #02H ; <--步长+2 ...... TRI_UP: ...... ADD A, #02H ; <--步长+2 ......

2写出实验结果并进行分析

本实验成功利用AT89C51和DAC0832实现了多波形发生器设计,达成设计目的:能够用P1.0~P1.3控制方波、锯齿波、三角波和正弦波输出的选择开关;能够用P1.4~P1.7控制方波、锯齿波、三角波和正弦波的指示灯;利用AT89C51的P2口作为频率选择的输入口,输入数据范围0~255,值越大频率越高。

(1)选择开关指示灯实现结果如下:

  • 波形选择器选择1方波→D2亮起→示波器显示方波
  • 波形选择器选择2锯齿波→D3亮起→示波器显示锯齿波
  • 波形选择器选择3三角波→D4亮起→示波器显示三角波
  • 波形选择器选择4正弦波→D5亮起→示波器显示正弦波

(2)频率选择实现结果如下:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:03:32

LangChain资源精选集:AI应用开发的导航地图与实战指南

1. 项目概述&#xff1a;为什么我们需要一个LangChain资源精选集如果你最近在搞AI应用开发&#xff0c;尤其是基于大语言模型&#xff08;LLM&#xff09;的智能体&#xff08;Agent&#xff09;或者复杂工作流&#xff0c;那你大概率听说过或者用过LangChain。这个框架火起来的…

作者头像 李华
网站建设 2026/5/1 4:02:18

Taotoken模型广场如何帮助开发者快速选型与切换模型

Taotoken模型广场如何帮助开发者快速选型与切换模型 1. 模型广场的核心价值 Taotoken模型广场为开发者提供了集中查看和管理多个厂商大模型的统一入口。通过该功能&#xff0c;开发者无需分别登录不同厂商的控制台&#xff0c;即可在一个界面中浏览各模型的详细信息。这种设计…

作者头像 李华
网站建设 2026/5/1 4:02:02

科研绘图不用熬软件!虎贲等考 AI 科研绘图,一键出期刊级学术配图

临近毕业答辩、期刊投稿、课题申报&#xff0c;所有人都会遇到同一个难题&#xff1a;论文写得再好&#xff0c;缺一张专业规范的科研图表&#xff0c;直接被导师打回、被审稿人返修。学术论文里的图表&#xff0c;不只是装饰&#xff0c;更是研究逻辑、实验数据、变量关系、技…

作者头像 李华
网站建设 2026/5/1 4:00:59

Sunshine游戏串流:打造个人云游戏服务器的完整技术指南

Sunshine游戏串流&#xff1a;打造个人云游戏服务器的完整技术指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款开源的游戏串流服务器软件&#xff0c;能够将高性…

作者头像 李华
网站建设 2026/5/1 3:59:25

Flux2-Klein-9B-True-V2应用场景:服装设计图案生成与面料纹理模拟

Flux2-Klein-9B-True-V2应用场景&#xff1a;服装设计图案生成与面料纹理模拟 1. 模型简介与核心能力 Flux2-Klein-9B-True-V2是基于FLUX.2-Klein-9B微调的先进图像生成模型&#xff0c;专为创意设计领域优化。这个模型不仅能根据文字描述生成高质量图像&#xff0c;还能对现…

作者头像 李华