8259 中断控制实验

一、实验目的:

1、掌握8259中断控制器的工作原理。

2、学习8259的应用编程方法。

3、掌握8259级联方式的使用方法。

二、实验内容与要求:

1.利用系统总线上中断请求信号MIR7,设计一个单一中断请求实验。

2.利用系统总线上中断请求信号MIR6和MIR7,设计一个双中断优先级应用实验,观察8259对中断优先级的控制。

3.利用系统总线上中断请求信号MIR7和SIR1,设计一个级连中断应用实验。

四、实验步骤

1.8259单中断实验

实验接线图如图4.2.11所示,单次脉冲输出与主片8259的IR7相连,每按动一次单次脉冲,产生一次外部中断,在显示屏上输出一个字符“7” (代码修改成“9)。

d8f5eba529f2497a98b43b8fd0f05394.png

图1 8259单中断实验接线图

(1)按图1连接实验线路。

(2)编写实验程序,经编译、链接无误后装入系统。

(3)单击RUN按钮,运行实验程序,重复按单次脉冲开关KK1+,在界面的输出区会显示字符“9”,说明响应了中断。

2.8259双中断优先级实验

实验接线图如图2所示,KK1+和KK2+分别连接到主片8259的IR7和IR6上,当按一次KK1+时,显示屏上显示字符“7” (代码修改成“8),按一次KK2+时,显示字符“6” (代码修改成“3)。编写程序。

8d3ff9d889044e188fbe87660ddd50e7.png

图2 8259单中断实验接线图

(1)按图2连接实验线路。

(2)编写实验程序,经编译、链接无误后装入系统。

(3)单击RUN按钮,运行实验程序,重复按单次脉冲开关KK1+和KK2+,在界面的输出区会显示字符“8”和“3”,说明响应了中断。

(4)尝试先按KK1+,再快速按KK2+,观察MIR7和MIR6两个中断请求的优先级,分析实验结果。

3.8259级连中断实验

实验接线图如图3所示,KK1+连接到主片8259的IR7上,KK2+连接到从片8259的IR1上,当按一次KK1+时,显示屏上显示字符“L2”,按一次KK2+时,显示字符“S1”。编写程序。

3d8a1c1feb474406bdbff900b7dd5135.png

图3 8259级联实验接线图

(1)按图3连接实验线路。

(2)输入程序,编译、链接无误后装入系统。

(3)单击凹按钮,运行实验程序,重复按单次脉冲开关KK1+和KK2+,在界面的输出区会显示字符“L2”和“S1”,说明响应了中断,验证实验程序的正确性。

(4)尝试先按KK1+,再快速按KK2+,观察MIR7和SIR1两个级连中断请求的优先级,分析实验结果。

五、电路连接

1.8259单中断实验电路连接

157c9d4b6d1e4510a6dddc51f8ea6d34.png

图4 8259单中断实验电路连接

2.8259双中断优先级实验电路连接

cda78c39f66d4ac2b70a47fa043fb8eb.png

图5 8259双中断优先级实验电路连接

3.8259级连中断实验电路连接

f7cbce2456ea4d29ae373fb321ef0067.png

图6 8259级连中断实验电路连接

六、代码设计与分析

1.关于显示字符

MOV AX, 0137H
INT 10H ;显示字符 7

这里AH=01,AL=37=‘7’,会显示AL对应的字符。

2.关于中断矢量地址

IR7为例:

MOV AX, OFFSET MIR7     ;取中断入口地址

MOV SI, 003CH           ;中断矢量地址

MOV [SI], AX            ;填IRQ7的偏移矢量

MOV AX, CS              ;段地址

MOV SI, 003EH

MOV [SI], AX            ;填IRQ7的段地址矢量

子程序入口是中断类型号*4,从下图可以看出,IR7的中断类型号是F(0F),0F×4=003C,003E=0F×4+2

af07d68e708a49479c06a05e70697035.png

IRQ6SIR1(即IR1,丛片1)同上分析。

3.关于初始化ICWOCW

MOV AL, 11H

OUT 20H, AL             ;ICW1

MOV AL, 08H

OUT 21H, AL             ;ICW2

MOV AL, 04H

OUT 21H, AL             ;ICW3

MOV AL, 01H

OUT 21H, AL             ;ICW4

MOV AL, 6FH  ;OCW1  0110 1111   开放4号中断串口用,7号中断实验用

ef18964c88b340b89c5fb1cbe7fa5948.png

1)送ICW1命令到20H端口地址,用于定义触发方式,单片/多片使用,是否需要写ICW4,具体命令格式如下图。

 b853c0abf29f47088648fc1aeab1652b.png

2)送ICW2命令到21H端口地址,确定中断号的高五位,具体命令格式如下图。

b6d549478f7c47b5af6c86ead2a42e5e.png

3)如果采用多片级联方式,则定义主片和从片的IR引脚编号,送到20H端口地址,具体命令格式如下图。如果没有级联直接进入第四步。(ICW3命令只有系统存在2片以上中断控制器芯片时才启用,否则,不用ICW3命令。)

 cd4dfa2358904faba962880570329c04.png

4)如果需要ICW4,则定义中断方式,嵌套方式缓冲方式和系统位数,具体命令格式如下图。如果不需要,则跳到第五步。

3e338d2bb1914739ad8c8c4e1ecf5e89.png

5)准备接收中断  

七、实验现象

1.8259单中断实验结果

重复按单次脉冲开关KK1+,在界面的输出区会显示字符“9”),说明响应了中断。

a98a99b5e0ad45c6bedb1b0ec15277a1.png

图7 8259单中断实验结果

2.8259双中断优先级实验结果

先按KK1+,显示字符3,再快速按KK2+,因为MIR7的中断请求优先级高于MIR6,所以会显示字符8,当MIR7的中断响应的结束后执行MIR6的中断响应,所以可以看到字符3和字符8如图10所示。

1bf2c1334d95429fa1206600f1ac2bb3.png

图8 8259双中断优先级实验结果

3.8259级连中断实验结果

先按KK1+,显示字符L2,再快速按KK2+,因为MIR7的中断请求优先级高于SIR1,所以会显示字符S1,当MIR7的中断响应的结束后执行SIR1的中断响应,所以可以看到字符L2和字符S1如图11所示。

5ed2c881c8b34fa6bff11bc248ec0d9c.png

图9 8259级连中断实验结果

八、实验代码

1.A82591.ASM
功能描述: 8259中断实验,中断源为主片8259的IRQ7;每产生一次中断输出显示一个字符7


SSTACK	SEGMENT STACK
		DW 32 DUP(?)
SSTACK	ENDS
CODE   	SEGMENT
	   	ASSUME CS:CODE
START: 	PUSH DS
		MOV AX, 0000H
		MOV DS, AX
		MOV AX, OFFSET MIR7		;取中断入口地址
		MOV SI, 003CH			;中断矢量地址
		MOV [SI], AX			;填IRQ7的偏移矢量
		MOV AX, CS				;段地址
		MOV SI, 003EH
		MOV [SI], AX			;填IRQ7的段地址矢量
		CLI
		POP DS
		;初始化主片8259
		MOV AL, 11H
		OUT 20H, AL				;ICW1
		MOV AL, 08H
		OUT 21H, AL				;ICW2
		MOV AL, 04H
		OUT 21H, AL				;ICW3
		MOV AL, 01H
		OUT 21H, AL				;ICW4
		MOV AL, 6FH				;OCW1  0110 1111   开放4号中断串口用,7号中断实验用
		OUT 21H, AL
		STI
AA1:	NOP
		JMP AA1		
MIR7:	STI
		CALL DELAY
		MOV AX, 0137H
		INT 10H					;显示字符7
		MOV AX, 0120H
		INT 10H
		MOV AL, 20H
		OUT 20H, AL				;中断结束命令
		IRET		
DELAY:	PUSH CX
		MOV CX, 0F00H
AA0:	PUSH AX
		POP  AX
		LOOP AA0
		POP CX
		RET		
CODE	ENDS
		END  START

2. A82592.ASM
功能描述: 8259中断优先级应用实验

SSTACK	SEGMENT STACK
		DW 32 DUP(?)
SSTACK	ENDS

CODE   	SEGMENT
	   	ASSUME CS:CODE
START: 	PUSH DS
		MOV AX, 0000H
		MOV DS, AX
		MOV AX, OFFSET MIR7		;取中断入口地址
		MOV SI, 003CH			;中断矢量地址
		MOV [SI], AX			;填IRQ7的偏移矢量
		MOV AX, CS				;段地址
		MOV SI, 003EH
		MOV [SI], AX			;填IRQ7的段地址矢量
		MOV AX, OFFSET MIR6
		MOV SI, 0038H
		MOV [SI], AX
		MOV AX, CS
		MOV SI, 003AH
		MOV [SI], AX
		CLI
		POP DS
		;初始化主片8259
		MOV AL, 11H
		OUT 20H, AL				;ICW1
		MOV AL, 08H
		OUT 21H, AL				;ICW2
		MOV AL, 04H
		OUT 21H, AL				;ICW3
		MOV AL, 01H
		OUT 21H, AL				;ICW4
		MOV AL, 2FH
		OUT 21H, AL				;主8259 OCW1
		STI
AA1:	NOP
		JMP AA1
MIR7:	STI
		CALL DELAY
		MOV AX, 0137H
		INT 10H					;显示字符7
		MOV AX, 0120H
		INT 10H
		MOV AL, 20H
		OUT 20H, AL				;中断结束命令
		IRET
MIR6:	STI
		CALL DELAY
		MOV AX, 0136H
		INT 10H					;显示字符6
		MOV AX, 0120H
		INT 10H
		MOV AL, 20H
		OUT 20H, AL
		IRET
DELAY:	PUSH CX
		MOV CX, 0F000H
AA0:	PUSH AX
		POP  AX
		LOOP AA0
		POP CX
		RET
CODE	ENDS
		END  START

3.A82593.ASM
功能描述: 8259级联中断实验,中断源为主片8259的IR7,从片8259的IR1。从片8259通过主片8259的IR2;进行级联;主片每产生一次中断输出显示一个字符M7,从片每产生一次中断输出显示一个字符


SSTACK	SEGMENT STACK
		DW 32 DUP(?)
SSTACK	ENDS
CODE   	SEGMENT
	   	ASSUME CS:CODE
START: 	PUSH DS
		MOV AX, 0000H
		MOV DS, AX
		MOV AX, OFFSET MIR7		;取中断入口地址
		MOV SI, 003CH			;中断矢量地址
		MOV [SI], AX			;填IRQ7的偏移矢量
		MOV AX, CS				;段地址
		MOV SI, 003EH
		MOV [SI], AX			;填IRQ7的段地址矢量		
		MOV AX, OFFSET SIR1
		MOV SI, 00C4H
		MOV [SI], AX
		MOV AX, CS
		MOV SI, 00C6H
		MOV [SI], AX
		CLI
		POP DS
		;初始化主片8259
		MOV AL, 11H
		OUT 20H, AL				;ICW1
		MOV AL, 08H
		OUT 21H, AL				;ICW2
		MOV AL, 04H
		OUT 21H, AL				;ICW3
		MOV AL, 01H
		OUT 21H, AL				;ICW4
		;初始化从片8259
		MOV AL, 11H
		OUT 0A0H, AL			;ICW1
		MOV AL, 30H
		OUT 0A1H, AL			;ICW2
		MOV AL, 02H				
		OUT 0A1H, AL			;ICW3
		MOV AL, 01H
		OUT 0A1H, AL			;ICW4
		MOV AL, 0FDH
		OUT 0A1H,AL				;OCW1 = 1111 1101		
		MOV AL, 6BH
		OUT 21H, AL				;主8259 OCW1
		STI
AA1:	NOP
		JMP AA1
MIR7:	STI
		CALL DELAY
		MOV AX, 014DH
		INT 10H					;显示字符M
		MOV AX, 0137H
		INT 10H					;显示字符7
		MOV AX, 0120H
		INT 10H
		MOV AL, 20H
		OUT 20H, AL				;中断结束命令
		IRET
SIR1:	STI
		CALL DELAY
		MOV AX, 0153H
		INT 10H					;显示字符S
		MOV AX, 0131H
		INT 10H					;显示字符1
		MOV AX, 0120H
		INT 10H
		MOV AL, 20H
		OUT 0A0H, AL
		OUT 20H, AL
		IRET
DELAY:	PUSH CX
		MOV CX, 0F00H
AA0:	PUSH AX
		POP  AX
		LOOP AA0
		POP CX
		RET
CODE	ENDS
		END  START

S1。

  • 27
    点赞
  • 175
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个用汇编语言编写的 8259 中断控制实验程序,同时实现了中断次数的显示: ```assembly section .data count db 0 ; 定义计数器 section .text handler: pusha ; 保存通用寄存器 inc byte [count] ; 每次中断,计数器加一 mov al, 0x20 out 0x20, al ; 发送中断结束命令 popa ; 恢复通用寄存器 iret ; 中断返回指令 global _start _start: ; 初始化主片和从片 mov al, 0x11 ; ICW1: 边沿触发模式,级联8259,需要ICW4 out 0x20, al ; 主片ICW1 out 0xa0, al ; 从片ICW1 mov al, 0x20 ; ICW2: 设置主片中断向量号为0x20~0x27 out 0x21, al ; 主片ICW2 mov al, 0x28 ; ICW2: 设置从片中断向量号为0x28~0x2f out 0xa1, al ; 从片ICW2 mov al, 0x04 ; ICW3: 设置从片连接到主片的IR2 out 0x21, al ; 主片ICW3 mov al, 0x02 ; ICW4: 8086模式 out 0x21, al ; 主片ICW4 out 0xa1, al ; 从片ICW4 ; 设置中断向量表 mov al, 0x08 mov ah, 0x35 mov dx, handler int 0x21 ; 开启中断 sti ; 循环显示计数器 loop: mov al, byte [count] call print_num call print_nl jmp loop print_num: ; 将数字转为字符串 push ax push bx push cx push dx xor bx, bx mov cx, 10 div cx add ax, 0x3030 mov byte [num_str+1], al mov byte [num_str], ah mov ah, 0x09 mov dx, num_str int 0x21 pop dx pop cx pop bx pop ax ret print_nl: ; 输出换行符 mov ah, 0x02 mov dl, 0x0a int 0x21 mov dl, 0x0d int 0x21 ret section .bss num_str resb 2 ; 存储数字字符串的缓冲区 ``` 在中断服务程序 `handler` 中,每次中断时计数器 `count` 加一,并发送中断结束命令。在 `_start` 函数中,先初始化 8259 芯片,然后设置中断向量表、开启中断,并通过一个无限循环不断显示计数器的值,同时调用 `print_num` 函数将数字转为字符串并输出,再调用 `print_nl` 函数输出换行符,以避免过于频繁的输出。 需要注意的是,在实际的应用场景中,8259 芯片可能已经被 BIOS 或操作系统初始化,这时需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钻仰弥坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值