您的当前位置:首页正文

西电微机原理实验报告

2022-10-25 来源:星星旅游
实验一 8259中断实验

一、实验目的

1.掌握PC机中断处理系统的基本原理。

2.掌握外部扩展中断源的设计方法。 3.学会编写中断服务程序。

二、实验原理

PC机用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。

三、实验内容

实验要求实现8259控制器的IR1、IR3两路中断都可以通过IRQ向PC机发起中断请求,用SP1、SP2单次脉冲模拟两个中断源。IR1中断时,在它的中断服务程序中编程显示“IR1 OK AND EXIT!”; IR3中断时,在它的中断服务程序中编程显示“IR3 OK AND EXIT!”。

采用查询方式完成。

GNDPR14.7K1234567JD1D0D1D2D3D4D5D6D7IRQD0D1D2D3D4D5D6D7INT11109876541726U1D0D1D2D3D4D5D6D7INTINTACSRDWRA0CAS0CAS1CAS2SP/ENIR0IR1IR2IR3IR4IR5IR6IR71819202122232425891IR01IR11IR21IR31IR41IR51IR61IR7R14.7KVCCSP1SP216(280H)Y1IORIOWA08259CS1/RD/WRA0132271213158259 图1-1 扩展中断电路

四、参考流程图

向系统中的8259发中N 有键按下吗? 开中断 执行IR3处理 N 初始化实验系统中8259中的N Y 是IR3请求? 设置中断掩码 是IR1请求? 关中断 向8259OCW3发查询命开始 中断入口 初始化PCI使能中断,替读出查询字 Y 执行IR1处理

Y 关中断 清PCI卡中断标志位 恢复中断掩码,恢复中断向量和向PC机内8259发中断

开中断 中断返回 返回到DOS 五、实验程序

;*********************; ;* 实验台上8259中断 *; ;*********************; data segment

ioport equ 0ff00h-0280h

MY8259_ICW1 EQU ioport +280H ;实验系统中8259的ICW1端口地址 MY8259_ICW2 EQU ioport +281H ;实验系统中8259的ICW2端口地址 MY8259_ICW3 EQU ioport +281H ;实验系统中8259的ICW3端口地址 MY8259_ICW4 EQU ioport +281H ;实验系统中8259的ICW4端口地址 MY8259_OCW1 EQU ioport +281H ;实验系统中8259的OCW1端口地址 MY8259_OCW2 EQU ioport +280H ;实验系统中8259的OCW2端口地址 MY8259_OCW3 EQU ioport +280H ;实验系统中8259的OCW3端口地址

io8255a equ ioport+288h io8255b equ ioport+289h io8255c equ ioport+28ah io8255 equ ioport+28bh

msg3 db 0dh,0ah,'IR1 ok and exit!',0dh,0ah,'$' msg4 db 0dh,0ah,'IR3 ok and exit!',0dh,0ah,'$'

data ends

stacks segment db 100 dup (?) stacks ends

code segment

assume cs:code,ds:data,ss:stacks,es:data start:

mov ax,data mov ds,ax mov es,ax mov ax,stacks mov ss,ax MOV DX,MY8259_ICW1 ;初始化实验系统中8259的ICW1 MOV AL,13H ;边沿触发、单片8259、需要ICW4 OUT DX,AL

MOV DX,MY8259_ICW2 ;初始化实验系统中8259的ICW2 MOV AL,08H OUT DX,AL

MOV DX,MY8259_ICW4 ;初始化实验系统中8259的ICW4 MOV AL,01H ;非自动结束EOI OUT DX,AL

MOV DX,MY8259_OCW1 ;初始化实验系统中8259的OCW1 MOV AL,0F5H ;打开IR1和IR3的屏蔽位 OUT DX,AL

QUERY: MOV DX,MY8259_OCW3 ;向8259的OCW3发送查询命令 MOV AL,0CH OUT DX,AL NOP NOP NOP

MOV DX,MY8259_OCW3

IN AL,DX ;读出查询字

TEST AL,80H ;判断中断是否已响应 JZ QUERY ;没有响应则继续查询

AND AL,07H CMP AL,01H JE IR1ISR ;若为IR1请求,跳到IR1处理程序 CMP AL,03H

JE IR3ISR ;若为IR3请求,跳到IR1处理程序 JMP EOI

IR1ISR: mov dx,offset msg3 ;IR1处理,显示字符串'IR1 ok and exit' mov ah,09h int 21h

mov dx,io8255 ;设8255为B口输入,C口输出

mov al,93h out dx,al

inout: mov dx,io8255b ;从B口输入一数据 in al,dx mov dx,io8255c ;从C口输出刚才自B口 out dx,al ;所输入的数据

mov dx,io8255b xor dx,dx in al,dx mov dx,io8255c

out dx,al mov dl,0ffh mov ah,06h int 21h

jz inout mov ah,4ch int 21h

JMP QUERY JMP EOI

IR3ISR:mov dx,offset msg4 mov ah,09h int 21h

mov dx,io8255 mov al,93h out dx,al inout1: mov dx,io8255b in al,dx

mov dx,io8255c out dx,al mov dx,io8255b xor dx,dx in al,dx mov dx,io8255c out dx,al

mov dl,0ffh mov ah,06h int 21h jz inout1 mov ah,4ch ;从C口输出刚才自B口

;判断是否有按键 ;若无,则继续自C口输入,A口输出 ;否则返回 ;IR1处理,显示字符串'IR3 ok and exit'

;设8255为C口输入,A口输出 ;从C口输入一数据 ;从A口输出刚才自C口 ;所输入的数据 ;从C口输出刚才自B口 ;判断是否有按键 ;若无,则继续自C口输入,A口输出 ;否则返回

int 21h

JMP QUERY JMP EOI

EOI: MOV DX,MY8259_OCW2 ;向实验系统中8259发送中断结束命令 MOV AL,20H OUT DX,AL

code ends end start

六、实验结果

运行程序之后,通过对IR1,IR3的按钮的交替控制,使得屏幕上显示固定的语句,表示已经试验成功。

七、实验中遇到的问题及解决方法 遇到的问题:

1、程序调整好了之后,按下中断按钮之后没有出现想要的结果,屏幕上没有出现该出现的语句。

2、程序不能打开,不能运行。

解决的方法:检查线路之后,发现有接线接错,通过对程序中的小的修改,最终成功的解决问题。

实验二 8255及综合

一、实验目的

掌握8255方式0的工作原理及使用方法。

二、实验原理

实验电路如图,8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。

U18255PA0PA1PA2PA3PA4PA5PA6PA7PB0PB1PB2PB3PB4PB5PB6PB7PC0PC1PC2PC3VCCPC4PC5PC6PC743214039383718192021222324251415161713121110D0D1D2D3D4D5D6D7JD1IORIOWA0A1RST(288H)Y1D0D1D2D3D4D5D6D7/RD/WRA0A1RST8255CS343332313029282753698356D0D1D2D3D4D5D6D7RDWRA0A1RESETCSPA0PA1PA2PA3PA4PA5PA6PA7PB0PB1PB2PB3PB4PB5PB6PB7PC0PC1PC2PC3PC4PC5PC6PC7L0L1L2L3L4L5L6L7R14.7KK0K1K2K3K4K5K6K7 图2-1

三、实验内容

1.1) 编程从8255C口输入数据,再从A口输出;

2) 编程从8255A口输入数据,再从B口输出; 3) 编程从8255B口输入数据,再从A口输出。

2. 将8255与8259结合起来。 当程序响应IR1中断时候,发光二极管的高四位灭(或亮),同时屏幕显示“IR1 ok and exit”,当程序响应IR3中断时候,发光二极管的低四位灭(或亮),同时屏幕显示“IR13ok and exit”。

四、实验流程图

五、实验程序

1、

1)C口入,A口出

ioport equ 0C400H-0280h io8255a equ ioport+288h io8255b equ ioport+28bh io8255c equ ioport+28ah code segment assume cs:code

start: mov dx,io8255b mov al,89h out dx,al

inout: mov dx,io8255c in al,dx

;设8255为C口输入,A口输出

;从C口输入一数据

mov dx,io8255a out dx,al mov dl,0ffh mov ah,06h int 21h

;从A口输出刚才自C口 ;所输入的数据 ;判断是否有按键

jz inout ;若无,则继续自C口输入,A口输出 mov ah,4ch ;否则返回DOS

int 21h

code ends end start

2)A口入,B口出

ioport equ 0C400H-0280h io8255a equ ioport+288h io8255b equ ioport+28bh io8255c equ ioport+28ah code segment assume cs:code

start: mov dx,io8255b mov al,99h out dx,al

inout: mov dx,io8255a in al,dx mov dx,io8255b out dx,al mov dl,0ffh mov ah,06h int 21h jz inout mov ah,4ch int 21h code ends end start

3)B入,C出

ioport equ 0C400H-0280h io8255a equ ioport+288h io8255b equ ioport+28bh io8255c equ ioport+28ah code segment assume cs:code

start: mov dx,io8255b mov al,82h out dx,al

;设8255为C口输入,A口输出 ;从C口输入一数据 ;从A口输出刚才自C口 ;所输入的数据 ;判断是否有按键 ;若无,则继续自C口输入,A口输出 ;否则返回DOS ;设8255为C口输入,A口输出

inout: mov dx,io8255b ;从C口输入一数据 in al,dx mov dx,io8255c ;从A口输出刚才自C口 out dx,al ;所输入的数据 mov dl,0ffh ;判断是否有按键 mov ah,06h int 21h jz inout ;若无,则继续自C口输入,A口输出 mov ah,4ch ;否则返回DOS int 21h code ends end start

2、8255与8259的结合程序

;*********************; ;* 实验台上8259中断 *; ;*********************; data segment ioport

equ 0ff00h-0280h

io8255a equ ioport+288h ;A口口地址 io8255b equ ioport+289h ;B口 io8255c equ ioport+28ah ;C口

io8255 equ ioport+28bh ;控制寄存器口地址

MY8259_ICW1 EQU ioport +280H ;实验系统中8259的ICW1端口地址 MY8259_ICW2 EQU ioport +281H ;实验系统中8259的ICW2端口地址 MY8259_ICW3 EQU ioport +281H ;实验系统中8259的ICW3端口地址 MY8259_ICW4 EQU ioport +281H ;实验系统中8259的ICW4端口地址 MY8259_OCW1 EQU ioport +281H ;实验系统中8259的OCW1端口地址 MY8259_OCW2 EQU ioport +280H ;实验系统中8259的OCW2端口地址 MY8259_OCW3 EQU ioport +280H ;实验系统中8259的OCW3端口地址 csreg ipreg

dw ? dw ?

;旧中断向量保存空间 dw 00h ;中断计数

irq_times

msg1 db 0dh,0ah,'DVCC pci card Interrupt',0dh,0ah,'$' msg2 db 0dh,0ah,'Press any key to exit!',0dh,0ah,'$' msg3 db 0dh,0ah,'IR1 ok and exit!',0dh,0ah,'$' msg4 db 0dh,0ah,'IR3 ok and exit!',0dh,0ah,'$' data ends

stacks segment

db 100 dup (?) stacks ends

code segment

assume cs:code,ds:data,ss:stacks,es:data start:

mov ax,data mov ds,ax mov es,ax mov ax,stacks mov ss,ax

mov dx,io8255 mov al,80h out dx,al

mov dx,io8255c mov al,00h

out dx,al

MOV DX,MY8259_ICW1 MOV AL,13H OUT DX,AL

MOV DX,MY8259_ICW2 MOV AL,08H OUT DX,AL

MOV DX,MY8259_ICW4 MOV AL,01H OUT DX,AL

MOV DX,MY8259_OCW1 MOV AL,0F5H OUT DX,AL

QUERY: MOV DX,MY8259_OCW3 MOV AL,0CH OUT DX,AL NOP NOP

NOP MOV DX,MY8259_OCW3 IN AL,DX

;设8255为A口输入,C口输出 ;从C口输出刚才自A口

;初始化实验系统中8259的ICW1 ;边沿触发、单片8259、需要ICW4 ;初始化实验系统中8259的ICW2 ;初始化实验系统中8259的ICW4 ;非自动结束EOI ;初始化实验系统中8259的OCW1 ;打开IR1和IR3的屏蔽位 ;向8259的OCW3发送查询命令 ;读出查询字 TEST AL,80H ;判断中断是否已响应 JZ QUERY ;没有响应则继续查询

AND AL,07H CMP AL,01H JE IR1ISR ;若为IR1请求,跳到IR1处理程序

CMP AL,03H

JE IR3ISR JMP EOI

IR1ISR: mov dx,offset msg3

mov ah,09h int 21h

mov dx,io8255c mov al,0f0h out dx,al JMP EOI

IR3ISR: mov dx,offset msg4

mov ah,09h

int 21h mov dx,io8255c

mov al,0fh

out dx,al

JMP EOI

EOI: MOV DX,MY8259_OCW2 MOV AL,20H OUT DX,AL JMP QUERY

code ends end start

六、实验结果

;若为IR3请求,跳到IR3处理程序 ;IR1处理,显示字符串'IR1 ok and exit'

;从C口输出刚才自A口 ;IR3处理,显示字符串'IR3 ok and exit'

;从C口输出刚才自A口

;向实验系统中8259发送中断结束命令 1、正确接线之后,通过设置初始值进行初始化,最后能实现用开关来控制小灯的亮灭,不同的初始参数和接线方法能够出现不同的结果。 2、8255与8259的结合程序 程序运行完成之后,小灯能够在中断的控制下四个一组交替亮灭,通过按下IR1,IR3按钮来进行控制。

七、实验中遇到的问题及解决方法 遇到的问题:

1、程序调整好了之后,有若干的小灯不能被开关控制,只有一部分小灯能够被控制。

2、程序不能打开,不能运行。

解决的方法:检查线路之后,发现有接线接错,通过纠正和对程序中的小的修改(对入口参数的修改),最终成功的解决问题。

实验三 8253

一、实验目的

掌握8253的基本工作原理和编程方法。

二、实验原理及内容

1.图3-1是本实验程序的接线图,将计数器0设置为方式0,计数器初值为N(N≤0FH,本程序中为0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用L0或逻辑笔观察OUT0电平变化,初始时OUT0为高电平,当输入N个脉冲时,OUT0变为低电平,当输入N+1个脉冲后OUT0变高电平)。

2.按图3-2连接电路,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用电平指示灯L0或逻辑笔观察OUT1输出电平的变化,要求输出频率1HZ的分频信号。

U2D0D1D2D3D4D5D6D7JD1D0D1D2D3D4D5D6D787654321D0D1D2D3D4D5D6D7OUT1CSRDWR1415A0GATE1CLK1A11321222319208253OUT0GATE0CLK0GATE2OUT2CLK210119161718R24.7KVCCOUT0GATE0CLK0L0+5VSP18253CS/RD/WRA0A1Y0(280H)IORIOWA0A1 图 3-1

U2D0D1D2D3D4D5D6D7JD1D0D1D2D3D4D5D6D787654321D0D1D2D3D4D5D6D78253OUT0GATE0CLK0GATE2OUT2CLK210119161718OUT0GATE0CLK0+5V1MHZOUT1132122231920L04.7KR2VCCOUT1CSRDWR+5VGATE1CLK11415A0GATE1CLK1A18253CS/RD/WRA0A1Y0(280H)IORIOWA0A1

图3-2 三、参考流程图

实验内容一的框图如图3-3所示,实验内容二2的框图如图3-4所示。

开始 结束

计数器0工作方式设为2 计数器0工作方式设为3

送计数器初值 向计数器0送初值1000

先送低字节后送高字节 读计数器值 计数器1工作方式设为3 显示计数值 向计数器0送初值1000 先送低字节后送高字节 N 有键按 结束 下吗? Y

结束

图3-3 图3-4

四、参考程序

1、

;*************************; ;* 8253方式0计数器实验 *; ;*************************;

ioport equ 0ff00h-0280h io8253k equ ioport+283h io8253a equ ioport+280h code segment assume cs:code start:

mov al,00010000B ;设置8253通道0为工作方式2,二进制计数 mov dx,io8253k

out dx,al

mov dx,io8253a ;送计数初值为08H mov al,08h out dx,al

lll: in al,dx ;读计数初值 call disp ;调显示子程序 push dx mov ah,06h mov dl,0ffh int 21h pop dx jz lll

mov ah,4ch ;退出 int 21h

disp proc near ;显示子程序 push dx

and al,0fh ;首先取低四位 mov dl,al cmp dl,9 ;判断是否<=9 jle num ;若是则为'0'-'9',ASCII码加30H add dl,7 ;否则为'A'-'F',ASCII码加37H num: add dl,30h

mov ah,02h ;显示 int 21h

mov dl,0dh ;加回车符 int 21h mov dl,0ah ;加换行符 int 21h pop dx ret ;子程序返回 disp endp code ends end start

2、

;******************* ;* 8253分频 * ;******************* ioport equ 0ff00h-0280h io8253a equ ioport+280h io8253b equ ioport+281h io8253k equ ioport+283h code segment assume cs:code

start:mov dx,io8253k ;向8253写控制字 mov al,36h ;使0通道为工作方式3 out dx,al mov ax,1000 ;写入循环计数初值1000 mov dx,io8253a

out dx,al ;先写入低字节 mov al,ah

out dx,al ;后写入高字节 mov dx,io8253k

mov al,76h ;设8253通道1工作方式2 out dx,al

mov ax,1000 ;写入循环计数初值1000 mov dx,io8253b

out dx,al ;先写低字节 mov al,ah out dx,al ;后写高字节 mov ah,4ch ;程序退出 int 21h code ends end start

五、实验结果

实验一:设置好初始值N之后,按下控制按钮N+1次之后,发现小灯由暗变亮。

实验二:设置好初始值,运行程序之后,小灯按照事先设置好的频率闪烁

六、实验中遇到的问题及解决方法

实验中的问题:实验一中,运行程序之后,按下控制按钮之后没有出现由暗变亮的结果,在设置不同的初始值之后,有一些能够成功的出现结果,另有一些不能出现结果;实验二中,没有出现闪烁的情况。

解决办法:对实验一中的程序进行了小的修改,但是最终还是有这样的问题,最后老实说怀疑是病毒导致的结果,没有搞得很清楚。实验二中对设置的频率进行了调整,最后实现了实验的现象

因篇幅问题不能全部显示,请点此查看更多更全内容