西电 机电微机原理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理实验报告
姓名:
学号:
实验一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!”。
采用查询方式完成。
图1-1 扩展中断电路
四、实验步骤
1、连接线路
SP1和SP2分别接到IR1和IR3,IR1和IR3与L0和L1指示灯相连,8259CS 接到Y0上,最后将/RD、/WR、INT分别与IOR、IOW、IRQ相连接,连接好后打开电源。
2、编写程序
3、汇编、编译、连接及运行
五、实验程序
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端口地址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 AX,DATA
MOV DS,AX
MOV DX,OFFSET MSG1
MOV AH,09H
INT 21H
MOV DX,OFFSET MSG2
MOV AH,09H
INT 21H
START1: 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 ;若为IR1请求,跳到IR1处理程序
JMP EOI
QUERY1: MOV DL,0FFH
MOV AH,06H
INT 21H
JZ START1
MOV AH,4CH
INT 21H
IR1ISR: MOV DX,OFFSET MSG3 ;IR1处理,显示字符串'IR1 OK AND EXIT'
MOV AH,09H
INT 21H
JMP EOI
IR3ISR: MOV DX,OFFSET MSG4 ;IR1处理,显示字符串'IR3 OK AND EXIT'
MOV AH,09H
INT 21H
EOI: MOV DX,MY8259_OCW2 ;向实验系统中8259发送中断结束命令MOV AL,20H
OUT DX
MOV AL,20H ;SEND EOI
OUT 0A0H,AL
OUT 20H,AL
POP DS
POP DX
POP AX
JMP START1
CODE ENDS
END START
六、实验结果
接好电路,编好程序,打开电源后,两个LED指示L0和L1灯都熄灭;编译、链接、运行程序,8259控制器的IR1、IR3两路中断可通过IRQ向PC机发起中断请求,按下SP1,IR1中断,指示灯L0亮,电脑屏幕上显示“IR1 OK AND EXIT!”;按下SP2, IR3中断,指示灯L1亮,电脑屏幕上显示“IR3 OK AND EXIT!”
七、实验中遇到的问题及解决方法
最初认为要按照原理图把所有线都接上,后来知道了直接用排线连接就好,同时还能降低短路的可能性。
这个实验的难点在于源程序的改动,在这方面我花了不少时间。
实验二 8255及综合
一、实验目的
掌握8255方式0的工作原理及使用方法。
二、实验原理
实验电路如图,8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。
图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口输出为例):8255的C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7,将8255CS与Y1相连接,连接好后打开电源。
实验2 (8255与8259结合C口输入A口输出):SP1和SP2分别与IR1与IR3相连接,8259CS接到Y0上,/RD、/WR、INT分别与IOR、IOW、IRQ 相连接,A口接LED显示电路L0~L7,C口输入不需要接,最后将8255和8259级联起来,8255CS与Y1相连接,连接好后打开电源。
2、编写程序
3、汇编、编译、连接及运行
五、实验程序
1、
1)C口入,A口出
ioport equ 0ff00h-0280h
io8255a equ ioport+288h ;A端口地址
io8255b equ ioport+289h ;B端口地址
io8255c equ ioport+28ah ;C端口地址
io8255 equ ioport+28bh ;控制口
code segment
assume cs:code
start: mov dx,io8255 ;设8255为C口输入,A口输出mov al,8bh ;初始化
out dx,al
inout: mov dx,io8255c ;从c口输入一数据
in al,dx ;读c口
mov dx,io8255a ;a口地址给dx
out dx,al ;所输入的数据
mov dl,0ffh ;判断是否有按键
mov ah,06h ;直接控制台输入输出
int 21h
jz inout ;若无,则继续自C口输入,A口输出mov ah,4ch ;否则返回
int 21h
code ends
end start
2)A口入,B口出
ioport equ 0ff00h-0280h
io8255a equ ioport+288h ;A端口地址
io8255b equ ioport+289h ;B端口地址
io8255c equ ioport+28ah ;C端口地址
io8255 equ ioport+28bh ;控制口
code segment
assume cs:code
start: mov dx,io8255 ;设8255为A口输入,B口输出mov al,99h ;初始化
out dx,al
inout: mov dx,io8255a ;从A口输入一数据
in al,dx ;读A口
mov dx,io8255b ;B口地址给dx
out dx,al ;所输入的数据
mov dl,0ffh ;判断是否有按键
mov ah,06h ;直接控制台输入输出
int 21h
jz inout ;若无,则继续自A口输入,B口输出
mov ah,4ch ;否则返回
int 21h
code ends
end start
3)B入,C出
ioport equ 0ff00h-0280h
io8255a equ ioport+288h ;A端口地址
io8255b equ ioport+289h ;B端口地址
io8255c equ ioport+28ah ;C端口地址
io8255 equ ioport+28bh ;控制口
code segment
assume cs:code
start: mov dx,io8255 ;设8255为B口输入,C口输出mov al,92h ;初始化
out dx,al
inout: mov dx,io8255c ;从B口输入一数据
in al,dx ;读B口
mov dx,io8255a ;C口地址给dx
out dx,al ;所输入的数据
mov dl,0ffh ;判断是否有按键
mov ah,06h ;直接控制台输入输出
int 21h
jz inout ;若无,则继续自B口输入,C口输出mov ah,4ch ;否则返回
int 21h
code ends
end start
2、8255与8259的结合程序
DATA SEGMENT
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
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端口地址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,IO8255C ;设8255为A口输入,C口输出MOV AL,00H
OUT DX,AL
MOV DX,IO8255
MOV AL,80H ;从C口输出刚才自A口
OUT DX,AL
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请求,跳到IR3处理程序
JMP EOI
IR1ISR: MOV DX,OFFSET MSG3 ;IR1处理,显示字符串'IR1 OK AND EXIT'
MOV AH,09H
INT 21H
MOV DX,IO8255C ;从C口输出刚才自A口
MOV AL,0F0H
OUT DX,AL
JMP EOI
IR3ISR: MOV DX,OFFSET MSG4 ;IR3处理,显示字符串'IR3 OK AND EXIT'
MOV AH,09H
INT 21H
MOV DX,IO8255C
MOV AL,00FH ;从C口输出刚才自A口
OUT DX,AL
JMP EOI
EOI: MOV DX,MY8259_OCW2 ;向实验系统中8259发送中断结束命令MOV AL,20H
OUT DX,AL
JMP QUERY
CODE ENDS
END START
六、实验结果
实验一:正确连接电路及编写程序后,编译、链接、运行程序,开关K0~K7分别对应控制着LED灯L0~L7的点亮和熄灭。
实验二:正确连接电路后,所有的LED指示灯都熄灭灭;编译、链接、运行程序,按下SP1,L0~L3这四个指示灯(低位指示灯)亮,再按一次SP1,这四个LED指示灯又灭,如此重复,每按一次SP1,电脑屏幕上显示“IR1 ok and exit”;按下SP2,L4~L7这四个指示灯亮,再按一次SP2,这四个LED指示灯又灭,如此重复,每按一次SP2,电脑屏幕上显示“IR3 ok and exit”。
七、实验中遇到的问题及解决方法
做实验二时,按实验步骤中所说的正确操作后不能正确的出现实验结果,多次重复操作后有一次成功了,换了一台机子后能正确显示结果,自己感觉之前的LED灯有点问题。
实验三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的分频信号。
图3-1
三、实验步骤
1、连接线路
实验一:8253CS 与Y0相连,RD 与IOR 相连,WR 与IOW 相连,CLK0连SP1,OUT0连一盏LED 。
实验二:8253CS 与Y0相连, CLK0连1Mhz ,OUT0连CLK1,OUT 连一盏LED 。
2、编写程序
3、汇编、编译、连接及运行
四、参考程序 1、
ioport equ 0ff00h-0280h io8253k equ ioport+283h io8253a equ ioport+280h code segment assume cs:code
start: mov al,10h ;设置8253通道0为工作方式0,二进制计数 mov dx,io8253k out dx,al
mov dx,io8253a ;送计数初值为03H
mov al,03h 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
2、
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
五、实验结果
实验一:刚开始L0亮,运行程序,屏幕上显示“8”,按一下SP1,L0灭且屏幕上显示“7”,之后每次按下SP1,屏幕依次显示“6,5,4,3,2,1,0”,之后又开始显示“8,7,6,5,4,3,2,1,0”,这样一直循环,达到计数的目的,每次按下SP1,指示灯L0都会灭,松开SP1时,L0亮。
实验二:运行程序,其作用就是将1MHz的信号分频为1Hz的信号作用在指示灯L0上,使得指示灯L0每秒闪烁一次。
六、实验中遇到的问题及解决方法
因为LED灯的问题换了一台机子,这个实验不难,只要能正确连接电路,实验结果很容易就能出来。
实验体会:
通过两次实验的实际操作,我更深刻地理解了课堂上所说的8259、8255、8253的理论知识,同时也明白了实际操作中不像课堂上板书的连接图和初始化程序那么容易,许多错误往往是意想不到的,实验更能锻炼自己临场的随意应变能力。