《单片机汇编》期末考试、考研常见考题、习题,题型汇总(五十)、DAC0832讲解及程序

小知识点补充15:
DA转换器两种输出形式:
1,电压型输出
2,电流型输出(实际需要模拟电压输出时需在输出端加运放)

小知识点补充16:
DA转换器主要技术指标有:
1,分辨率:指单片机输入给DA转换器的单位数字量的变化所引起的模拟量输出的变化。定义:输出满刻度值与2^n之比(n为DA的二进制位数)
2,建立时间:用于表明转换时间或转换速度。其值为从输入数字量到输出达到终值误差正负(1/2)LSB(最低有效位)时所需时间。
3,转换精度:位数越多,精度越高
(1)绝对转换精度
(2)相对转换精度

DAC0832芯片介绍:

在这里插入图片描述
(DAC0832实物图)

1,DAC08328位的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器(寄存器)、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。

2,主要参数

**  分辨率为8**  电流稳定时间1us,即电流输出,建立时间为1us
**  可单缓冲、双缓冲或直接数字输入
**  只需在满量程下调整其线性度
**  单一电源供电(+5V~+15V)
**  低功耗,20mW

3,引脚介绍
DAC0832引脚图:
DAC引脚图
DAC0832内部结构图:
在这里插入图片描述

* DI0~DI7:8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错)
* ILE:     数据锁存允许控制端,高电平有效
* CS:      片选信号输入线(选通数据锁存器),低电平有效
* WR1:     数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效(低电平有效)。由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存
* XFER:    数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效
* WR2:     DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换
* IOUT1:   电流输出端1,其值随DAC寄存器的内容线性变化
* IOUT2:   电流输出端2,其值与IOUT1值之和为一常数,即IOUT1+IOUT2=常数
* RFB:     反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
* Vcc:     电源输入端,Vcc的范围为+5V~+15V;
* VREF:    基准电压输入线,VREF的范围为-10V~+10V;
* AGND:    模拟信号地;
* DGND:    数字信号地。

4,工作方式
根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:直通方式、单缓冲方式和双缓冲方式

(1)单缓冲方式:单缓冲方式是控制输入寄存器和DAC寄存器同时接收数据,或者只用输入寄存器而把DAC寄存器接成直通方式。此方式适用只有一路模拟量输出或几路模拟量异步输出的情形。

(2)双缓冲方式:双缓冲方式是先使输入寄存器接数据,再控制输入寄存器的输出资料到DAC寄存器,即分两次锁存输入数据。此方式适用于多个D/A转换同步输出的情节。

(3)直通方式: 直通方式是数据不经两级锁存器锁存,即 CS*,XFER* ,WR1* ,WR2* 均接地,ILE接高电平。此方式适用于连续反馈控制线路和不带微机的控制系统,不过在使用时,必须通过另加I/O接口与CPU连接,以匹配CPU与D/A转换。
参考图如下:
在这里插入图片描述
(此图摘自百度)

题48

1,利用DAC0832产生锯齿波
2,利用DAC0832产生三角波

连接原理图如下图:
在这里插入图片描述

程序源码:
1,锯齿波汇编程序:

	ORG 0000H
	LJMP START
	ORG 0030H
START:
	MOV DPTR,#7FFFH
L1:
	CLR A
	MOV R7,#0FFH
LOOP:
	MOVX @DPTR,A
	INC A
	DJNZ R7,LOOP
	AJMP L1
	SJMP $
	END

1,锯齿波C程序:

#include "reg51.h"
#include "absacc.h";此文件里的内容前文提过

#define DAC0832ADDR XBYTE[0X7FFF]

#define uchar unsigned char
#define uint  unsigned int

uint count=0;

int main()
{
	while(1)
	{
		for(count=0;count<256;count++)
			DAC0832ADDR=count;		
	}
	return 0;
}

仿真图:
在这里插入图片描述
备注:锯齿波实际上每一个斜边分成256个台阶,只是简单的测试,若需使用DAC0832做实际东西请见此文:“基于51单片机的波形发生器(初版)”

2,三角波汇编程序:

	ORG 0000H
	LJMP START
	ORG 0030H
START:
	MOV DPTR,#7FFFH
	CLR A
L1:
	MOVX @DPTR,A
	INC A
	CJNE A,#255,L1
L2:
	MOVX @DPTR,A
	DEC A
	CJNE A,#00H,L2
	AJMP L1
	END

2,三角波C程序:

#include "reg51.h"
#include "absacc.h"

#define DAC0832ADDR XBYTE[0X7FFF]

#define uchar unsigned char
#define uint  unsigned int

uint count=0;

int main()
{
	while(1)
	{
		for(count=0;count<256;count++)
			DAC0832ADDR=count;
		for(count=255;count>=0;count--)
			DAC0832ADDR=count;		
	}
	return 0;
}

仿真图:(简单测试)
在这里插入图片描述
备注:产生方波只需给高低电平然后延时,产生正弦波利用查表指令。
上述程序均是单缓冲方式

扩展:直通方式产生三角波:
电路图:
在这里插入图片描述
程序源码:

	ORG 0000H
	LJMP START
	ORG 0030H
START:
	CLR A
L1:
	MOV P0,A
	NOP
	NOP
	NOP
	INC A
	CJNE A,#255,L1
L2:
	MOV P0,A
	NOP
	NOP
	NOP
	DEC A
	CJNE A,#00H,L2
	AJMP L1
	END

注:程序基本没变,主要变化是在硬件电路连接上

仿真图:
在这里插入图片描述
对比可发现:缓冲方式和直通方式产生的波形是有一定差别的,直通方式更接近我们想要的波形(在仿真软件上),但在做实物时,根据实际情况选择工作方式。可参考:
基于单片机的波形发生器(初版)

原创文章 59 获赞 52 访问量 1万+

猜你喜欢

转载自blog.csdn.net/liuxianfei0810/article/details/105763381
今日推荐