MOV AH,35H MOV A L,0AH ;取0AH号中断向量送 ES:BX INT 21 H PUSH ES ;保存原中断向量 PUSH BX PUSH DS MOV DX,SEG ADINT MOV DS,DX MOV DX,OFFSET ADINT ;设置新的中断向量 MOV AH,25H MOV AL,0AH INT 21H POP DS IN AL,21H ;取中断屏蔽寄存器的内容 PUSH AX ;保存 AND AL,11111011B ;允许IRQ2的中断 OUT 21H,AL
4.PC机系统中的8259A工作在完全嵌套方式下,在中断处理程序结束时,需要发中断结束名命令。
MOV AL,20H OUT 20H,AL 5.编程2的内容具有一定难度,仅为选作内容。 四、程序框图:
1.中断处理程序:
保存使用的寄存器的内容 从0809的端口读取A/D转换的数据 发中断结束的命令 中断返回
16
2.主程序:
用INT21H的35H子功能取类型0AH的中断向量,并入栈保存 用INT21H的25H子功能设置类型0AH的中断向量,指向A/D转换的中断处理子程序 取中断屏蔽寄存器的内容保存在BP寄存器中 开放0AH号中断 300→CX 开中断 启动0809进行本次A/D转换 等待硬中断 关中断 A/D转换结果送内存6000H段 N CX减1为0? Y 用INT21H的25H子功能恢复原中断向量 恢复中断屏蔽寄存器内容 结束
17
五、程序清单(一):
CRLF MACRO
MOV DL,0DH MOV AH,02H INT 21H ;中断方式采样 A/ D转换数 MOV DL,0AH 据,送内存的6000H段处。 MOV AH,02H INT 21H ENDM
DATA SEGMENT INR DB ? RESULT DB ? DATA ENDS
STACK SEGMENT STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START:MOV AX,DATA MOV DS,AX MOV AX,STACK ;初始化 MOV SS,AX MOV AX,TOP MOV SP,AX MOV AL,0AH MOV AH,35H ;取 IRQ2对应的中断向量 INT 21 H PUSH ES PUSH BX ;保存 PUSH DS MOV AX,SEG ADINT ;取中断处理程序的段址送 DS MOV DS,AX MOV DX,OFFSET ADINT ;偏移量送DX
MOV AL,0AH
MOV AH,25H ;设置 IRQ2中断向量指向中断 INT 21H 处理程序 POP DS ;恢复 DS IN AL,21H ;取中断屏蔽寄存器的内容送 MOV BP,AX BP保存
18
AND AL,11111011B ;允许 IRQ2中断 OUT MOV CCC: STI MOV OUT HLT CLI MOV PUSH MOV MOV MOV DEC MOV POP
LOOP
POP POP MOV MOV INT MOV OUT MOV
INT
ADINT PROC PUSH
PUSH
MOV IN MOV MOV OUT POP POP IRET ADINT ENDP CODE ENDS END START
21 H,AL CX,300 DX,220H DX,AL AX,SI DS
BX,6000H DS,BX
BX,CX BX [BX],AL DS CCC DX DS AL,0AH AH,25H 21 H
AX,BP 21H,AL AX,4C00H 21 H
NEAR AX DX
DX,220H AL,DX
SI,AX AL,20H 20H,AL DX AX
;采样300个点 ;开中断
;启动一次A/D采样 ;等待 IRQ2硬中断 ;关中断
;取A/D转换的结果
;送至内存6000:0—2FF区域
;恢复 IRQ2中断向量
;恢复原中断屏蔽寄存器的内容 ;结束
;中断处理子程序 ;保存
;读取A/D转换后的数据 ;数据送SI寄存器中 ;发中断结束命令
;恢复
19
六、程序清单(二):
以中断方式采样A/D转换数据,并将结果在PC机上显示出来。
说明:该程序使用两个缓冲区,其中,BUFFER1用于存放A/D采样转换的数值,BUFFER2用于存放显示的数对应的行值。P1是BUFFER1的地址指针,用于指示要读出的数的地址.
程序采用中断方式进行采样,将采样值存人BUFFER1中。每当640个点采样完后,则将采样值变成显示所对应的行值,以顺序号作为列值,按高分辨率图形方式显示出来。每次显示,都首先抹除旧的显示亮点,然后显示新的显示亮点。如此循环,则在屏幕上将看到一条动态显示曲线。当任意健按下时,程序运行结束。 DATA SEGMENT BUFFER l DB 640 DUP (0) BUFFER2 DB 640 DUP (0) Pl DW 8FH P2 DB 0FFH FLAG DB 0 DATA ENDS STACK SEGMENT DW 32 DUP (7) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX ;初始化 MOV AX,STACK MOV SS,AX MOV AL,0AH MOV AH,35H ;取0AH的中断向量送ES:BX INT 21H PUSH ES PUSH BX ;入栈保存 PUSH DS MOV AX,SEG ADINT MOV DS,AX MOV DX,OFFSET ADINT MOV AL,0AH ;设置新的中断向量,以指向中 MOV AH,25H 断 处理程序 INT 21H POP DS IN AL,21H ;取中断屏蔽寄存器内容送 BP MOV BP,AX
20