汇编与接口技术实验5——8259中断实验
一、 实验目的
该实验使学生掌握8259向量中断方式的硬件连接和软件编程的方法,同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。
二、 实验内容
1、手动产生单脉冲作为中断请求信号连接到MIRQ3(对应中断号0BH)上和SIRQ10(对应中断号72H)上。每按一次开关产生一次中断,某LED灯就亮或灭一次(上次亮,当前就灭;上次灭,当前就亮),中断10次后程序退出。其中,主8259的端口地址为20H,从片8259的端口地址为0A0H.
连线:
总线/MIRQx 接 单脉冲1/正脉冲
总线/SIRQx 接 单脉冲2/正脉冲
编程提示
(1) MIRQ3和SIRQ10是接到PC的标准中断8259,其初始化工作已由系统的BIOS完成,因此不需要再对主和从8259A初始化(ICW1-ICW4),但要进行设置中断矢量和打开中断(包括CPU中断和8259A中断)等操作;注意:微机中采用的是非自动结束,则需要在中断结束前(中断服务程序的最后)发中断结束命令。另外、写入中断屏蔽字应采用“读—修改—写”过程,如下所述:
IN AL,21H
AND AL,0DFH
OUT 21H,AL
(2) 系统中断主中断MIRQ3
(3) 系统中断从中断SIRQ10。
2、8255的PC6作为中断源连接到MIRQ3上,每向8259A发出中断请求,使LED指示等交替点亮和熄灭。中断5次后程序退出.
编程提示
(1)中断服务程序的主要功能是交替点亮和熄灭LED指示灯(即第1次进中断点亮LED,
第2次进中断则熄灭LED)。8255使用前需要在主程序中初始化。
(2) 8255的PC6作为中断源,应采用上升沿触发方式(由低到高的变化),为了能够进行下次中断,PC6必须变为低点平。
(3) 为了能使LED的闪烁可见,在中断各申请之间加入延迟程序。
实验1程序的流程图如下:
实验2的流程图如下:
三、 实验步骤
1、 根据原理图自行连接实验线路(需要连接红线)。
实验1接线图如下:
实验2接线图如下:
2、 正确理解实验原理。
3、 编写实验程序,并上机调试,观察实验结果。
答: 实验1:主片和从片分别对应一个LED灯,通过脉冲触发中断,每触发一次,对应LED灯交替点亮或熄灭,在10次之后程序退出。
实验1的代码如下:
SSEG SEGMENT
DW 100 DUP(?)
SSEG ENDS
;设置保存中断向量地址的变量
DSEG SEGMENT
OLD1_OFF DW ?
OLD1_SEG DW ?
OLD2_OFF DW ?
OLD2_SEG DW ?
;题目要求中断10次,设置变量用于对比
N DW 10
;通过8255设置LED灯打开位置
LED1 DW 00000100B
LED2 DW 00100000B
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START:
MOV AX,DSEG
MOV DS,AX
;开放主片的中断屏蔽
CLI
IN AL,21H
AND AL,0F3H ;11110011
OUT 21H,AL
;开放从片的中断屏蔽
IN AL,0A1H
AND AL,0FBH ;11111011
OUT 0A1H,AL
;中断主程序
CALL SET_TABLE
;对要用到的8255进行初始化
MOV DX,283H ;8255的命令口地址
MOV AL,90H ;使用0方式
OUT DX,AL ;送入命令口
;中断程序
XOR CX,CX
;统计中断次数,超过10次则退出
S1:
STI
HLT
CMP CX,N
JNZ S1
;中断结束,恢复中断向量
CLI
CALL RECOVER_TABLE
;中断结束恢复屏蔽
IN AL,21H
OR AL,0CH ;00001100
OUT 21H,AL
IN AL,0A1H
OR AL,04H ;00000100
OUT 0A1H,AL
STI
MOV AH,4CH ;程序结束
INT 21H
;修改中断向量
SET_TABLE PROC
PUSH DS
PUSH DI
PUSH BX
MOV AX,0;
MOV DS,AX
MOV DI,4*0BH
;获取原中断向量
MOV BX,[DI]
MOV OLD1_OFF,BX
MOV BX,[DI+2]
MOV OLD1_SEG,BX
;设置新的中断向量
MOV BX,OFFSET SW1_INT
MOV [DI],BX
MOV BX,SEG SW1_INT
MOV [DI+2],BX
MOV DI,4*72H
;获取原中断向量
MOV BX,[DI]
MOV OLD2_OFF,BX
MOV BX,[DI+2]
MOV OLD2_SEG,BX
;设置新的中断向量
MOV BX,OFFSET SW2_INT
MOV [DI],BX
MOV BX,SEG SW2_INT
MOV [DI+2],BX
POP BX
POP DI
POP DS
RET
SET_TABLE ENDP
;中断向量恢复
RECOVER_TABLE PROC
PUSH DS
PUSH DI
PUSH BX
MOV AX,0;
MOV DS,AX
MOV DI,4*0BH
;实现中断向量恢复语句
MOV BX,OLD1_OFF
MOV [DI],BX
MOV BX,OLD1_SEG
MOV [DI+2],BX
MOV DI,4*72H
;实现中断向量恢复语句
MOV BX,OLD2_OFF
MOV [DI],BX
MOV BX,OLD2_SEG
MOV [DI+2],BX
POP BX
POP DI
POP DS
RET
RECOVER_TABLE ENDP
;中断服务程序
SW1_INT PROC
PUSH AX
PUSH DX
CLI
INC CX ;统计中断次数,如果超过10次则程序退出
MOV AX,LED1
MOV DX,281H ;8255的B口地址
OUT DX,AX ;送到命令口
XOR AX,00000100B ;异或语句实现指定LED对应输出电平转换
MOV LED1,AX
MOV AL,20H
OUT 20H,AL
POP DX
POP AX
STI
IRET
SW1_INT ENDP
;另一个中断服务程序
SW2_INT PROC
PUSH AX
PUSH DX
CLI
INC CX ;统计中断次数
MOV AX,LED2
MOV DX,281H ;8255的B口地址
OUT DX,AX ;送到命令口
XOR AX,00100000B ;异或语句实现指定LED对应输出电平转换
MOV LED2,AX
MOV AL,20H
OUT 20H,AL
MOV AL,20H;?
OUT 0A0H,AL;?
POP DX
POP AX
STI
IRET
SW2_INT ENDP
CSEG ENDS
END START
实验2:程序中对8255的PC6进行控制,由程序自发的触发中断。可以看到的结果是8个LED灯一起亮灭五次。
实验2的代码如下:
SSEG SEGMENT
DW 100 DUP(?)
SSEG ENDS
;数据段,存储LED操作,中断向量以及中断次数标准
DSEG SEGMENT
OLD_OFF DW ?
OLD_SEG DW ?
N DW 5
LED DB 0FFH
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START:
MOV AX,DSEG
MOV DS,AX
;开放中断屏蔽
CLI
IN AL,21H
AND AL,0F3H ;11110011
OUT 21H,AL
;中断主程序
CALL SET_TABLE
;对8255进行初始化
MOV DX,283H
MOV AL,90H
OUT DX,AL
;中断程序
XOR CX,CX ;CX清零
S1:
STI
;设置8255的PC6输出高电平,触发中断
MOV DX,282H
MOV AL,40H ;01000000
OUT DX,AL
;LED
MOV DX,281H
MOV AL,0FFH
OUT DX,AL
CALL DELAY
MOV AL,00H
OUT DX,AL
CALL DELAY
MOV DX,282H
MOV AL,00H
OUT DX,AL
;统计中断次数
CMP CX,N
JNZ S1
;中断结束,恢复中断向量
CLI
CALL RECOVER_TABLE
;中断结束恢复中断屏蔽
IN AL,21H
OR AL,0CH
OUT 21H,AL
STI
MOV AH,4CH
INT 21H
;修改中断向量
SET_TABLE PROC
;寄存器压栈保护
PUSH DS
PUSH DI
PUSH BX
MOV AX,0;
MOV DS,AX
MOV DI,4*0BH
;获取原中断向量
MOV BX,[DI]
MOV OLD_OFF,BX
MOV BX,[DI+2]
MOV OLD_SEG,BX
;设置新的中断向量
MOV BX,OFFSET SW_INT
MOV [DI],BX
MOV BX,SEG SW_INT
MOV [DI+2],BX
POP BX
POP DI
POP DS
RET
SET_TABLE ENDP
;中断向量恢复
RECOVER_TABLE PROC
PUSH DS
PUSH DI
PUSH BX
MOV AX,0;
MOV DS,AX
MOV DI,4*0BH
;实现中断向量恢复句
MOV BX,OLD_OFF
MOV [DI],BX
MOV BX,OLD_SEG
MOV [DI+2],BX
POP BX
POP DI
POP DS
RET
RECOVER_TABLE ENDP
;中断服务程序
SW_INT PROC
PUSH AX
PUSH DX
CLI
INC CX ;统计中断次数
MOV AL,20H
OUT 20H,AL
POP DX
POP AX
STI
IRET
SW_INT ENDP
;因为程序目的是LED自发闪烁,为确保观测效果设定时延
DELAY PROC
PUSH BX
PUSH CX
MOV CX,0FFFH
DL1:
MOV BX,0FFFH
DL2:
DEC BX
JNZ DL2
DEC CX
JNZ DL1
POP CX
POP BX
RET
DELAY ENDP
CSEG ENDS
END START
四、 思考题
如何理解采用中断方式进行实时控制,请举一些可能的应用例子。
答:中断是一种可以使CPU和硬件设备进行通信的技术。例如,当我们在敲击键盘时,键盘控制器(控制键盘的硬件设备)会发送一个中断,通知操作系统有键按下。从本质上说,中断是一种特殊的信号,由硬件设备向CPU发送。当CPU接收到中断信号后,就会马上通知操作系统此信号的到来,然后由操作系统负责处理这些新到来的数据。
相关文章
- 龙邱树莓派Raspberry Pi 扩展板电路及其相关实验
- 增加ATMEGA328 实验电路板对外引脚
- MicroPython内核开发笔记书内软件用例 :PWM部分实验用例
- Viterbi译码+QPSK调制解调实验
- 【FPGA教程案例67】硬件开发板调试7——基于HDMI接口的彩色显示器图像显示实验
- 《计算机网络》课程实验(HTTP 代理服务器的设计与实现 、可靠数据传输协议、IPv4 分组收发转发、利用 Wireshark 进行协议分析)【100010494】
- Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏
- 华为enspDHCP分配实验
- H3C PBR(策略路由)实验
- 【正点原子FPGA连载】第二十五章 双路高速AD实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
- 【正点原子FPGA连载】 第二十章 LCD触摸屏实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
- 【正点原子FPGA连载】 第十七章 RS485串口通信实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
- 【正点原子Linux连载】第六十七章 Linux USB驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
- 【正点原子MP157连载】第十四章 串口通信实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
- 【正点原子FPGA连载】第十三章 外部中断实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
- 【数据分析】实验:对某银行对降低贷款拖欠率的数据进行逻辑回归建模,并输出平均正确率。
- 【鲲鹏应用迁移】实验:通过鲲鹏开发套件实现Hyper Tuner性能调优(超详细)
- 汇编与接口技术实验6——ADDA转换实验,中断方式的AD采集系统