微机接口 8255中断实验报告.docx
- 文档编号:29866523
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:15
- 大小:446.95KB
微机接口 8255中断实验报告.docx
《微机接口 8255中断实验报告.docx》由会员分享,可在线阅读,更多相关《微机接口 8255中断实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
微机接口8255中断实验报告
浙江工业大学计算机学院
实验报告
实验名称8259中断实验
姓名
学号
班级
教师
日期
一、实验内容与要求
1.1实验内容
通过实验了解8259A中断控制器的工作原理,了解PC中断的原理和过程,学会中断处理程序的编写。
1.2实验要求
了解8259A终端控制器的工作原理,了解PC中断的原理和过程,设计并编写程序,设置8259A的命令字,定义中断服务程序,使在实验平台上每按一次单脉冲开关产生一次中断,在屏幕上依次显示“Thisisthe1stTPCA Interrupt!
”、“Thisisthe2nd TPCA Interrupt!
”、····、“Thisisthe10th TPCA Interrupt!
”、···,中断n次后程序退出,并在屏幕上显示“The TPCA Interrupt end!
”
二、实验原理与硬件连线
2.1实验原理
1.8259A的内部结构:
2.8259A的工作方式:
8259A是一种可编程中断控制器,可协助CPU进行中断管理。
单片8259A工作时,每次中断处理过程如下:
1当IR7~IR0上有中断请求,则IRR相应的位置1。
2对于已进入IRR且未被IMR屏蔽的中断请求,PR电路进行优先级判定,得到最高级的中断请求。
3控制逻辑接收中断请求,向CPU发INT信号。
4若CPU允许中断,则在当前指令结束后连续发出2个中断应答信号INTA,进行中断响应。
每个信号持续2个时钟周期。
5CPU发第一个INTA时,输出总线锁定信号LOCK,防止其它处理器或DMA控制器占用总线。
8259A收到第一个负脉冲后,将优先级最高的中断ISR相应位置1,同时使IRR相应位清0。
6CPU发第二个INTA时,撤销总线锁存信号LOCK,地址允许信号ALE无效,允许数据线工作。
8259A收到第二个负脉冲后,将相应中断的类型号送到数据线上。
CPU读取中断类型号,查找中断向量表得到中断向量,转而进入中断服务程序。
7若系统为自动结束中断方式(AEOI),则8259A会在第2个脉冲结束时,自动将ISR的相应位复位;
若为非自动结束中断方式(EOI),则ISR相应位的“1”一直保持,直到CPU发EOI(中断结束)命令时才将其复位。
3.8259A的操作命令字的使用:
实验中要对IRQ3进行中断屏蔽和开放:
ANDAL,11110111B=0F7H;允许中断IRQ3
ORAL,00001000B=O8H;关闭中断IRQ3
实验中:
MOVAL,20HOUT20H,AL;中断结束命令
前面的20H是OCW2命令字,后面的20H是端口地址
4.8259A在PC中的运用:
PC用户使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。
中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。
IBM PC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源。
中断源
中断类型号
中断功能
IRQ1
08H
时钟
IRQ2
09H
键盘
IRQ3
0AH
保留
IRQ4
0BH
串行口2
IRQ5
0CH
串行口1
IRQ6
0DH
硬盘
IRQ7
0EH
软盘
IRQ8
0FH
并行打印机
8个中断源的中断请求信号线IRQ0~IRQ7在主机的62线ISA总线插座中可以引出,系统已设定中断请求信号为“边沿触发”,普通结束方式。
PC/AT及286以上微机内又扩展了一片8259中断控制,IRQ2用于两片8259之间级联,对外可以提供16个中断源。
中断源
中断类型号
中断功能
IRQ8
070H
实时时钟
IRQ9
071H
用户中断
IRQ10
072H
保留
IRQ11
073H
保留
IRQ12
074H
保留
IRQ13
075H
协处理器
IRQ14
076H
硬盘
IRQ15
077H
保留
TPC-USB实验板上,将中断源固定接到3号中断IRQ3上,即进行中断类型号为0BH。
2.2硬件连线
把TPC-USB平台与PC相连。
在TPC-USB平台上,单脉冲接口与IRQ接口相连。
电路连接图如图1所示:
图1.TPC-USB平台中断实验电路连接图
实验连线实拍图:
三、设计思路、步骤和程序流程图
3.1设计思路
经过and al,0f7h允许中断(IRQ3),在sti开中断以后接收到一个单脉冲即产生中断,调用中断子程序执行,通过mov dx,offset mess mov ah,09h int 21h显示中断信息,达到在屏幕上依次显示“Thisisthe1stTPCA Interrupt!
”、“Thisisthe2nd TPCA Interrupt!
”、····、“Thisisthe10th TPCA Interrupt!
”、···的目的,由于刚开始初始化了Bh等于N,而且每执行一次中断会通过loop next语句来将计数器减1,直到减为0以后就不再执行中断,程序退出。
因本次实验必须通过外部中断来实现N次中断,并把每次中断信息输出在屏幕上。
而PC用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。
所以实验要用到8259A芯片,了解了8259A中断控制器的工作原理和PC中断的原理和过程后,画出中断主程序流程图,再画出中断服务程序的流程图,根据流程图写出相应汇编程序,连接好实验电路,运行程序。
本次实验的难点:
(1)如何输出两位数:
可以通过除以10,分别存储商(十位)、余数(个位),再组合输出来达到输出两位数的目的;
(2)中断次数后的字母输出:
通过跳转,进行组合输出,这要求程序逻辑清晰,要不然容易出错;
3.2实验步骤
(1) 连接实验电路,实验电路如图1所示;
(2) 画出流程图,根据流程图编写程序,程序编译成功后,与硬件相连,程序流程图如
图2、图3所示;
(3) 运行程序,按单脉冲开关N次,观察屏幕显示的结果。
3.3程序流程图
图2主程序流程图
图3中断服务程序流程图
四、程序清单与执行结果
4.1程序清单
DATASEGMENT
MESS1DB'Thisisthe','$'
MESS3DB'TheTPCAInterruptend!
',0AH,0DH,'$'
MESS2DB'th','$';输出次序比三大的
MESS4DB'st','$';first
MESS5DB'nd','$';second
MESS6DB'rd','$';third
MESS7DB'TPCAInterrupt',0AH,0DH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
CLI;关中断
MOVAX,SEGIRQ3_INT;中断程序入口地址送中断向量表
MOVDS,AX
MOVDX,OFFSETIRQ3_INT
MOVAX,250BH;设置中断向量程序
INT21H
MOVAX,DATA;将DS指向输出端
MOVDS,AX
INAL,21H;读取中断屏蔽字
ANDAL,0F7H;开放IRQ3中断
OUT21H,AL
MOVBh,15;设置中断次数
STI;开中断
MOVCX,1;把1放入CX寄存器
WIN:
JMPWIN;等待硬中断
IRQ3_INT:
;中断服务程序
CLI
MOVDX,OFFSETMESS1;显示发生中断的信息
MOVAH,09H
INT21H
MOVAH,0
MOVAL,CL
MOVBL,10
DIVBL
MOVCH,AH
MOVDL,AL
ADDDL,30H
MOVAH,2
INT21H;输出十位数
MOVDL,CH
ADDDL,30H
MOVAH,2
INT21H;输出个位数
CMPCL,1;数字后缀输出
JEPRINT_ST
CMPCL,2
JEPRINT_ND
CMPCL,3
JEPRINGT_RD
CMPCL,4
JGEPRINT_TH
HL:
MOVDX,OFFSETMESS7
MOVAH,09H
INT21H
MOVAL,20H
OUT20H,AL
INCCX
DECBh
JNZNEXT
INAL,21H;N次中断已到,恢复屏蔽字
ORAL,08H;禁止IRQ3中断
OUT21H,AL
MOVDX,OFFSETMESS3;显示N次中断结束信息
MOVAH,09H
INT21H
MOVAH,4CH;返回dos系统
INT21H
PRINT_ST:
;输出后缀st
MOVDX,OFFSETMESS4
MOVAH,09H
INT21H
JMPHL
PRINT_ND:
;输出后缀nd
MOVDX,OFFSETMESS5
MOVAH,09H
INT21H
JMPHL
PRINGT_RD:
;输出后缀rd
MOVDX,OFFSETMESS6
MOVAH,09H
INT21H
JMPHL
PRINT_TH:
;输出后缀th
MOVDX,OFFSETMESS2
MOVAH,09H
INT21H
JMPHL
NEXT:
IRET;中断返回
CODEENDS
ENDSTART
4.2执行结果
五、程序调试说明和实验感想
5.1调试说明
这次实验主要碰到以下问题:
(1)在输出二位数时,我们采用的是除以10,分别搜集十位和个位,再组合输出。
但在实际编写时却无法正常输出,输出的是4位,前两位是乱码。
当时找了半天没找出来是什么问题,后来在老师的帮助下,发现时我们的寄存器的使用存在问题,因为除法涉及到多个寄存器,很容易出错,再加上我们汇编水平不够,造成混乱,在重新赋值,梳理之后,两位输出才成功;
(2)在整个实验完成后,运行时,前面的很顺利,但在最后中断次数结束,退出程序是出现了一个bug,原本是应该输完第11次中断信息语句,再跳出中断结束的语句,但结果是变成如图4所示的结果。
我知道这是程序执行顺序的问题,但当我把程序段调整之后,编译器报错,我的调整不合法,当时因为时间的缘故,只能回来进行修改。
回来后,因为对整个实验有了一个比较详细的理解,再看当时在实验室写的代码,就感觉是拼积木一样,东拼西凑,毫无章法,我自己也不知道怎么改了,于是我就重新写了一份,不过这次我不是直接下笔,而是先画了个流程图,按照流程图,再去写,这样完成了一份逻辑清晰的代码,在下次实验时我运行了一下,除了点小bug,很快就编译通过了,运行也达到了理想的目的。
图4实验时不理想的实验结果截图
(3)在我将重新写的实验代码在机器上运行时,我还遇到一个问题就是,尽管输出很完美、整齐,但这个程序没有中断结束。
原本我设定的中断次数是15,但我可以运行到20,甚至99,当时我很不理解,感觉逻辑上面应该没什么问题,代码书写语法应该也是对的,但至少我知道问题应该是出现在中断次数的改变上,我先去看了一下执行中断次数减一的程序段,确认它没有问题,之后我再去看整个程序,看有没有哪句会造成中断次数变更,果然在我仔细看了一下输出两位数的除法算法里,有对BL程序赋值的语句,于是我把中断次数放到BH中,之后没有语句对它进行重新赋值,保证它能按我想的那样执行减法,结果证明我是对的,最后程序在15次之后中断结束。
5.2实验感想与收获
(1)实验前预习一下很重要,如果我在实验前有对实验进行预习,了解它的实验原理,要求及内容,那样我在实验时编写程序就会有更清晰的逻辑与想法,会节省很多的时间。
而且这样程序也不会漏洞百出;
(2)对于一个程序而言,流程图很重要,它就像人的脊柱,支撑这个程序的框架,为程序员指明道路。
一个清晰、明确的流程图能保证程序逻辑不会出错,在结果输出时能够得到理想的结果;
(3)对于汇编而言,寄存器是一个十分重要的东西,特别是对于运用到多个寄存器对数据进行处理时,一定要清楚的知道各个寄存器是否被使用,现在使用这个寄存器会不会对原先使用的寄存器中的数据造成不可恢复的影响,造成程序出错,如果搞不清楚,最好用笔记一下。
5.3实验特色
可以任意设置两位数以内的中断次数,而且当中断次数结束时,程序能够自然退出。
因为有很多同学也能实现两位数的输出,但他们的程序无法退出,即原本设置的中断次数是20,但它能一直运行到99,而我的就不会出现这种问题。
而有些则是只能输出1~9,之后就是乱码,而我的只是能输出1~99。
5.4展望
如果有充裕的时间,希望每次中断可以在屏幕上显示更加复杂的信息,而不是现在这样简单的组合输出,并且每发生一次中断时都响一次铃,或者结合其他的芯片,完成更加高难度的中断实验。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机接口 8255中断实验报告 微机 接口 8255 中断 实验 报告