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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六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, #PORT

MOV A , #DA TA

MOVX @DPTR, A

INC DPTR

MOVX @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, #PORT

MOVX @DPTR, A

A中是什么内容是不重要的,这是一次虚拟写,其目的是产生一个/WR信号。

A/D转换期间EOC脚(A/D转换结束信号输出端口)为低电平,一旦转换结束时输出高电平。如果我们把EOC脚接至一个反相器的输入端,反相器的输出端就得到一个负跳变的触发信号,它正好可以用来作为8051的外中断源的边缘触发信号。

在一个数据转换完毕后,我们向ENABLE脚送一个高电平,用以打开三态数据锁存器,就可以读出数据,因此可以使用如下指令读取A/D转换结果:

MOV DPTR, #PORT

MOV 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.asm

ORG 4000H

LJMP MAIN

ORG 401BH

LJMP DELAY

PORT EQU 0CFA0H

ORG 4100H

MAIN: MOV TMOD,#10H ; 定时器1工作在定时方式,方式1 SETB EA

SETB ET1

MOV TL1, #0AFH

MOV TH1, #3CH ; 置定时0.1S的初值

SETB TR1

DISP: MOV R1,#50H

LCALL PRG1 ; 调用产生锯齿波子程序

MOV R1, #50H

LCALL PRG2 ; 调用产生三角波子程序

MOV R1, #50H

LCALL PRG3 ; 调用产生正弦波子程序

LJMP DISP

DELAY: CLR TR1 ; 中断服务程序

MOV TL1, #0AFH

MOV TH1, #3CH

DEC R1

SETB TR1

RETI

;

PRG1: MOV A, #00H ; 产生锯齿波子程序开始. LOOP: MOV DPTR, #PORT ; 输入寄存器端口地址#PORT MOVX @DPTR, A ; 送出数据

INC DPTR ; DAC寄存器端口地址#PORT+1

MOVX @DPTR, A ; 启动转换

INC A ; 数据加1

CJNE R1, #00H, LOOP ; 计数值减到00H了么?

RET ; 没有则继续产生锯齿波.

;

PRG2: MOV A, #00H ; 产生三角波子程序

LP1: MOV DPTR, #PORT ; 上升部分

MOVX @DPTR, A

INC DPTR

MOVX @DPTR, A

INC A

CJNE A, #0FFH, LP1

MOV R2, A

LP2: MOV DPTR, #PORT ; 下降部分

MOV A, R2

MOVX @DPTR, A

INC DPTR

MOVX @DPTR, A

DJNZ R2, LP2

CJNE R1, #00H, LP1

RET

PRG3: MOV R2, #02H ; 产生正弦波子程序

MOV R4, #0FFH ; 一个正弦周期的数据个数

相关文档
最新文档