当前位置:文档之家› 单片机实验六 D-A与A-D转换

单片机实验六 D-A与A-D转换

实验六D/A与A/D转换一.实验目的1.学习D/A转换的基本原理和D/A转换芯片0832的性能及编程方法。

2.了解单片机系统中扩展D/A转换芯片的基本方法。

3.学习A/D芯片ADC0809的转换性能及编程方法。

4.了解A/D转换芯片与写单片机的接口方法。

5.通过实验掌握单片机进行数据采集的方法。

二.实验说明1.D/A转换是把数字量转换成模拟量的变换,从D/A输出的是模拟信号。

实验程序一是通过在D/A的输入短送入有一定规律的数字量,在输出端产生锯齿波、三角波、正弦波的波形,通过示波器观察来直观地了解D/A的转换功能。

产生锯齿波、三角波只需由A存放的数字量(送入D/A的输入寄存器)的增减来控制;要产生正弦波,较简单的方法是造一张正弦数字量的表,取值范围为一个周期,采样点愈多,精度愈高。

在EL-8051-III实验台上DAC0832与单片机的连接图如下图所示:图6-1 D/A转换逻辑由图可以看出,输入寄存器占偶地址端口(A0=0),DAC寄存器占较高的奇地址端口(A0=1)。

两个寄存器均对数据独立进行锁存。

要把一个数据通过0832输出,要经两次锁存。

典型的程序如下:MOV DPTR, #PORTMOV A , #DA TAMOVX @DPTR, AINC DPTRMOVX @DPTR, A其中,第二次写入是一个虚拟写的过程,其目的是产生一个WR信号,启动D/A。

2.A/D转换是把模拟量转变为数字量的变换。

A/D转换器大致有三类:一是双积分A/D转换器,优点是精度高,抗干扰性好,价格便宜,但速度慢;二是逐次逼近法A/D转换器,精度、速度、价格适中;三是并行A/D转换器,速度快,价格也昂贵。

本实验用的是ADC0809属逐次逼近法A/D转换器,是八位的A/D转换器。

每采集一次需100us。

实验电路如下图:图6-2 A/D转换逻辑ADC0809的START端为A/D转换启动信号,ALE端为通道选择地址的锁存信号。

实验电路中将二者相连,以便同时锁存通道地址并开始A/D采样转换,故启动A/D转换只需两条指令:MOV DPTR, #PORTMOVX @DPTR, AA中是什么内容是不重要的,这是一次虚拟写,其目的是产生一个/WR信号。

A/D转换期间EOC脚(A/D转换结束信号输出端口)为低电平,一旦转换结束时输出高电平。

如果我们把EOC脚接至一个反相器的输入端,反相器的输出端就得到一个负跳变的触发信号,它正好可以用来作为8051的外中断源的边缘触发信号。

在一个数据转换完毕后,我们向ENABLE脚送一个高电平,用以打开三态数据锁存器,就可以读出数据,因此可以使用如下指令读取A/D转换结果:MOV DPTR, #PORTMOV A, @DPTR三.实验内容1.利用DAC0832编程产生锯齿波、三角波、正弦波。

三种波形轮流显示。

连线方法:0832的CS0832接28-2F。

输出Aout接示波器探头,示波器探头地线接实验板地线。

程序清单见D61.ASM。

2.A/D转换实验:用中断方法来读取IN0的输入模拟电压,通过P1口输出到LED上显示。

运行程序后,读出LED上显示的数据(灯亮表示1,化为十六进制数)。

用万用表测量IN0的输入模拟电压,与读出的LED上显示的数据进行比较。

连线方法:,1、0809的片选信号CS0809接CS0。

2、电位器的输出信号AN0接0809的ADIN0。

3、EOC接CPU板的INT0。

4、P1.0-P1.7连L1-L8。

程序清单见D62.ASM。

3.用查EOC电位法作上述测量。

测量的数据在LED数码管上显示,连续不断地测量(数据不用存储)。

编写程序上机运行。

然后,把EOC直接连接到8051的管脚/INT0,修改程序,再运行程序。

四.实验报告1.写出每个实验的结果。

2.对程序二(D62.ASM)作出注释。

3.附上实验内容三第一步调试通过的程序。

如果EOC直接连到8051的管脚/INT0,应该如何修改程序?五、实验程序;D61.asmORG 4000HLJMP MAINORG 401BHLJMP DELAYPORT EQU 0CFA0HORG 4100HMAIN: MOV TMOD,#10H ; 定时器1工作在定时方式,方式1 SETB EASETB ET1MOV TL1, #0AFHMOV TH1, #3CH ; 置定时0.1S的初值SETB TR1DISP: MOV R1,#50HLCALL PRG1 ; 调用产生锯齿波子程序MOV R1, #50HLCALL PRG2 ; 调用产生三角波子程序MOV R1, #50HLCALL PRG3 ; 调用产生正弦波子程序LJMP DISPDELAY: CLR TR1 ; 中断服务程序MOV TL1, #0AFHMOV TH1, #3CHDEC R1SETB TR1RETI;PRG1: MOV A, #00H ; 产生锯齿波子程序开始. LOOP: MOV DPTR, #PORT ; 输入寄存器端口地址#PORT MOVX @DPTR, A ; 送出数据INC DPTR ; DAC寄存器端口地址#PORT+1MOVX @DPTR, A ; 启动转换INC A ; 数据加1CJNE R1, #00H, LOOP ; 计数值减到00H了么?RET ; 没有则继续产生锯齿波.;PRG2: MOV A, #00H ; 产生三角波子程序LP1: MOV DPTR, #PORT ; 上升部分MOVX @DPTR, AINC DPTRMOVX @DPTR, AINC ACJNE A, #0FFH, LP1MOV R2, ALP2: MOV DPTR, #PORT ; 下降部分MOV A, R2MOVX @DPTR, AINC DPTRMOVX @DPTR, ADJNZ R2, LP2CJNE R1, #00H, LP1RET;PRG3: MOV R2, #02H ; 产生正弦波子程序MOV R4, #0FFH ; 一个正弦周期的数据个数SJMP SUBDATALP3: MOV DPTR, #PORTMOVX @DPTR, AINC DPTRMOVX @DPTR, AINC R2DJNZ R4, SUBDATAMOV R4, #0FFHMOV R2, #02HCJNE R1, #00H, SUBDATARETSUBDATA: MOV A, R2MOVC A,@A+PCSJMP LP3DATA0: ; 产生正弦波的数据(256个)DB 80H,83H,86H,89H,8DH,90H,93H,96HDB 99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEHDB 0B1H,0B4H,0B7H,0BAH,0BCH,0BFH,0C2H,0C5HDB 0C7H,0CAH,0CCH,0CFH,0D1H,0D4H,0D6H,0D8HDB 0DAH,0DDH,0DFH,0E1H,0E3H,0E5H,0E7H,0E9HDB 0EAH,0ECH,0EEH,0EFH,0F1H,0F2H,0F4H,0F5HDB 0F6H,0F7H,0F8H,0F9H,0FAH,0FBH,0FCH,0FDHDB 0FDH,0FEH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFHDB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FEH,0FDHDB 0FDH,0FCH,0FBH,0FAH,0F9H,0F8H,0F7H,0F6HDB 0F5H,0F4H,0F2H,0F1H,0EFH,0EEH,0ECH,0EAHDB 0E9H,0E7H,0E5H,0E3H,0E1H,0DEH,0DDH,0DAHDB 0D8H,0D6H,0D4H,0D1H,0CFH,0CCH,0CAH,0C7HDB 0C5H,0C2H,0BFH,0BCH,0BAH,0B7H,0B4H,0B1HDB 0AEH,0ABH,0A8H,0A5H,0A2H,9FH,9CH,99HDB 96H,93H,90H,8DH,89H,86H,83H,80HDB 80H,7CH,79H,76H,72H,6FH,6CH,69HDB 66H,63H,60H,5DH,5AH,57H,55H,51HDB 4EH,4CH,48H,45H,43H,40H,3DH,3AHDB 38H,35H,33H,30H,2EH,2BH,29H,27HDB 25H,22H,20H,1EH,1CH,1AH,18H,16HDB 15H,13H,11H,10H,0EH,0DH,0BH,0AHDB 09H,8H,7H,6H,5H,4H,3H,2HDB 02H,1H,0H,0H,0H,0H,0H,0HDB 00H,0H,0H,0H,0H,0H,1H,2HDB 02H,3H,4H,5H,6H,7H,8H,9HDB 0AH,0BH,0DH,0EH,10H,11H,13H,15HDB 16H,18H,1AH,1CH,1EH,20H,22H,25HDB 27H,29H,2BH,2EH,30H,33H,35H,38HDB 3AH,3DH,40H,43H,45H,48H,4CH,4EHDB 51H,51H,55H,57H,5AH,5DH,60H,63HDB 69H,6CH,6FH,72H,76H,79H,7CH,80HEND;D62.ASMORG 4000HLJMP MAINORG 4003H ; 外中断0的中断向量LJMP INTX0PORT EQU 0CFA0HORG 4050HMAIN: MOV R0, #50H ; 存数RAM的首地址MOV R1, #8 ; 转换数据的个数MOV P3, #0FFHSETB EASETB EX0SETB IT0START: MOV DPTR, #PORTMOV A, #0MOVX @DPTR, A ; 启动ADC0809开始转换;ACALL DELSJMP START;INTX0: CLR EA ; 中断服务程序MOVX A,@DPTR ; 取出转换的数据CPL AMOV P1, AMOV @R0, A ; 存储数据SETB EAEXIT: RETI ; 从中断返回;DEL: MOV R7, #15DEL1: MOV R6, #130 ;延时一段时间DEL2: MOV R5, #200DEL3: DJNZ R5, DEL3DJNZ R6, DEL2DJNZ R7, DEL1RETEND。

相关主题