实验五 基本IO扩展与8259中断实验
- 格式:doc
- 大小:342.55 KB
- 文档页数:11
二、实验设备1. PC 机一台2. QTH-8086B 16 位微机教学实验仪一套三、实验说明1. 74LS244 是一种三态输出的8总线缓冲驱动器,无锁存功能,当 G 为低电平时,Ai 信号传送到Yi ,当为高电平时,Yi 处于禁止高阻状态。
74LS273 是一种 8D 触发器,当 CLR 为高电平且 CLK 端电平正跳变时,D0——D7 端数据被锁存到8D 触发器中。
一、实验目的1. 了解 TTL 芯片扩展简单 I/O 口的方法;2. 掌握数据输入输出程序编制的方法。
3. 掌握 8259A 中断控制器的工作原理;4. 掌握 8259A 可编程中断控制器的应用编程。
2. 8259A 中断控制器中断控制是微机系统的主要管理方式之一,也是处理器与外设之间通信的最有效方法之一。
它可 以减少系统为反复查询外部设备状态而消耗的时间,提高了系统的整体运行效率。
在现代 16 位微机 系统中,系统的中断有两类:软件中断和硬件中断。
硬件中断可以实现微机系统对外设的管理,由8259 中断控制器来完成。
(1)8259 控制器的介绍 中断控制器 8259A 是 Intel 公司专为控制优先级中断而设计开发的芯片。
它将中断源优先级排队、 辨别中断源以及提供中断矢量的电路集于一片中,因此无需附加任何电路,只需对 8259A 进行编程, 就可以管理 8 级中断,并选择优先模式和中断请求方式,即中断结构可以由用户编程来设定。
同时, 在不需增加其它电路的情况下,通过多片 8259A 的级连,能构成多达 64 级的矢量中断系统。
它的管 理功能包括:①记录各级中断源请求,②判别优先级,确定是否响应和响应哪一级中断,③响应中断 时,向 CPU 传送中断类型号。
8259A 的内部结构和引脚如图 3-2-1 所示。
8259A 的命令共有 7 个,一类是初始化命令字,另一类是操作命令。
8259A 的编程就是根据应用 需要将初始化命令字 ICW1~ICW4 和操作命令字 OCW1~OCW3 分别写入初始化命令寄存器组和操作命令寄 存器组。
ICW1-ICW4 各命令字格式如图 3-2-2 所示,OCW1-OCW3 各命令字格式如图 3-2-3 所示,其中 OCW1 用于设置中断屏蔽操作字,OCW2 用语设置优先级循环方式和中断结束方式的操作命令字,OCW3 用语设置和撤消特殊屏蔽方式,设置中断查询方式以及设置对 8259 内部寄存器的读出命令。
10QTH-*086B 实验系统说明书图 2 8259 内部结构和引脚图图 3 (a ) ICW1 格式图 3 (b ) ICW2 格式从片图 3 (c ) *CW3 格式图 3 (d ) ICW4 格式11QTH-808*B 实验系统说明书图4 8259 命令字格式(2) 8259 寄存器及命令的控制访问在硬件系统中,8259 仅占用两个外设接口地址,在片选有效的情况下,利用 A0 来寻址不同的寄 存器和命令字。
对寄存器和命令字的访问控制如表 3-1 所示。
(3) PC 微机系统中 8259A 的应用在现代 PC 微机系统中,系统中包含了两片 82*9A 中断控制器,经级连可以管理 16 级硬件中断, 其中部分中断源已经被系统硬件占用,具体使用情况如表 3-2 示。
两片 8259A 的端口地址为:主片 在 020H-03FH ,实际使用 020H 和 021H 两个端口;从片在 0A0H-0BFH 范围,实际使用 0A0H 和 0A1H 两 个端口。
*2四、实验原理图图 1 7LS244 与 74LS273 扩展 I/O 口原理图五、实验内容1. 利用 74LS244 作为输入口,读取开关状态,并将此状态通过 74LS27* 驱动发光二极管显示出来。
2. 用脉冲作为中断源,编写一实验程序,完成按键中断的响应,每产生一次按键中断,中断次数加1。
通过并行接口芯片8255,将中断号和中断次数分别从8255的A 口和B 口送两排8个LED 灯分别显示出来,拨动开关 KN09 观察数码管的变化;改变中断输入,观察显示变化。
QTH-8086B 实验系统说明书六、实验步骤1. 基本I/O扩展(1) 实验连线:244 的CS——MCU 主模块的地址A15,Y7~Y0——开关K01—K08。
273 的CS——MCU 主模块的地址A14,Q7~Q0——发光二极管L1—L8。
该模块的WR、RD 分别连到MCU 主模块的WR、RD。
该模块的数据(AD0~AD7)连到MCU 主模块的数据(AD0~AD7)。
(2) 运行程序:IO.ASM(3) 拨动开关,观察发光二极管的变化2. 8259中断实验(1)实验连线:⏹8259 模块选通线CS 连到MCU 主模块的地址A14。
⏹8259 模块的WR、RD 分别连到MCU 主模块的WR、RD。
⏹8259 模块的数据(AD0~AD7)、地址线(A0~A7)分别连到MCU 主模块的数据(AD0~AD7)、地址线(A0~A7)。
⏹8259 模块的INTA 接MCU 主模块的的INTA,INT 接MCU 主模块的INTR,IRx(指IR0~IR7 中的任一个)接信号源模块的1H。
⏹8255 模块的WR、RD 分别连到MCU 主模块的WR、RD。
⏹8255 模块的数据(AD0~AD7)、地址线(A0~A7)分别连到MCU 主模块的数据(AD0~AD7)、地址线(A0~A7)。
⏹8255 模块选通线CE 连到MCU 主模块的地址A15。
⏹8255 模块的A口PA0-PA7接发光二极管L9—L16;B口PB0~PB7接发光二极管L1—L8。
(2)运行程序:INTR.ASM。
七、实验结果1. 基本I/O扩展源程序:1. IO.ASMLS244 EQU 7000H ;设置LS244的端口地址为7000HLS273 EQU 0B000H ;设置LS273的端口地址为0B000HDATA SEGMENT ;数据段开始A DB 20 DUP(0) ;定义A为20个初始化为0的空间DATA ENDS ;数据段结束STACK SEGMENT STACK ;堆栈段开始DB 100 DUP(0) ;开辟100个空间给堆栈段STACK ENDS ;堆栈段结束CODE SEGMENT ;代码段开始ASSUME CS:CODE, SS:STACK,DS:DATAORG 0100H ;定义代码段起始偏移量MAIN: MOV AX, DATA ;将DATA首地址赋值给AXMOV DS, AX ;定义DS首地址为AXMOV AX, STACK ;将STACK首地址赋值给AXMOV SS,AX ;定义SS首地址为AXMOV SP,9000H ;定义堆栈指针为9000HMOV DX,LS244 ;读取开关状态IN AL,DX ;将结果存入AL中MOV DX,LS273 ;将端口存入DX中OUT DX,AL ;送LED显示JMP MAIN ;无条件跳转到MAINCODE ENDS ;代码段结束END MAIN ;主程序结束2. 8259中断实验在流水灯的实验中加入了读取开关状态的程序,使得程序能先在一段时间内先控制开关的亮灭,在开始流水灯。
程序如下:A82590 EQU 0B000H ;设置A82590的端口地址为0B000HA82591 EQU 0B001H ; 设置A82591的端口地址为0B001HA8255 EQU 7000H ; 设置A8255的端口地址为7000HB8255 EQU 7001H ; 设置B8255的端口地址为7001HC8255 EQU 7002H ; 设置C8255的端口地址为7002HD8255 EQU 7003H ; 设置D8255的端口地址为7003HDATA SEGMENT ;数据段开始NUM DB ? ;声明字节变量NUMTIMES DB 0 ;定义字变量TIMES为0DATA ENDS ;数据段结束STACK SEGMENT STACK ;堆栈段开始DB 40 DUP(0) ;开辟40个堆栈空间STK_TP DB 0 ;初始化堆栈指针为0STACK ENDS ;堆栈段结束CODE SEGMENT ;代码段开始ASSUME CS:CODE, DS:DATA, SS:STACK,ES:DATAORG 0100H ;定义代码段起始偏移量MAIN: MOV AX, DATA ;将DATA首地址赋值给AXMOV DS, AX ;定义DS首地址为AXMOV AX, STACK ;将STACK首地址赋值给AXMOV SS,AX ;定义SS首地址为AXLEA SP, STK_TP ;将堆栈指针指向STK_TPMOV DX, D8255 ;在DX中存入8255的控制口的端口地址MOV AL, 80H ;给AL赋值80HOUT DX, AL ;输出AL到DX指代的端口地址MOV AL, 0FFH; ;给AL赋值0FFHMOV DX, A8255 ;在DX中存入8255的A口的端口地址OUT DX,AL ;输出AL到DX指代的端口地址MOV AL,0FFH ;给AL赋值0FFHMOV DX, B8255 ;在DX中存入8255的B口的端口地址OUT DX,AL ;输出AL到DX指代的端口地址MOV DX,A82590 ;A0=0,8259A地址送入DXMOV AL,00010011B ; ICW1为13H,上升沿触发,单片使用,要写ICW4OUT DX,AL ;输出AL到DX指代的端口MOV DX,A82591 ;A0=1,8259A地址送入DXMOV AL,01001000B ;ICW2为48H,提供中断类型号初始值OUT DX,AL ;输出AL到DX指代的端口MOV AL,00000011B;ICW4,非缓冲方式,自动EOI,一般完全嵌套OUT DX,AL ;输出AL到DX指代的端口MOV DX,A82590 ;A0=0,8259A地址送入DXMOV AL,00001010B ;OCW3下一个读指令读出中断号OUT DX, AL ;输出AL到DX指代的端口NOP ;静止一个指令周期NEXT: IN AL, DX ;从DX的端口中读取数据至ALCMP AL, 00H ;比较AL与00HJZ NEXT ;如果相等就跳转NEXTINC TIMES ;TIMES自增1MOV CL, 0FFH ;给CL赋值0FFHNEXT1: INC CL ;CL自增SHR AL,1 ;AL逻辑左移1JNC NEXT1 ;NEXT1自增1MOV NUM,CL ;给NUM赋值CLMOV AL,CL ;给AL赋值CLMOV AH,00H ;给AH赋值00HADD AL,48H ;AL加上48HMOV CX,0004H ;给CX赋值0004HMUL CX ;AX乘上CX,结果存入DX:AX中MOV BX,AX ;IRQ0--48H*4+0=0120中断MOV AX,OFFSET IIRQ ;中断入口地址偏移量MOV [BX],AX ;给BX为偏移量的数据段中的空间赋值AXINC BX ;BX自增INC BX ;BX自增MOV AX,SEG IIRQ ;将SEG IIRQ赋值给AXMOV [BX],AX ;给BX为偏移量的数据段中的空间赋值AXMOV DX,A82590 ;A0=0,8259A地址送入DXMAIN1: STI ;开中断JMP MAIN1 ;无条件跳转到MAIN1HLT ;结束IIRQ PROC ;子程序开始PUSH DX ;将DX推入堆栈INC TIMES ;TIMES自增MOV AL,TIMES ;中断次数NOT AL ;对AL取非MOV DX, B8255 ;将DX指向8255的B口OUT DX, AL ;向8255的B口输入ALMOV AL,NUM ;中断号NOT AL ;对AL取非MOV DX, A8255 ;将DX指向8255的A口OUT DX, AL ;向8255的A口输入ALINC CX ;CX自增MOV DX, A82590 ;A0=0,8259A地址送入DXMOV AL, 20H ;给AL赋值20HOUT DX, AL ;将AX中的值输入DX指向的端口中CLI ;关中断POP DX ;将DX推出堆栈IRET ;子程序返回中断IIRQ ENDP ;子程序结束CODE ENDS ;代码段结束END MAIN ;主程序结束八、实验总结了解了TTL芯片扩展简单I/O口的方法,基本掌握数据输入输出程序编制的方法,通过实际操作LED灯的改变来了解其工作的原理。