淮南联合大学 方向红
实训课题七 D/A与 A/D 转换
DAC0832 及其单片机的接口 7.1
ADC0809 及其与单片机的接口
7.2
DAC0832 应用举例7.2
7.3
7.4 ADC0809 应用举例
淮南联合大学 方向红
7.1 DAC0832 及其与单片机的接口 一、 芯片主要特性与结构
淮南联合大学 方向红
输入
锁存器
DAC
寄存器
D/A
转换器
DI7~DI0
I LE
CS
WR1
WR2 XFER
VREF
IOUT2
IOUT1
Rfb
AGND
VCC
&&
&
LE1 LE2
淮南联合大学 方向红
引脚功能:
DI0~DI7: 8 位数字信号输入端
:片选端,为低电平时,本芯片被选中。
ILE :数据锁存允许控制端,高电平有效。
:第一级输入寄存器写选通控制,低电平有效。
:第二级 DAC 寄存器写选通控制,低电平有效。
:数据传送控制,低电平有效。
VCC :电源输入端,在 +5V~+15V 范围内。
Rfb :内部反馈电阻引脚
DGND、 AGND :分别为数字信号地和模拟信号地 4
WR1
CS
XFER
2WR
淮南联合大学 方向红
: 负跳变时锁存数据,正脉冲时,输入锁存器的输出随输入变化。
:作用与上面的类似。
IOUT1 :模拟电流输出 1 端,约等于
输入数字量全为“ 1” 时, IOUT1 最大约为 输入数字
量全为“ 0” 时, IOUT1 最小,为“ 0” 。
IOUT2 :模拟电流输出 2 端, IOUT2 + IOUT1 = 常数。
VREF: 基准电压输入端,可在 -10~+10V 范围内调节。
5
LE1
2LE
REFfb
VR
256
输入的数字量
REFfb
VR
256
255
淮南联合大学 方向红
二、 D/A 转换器的主要性能指标
1 、分辨率 指单片机输入给 D/A转换器的单位数字量的变化,所引起的模拟量输出的变化,通常定义为输出满刻度值与 2n之比( n 为 D/A转换器的二进制位数)。
例如:对于 5V的满量程,采用8位的 DAC时,分辨率为 5V/256= 19.5mV;当采用 12位的 DAC时,分辨率则为 5V/4096= 1.22mV。显然,位数越多分辨率就越高。
淮南联合大学 方向红
2 、建立时间 用于表明转换时间或转换速度的一个参数。电流输出型 DAC的建立时间短。电压输出型DAC的建立时间主要决定于运算放大器的响应时间。 根据建立时间的长短,可以将 DAC分成超高速(< 1μS)、高速( 10~ 1μS)、中速( 100~ 10μS)、低速(≥ 100μS)几档。
淮南联合大学 方向红
DAC0832 主要特性
分辨率8位;电流建立时间1 μS ;数据输入可采用双缓冲、单缓冲或直通方式;输入逻辑电平与 TTL 兼容;单电源供电(+ 5V ~+ 15V );低功耗, 20m W。
淮南联合大学 方向红
由于 DAC0832 为电流输出型,要想输出电压,可外接运放,下图是一种典型应用电路
淮南联合大学 方向红
1 .直通方式:
CS 1WR 2WR 当引脚 、 、 、 直接接地, ILE 接电源, DAC0832 工作于直通方式,此时, 8 位输入寄存器和 8 位DAC 寄存器都直接处于导通状态, 8位数字量到达 , 就立即进行 D/A 转换。特点:转换速度快。
三、 DAC0832 与单片机的接口
XFER
80C51
CS
DAC0832
WR1
P1
XFER
8
WR2
D7 0~
+-
VO
淮南联合大学 方向红
2 .单缓冲方式: 输入寄存器和 DAC 寄存器共用一个地址,同时选通输出,输入数据在控制信号作用下,直接进入 DAC 寄存器中; WR1 和WR2 同时进行,并且与 CPU的WR 相连, CPU对 0832 执行一次写操作,将数据直接写入DAC 寄存器中。 适用:只有一路模拟信号输出或几路模拟信号非同步输出。
80C51
P2.7
P0
WR
CS
XFER
WR1
WR2
ILE
VCC+5V
-+
Rfb
VO
DA
C08
32
IOUT1
IOUT2
1kΩ
1MΩDI0
DI7
DGNDVSS 1/4LM324VREF-5V
淮南联合大学 方向红
3 .双缓冲方式:
输入寄存器和 DAC 寄存器分配有各自的地址,可分别选通用同时输出多路模拟信号。适用:同时输出几路模拟信号的场合,可构成多个 0832 同步输出电路。 当 8 位输入锁存器和 8 位DAC 寄存器分开控制导通时, DAC0832 工作于双缓冲方式,双缓冲方式时单片机对DAC0832 的操作分两步,第一步,使 8 位输入锁存器导通,将 8 位数字量写入 8 位输入锁存器中;第二步,使 8 位DAC 寄存器导通, 8 位数字量从 8 位输入锁存器送入 8 位DAC 寄存器。第二步只使 DAC 寄存器导通,在数据输入端写入的数据无意义。
淮南联合大学 方向红
80C51
P2.7
P0
WR
CS
XFER
WR1
WR2
ILE
VCC
DA
C08
32(1
)
DI0
DI7
CS
XFER
WR1
WR2
ILE
VCC
+5V
DA
C08
32(2
)
DI0
DI7
P2.6
P2.5
淮南联合大学 方向红
四、应用实例——简易锯齿波发生器
淮南联合大学 方向红
程序:
#include<reg51.h>#include<absacc.h> // 绝对地址访问头文件#define uchar unsigned char#define unit unsigned int#define DAC0832 XBYTE[0x7fff]void delayms()// 延时函数( T1 定时实现){TH1=0xfc;TL1=0x18;TR1=1;
淮南联合大学 方向红
while(!TF1);TF1=0;} void main() {uchar i; TMOD=0x10; while(1) {for(i=0;i<=255;i++) {DAC0832=i;delayms();} } }
淮南联合大学 方向红
若将 for(i=0;i<=255;i++) {DAC0832=i;delayms();}改为: for(i=255;i>=255;i--) {DAC0832=i;delayms();}则示波器中观察到的波形有什么变化?
问答:如果改变锯齿波的周期和幅值?答:改变延时时间可改变波形周期;改变输出二进
制的最大值,可以改变波形的幅值。
淮南联合大学 方向红
ADC0809 的结构与引脚 1 2 3 4 5 6 7 8 9 1011121314
28272625242322 21 20 19 18 17 16 15
IN3 IN4IN5 IN6IN7
STARTEOC D3OE
CLKVCC
VR(+)GNDD1
IN2IN1IN0ABCALED7D6D5D4D0VR(-)D2
AD
C08
09
7.3 ADC0809 及其与单片机的接口
IN0~ IN7: 8 路模拟信号输入端。D0~D7: 8 位数字量输出端。VR( + )、 VR (−):基准电压输入端。 A 、 B 、 C : 8 路输入通道的选择CLK: 为时钟信号输入端。ALE: 地址锁存允许信号OE :输出允许端START :为启动 A/D 转换的输入端,上升沿复位,下降沿开始转换。EOC: 转换结束信号输出端。转换结束后为高电平。
淮南联合大学 方向红
IN7三态输出锁存器
8路模拟开关
地址锁存与译码
8位A/D转换器
IN0
CBA
ALE
3
D7
D0
D3
D5
D1D2
D4
D6
OE
EOC
VR(+) VR(-)
START CLK
淮南联合大学 方向红
ADC0809A/D 转换器主要性能
分辨率为8位; 精度: ADC0809 小于 ±1LSB ; 单+5V 供电,模拟输入电压范围为 0 ~+ 5V ; 具有锁存控制的8路输入模拟开关; 可锁存三态输出,输出与 TTL 电平兼容; 功耗为 15mW ; 不必进行零点和满度调整; 转换时间约为 100µS (时钟频率 640KHz 时)。
淮南联合大学 方向红
ADC0809 的工作流程1.输入 3位地址,并使 ALE=1,将地址存入地
址锁存器中,经地址译码器译码从 8路模拟通道中选通一路模拟量送到比较器。2.送 START一高脉冲, START的上升沿使逐
次逼近寄存器复位,下降沿启动 A/D转换,并使EOC信号为低电平。3.当转换结束时,转换的结果送入到输出三态锁
存器,并使 EOC信号回到高电平,通知 CPU已转换结束。4.当 CPU执行一读数据指令,使 OE为高电平,
则从输出端 D0~D1读出数据。
淮南联合大学 方向红
START/ALE 地址锁存
ADDA/B/C
EOC
OE
D0~D7
启动
转换结束
读取结果
DATA
淮南联合大学 方向红
ADC0809与MCS-51 单片机的接口
涉及 2 个问题:( 1 ) 8 路模拟信号通道选择;( 2 )A/D 转换完成后转换数据的传送。
转换数据的传送:①定时传送方式;(不需接 EOC 脚)②查询方式;(测试 EOC 脚的状态)③中断方式。( EOC 脚接 INTi 脚)
注意:(1)不能用无条件方式;(2)2个 ALE不能直接相接。
淮南联合大学 方向红
P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7
ALE
WR
P2.7RD
INT0
+
+
+5V
GND
D0D1D2D3D4D5D6D7ADDAADDBADDCCLKALESTART
OE
EOC
IN0IN1IN2IN3IN4IN5IN6IN7
VREF+
VREF-
ADC0809
8051
分频器
淮南联合大学 方向红
ADC0809 与单片机接口
EOC
ADC0809
D0~D7
74L
S37
3
OEG
ALE
80C51
D7::
D0
Q7::
Q0
P3.3
EA
P0
ABC
CK Q
D Q
1
≥ 1
≥ 1
STARTALEOE
CLK
WR
P2.7
RD
IN0
IN7
CK Q
D Q
淮南联合大学 方向红
ADC0809 采样通道 3 输入的模拟量,转换后的结果显示在数码管上。
淮南联合大学 方向红
#include<reg51.h>#define uchar unsigned char#define unit unsigned intuchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};unsigned char dispcount;sbit CLK=P3^0; // 时钟信号sbit ST=P3^3;//启动信号sbit OE=P3^1; // 输出使能sbit EOC=P3^2;// 转换结束信号
淮南联合大学 方向红
void delayms(unit x)// 延时函数{uchar i,j;for(i=x;i>0;i--) for(j=0;j<120;j++);}void Display_Result(uchar d) //显示函数{P0=0xfb; //第 4 个数码管显示个位数P1=dispcode[d%100%10];delayms(5);P0=0xfd; //第 3 个数码管显示十位数P1=dispcode[d%100/10];delayms(5);
淮南联合大学 方向红
P0=0xfe; //第 2 个数码管显示百位数P1=dispcode[d/100];delayms(5); }void main(void){TMOD=0x02; //T0 工作模式 2TH0=0xf0;TL0=0xf0;IE=0x82;TR0=1;P3=0x3f; // 选择 ADC0809 的通道 3
淮南联合大学 方向红
while(1){ST=0; ST=1; ST=0; //启动 A/D 转换while(EOC==0); // 等待转换完成OE=1;Display_Result(P2);OE=0;}}//T0 定时器中断给 ADC0808提供时钟信号void Timer0_INT() interrupt 1{CLK=~CLK;}
淮南联合大学 方向红
简易数字电压表要求:通过调整电位器,采集 0—5V连续可变的模拟电压信号,通过 ADC0809转换为数字信号 0x00-0xff后,送单片机处理,并在四位数码管上显示 0.000—5.000V。
淮南联合大学 方向红
#include<reg51.h>#define uchar unsigned char#define unit unsigned intuchar code dispcode1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed};uchar code dispcode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar ch1,ch2,ch3,ch4;sbit ST=P3^3;//启动信号sbit OE=P3^1; // 输出使能sbit EOC=P3^2;// 转换结束信号sbit CLK=P3^0;
淮南联合大学 方向红
void delayms(unit x)//延时函数{uchar i,j;for(i=x;i>0;i--) for(j=0;j<120;j++) ; }void Display (uchar i,uchar d) {if(i==1) P1=dispcode1[d];else P1=dispcode2[d];delayms(10);}void sepr(uchar x){uchar ch;ch=x;ch1=ch/51; ch=ch%51;ch2=ch*10/51; ch=ch*10%51;ch3=ch*10/51;ch=ch*10%51;ch4=ch*10/51;}
淮南联合大学 方向红
void main(void){uchar a;TMOD=0x02; //T0 工作模式 2TH0=0xf0;TL0=0xf0;IE=0x82;TR0=1;while(1){ST=0;delayms(1); ST=1;delayms(1); ST=0; //启动 A/D 转换
淮南联合大学 方向红
while(EOC==0); // 等待转换完成OE=1; P2=0xff;a=P2;sepr(a);P0=0xfe; Display(2,ch4);P0=0xfd; Display(2,ch3);P0=0xfb; Display(2,ch2);P0=0xf7; Display(1,ch1);OE=0;}}void Timer0_INT() interrupt 1{CLK=~CLK;}