350 likes | 523 Views
实训课题七 D/A 与 A/D 转换. 7.2. DAC0832 及其单片机的接口. 7.1. DAC0832 应用举例. 7.2. 7.3. ADC0809 及其与单片机的接口. ADC0809 应用举例. 7.4. 7.1 DAC0832 及其与单片机的接口. 一、 芯片主要特性与结构. 引脚功能 : DI0 ~ DI7 : 8 位数字信号输入端 : 片选端,为低电平时,本芯片被选中。 I LE : 数据锁存允许控制端,高电平有效。 : 第一级输入寄存器写选通控制,低电平有效。
E N D
实训课题七 D/A与A/D转换 7.2 DAC0832及其单片机的接口 7.1 DAC0832应用举例 7.2 7.3 ADC0809及其与单片机的接口 ADC0809应用举例 7.4
7.1DAC0832 及其与单片机的接口 一、 芯片主要特性与结构
引脚功能: DI0~DI7:8位数字信号输入端 :片选端,为低电平时,本芯片被选中。 ILE:数据锁存允许控制端,高电平有效。 :第一级输入寄存器写选通控制,低电平有效。 :第二级DAC寄存器写选通控制,低电平有效。 :数据传送控制,低电平有效。 VCC:电源输入端,在+5V~+15V范围内。 Rfb:内部反馈电阻引脚 DGND、AGND:分别为数字信号地和模拟信号地 4
:负跳变时锁存数据,正脉冲时,输入锁存器的输出随输入变化。 :作用与上面的类似。 IOUT1:模拟电流输出1端,约等于 输入数字量全为“1”时,IOUT1最大约为 输入数字量全为“0”时,IOUT1最小,为“0”。 IOUT2:模拟电流输出2端,IOUT2 + IOUT1 = 常数。 VREF:基准电压输入端,可在-10~+10V范围内调节。 5
二、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); • 低功耗,20mW。
由于DAC0832为电流输出型,要想输出电压,可外接运放,下图是一种典型应用电路由于DAC0832为电流输出型,要想输出电压,可外接运放,下图是一种典型应用电路
三、DAC0832与单片机的接口 1.直通方式: 当引脚 、 、 、直接接地,ILE接电源,DAC0832工作于直通方式,此时,8位输入寄存器和8位DAC寄存器都直接处于导通状态,8位数字量到达,就立即进行D/A转换。特点:转换速度快。
2.单缓冲方式: 输入寄存器和DAC寄存器共用一个地址,同时选通输出,输入数据在控制信号作用下,直接进入DAC寄存器中;WR1和WR2同时进行,并且与CPU的WR相连,CPU对0832执行一次写操作,将数据直接写入DAC寄存器中。 适用:只有一路模拟信号输出或几路模拟信号非同步输出。
3.双缓冲方式: 输入寄存器和DAC寄存器分配有各自的地址,可分别选通用同时输出多路模拟信号。适用:同时输出几路模拟信号的场合,可构成多个0832同步输出电路。 当8位输入锁存器和8位DAC寄存器分开控制导通时,DAC0832工作于双缓冲方式,双缓冲方式时单片机对DAC0832的操作分两步,第一步,使8位输入锁存器导通,将8位数字量写入8位输入锁存器中;第二步,使8位DAC寄存器导通,8位数字量从8位输入锁存器送入8位DAC寄存器。第二步只使DAC寄存器导通,在数据输入端写入的数据无意义。
程序: #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();} 则示波器中观察到的波形有什么变化? 问答:如果改变锯齿波的周期和幅值? 答:改变延时时间可改变波形周期;改变输出二进制的最大值,可以改变波形的幅值。
7.3 ADC0809及其与单片机的接口 • ADC0809的结构与引脚 IN0~IN7:8路模拟信号输入端。 D0~D7:8位数字量输出端。 VR(+)、VR(−):基准电压输入端。 A、B、C:8路输入通道的选择 CLK:为时钟信号输入端。 ALE:地址锁存允许信号 OE:输出允许端 START:为启动A/D转换的输入端,上升沿复位,下降沿开始转换。 EOC:转换结束信号输出端。转换结束后为高电平。
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读出数据。
ADC0809与MCS-51单片机的接口 • 涉及2个问题: (1)8路模拟信号通道选择; (2)A/D转换完成后转换数据的传送。 • 转换数据的传送: ①定时传送方式; (不需接EOC脚) ②查询方式; (测试EOC脚的状态) ③中断方式。 (EOC脚接INTi脚) 注意: (1)不能用无条件方式; (2)2个ALE不能直接相接。
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 ALE WR P2.7 RD INT0 D0 D1 D2 D3 D4 D5 D6 D7 ADDA ADDB ADDC CLK ALE START OE EOC IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7 VREF+ VREF- ADC0809 分 频 器 8051 +5V GND + +
ADC0809采样通道3输入的模拟量,转换后的结果显示在数码管上。ADC0809采样通道3输入的模拟量,转换后的结果显示在数码管上。
#include<reg51.h> #define uchar unsigned char #define unit unsigned int uchar 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工作模式2 TH0=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 int uchar 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工作模式2 TH0=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;}