用汇编实现模数转换实验(ADC0809)

用汇编实现模数转换实验(ADC0809)

前言

最近时间比较紧,不过这几天应该是进步比较快的,比在虚拟机上做肯定要学习的多并且来的实在,不过也发现自己之前积累太少了,很多东西都搞不动,等结束之后争取做一个脱敏的总结。(我在为我自己断更四天找借口,别戳穿我)

目的和内容

目的:
(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号之前不允许抄袭转载,做接口作业使用。

猜你喜欢

转载自blog.csdn.net/qq_43645782/article/details/106694668