1.编写实验程序,将ADC单元中提供的0V~5V信 号源作为ADC0809的模拟输入量,进 行A/D转换,转换结果通过变量进行显示。 修改A/D实验,将A/D转换的结果转成十进制在屏幕上显示.
①按实验指导pdf连接实验线路。
②编写实验程序(例程文件名为:AD0809.ASM),经编译、链接无误后装入系统。
将变量 VALUE 添加到变量监视窗口中。方法如下:打开设置\变量监控,出现如下图的界面,选中要监视的变量“VALUE”,单击“加入监视”后确定,就会在软件左侧栏的“变量区”出现该值。
③在 JMP START 语句行设置断点,使用万用表测量 ADJ 端的电压值,计算对应的采样
值,然后运行程序。
④程序运行到断点处停止运行,查看变量窗口中 VALUE 的值,与计算的理论值进行比较,看是否一致(可能稍有误差,相差不大)。
⑤调节电位器,改变输入电压,比较 VALUE 与计算值,反复验证程序功能。
可以看到上面我调节电位器,在端点处输出十进制数字,图中219对应十六进制数DB
代码如下,其中htob就是十六进制转十进制的程序:
;=========================================================
; 文件名: AD0809.ASM
; 功能说明: 进行AD采样,将结果显示。 片选为IOY0
;=========================================================
IOY0 EQU 0600H
AD0809 EQU IOY0+00H*2 ;AD0809的端口地址
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
PUBLIC VALUE ;设置全局变量以便变量监视
DATA SEGMENT
VALUE DB ? ;AD转换结果
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV DX, AD0809 ;启动AD采样
OUT DX, AL
CALL DALLY
IN AL, DX ;读AD采样结果
MOV VALUE, AL ;将结果送变量
call htod
JMP START ;在此处设置断点, 观察变量窗口中的VALUE值
DALLY: PUSH CX ;延时程序
PUSH AX
MOV CX, 100H
A5: MOV AX, 0800H
A6: DEC AX
JNZ A6
LOOP A5
POP AX
POP CX
RET
htod:
XOR AX,AX
MOV SI,0 ;栈底用0作为标志位,与30h-39h区分开来
PUSH SI
MOV DX,0
mov BX,10 ;BX作为除数
MOV AL, VALUE ;value为要转换的数值十六进制数
again:
DIV BX ;不断除以10,取余再加30H压入栈中,32位数除以16位,AX存放商,DX存放余数
MOV CX,DX ;余数存放在DX
ADD CX,30H ;转化为数字字符
PUSH CX ;入栈
MOV DX,0 ;余数清零
CMP AX,0 ;判断被除数是否除完了
JNZ again
Output:
POP DX ;出栈,依次输出数字
CMP DX,0
JZ exit2
mov ax,dx
mov AH,01h ;输出字符
int 10h
JMP Output
exit2:
MOV AX, 0120H ;空格
INT 10H
ret
CODE ENDS
END START
2、设计实验电路图实验线路并编写程序,实现D/A转 换,要求产生锯齿波、脉冲波,并用示波器观察电压波形
①按实验指导pdf连接线路
②编写实验程序(锯齿波例程文件名为:DA08321.ASM,方波例程文件名为:
DA08322.ASM),经编译、链接无误后装入系统。
③单击Run按钮,运行实验程序,用示波器测量 DA 的输出,观察实验现象。
用示波器观察波形的方法:单击虚拟仪器菜单中的按钮或直接单击工具栏的
按钮,在新弹出的示波器界面上单击
按钮运行示波器,观测实验波形
代码如下:
;=========================================================
; 文件名: DA08321.ASM
; 功能描述: 利用DA0832产生锯齿波,通过延时变化波形
;=========================================================
IOY0 EQU 0600H
DA0832 EQU IOY0+00H*2
STACK SEGMENT STACK
DW 32 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK
START: MOV AX, 00H ; 产生锯齿波
MOV DX, DA0832
MOV AL, 00H
AA1: OUT DX, AL
CALL DELAY
INC AL
JMP AA1
DELAY: PUSH CX
MOV CX, 03FFH
AA2: PUSH AX
POP AX
LOOP AA2
POP CX
RET
CODE ENDS
END START
;=========================================================
; 文件名: DA08322.ASM
; 功能描述: 利用DA0832产生方波,通过延时变化波形
;=========================================================
IOY0 EQU 0600H
DA0832 EQU IOY0+00H*2
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV AX, 00H ; 产生方波
MOV DX, DA0832
AA1: MOV AL, 00H
OUT DX, AL
CALL DELAY
MOV AL, 7FH
OUT DX, AL
CALL DELAY
JMP AA1
DELAY: PUSH CX
MOV CX,0FF00H
AA2: PUSH AX
POP AX
LOOP AA2
POP CX
RET
CODE ENDS
END START
3、将DA输出送AD输入,在屏幕上成对显示D/A和A/D的 输出值,每组用符号隔开开(D/A输出用锯齿波,注意要加大相邻两次D/A间的延迟时间,否则屏幕输出太快)。
代码中2行绿色代码被注释,解除注释可以检查DA输出的数字和AD输入的数字是否相同
DA输出信号,要延迟,AD接收信号前也延迟,转十进制的程序用回第一题的程序。
截图的输出结果,相邻2个数字有差别,不是一定递增,但多个数字输出大体上是递增,从0到255,然后又从0到255
连线时,DA转换器选中IOY0端口,AD转换器选中IOY1端口,注意!!
代码如下:
;=========================================================
; 文件名: DA08321newnewnew.ASM
; 功能描述: 利用DA0832产生锯齿波,通过延时变化波形,AD接收并输出
;=========================================================
IOY0 EQU 0600H
DA0832 EQU IOY0+00H*2
IOY1 EQU 0640H
AD0809 EQU IOY1+00H*2 ;AD0809的端口地址
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
PUBLIC VALUE
DATA SEGMENT
VALUE DB ? ;AD转换结果
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS:SSTACK
START:
MOV AX, DATA
MOV DS, AX
MOV DX, AD0809 ;启动AD采样
OUT DX, AL
CALL DELAY
MOV AX, 00H ; 产生锯齿波
MOV DX, DA0832
mov DI,00H
AA1:
MOV BX,DI
MOV DX, DA0832
MOV AL, BL
OUT DX, AL
;MOV VALUE, AL ;将结果送变量
;call htod
CALL DELAY
MOV DX, AD0809
MOV AX,DATA
OUT DX,AL
CALL DELAY
IN AL, DX ;读AD采样结果
MOV VALUE, AL ;将结果送变量
call htod
INC DI
JMP AA1
DELAY: PUSH CX
MOV CX, 0FFFH
AA2:
mov si,3H
LL5: PUSH AX
POP AX
dec si
cmp SI,0
JNZ LL5
LOOP AA2
POP CX
RET
htod:
XOR AX,AX
MOV SI,0 ;栈底用0作为标志位,与30h-39h区分开来
PUSH SI
MOV DX,0
mov BX,10 ;BX作为除数
MOV AL, VALUE ;value为要转换的数值十六进制数
again:
DIV BX ;不断除以10,取余再加30H压入栈中,32位数除以16位,AX存放商,DX存放余数
MOV CX,DX ;余数存放在DX
ADD CX,30H ;转化为数字字符
PUSH CX ;入栈
MOV DX,0 ;余数清零
CMP AX,0 ;判断被除数是否除完了
JNZ again
Output:
POP DX ;出栈,依次输出数字
CMP DX,0
JZ exit2
mov ax,dx
mov AH,01h ;输出字符
int 10h
JMP Output
exit2:
MOV AX, 0120H ;空格
INT 10H
ret
CODE ENDS
END START