附录二:实验参考程序
;===================== D/A(调零程序) =========================
;---D/A 0V输出(调基准电压)---
;在进行D/A输出方波/锯齿波、小直流电机实验之前,必须先运行本调零程序!
;装载并连续运行本程序,调节基准电压控制电位器W2,
;使D/A输出端“AOUT”输出电压为0V
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
;================================
DAPORT EQU 0FFE0h
ZXK EQU 0FFDCH
ZWK EQU 0FFDDH
;================================
ORG 3480H
START: MOV BUF,00H ;DISPLAY 0832 80
MOV BUF+1,08H
MOV BUF+2,03H
MOV BUF+3,02H
MOV BUF+4,08H
MOV BUF+5,00H
P5: MOV AL,80H
mov dx,DAPORT
out dx,al
call p6
jmp p5
;=========================
p6: mov cx,0100h
p8: push cx
CALL DIS
pop cx
loop p8
ret
;==========================
DIS: MOV CL,20H
MOV BX,OFFSET BUF
DIS1: MOV AL,[BX]
PUSH BX
MOV BX,OFFSET LED
XLAT
POP BX
MOV DX,ZXK
OUT DX,AL
MOV AL,CL
MOV DX,ZWK
OUT DX,AL
PUSH CX
MOV CX,0100H
DELAY: LOOP $
POP CX
CMP CL,01H
JZ EXIT
INC BX
SHR CL,1
JMP DIS1
EXIT: MOV AL,00H
MOV DX,ZWK
OUT DX,AL
RET
BUF DB ?,?,?,?,?,?
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H
;====================================
CODE ENDS
END START
;----------------8255A²¢ÐпÚʵÑé(1) ·½²¨-----------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 32C0H
H1: JMP STARTP1
PA EQU 0FFD8H
PB EQU 0FFD9H
PC EQU 0FFDAH
PCTL EQU 0FFDBH
STARTP1:MOV DX,PCTL
MOV AL,80H
OUT DX,AL
MOV AL,55H
P11: MOV DX,PA
OUT DX,AL
INC DX
OUT DX,AL
INC DX
OUT DX,AL
MOV CX,0800H
LOOP $
NOT AL
JMP P11
CODE ENDS
END H1
;--------------8255A²¢ÐпÚʵÑé(2) PAÊäÈë,PBÊä³ö-------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 32E0H
PA EQU 0FFD8H
PB EQU 0FFD9H
PC EQU 0FFDAH
PCTL EQU 0FFDBH
H2: MOV DX,PCTL
MOV AL,90H
OUT DX,AL
P2: MOV DX,PA
IN AL,DX
INC DX
OUT DX,AL
JMP P2
CODE ENDS
END H2
;----------------8255A²¢ÐпÚʵÑé(3) ¿ØÖƽ»Í¨µÆ----------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 32F0H
PA EQU 0FFD8H
PB EQU 0FFD9H
PC EQU 0FFDAH
PCTL EQU 0FFDBH
H3: MOV AL,88H
MOV DX,PCTL
OUT DX,AL ;MOD:0,
MOV DX,PA
MOV AL,0B6H
OUT DX,AL
INC DX
MOV AL,0DH
OUT DX,AL
CALL DELAY1
P30: MOV AL,75H
MOV DX,PA
OUT DX,AL
INC DX
MOV AL,0DH
OUT DX,AL
CALL DELAY1
CALL DELAY1
MOV CX,08H
P31: MOV DX,PA
MOV AL,0F3H
OUT DX,AL
INC DX
MOV AL,0CH
OUT DX,AL
CALL DELAY2
MOV DX,PA
MOV AL,0F7H
OUT DX,AL
INC DX
MOV AL,0DH
OUT DX,AL
CALL DELAY2
LOOP P31
MOV DX,PA
MOV AL,0AEH
OUT DX,AL
INC DX
MOV AL,0BH
OUT DX,AL
CALL DELAY1
CALL DELAY1
MOV CX,08H
P32: MOV DX,PA
MOV AL,9EH
OUT DX,AL
INC DX
MOV AL,07H
OUT DX,AL
CALL DELAY2
MOV DX,PA
MOV AL,0BEH
OUT DX,AL
INC DX
MOV AL,0FH
OUT DX,AL
CALL DELAY2
LOOP P32
JMP P30
DELAY1: PUSH AX
PUSH CX
MOV CX,0030H
DELY2: CALL DELAY2
LOOP DELY2
POP CX
POP AX
RET
DELAY2: PUSH CX
MOV CX,8000H
LOOP $
POP CX
RET
CODE ENDS
END H3
;------------------¼òµ¥I/O¿ÚÀ©Õ¹------------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 3380H ;273,244
PIO1 EQU 0FFE0H
PIO2 EQU 0FFE4H
P4: MOV DX,PIO1
IN AL,DX
MOV DX,PIO2
OUT DX,AL
JMP P4
CODE ENDS
END P4
;-----------------------硬件实验五 A/D转换实验----------------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 3390H
H5: JMP START
ZXK EQU 0FFDCH
ZWK EQU 0FFDDH
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H
BUF DB ?,?,?,?,?,?
ADPORT EQU 0FFE0H
START: MOV BUF,00H ;DISPLAY 0809 00
MOV BUF+1,08H
MOV BUF+2,00H
MOV BUF+3,09H ;DISPLAY 0809 00
MOV BUF+4,00H
MOV BUF+5,00H
P5: MOV AL,00H ;IN0
MOV DX,ADPORT
OUT DX,AL
CALL DIS
MOV DX,ADPORT
IN AL,DX
mov dx,0ffe4h ;new add --> 138 Y1
not al ;new add
out dx,al ;new add --> 驱动发光二极管
not al ;new add
CALL ADS
JMP P5
ADS: MOV AH,AL
AND AL,0FH
MOV BUF+5,AL
AND AH,0F0H
MOV CL,4
SHR AH,CL
MOV BUF+4,AH
RET
;--------------------------------
DIS: MOV CL,20H
MOV BX,OFFSET BUF
DIS1: MOV AL,[BX]
PUSH BX
MOV BX,OFFSET LED
XLAT
POP BX
MOV DX,ZXK
OUT DX,AL
MOV AL,CL
MOV DX,ZWK
OUT DX,AL
PUSH CX
MOV CX,0100H
DELAY: LOOP $
POP CX
CMP CL,01H
JZ EXIT
INC BX
SHR CL,1
JMP DIS1
EXIT: MOV AL,00H
MOV DX,ZWK
OUT DX,AL
RET
;--------------------------
CODE ENDS
END H5
;-------------------D/Aת»»ÊµÑé(1) ·½²¨-----------------
;×¢Ò⣺½øĞб¾ÊµÑéÇ°£¬ÇëÏÈ×°ÔØÔËĞĞD/A 0VÊä³ö£¨µ÷»ù×¼µçѹ£©³ÌĞòAsm88\da_0v.asm
;¡¡¡¡¡¡Ê¹D/AÊä³ö¶Ë¡°AOUT¡±Êä³öµçѹΪ0V£¬ÔÙ½øĞб¾ÊµÑé¡£
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 33E0H
DAPORT EQU 0FFE0H
H6: MOV AL,0FFH
P6: MOV DX,DAPORT
OUT DX,AL
MOV CX,0400H
LOOP $
NOT AL
JMP P6
CODE ENDS
END H6
;--------------------D/A转换实验(2) 锯齿波---------------
;注意:进行本实验前,请先装载运行D/A 0V输出(调基准电压)程序Asm88\da_0v.asm
; 使D/A输出端“AOUT”输出电压为0V,再进行本实验。
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 33F0H
DAPORT EQU 0FFE0H
H7: MOV DX,DAPORT
MOV AL,00H
P7: OUT DX,AL
INC AL
JMP P7
CODE ENDS
END H7
;-------------8259单级中断控制器实验-------------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 3400H
H8: JMP P8259
ZXK EQU 0FFDCH
ZWK EQU 0FFDDH
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H
BUF DB ?,?,?,?,?,?
Port0 EQU 0FFE0H
Port1 EQU 0FFE1H
P8259: CLI
CALL WP ;初始化显示“P.”
MOV AX,OFFSET INT8259
MOV BX,003CH
MOV [BX],AX
MOV BX,003EH
MOV AX,0000H
MOV [BX],AX
CALL FOR8259
mov si,0000h
STI
CON8: CALL DIS
JMP CON8
;------------------------------------
INT8259:cli
MOV BX,OFFSET BUF
MOV BYTE PTR [BX+SI],07H
INC SI
CMP SI,0007H
JZ X59
XX59: MOV AL,20H
MOV DX,Port0
OUT DX,AL
mov cx,0050h
xxx59: push cx
call dis
pop cx
loop xxx59
pop cx
mov cx,3438h
push cx
STI
IRET
X59: MOV SI,0000H
CALL WP
JMP XX59
;==============================
FOR8259:MOV AL,13H
MOV DX,Port0
OUT DX,AL
MOV AL,08H
MOV DX,Port1
OUT DX,AL
MOV AL,09H
OUT DX,AL
MOV AL,7FH ;IRQ7
OUT DX,AL
RET
;---------------------------
WP: MOV BUF,11H ;初始化显示“P.”
MOV BUF+1,10H
MOV BUF+2,10H
MOV BUF+3,10H
MOV BUF+4,10H
MOV BUF+5,10H
RET
;--------------------------------
DIS: MOV CL,20H
MOV BX,OFFSET BUF
DIS1: MOV AL,[BX]
PUSH BX
MOV BX,OFFSET LED
XLAT
POP BX
MOV DX,ZXK
OUT DX,AL
MOV AL,CL
MOV DX,ZWK
OUT DX,AL
PUSH CX
MOV CX,0100H
DELAY: LOOP $
POP CX
CMP CL,01H
JZ EXIT
INC BX
SHR CL,1
JMP DIS1
EXIT: MOV AL,00H
MOV DX,ZWK
OUT DX,AL
RET
;--------------------------
CODE ENDS
END H8
;-----------------¶¨Ê±/¼ÆÊýÆ÷ 8253·½²¨-------------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 3490H
H9: MOV DX,0FFE3H
MOV AL,36H
OUT DX,AL
MOV DX,0FFE0H
MOV AL,00H
OUT DX,AL
MOV AL,10H
OUT DX,AL
JMP $
CODE ENDS
END H9
;------------------继电器控制------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 34B0H
H10: MOV DX,0FFDBH ;8255CTL ?
J0: MOV AL,00H
OUT DX,AL ;PC0=0
CALL JDL
MOV AL,01H
OUT DX,AL ;PC0=1
CALL JDL
JMP J0
JDL: MOV CX,0004H
JDL1: PUSH CX
MOV CX,0FFFFH
LOOP $
POP CX
LOOP JDL1
RET
CODE ENDS
END H10
;----------------8251串口实验 自发自收--------------------
Z8251 EQU 0FFE1H
D8251 EQU 0FFE0H
ZXK EQU 0FFDCH
ZWK EQU 0FFDDH
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 35C0H ;TX=RX
;===修改开始
START: MOV DX,Z8251
MOV AL,00H
OUT DX,AL
MOV AL,00H
OUT DX,AL
MOV AL,00H
OUT DX,AL
MOV AL,40H
OUT DX,AL
MOV AL,0CEH
OUT DX,AL
MOV AL,25H
OUT DX,AL
;===修改结束
MOV AL,01H
MOV BX,0400H
MOV [BX],AL
SR0: CALL WP
MOV SI,4000H
MOV DI,5000H
MOV CX,0010H
SR1: MOV AH,[SI]
CALL SEND
CALL RX
MOV [DI],AH
INC SI
INC DI
LOOP SR1
SR2: CALL DIS
JMP SR2
RX: MOV DX,Z8251
RX1: IN AL,DX
TEST AL,02H
JZ RX1
MOV DX,D8251
IN AL,DX
MOV AH,AL
RET
;------------------------
WP: MOV BUF,11H
MOV BUF+1,10H
MOV BUF+2,10H
MOV BUF+3,10H
MOV BUF+4,10H
MOV BUF+5,10H
RET
;--------------------------
SEND: MOV DX,Z8251
W1: IN AL,DX
TEST AL,01H
JZ W1
MOV DX,D8251
MOV AL,AH
OUT DX,AL
RET
;---------------------------
DIS: MOV CL,20H
MOV BX,OFFSET BUF
DIS1: MOV AL,[BX]
PUSH BX
MOV BX,OFFSET LED
XLAT
POP BX
MOV DX,ZXK
OUT DX,AL
MOV AL,CL
MOV DX,ZWK
OUT DX,AL
PUSH CX
MOV CX,0100H
DELAY: LOOP $
POP CX
CMP CL,01H
JZ EXIT
INC BX
SHR CL,1
JMP DIS1
EXIT: MOV AL,00H
MOV DX,ZWK
OUT DX,AL
RET
;--------------------------
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H
BUF DB ?,?,?,?,?,?
;--------------------------
CODE ENDS
END START
;=============8251串行通信实验:接收端===========
;1.编译连接装载本程序
;2.装载完毕后,退出Dais集成开发环境,释放串行口
;3.从键盘输入3FD0入口地址,按[EXEC]键连续运行
;4.运行“PC发送程序.exe”,选择相关串行口,使用默认2400波特率,单击“打开端口”
;5.在“PC发送程序”上点击相应发送数字按钮,实验系统LED即显示接收到的数字
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 3FD0H
Z8251 EQU 0FFE1H
D8251 EQU 0FFE0H
START: CALL FOR8253 ;#1,f1=1.8432m/48=38.4khz
CALL FOR8251 ;BPS=f1/16=2400
MOV DS:[077AH],1702H
MOV DS:[077CH],0501H
MOV DS:[077EH],0802H
MOV DS:[0740H],077FH
watrxd: call disp
CALL YRX
MOV BX,DS:[0740H]
CON: mov ds:[bx],al
CMP BX,077ah
jz serial
dec BX
MOV DS:[0740H],BX
jmp watrxd
serial: mov ds:[0740h],077fh
jmp watrxd
disp:
push cx
mov dx,077fh
mov ah,20h
disp0:
mov cx,00ffh
mov bx,dx
mov bl,ds:[bx]
mov bh,0h
push dx
mov dx,0FFDCH
mov al,[bx+OFFSET DATA1]
out dx,al
mov dx,0FFDDH
mov al,ah
out dx,al
disp1:
loop disp1
pop dx
dec dx
shr ah,01h
jnz disp0
pop cx
ret
data1:
db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h
db 80h,90h,88h,83h,0c6h,0a1h,86h,8eh
db 0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh
db 90h,0a3h,0a1h,86h,8fh
FOR8253:MOV DX,0FFE7H
MOV AL,76H
OUT DX,AL
MOV DX,0FFE5H
MOV AL,30H
OUT DX,AL
MOV DX,0FFE5H
MOV AL,00H
OUT DX,AL
RET
FOR8251:MOV DX,Z8251
MOV AL,4EH
OUT DX,AL
MOV AL,25H
OUT DX,AL
RET
YRX: MOV DX,Z8251
YRX0: PUSH DX
CALL DISP
POP DX
IN AL,DX
TEST AL,02
JZ YRX0
MOV DX,D8251
IN AL,DX
RET
YTX: MOV DX,Z8251
PUSH AX
YTX0: IN AL,DX
TEST AL,01
JZ YTX0
MOV DX,D8251
POP AX
OUT DX,AL
RET
CODE ENDS
END START
;=============8251串行通信实验:发送端===========
;1.编译连接装载本程序
;2.装载完毕后,退出Dais集成开发环境,释放串行口
;3.从键盘输入3FD8入口地址,按[EXEC]键连续运行
;4.运行“PC接收程序.exe”,选择相关串行口,使用默认2400波特率,单击“打开端口”
;5.在实验仪键盘上输入相关数字,“PC接收程序”上即显示接收到的数字
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ZXK EQU 0FFDCH ;定义字形端口地址
ZWK EQU 0FFDDH ;定义字位/键扫端口地址
zjk equ 0ffdeh ;定义键入端口地址
Z8251 EQU 0FFE1H
D8251 EQU 0FFE0H
;-------------------------------
ORG 3FD8H
START: MOV BUF,08H ;DISPLAY 8251-1
MOV BUF+1,02H
MOV BUF+2,05H
MOV BUF+3,01H
MOV BUF+4,14H
MOV BUF+5,01H
CALL FOR8253 ;#1,f1=1.8432m/48=38.4khz
CALL FOR8251 ;BPS=f1/16=2400
led_g: call dispkey
cmp al,10h
jnc led_g
call ytx
jmp led_g
;==============================
DISPKEY:CALL DIS;调显示子程序
DISCDEY:CALL KEY ;调键扫子程序
MOV AH,AL ;键消抖处理
MOV BX,OFFSET buF+8
MOV CX,[BX]
MOV BL,CL
MOV BH,CH
CMP AH,BH
MOV BH,AH
MOV AH,BL
JZ DISK4
MOV BL,88H
MOV AH,88H
DISK4: DEC AH
CMP AH,82H
JZ DISK6
CMP AH,0EH
JZ DISK6
CMP AH,00H
JZ DISK5
MOV AH,20H
DEC BL
JMP DISK7
DISK5: MOV AH,0FH
DISK6: MOV BL,AH
MOV AH,BH
DISK7: mov buF+8,bL
mov buF+9,bh
mov aL,ah
cmp cl,ah
RET
;===========显示子程序=============
DIS: MOV CL,20H
MOV BX,OFFSET BUF
DIS1: MOV AL,[BX]
PUSH BX
MOV BX,OFFSET LED
XLAT
POP BX
MOV DX,ZXK
OUT DX,AL
MOV AL,CL
MOV DX,ZWK
OUT DX,AL
PUSH CX
MOV CX,0100H
DELAY: LOOP $
POP CX
CMP CL,01H
JZ EXIT
INC BX
SHR CL,1
JMP DIS1
EXIT: MOV AL,00H
MOV DX,ZWK
OUT DX,AL
RET
;============键扫子程序==============
key: mov aL,0ffh ;关显示口
mov dx,zxk
out dx,aL
mov bL,00h
mov ah,0feh
mov cx,08h
key1: mov aL,ah
mov dx,zwk
out dx,aL
SHL AL,01H
MOV AH,AL
NOP
NOP
NOP
NOP
NOP
NOP
MOV DX,zjk
IN AL,DX
NOT AL
NOP
NOP
AND AL,0FH
JNZ KEY2
INC BL
LOOP KEY1
NKEY: MOV AL,20H
ret
KEY2: TEST AL,01H
JE KEY3
MOV AL,00H
JMP KEY6
KEY3: TEST AL,02H
JE KEY4
MOV AL,08H
JMP KEY6
KEY4: TEST AL,04H
JE KEY5
MOV AL,10H
JMP KEY6
KEY5: TEST AL,08H
JE NKEY
MOV AL,18H
KEY6: ADD AL,BL
CMP AL,10H
JNC FKEY
mov bx,offset ls3
XLAT
FKEY: RET
;================================
ls3 DB 07H,04H,08H,05H,09H,06H,0AH,0BH
DB 01H,00H,02H,0FH,03H,0EH,0CH,0DH
;================================
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H,0BFH
;================================
BUF DB ?,?,?,?,?,?,?,?,?,?
; 3,2,1,0,4,6,8,
;-------------------------------------------
FOR8253:MOV DX,0FFE7H
MOV AL,76H
OUT DX,AL
MOV DX,0FFE5H
MOV AL,30H
OUT DX,AL
MOV DX,0FFE5H
MOV AL,00H
OUT DX,AL
MOV DX,Z8251
MOV DX,Z8251
RET
FOR8251:MOV DX,Z8251
MOV AL,4EH
OUT DX,AL
MOV AL,25H
OUT DX,AL
RET
YTX: MOV DX,Z8251
PUSH AX
YTX0: IN AL,DX
TEST AL,01
JZ YTX0
MOV DX,D8251
POP AX
OUT DX,AL
RET
;--------------------------
CODE ENDS
END START
;-------------------²½½øµç»ú¿ØÖÆ----------------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
IOCONPT EQU 0FFDBH
IOBPT EQU 0FFD9H
IOAPT EQU 0FFD8H
ORG 3620H
H12: MOV AL,88H
MOV DX,IOCONPT
OUT DX,AL
NOP
NOP
NOP
IOLED1: MOV DX,IOAPT
MOV AL,03H
OUT DX,AL
CALL XDELAY
MOV AL,06H
OUT DX,AL
CALL XDELAY
MOV AL,0CH
OUT DX,AL
CALL XDELAY
MOV AL,09H
OUT DX,AL
CALL XDELAY
MOV AL,03H
OUT DX,AL
CALL XDELAY
MOV AL,06H
OUT DX,AL
CALL XDELAY
MOV AL,0CH
OUT DX,AL
CALL XDELAY
MOV AL,09H
OUT DX,AL
CALL XDELAY
JMP IOLED1
XDELAY: MOV CX,03FFFH
XDELA: LOOP XDELA
RET
CODE ENDS
END H12
;-------------------²½½øµç»ú¿ØÖÆ----------------------
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
IOCONPT EQU 0FFDBH
IOBPT EQU 0FFD9H
IOAPT EQU 0FFD8H
ORG 3620H
H12: MOV AL,88H
MOV DX,IOCONPT
OUT DX,AL
NOP
NOP
NOP
IOLED1: MOV DX,IOAPT
MOV AL,03H
OUT DX,AL
CALL XDELAY
MOV AL,06H
OUT DX,AL
CALL XDELAY
MOV AL,0CH
OUT DX,AL
CALL XDELAY
MOV AL,09H
OUT DX,AL
CALL XDELAY
MOV AL,03H
OUT DX,AL
CALL XDELAY
MOV AL,06H
OUT DX,AL
CALL XDELAY
MOV AL,0CH
OUT DX,AL
CALL XDELAY
MOV AL,09H
OUT DX,AL
CALL XDELAY
JMP IOLED1
XDELAY: MOV CX,03FFFH
XDELA: LOOP XDELA
RET
CODE ENDS
END H12
;-------------------小直流电机调速