最近时间比较紧,不过这几天应该是进步比较快的,比在虚拟机上做肯定要学习的多并且来的实在,不过也发现自己之前积累太少了,很多东西都搞不动,等结束之后争取做一个脱敏的总结。(我在为我自己断更四天找借口,别戳穿我)
目的:
(1)掌握A/D转换芯片与8088/86的接口方法;
(2)了解A/D芯片ADC0809转换性能及编程;
(3)了解8088/86CPU如何进行模拟数据采集。
内容:利用仿真软件平台上的ADC0809(ADC0808)做A/D转换器,采用电位器提供模拟量输入。转换结果在数码管上显示。
(1)采用延时方式;
(2)采用查询方式;
(3)采用中断方式。
PORTA EQU 8000H ;8255地址
PORTB EQU 8002H
PORTC EQU 8004H
CTRW EQU 8006H
CS0809 EQU 9000H ;AD地址
CS8259A EQU 0A000H ; 8259地址
CS8259B EQU 0A002H
ICW1 EQU 00010011b ; 单片8259, 上升沿中断, 要写ICW4
ICW2 EQU 01100000b ; 中断号为60H
ICW4 EQU 00000011b ; 工作在8086/88 方式,自动结束
OCW1 EQU 11111110b ; 中断屏蔽字,只响应INT0 中断
data segment
LEDBuf DB 8 dup(0) ; 显示缓冲
bai DB 0 ; 定义时钟变量
shi DB 0
gew DB 0
LEDMAP DB 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h; 八段管显示码
DB 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
data ends
code segment
ASSUME CS:CODE,DS:CODE,DS:DATA,ES:DATA
Start proc near
MOV AX, DATA
MOV DS, AX
MOV ES, AX
;CALL P8259INIT
CALL P8255INIT
STI ; 开中断
MLoop: CALL ADC08
CALL DisplayBUF ; 时钟送显示缓冲区
CALL DisplayLED ; 数码管动态扫描
JMP MLoop
;**********************************************************
; 时钟送显示缓冲区
DisplayBUF PROC
MOV BX, offset LEDMAP
MOV DX,CS0809
IN AL,DX
CALL BCD1
XLAT
MOV LEDBuf+7 , AL
MOV AL,AH
CALL BCD1
XLAT
MOV LEDBuf+6,AL
MOV AL,AH
CMP AL,0
JNE BCD_NEXT
MOV AL,0;
MOV LEDBuf+5,AL
MOV AL,LEDBuf+6
CMP AL,3FH
JNE NEXT1
MOV AL,0
MOV LEDBuf+6,AL
NEXT1:
RET
BCD_NEXT:
MOV AL,AH
XLAT
MOV LEDBuf+5,AL
RET
DisplayBUF ENDP
; 十进制转换,高位在AH,低位在AL
BCD1 PROC
PUSH BX
MOV BL,10
MOV AH, 0
DIV BL
XCHG AL,AH
POP BX
RET
BCD1 ENDP
;***********************************************
; 数码管动态扫描
DisplayLED proc near
PUSH CX
MOV BX, offset LEDBuf
MOV CL, 8 ; 共8个八段管
MOV AH, 1 ; 从左边开始显示
DLoop: MOV DX, PORTB
MOV AL, 0FFH
OUT DX, AL ; 关所有八段管
MOV AL, [BX]
MOV DX, PORTA
OUT DX, AL
MOV DX, PORTB
MOV AL, AH
NOT AL
OUT DX, AL ; 显示一位八段管
PUSH AX
MOV AH, 1
CALL Delay
POP AX
SHL AH, 1
INC BX
DEC CL
JNZ DLoop
MOV DX, PORTB
MOV AL, 0FFH
OUT DX, AL ; 关所有八段管
POP CX
RET
DisplayLED endp
Delay proc near
PUSH AX ; 延时子程序
PUSH CX
MOV AL, 10H
MOV CX, AX
LOOP $
POP CX
POP AX
RET
Delay endp
P8259INIT PROC
MOV AX, 0
MOV DS, AX
MOV SI, ICW2*4
LEA AX, INT0 ;中断服务程序地址
MOV [SI], AX
MOV AX, CS
MOV [SI+2], AX
MOV AL, ICW1;初始化8259
MOV DX, CS8259A
OUT DX, AL
MOV AL, ICW2; 中断向量
MOV DX, CS8259B
OUT DX, AL
MOV AL, ICW4
OUT DX, AL
MOV AL, OCW1;中断屏蔽字
OUT DX, AL
RET
P8259INIT ENDP
;***********************************************
P8255INIT PROC
MOV DX, CTRW ; 8255 A口方式0输出,B口方式0输出,C口高位输出,低位输入
MOV AL, 80H
OUT DX, AL
RET
P8255INIT ENDP
INT0 PROC
push cx
mov cx,01fffh
loop $
pop cx
STI
IRET
INT0 ENDP
ADC08 PROC
mov al,0
mov dx,CS0809
out dx,al
ret
ADC08 ENDP
Start endp
code ends
end Start
这个需要把eoc接到pc7上
PORTA EQU 8000H ;8255地址
PORTB EQU 8002H
PORTC EQU 8004H
CTRW EQU 8006H
CS0809 EQU 9000H ;AD地址
CS8259A EQU 0A000H ; 8259地址
CS8259B EQU 0A002H
ICW1 EQU 00010011b ; 单片8259, 上升沿中断, 要写ICW4
ICW2 EQU 01100000b ; 中断号为60H
ICW4 EQU 00000011b ; 工作在8086/88 方式,自动结束
OCW1 EQU 11111110b ; 中断屏蔽字,只响应INT0 中断
data segment
LEDBuf DB 8 dup(0) ; 显示缓冲
bai DB 0 ; 定义时钟变量
shi DB 0
gew DB 0
LEDMAP DB 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h; 八段管显示码
DB 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
data ends
code segment
ASSUME CS:CODE,DS:CODE,DS:DATA,ES:DATA
Start proc near
MOV AX, DATA
MOV DS, AX
MOV ES, AX
;CALL P8259INIT
CALL P8255INIT
;STI ; 开中断
MLoop: CALL ADC08
;CALL DisplayBUF ; 时钟送显示缓冲区
;call Delay
call chaxun
CALL DisplayLED ; 数码管动态扫描
JMP MLoop
chaxun proc
;push ax
;push dx
mov dx,PORTC
qqq:
in al,dx
cmp al,1
jz qqq
call DisplayBUF
;pop ax
;pop dx
chaxun ENDP
;**********************************************************
; 时钟送显示缓冲区
DisplayBUF PROC
MOV BX, offset LEDMAP
MOV DX,CS0809
IN AL,DX
CALL BCD1
XLAT
MOV LEDBuf+7 , AL
MOV AL,AH
CALL BCD1
XLAT
MOV LEDBuf+6,AL
MOV AL,AH
CMP AL,0
JNE BCD_NEXT
MOV AL,0;
MOV LEDBuf+5,AL
MOV AL,LEDBuf+6
CMP AL,3FH
JNE NEXT1
MOV AL,0
MOV LEDBuf+6,AL
NEXT1:
RET
BCD_NEXT:
MOV AL,AH
XLAT
MOV LEDBuf+5,AL
RET
DisplayBUF ENDP
; 十进制转换,高位在AH,低位在AL
BCD1 PROC
PUSH BX
MOV BL,10
MOV AH, 0
DIV BL
XCHG AL,AH
POP BX
RET
BCD1 ENDP
;***********************************************
; 数码管动态扫描
DisplayLED proc near
PUSH CX
MOV BX, offset LEDBuf
MOV CL, 8 ; 共8个八段管
MOV AH, 1 ; 从左边开始显示
DLoop: MOV DX, PORTB
MOV AL, 0FFH
OUT DX, AL ; 关所有八段管
MOV AL, [BX]
MOV DX, PORTA
OUT DX, AL
MOV DX, PORTB
MOV AL, AH
NOT AL
OUT DX, AL ; 显示一位八段管
PUSH AX
MOV AH, 1
CALL Delay
POP AX
SHL AH, 1
INC BX
DEC CL
JNZ DLoop
MOV DX, PORTB
MOV AL, 0FFH
OUT DX, AL ; 关所有八段管
POP CX
RET
DisplayLED endp
Delay proc near
PUSH AX ; 延时子程序
PUSH CX
MOV AL, 10H
MOV CX, AX
LOOP $
POP CX
POP AX
RET
Delay endp
P8259INIT PROC
MOV AX, 0
MOV DS, AX
MOV SI, ICW2*4
LEA AX, INT0 ;中断服务程序地址
MOV [SI], AX
MOV AX, CS
MOV [SI+2], AX
MOV AL, ICW1;初始化8259
MOV DX, CS8259A
OUT DX, AL
MOV AL, ICW2; 中断向量
MOV DX, CS8259B
OUT DX, AL
MOV AL, ICW4
OUT DX, AL
MOV AL, OCW1;中断屏蔽字
OUT DX, AL
RET
P8259INIT ENDP
;***********************************************
P8255INIT PROC
MOV DX, CTRW ; 8255 A口方式0输出,B口方式0输出,C口高位输出,低位输入
MOV AL, 89H
OUT DX, AL
RET
P8255INIT ENDP
INT0 PROC
call DisplayBUF
IRET
STI
INT0 ENDP
ADC08 PROC
mov al,0
mov dx,CS0809
out dx,al
ret
ADC08 ENDP
Start endp
code ends
end Start
PORTA EQU 8000H ;8255地址
PORTB EQU 8002H
PORTC EQU 8004H
CTRW EQU 8006H
CS0809 EQU 9000H ;AD地址
CS8259A EQU 0A000H ; 8259地址
CS8259B EQU 0A002H
ICW1 EQU 00010011b ; 单片8259, 上升沿中断, 要写ICW4
ICW2 EQU 01100000b ; 中断号为60H
ICW4 EQU 00000011b ; 工作在8086/88 方式,自动结束
OCW1 EQU 11111110b ; 中断屏蔽字,只响应INT0 中断
data segment
LEDBuf DB 8 dup(0) ; 显示缓冲
bai DB 0 ; 定义时钟变量
shi DB 0
gew DB 0
LEDMAP DB 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h; 八段管显示码
DB 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
data ends
code segment
ASSUME CS:CODE,DS:CODE,DS:DATA,ES:DATA
Start proc near
MOV AX, DATA
MOV DS, AX
MOV ES, AX
CALL P8259INIT
CALL P8255INIT
STI ; 开中断
MLoop: CALL ADC08
;CALL DisplayBUF ; 时钟送显示缓冲区
call Delay
CALL DisplayLED ; 数码管动态扫描
JMP MLoop
;**********************************************************
; 时钟送显示缓冲区
DisplayBUF PROC
MOV BX, offset LEDMAP
MOV DX,CS0809
IN AL,DX
CALL BCD1
XLAT
MOV LEDBuf+7 , AL
MOV AL,AH
CALL BCD1
XLAT
MOV LEDBuf+6,AL
MOV AL,AH
CMP AL,0
JNE BCD_NEXT
MOV AL,0;
MOV LEDBuf+5,AL
MOV AL,LEDBuf+6
CMP AL,3FH
JNE NEXT1
MOV AL,0
MOV LEDBuf+6,AL
NEXT1:
RET
BCD_NEXT:
MOV AL,AH
XLAT
MOV LEDBuf+5,AL
RET
DisplayBUF ENDP
; 十进制转换,高位在AH,低位在AL
BCD1 PROC
PUSH BX
MOV BL,10
MOV AH, 0
DIV BL
XCHG AL,AH
POP BX
RET
BCD1 ENDP
;***********************************************
; 数码管动态扫描
DisplayLED proc near
PUSH CX
MOV BX, offset LEDBuf
MOV CL, 8 ; 共8个八段管
MOV AH, 1 ; 从左边开始显示
DLoop: MOV DX, PORTB
MOV AL, 0FFH
OUT DX, AL ; 关所有八段管
MOV AL, [BX]
MOV DX, PORTA
OUT DX, AL
MOV DX, PORTB
MOV AL, AH
NOT AL
OUT DX, AL ; 显示一位八段管
PUSH AX
MOV AH, 1
CALL Delay
POP AX
SHL AH, 1
INC BX
DEC CL
JNZ DLoop
MOV DX, PORTB
MOV AL, 0FFH
OUT DX, AL ; 关所有八段管
POP CX
RET
DisplayLED endp
Delay proc near
PUSH AX ; 延时子程序
PUSH CX
MOV AL, 10H
MOV CX, AX
LOOP $
POP CX
POP AX
RET
Delay endp
P8259INIT PROC
MOV AX, 0
MOV DS, AX
MOV SI, ICW2*4
LEA AX, INT0 ;中断服务程序地址
MOV [SI], AX
MOV AX, CS
MOV [SI+2], AX
MOV AL, ICW1;初始化8259
MOV DX, CS8259A
OUT DX, AL
MOV AL, ICW2; 中断向量
MOV DX, CS8259B
OUT DX, AL
MOV AL, ICW4
OUT DX, AL
MOV AL, OCW1;中断屏蔽字
OUT DX, AL
RET
P8259INIT ENDP
;***********************************************
P8255INIT PROC
MOV DX, CTRW ; 8255 A口方式0输出,B口方式0输出,C口高位输出,低位输入
MOV AL, 80H
OUT DX, AL
RET
P8255INIT ENDP
INT0 PROC
call DisplayBUF
IRET
STI
INT0 ENDP
ADC08 PROC
mov al,0
mov dx,CS0809
out dx,al
ret
ADC08 ENDP
Start endp
code ends
end Start
不过说实在的,连着8小时看这个低频pwm调光的显示器,眼睛真的有点难受。
感谢同学们的帮助,不然这个代码我还要多写好久。
本文章6.18号之前不允许抄袭转载,做接口作业使用。