《单片机应用技术》课件第4章单片机AD与DA转换接口技术_第1页
《单片机应用技术》课件第4章单片机AD与DA转换接口技术_第2页
《单片机应用技术》课件第4章单片机AD与DA转换接口技术_第3页
《单片机应用技术》课件第4章单片机AD与DA转换接口技术_第4页
《单片机应用技术》课件第4章单片机AD与DA转换接口技术_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章单片机的A/D与D/A转换接口技术

4.1

A/D转换电子秤的数据采集项目设计项目A/D工作原理A/D(AnalogtoDigital)转换:从模拟信号到数字信号的转换。

电压

(3V)10010010

逐次逼近式A/D转换器:一种速度较快、精度较高的转换器,其转换时间大约在几微秒到几百微秒之间。基本原理是从高位到低位逐位试探比较,好像用天平称物体,从重到轻逐级增减砝码进行试探。A/D转换器分类转换开始时,先将逐次逼近寄存器最高位置1,送入D/A转换器,经D/A转换后生成的模拟量送入比较器,称为Vo,与送入比较器的待转换的模拟量Vi进行比较,若Vo<Vi,该位1被保留,否则被清除。置逐次逼近寄存器次高位为1,将寄存器中新的数字量送D/A转换器,若Vo<Vi,该位1被保留,否则被清除。重复此过程,直至逼近寄存器最低位。转换结束后,将逐次逼近寄存器中的数字量送入缓冲寄存器,得到数字量的输出。双积分式A/D转换器:

转换精度高,抗干扰性能好,价格便宜,但转换速度较慢,一般用于速度要求不高的场合。

双积分ADC的基本原理是对输入模拟电压和参考电压分别进行两次积分,将输入电压平均值变成与之成正比的时间间隔,然后利用时钟脉冲和计数器测出此时间间隔,进而得到相应的数字量输出。ADC0809电源及基准电压ADC0809是一个8位8通道的逐次逼近式AD转换器。电源电压Vcc:5V基准电压Vref(+):5vVref(-):0V

ADC0809通道选择ADDA、ADDB、ADDC:地址线IN7〜IN0:8个模拟量输入通道。AD0809控制端CLOCK:时钟,小于640KHzALE(AddressLockEnable):有效时,通道选择锁存START:转换启动信号EOC(EndOfConversion):转换状态OE(OutEnable):输出允许0809输出D7~D00809输出:D7D6D5D4D3D2D1D0ADC0809的工作时序START:转换启动信号EOC:转换状态OE:输出允许采用ADC0809轮流采集2路0~5V的电子秤传感器电路形成的模拟信号,转换为8位的数字信号00~FFH后,送单片机处理,并在4个数码管上显示采集的电压值。

动手做—画出硬件电路图

用可调电位器构成0~5V调压电路,模拟电子秤传感器测量电压,本设计有IN0、IN1共2路通道,只需要单片机控制ADDA、ADDB、ADDC中的ADDA一个地址的高低电平就能实现,其它ADDB、ADDC2个接地就可。所以,选择通道,只需要单片机P1.4控制ADC0809的ADDA一端,其它的ADDB、ADDC接地。ADC0809的转换的时钟信号由单片机的P1.3产生。ADC0809的转换的控制线START、EOC、OE分别与单片机的P1.2、P1.1和P1.0连接。ADC0809采集的数据送到单片机的 P3口,单片机数据处理后,再通过P0口送段码,通过P2.0~P2.3送位控信号到4位数码管,显示测量结果。

根据设计要求,采用ADC0809的电子秤数据采集A/D转换,其源程序如下。#include<reg51.h>#defineucharunsignedchar#defineulongunsignedlongucharled_table[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};//0-9共9个数,用于段控uchari,d;voidT_init();//定时器初始化,为AD转化提供时钟voidDisplay(uchar);//延时函数声明voidADC();//ADC转换函数声明voiddelay(uchar);//延时函数声明sbitAD_OE=P1^0;//单片机P1.0产生OE信号sbitAD_EOC=P1^1;//单片机P1.1读取EOC信号sbitAD_ST=P1^2;//单片机P1.2产生START信号sbitAD_CLK=P1^3;//单片机P1.3产生时钟信号sbitADD_A=P1^4;//单片机P1.4控制2路模拟信号输入sbitW1=P2^0;//单片机P2.0控制第1个数码管显示sbitW2=P2^1;//单片机P2.1控制第2个数码管显示sbitW3=P2^2;//单片机P2.2控制第3个数码管显示sbitW4=P2^3;//单片机P2.3控制第4个数码管显示/************主程序***************/voidmain(void){ T_init();//定时器初始化,为AD转化提供时钟

while(1) { ADC();//AD转换

}}/************定时器初始化***************/voidT_init(void){ TMOD=0x02;//定时器0工作方式2 TH0=TL0=0xf6;//初值设定,10us IE=0x82;//开中断10000010 TR0=1;//启动定时器0}/************定时器0中断函数***************/voidT0_Int(void)interrupt1{AD_CLK=!AD_CLK;//AD0809C0809采样时钟信号,约50KHz}/************数码管显示***************/voidDisplay(uchard){ ulongc; c=d*500000/255/100;//取mv数,为减少计算误差,分子分母都放大100倍

P0=led_table[c/1000]|0x80;//取千位加小数点

W1=0; delay(1); W1=1; P0=led_table[(c%1000)/100];//取百位

W2=0; delay(1); W2=1; P0=led_table[(c%100)/10];//取十位

W3=0; delay(1); W3=1; P0=led_table[c%10];//取个位

W4=0; delay(1); W4=1;}/************ADC转换***************/voidADC(void){ uchartemp; if(((i++)%2)==0)//用于交替选择通道0和通道1 { ADD_A=0;//选择通道0 } else { ADD_A=1;//选择通道1 } AD_ST=0; AD_ST=1; AD_ST=0;//启动转换

while(AD_EOC==0);//等待转换结束

AD_OE=1;//允许输出

for(temp=0;temp<100;temp++) { d=P3; Display(d); delay(1); } AD_OE=0;//关闭输出}/************延时t(ms)***************/voiddelay(uchart){ ucharj,k; for(j=0;j<t;j++) { for(k=0;k<255;k++){} }}1.时钟产生的程序设计ADC0809所需时钟信号的典型值为640kHz,最小值为10kHz,最大值为1280Hz,本设计用单片机定时器产生该时钟50kHz。若单片机系统时钟为12MHz,采用定时器0工作方式2,10μs产生一次中断,每次中断形成管脚的一次高低电平的变化,产生50kHz方波,因此,初值为:TH0=TL0=F5。2.转换工作过程的程序设计单片机START从低到高,再到低,转换开始。启动开始的程序语句为:AD0809_ST=0;AD0809_ST=1;AD0809_ST=0。单片机查询EOC输出信号由低变高,A/D转换完成。等待转换结束的程序语句为:while(AD0809_EOC==0)。单片机再控制OE高电平,将转换结果的数字量输出到数据总线上,传到单片机。允许输出的程序语句为:AD0809_OE=1;3.转换结果的显示方式将单片机采集到的转换好的8位数字量,通过数据处理成十进制数,再采用4个共阴数码管显示0~5V的传感器电压值。仿真运行图

仿真运行图

4.2

D/A转换的锯齿波形发生器项目设计项目单片机的D/A应用D/A工作原理项目:用DAC0832产生任意波形项目:用DAC0832控制直流电机转速D/A工作原理D/A(DigitaltoAnalog)转换:从数字信号到模拟信号的转换。

10001010电压V(2V)DA分类按输入的二进制数的位数分类,有八位、十位、十二位和十六位等。按输出是电流还是电压分类,分为电压输出器件和电流输出器件。依数字量的传送方式分,有并行和串行D/A转换器;

DA分辨率

例如8位数的分辨率为1/256≈0.004,10位数分辨率为1/1024,约等于0.001。由此可见数字量位数越多,分辨率也就越高。分辨率通常用数字输入信号的位数表示,有8位、10位、12位等。D/A转换芯片DAC0832DAC0832主要特性:10脚DGND数字地4脚AGND模拟地数字和模拟地单点连接。工作电源VCC:+5V~+15V参考电压VREF:-10V~10V数字量输入分辨率:8位数字输入。输出电流输出I1电流输出I2反馈电阻端:内部有反馈电阻,也可以外接VOUT=-VREF×D/2550832控制信号CS片选ILE(InputLockEnable)

输入数据锁存WR1第1写(输入信号)WR2第2写(输入信号)XFER数据传送控制信号内部结构图1.LE1决定数据输入,LE2决定寄存器。2.LE1、LE2、WR1、WR2、CS、XFER都是低电平有效,ILE高电平有效。3.WR1、WR2、CS、XFER、ILE有效,则LE1、LE2有效,直通。4.WR1、WR2、CS、XFER有个别无效,则LE1、LE2无效,锁存。DAC0832与8051的接口电路1.直通方式:数据直通+寄存器直通ILE接高电平,CS、WR1、WR2和XFER都接数字地,8位数字量一旦到达DI7~DI0输入端,就立即加到8位D/A转换器,被转换成模拟量。2.单缓冲单缓冲方式是控制输入寄存器和DAC寄存器同时接收资料,或者只用输入寄存器而把DAC寄存器接成直通方式。此方式适用只有一路模拟量输出。或几路模拟量异步输出的情形。1)数据直通+寄存器锁存2)数据锁存+寄存器直通3)数据+寄存器同时通或锁存3.双缓冲双缓冲方式是先使输入寄存器接收资料,再控制输入寄存器的输出资料到DAC寄存器,即分两次锁存输入资料。此方式适用于多个D/A转换同步输出的情节。数据锁存+寄存器锁存4.输出端

Iout1:电流输出1。Iout2:电流输出2。Iout1+Iout2=常数。Rfb:反馈电阻。DAC0832是电流输出,为了取得电压输出,需要在电压输出端接运放,Rfb是运放电路的反馈电阻。动手做——画出硬件电路图

项目采用单缓冲工作方式,将ILE接电源,将CS、XFER接单片机同一个控制端Q0,WR1、WR2接单片机WR,这样,两个寄存器的LE1、LE2同时同样地受控。单片机的P0口控制了74LS373的输出Q0,CS、XFER接Q0,所以P2、P0口的外部地址为0x00fe,即二进制表达为00000000(P2)11111110(P0)时,ADC0832的CS有效,DA启动转换。根据DAC0832的工作原理和项目设计要求,采用DAC0832的锯齿波发生器,源程序如下。#include<reg51.h>#include<absacc.h>#defineucharunsignedchar#defineDAC0832XBYTE[0x00fe]//00000000(P2)11111110(P0地址、数据复用),XBYTE定义外部16位地址,可以操作WR和RD引脚,可实现DA启动ucharnum;/****************主程序*****************/voidmain(void){ TMOD=0x01;//T0工作方式1 TL0=-1000%256;//1ms初值低8位

TH0=-1000/256;//1ms初值高8位

IE=0x82;//定时中断允许

TR0=1;//启动定时中断

while(1) { DAC0832=num;//00fe、WR有效、输出电压M }}/****************定时0中断函数*****************/voidTime0()interrupt1{ TL0=-1000%256;//T0初值重置

TH0=-1000/256; num++; if(num==255)num=0; }程序中,#defineDAC0832XBYTE[0x00fe]语句的XBYTE定义外部16位地址0x00fe,用二进制表达为0000000011111110,其中高8位由P2输出,低8位由P0地址及数据复用输出,使得74LS373输出端Q0低电平有效,从而产生DAC0832的CS/XFER有效,同时通过单片机P3.6/WR引脚,可以操作DAC0832的WR1、WR2引脚有效,实现单缓冲工作方式。

程序中,改变延时时间可以改变波形周期;改变输出8位的最大值,即可改变波形的幅值。仿真运行图

仿真运行图

4.3

D/A转换多功能波形发生器项目设计项目采用DAC0832形成多个模拟信号,模拟信号的波形为矩形波、锯齿波、三角波和正弦波等。动手做——画出硬件电路图

同样,采用单缓冲工作方式。单片机的P0口控制了74LS373的输出Q0,CD、XFER接Q0,所以P2、P0口的外部地址为0x00fe,即二进制表达为00000000(P2)11111110(P0)时,ADC0832CS有效,DA启动转换。P3.0、P3.1、P3.2、P3.3接4个按键,分别控制输出矩形波、锯齿波、三角波和正弦波。采用DAC0832的多功能发生器源程序,设计源程序如下。#include<reg51.h>#include<absacc.h>#defineucharunsignedchar#defineDAC0832XBYTE[0x00fe]//00000000(P2)11111110(P0地址、数据复用),XBYTE定义外部16位地址,可以操作WR和RD引脚,可实现DA启动sbitk1=P3^0;//矩形波按钮sbitk2=P3^1;//锯齿波按钮sbitk3=P3^2;//三角波按钮 sbitk4=P3^3;//正弦波按钮 ucharm,flag,num1,num2,num3,num4; /**********正弦波数据表*************/ucharcodesine_tab[256]={0x80,0x83,0x85,0x88,0x8A,0x8D,0x8F,0x92,0x94,0x97,0x99,0x9B,0x9E,0xA0,0xA3,0xA5,0xA7,0xAA,0xAC,0xAE,0xB1,0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,0xC9,0xCB,0xCC,0xCE,0xD0,0xD1,0xD3,0xD4,0xD6,0xD7,0xD8,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE3,0xE4,0xE4,0xE5,0xE5,0xE6,0xE6,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE6,0xE6,0xE5,0xE5,0xE4,0xE4,0xE3,0xE3,0xE2,0xE1,0xE0,0xDF,0xDE,0xDD,0xDC,0xDB,0xDA,0xD8,0xD7,0xD6,0xD4,0xD3,0xD1,0xD0,0xCE,0xCC,0xCB,0xC9,0xC7,0xC5,0xC3,0xC1,0xBF,0xBD,0xBB,0xB9,0xB7,0xB5,0xB3,0xB1,0xAE,0xAC,0xAA,0xA7,0xA5,0xA3,0xA0,0x9E,0x9B,0x99,0x97,0x94,0x92,0x8F,0x8D,0x8A,0x88,0x85,0x83,0x80,0x7D,0x7B,0x78,0x76,0x73,0x71,0x6E,0x6C,0x69,0x67,0x65,0x62,0x60,0x5D,0x5B,0x59,0x56,0x54,0x52,0x4F,0x4D,0x4B,0x49,0x47,0x45,0x43,0x41,0x3F,0x3D,0x3B,0x39,0x37,0x35,0x34,0x32,0x30,0x2F,0X2D,0x2C,0X2A,0x29,0x28,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1D,0x1C,0x1C,0x1B,0x1B,0x1A,0x1A,0x1A,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1A,0x1A,0x1A,0x1B,0x1B,0x1C,0x1C,0x1D,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29,0X2A,0x2C,0X2D,0x2F,0x30,0x32,0x34,0x35,0x37,0x39,0x3B,0x3D,0x3F,0x41,0x43,0x45,0x47,0x49,0x4B,0x4D,0x4F,0x52,0x54,0x56,0x59,0x5B,0x5D,0x60,0x62,0x65,0x67,0x69,0x6C,0x6E,0x71,0x73,0x76,0x78,0x7B,0x7D};/****************延时函数t(ms)*************/voiddelay(uchart){ucharj,k;for(j=0;j<t;j++) { for(k=0;k<255;k++){} }} /*************矩形波子程序***************/voidrect(void){ num1=num1+32; if(num1==255)num1=0; if(num1<64)DAC0832=1;//00fe,WR有效,输出电压0 elseDAC0832=255;//00fe,WR有效,输出电压255}/*************锯齿波子程序***************/voidsaw(void){ num2++; if(num2==255)num2=0; DAC0832=num2;//00fe,WR有效,输出电压M}/*************三角波子程序***************/voidtri(void){ if(flag==0) { num3++; if(num3==255) { flag=1; } DAC0832=num3;//00fe,WR有效,输出电压M } else { num3--;

if(num3==0) { flag=0; } DAC0832=num3;//00fe,WR有效,输出电压M }}/*************正弦波子程序***************/voidsine(void){ num4++; if(num4==255)num4=0; DAC0832=sine_tab[num4];//00fe,WR有效,输出电压表 }/*************波形选择按键函数***************/voidkey(void){ while(1) { if(k1==0)//检测矩形波按钮

{

delay(10);//消抖10ms if(k1==0)//如果矩形波按钮按下

{ m=1; } while(!k1);//松开继续执行

} if(k2==0)//检测锯齿波按钮

{ delay(10);//消抖10ms if(k2==0)//如果按下锯齿波按钮

{ m=2; } while(!k2);//松开后继续执行

} if(k3==0)//检测三角波按钮

{ delay(10);//消抖10ms if(k3==0)//如果三角波按钮

{ m=3; }

while(!k3);//松开后继续执行

} if(k4==0)//检测正弦波按钮

{ delay(10);//消抖10ms if(k4==0)//如果按下正弦波按钮

{ m=4; } while(!k4);//松开后继续执行

} }}/*************主程序***************/voidmain(void){ TMOD=0x01;//T0工作方式1 TL0=-1000%256;//1ms初值低8位

TH0=-1000/256;//1ms初值高8位

IE=0x82;//定时中断允许

TR0=1;//启动定时中断

while(1) {

key(); }}/*************定时器0中断函数***************/voidTime0()interrupt1{ TL0=-1000%256;//T0初值重置

TH0=-1000/256; switch(m) { case1:rect();break; case2:saw();break; case3:tri();break; case4:sine();break; } }仿真运行图

仿真运行图

4.4

D/A转换控制直流电机的项目设计项目项目采用DAC0832形成的模拟信号,控制模拟信号电压,从而控制直流电机的运转速度。动手做——画出硬件电路图

采用单缓冲工作方式。单片机的P3口的P3.0、P3.1、P3.2按键分别控制了加速、减速和停止。采用DAC0832控制直流电机加速、减速和停止,设计源程序如下。#include<reg51.h>#include<absacc.h>#defineucharunsignedchar#defineDAC0832XBYTE[

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论