微机实验报告.docx
《微机实验报告.docx》由会员分享,可在线阅读,更多相关《微机实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
微机实验报告
微机实验报告
04123104刘伟
实验一8259中断实验
一、实验目的
1.掌握PC机中断处理系统的基本原理。
2.掌握外部扩展中断源的设计方法。
3.学会编写中断服务程序。
二、实验原理
PC机用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。
中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。
三、实验内容
实验要求实现8259控制器的IR1、IR3两路中断都可以通过IRQ向PC机发起中断请求,用SP1、SP2单次脉冲模拟两个中断源。
IR1中断时,在它的中断服务程序中编程显示“IR1OKANDEXIT!
”;IR3中断时,在它的中断服务程序中编程显示“IR3OKANDEXIT!
”。
采用查询方式完成。
图1-1扩展中断电路
四、实验步骤
1、连接线路
在实验板上将8259的D0~D7跟PC/XT的D0~D7连接,将8259CS信号线与Y1连接,RD、WR分别与IOR、IOW连接,中断源SP1、SP2与8259的IR1、IR3连接,同时将IR0~IR7接到LED灯的L0~L7上面。
2、编写程序
;*********************;
;*实验台上8259中断*;
;*********************;
datasegment
ioportequ0ff00h-0280h
MY8259_ICW1EQUioport+280H;实验系统中8259的ICW1端口地址
MY8259_ICW2EQUioport+281H;实验系统中8259的ICW2端口地址
MY8259_ICW3EQUioport+281H;实验系统中8259的ICW3端口地址
MY8259_ICW4EQUioport+281H;实验系统中8259的ICW4端口地址
MY8259_OCW1EQUioport+281H;实验系统中8259的OCW1端口地址
MY8259_OCW2EQUioport+280H;实验系统中8259的OCW2端口地址
MY8259_OCW3EQUioport+280H;实验系统中8259的OCW3端口地址
msg1db0dh,0ah,'DVCCpcicardInterrupt',0dh,0ah,'$'
msg2db0dh,0ah,'Pressanykeytoexit!
',0dh,0ah,'$'
msg3db0dh,0ah,'IR1okandexit!
',0dh,0ah,'$'
msg4db0dh,0ah,'IR3okandexit!
',0dh,0ah,'$'
dataends
stackssegment
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks,es:
data
start:
;EnableLocalInterruptInput
movax,data
movds,ax
moves,ax
movax,stacks
movss,ax
movax,data
movds,ax
movdx,offsetmsg1
movah,09h
int21h
movdx,offsetmsg2
movah,09h
int21h
MOVDX,MY8259_ICW1;初始化实验系统中8259的ICW1
MOVAL,13H;边沿触发、单片8259、需要ICW4
OUTDX,AL
MOVDX,MY8259_ICW2;初始化实验系统中8259的ICW2
MOVAL,08H
OUTDX,AL
MOVDX,MY8259_ICW4;初始化实验系统中8259的ICW4
MOVAL,01H;非自动结束EOI
OUTDX,AL
MOVDX,MY8259_OCW1;初始化实验系统中8259的OCW1
MOVAL,0F5H;打开IR1和IR3的屏蔽位
OUTDX,AL
QUERY:
MOVDX,MY8259_OCW3;向8259的OCW3发送查询命令
MOVAL,0CH
OUTDX,AL
NOP
NOP
NOP
MOVDX,MY8259_OCW3
INAL,DX;读出查询字
TESTAL,80H;判断中断是否已响应
JZQUERY;没有响应则继续查询
ANDAL,07H
CMPAL,01H
JEIR1ISR;若为IR1请求,跳到IR1处理程序
CMPAL,03H
JEIR3ISR;若为IR1请求,跳到IR1处理程序
JMPEOI
IR1ISR:
movdx,offsetmsg3;IR1处理,显示字符串'IR1okandexit'
movah,09h
int21h
JMPEOI
IR3ISR:
movdx,offsetmsg4;IR1处理,显示字符串'IR3okandexit'
movah,09h
int21h
EOI:
MOVDX,MY8259_OCW2;向实验系统中8259发送中断结束命令
MOVAL,20H
OUTDX,AL
jmpstart
codeends
endstart
3、汇编、编译、连接及运行
五、实验程序
六、实验结果
当SP1脉冲中断源给一个脉冲时,屏幕上显示字符串'IR1okandexit';当SP2脉冲中断源给一个脉冲时,屏幕上显示字符串'IR1okandexit'。
这样每当给不同的中断信号,就会有不同的输出结果。
7、实验中遇到的问题及解决方法
当发现某个中断源坏了或者不能用的时候,及时调整到另外一个上面进行尝试,得出是器件原因而并非程序原因。
实验二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中断时候,发光二极管的高四位灭(或亮),同时屏幕显示“IR1okandexit”,当程序响应IR3中断时候,发光二极管的低四位灭(或亮),同时屏幕显示“IR13okandexit”。
四、实验步骤
1、连接线路
8255的D0~D7跟PC/XT的D0~D7连接,同时8255的D0~D7跟PC/XT的D0~D7连接,RD、WR分别与IOR、IOW连接,中断源SP1、SP2与8259的IR1、IR3连接,8255的CS片选信号与PC/XT的Y1相连。
8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。
2、编写程序
3、汇编、编译、连接及运行
五、实验程序
1、B口逻辑开关输入入,C口输出到LED灯显示效果
;*********************;
;*实验台上8259中断*;
;*********************;
datasegment
ioportequ0ff00h-0280h
io8255aequioport+288h
io8255bequioport+289h
io8255cequioport+28ah
io8255equioport+28bh
MY8259_ICW1EQUioport+280H;实验系统中8259的ICW1端口地址
MY8259_ICW2EQUioport+281H;实验系统中8259的ICW2端口地址
MY8259_ICW3EQUioport+281H;实验系统中8259的ICW3端口地址
MY8259_ICW4EQUioport+281H;实验系统中8259的ICW4端口地址
MY8259_OCW1EQUioport+281H;实验系统中8259的OCW1端口地址
MY8259_OCW2EQUioport+280H;实验系统中8259的OCW2端口地址
MY8259_OCW3EQUioport+280H;实验系统中8259的OCW3端口地址
msg1db0dh,0ah,'DVCCpcicardInterrupt',0dh,0ah,'$'
msg2db0dh,0ah,'Pressanykeytoexit!
',0dh,0ah,'$'
msg3db0dh,0ah,'IR1okandexit!
',0dh,0ah,'$'
msg4db0dh,0ah,'IR3okandexit!
',0dh,0ah,'$'
dataends
stackssegment
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks,es:
data
start:
;EnableLocalInterruptInput
movax,data
movds,ax
moves,ax
movax,stacks
movss,ax
movax,data
movds,ax
movdx,offsetmsg1
movah,09h
int21h
movdx,offsetmsg2
movah,09h
int21h
MOVDX,MY8259_ICW1;初始化实验系统中8259的ICW1
MOVAL,13H;边沿触发、单片8259、需要ICW4
OUTDX,AL
MOVDX,MY8259_ICW2;初始化实验系统中8259的ICW2
MOVAL,08H
OUTDX,AL
MOVDX,MY8259_ICW4;初始化实验系统中8259的ICW4
MOVAL,01H;非自动结束EOI
OUTDX,AL
MOVDX,MY8259_OCW1;初始化实验系统中8259的OCW1
MOVAL,0F5H;打开IR1和IR3的屏蔽位
OUTDX,AL
QUERY:
MOVDX,MY8259_OCW3;向8259的OCW3发送查询命令
MOVAL,0CH
OUTDX,AL
NOP
NOP
NOP
MOVDX,MY8259_OCW3
INAL,DX;读出查询字
TESTAL,80H;判断中断是否已响应
JZQUERY;没有响应则继续查询
ANDAL,07H
CMPAL,01H
JEIR1ISR;若为IR1请求,跳到IR1处理程序
CMPAL,03H
JEIR3ISR;若为IR1请求,跳到IR1处理程序
JMPEOI
IR1ISR:
movdx,offsetmsg3;IR1处理,显示字符串'IR1okandexit'
movah,09h
int21h
JMPEOI
IR3ISR:
movdx,offsetmsg4;IR1处理,显示字符串'IR3okandexit'
movah,09h
int21h
movdx,io8255;设8255为B口输入,C口输出
moval,82h
outdx,al
inout:
movdx,io8255b;从B口输入一数据
inal,dx
movdx,io8255c;从C口输出刚才自C口
outdx,al;所输入的数据
movdl,0ffh;判断是否有按键
movah,06h
int21h
jzinout;若无,则继续自B口输入,C口输出
movah,4ch;否则返回
int21h
EOI:
MOVDX,MY8259_OCW2;向实验系统中8259发送中断结束命令
MOVAL,20H
OUTDX,AL
jmpstart
codeends
endstart
2、8255与8259的结合程序
;*********************;
;*实验台上8259中断*;
;*********************;
datasegment
ioportequ0ff00h-0280h
io8255aequioport+288h
io8255bequioport+289h
io8255cequioport+28ah
io8255equioport+28bh
MY8259_ICW1EQUioport+280H;实验系统中8259的ICW1端口地址
MY8259_ICW2EQUioport+281H;实验系统中8259的ICW2端口地址
MY8259_ICW3EQUioport+281H;实验系统中8259的ICW3端口地址
MY8259_ICW4EQUioport+281H;实验系统中8259的ICW4端口地址
MY8259_OCW1EQUioport+281H;实验系统中8259的OCW1端口地址
MY8259_OCW2EQUioport+280H;实验系统中8259的OCW2端口地址
MY8259_OCW3EQUioport+280H;实验系统中8259的OCW3端口地址
msg1db0dh,0ah,'DVCCpcicardInterrupt',0dh,0ah,'$'
msg2db0dh,0ah,'Pressanykeytoexit!
',0dh,0ah,'$'
msg3db0dh,0ah,'IR1okandexit!
',0dh,0ah,'$'
msg4db0dh,0ah,'IR3okandexit!
',0dh,0ah,'$'
dataends
stackssegment
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks,es:
data
start:
;EnableLocalInterruptInput
movax,data
movds,ax
moves,ax
movax,stacks
movss,ax
movax,data
movds,ax
movdx,offsetmsg1
movah,09h
int21h
movdx,offsetmsg2
movah,09h
int21h
MOVDX,MY8259_ICW1;初始化实验系统中8259的ICW1
MOVAL,13H;边沿触发、单片8259、需要ICW4
OUTDX,AL
MOVDX,MY8259_ICW2;初始化实验系统中8259的ICW2
MOVAL,08H
OUTDX,AL
MOVDX,MY8259_ICW4;初始化实验系统中8259的ICW4
MOVAL,01H;非自动结束EOI
OUTDX,AL
MOVDX,MY8259_OCW1;初始化实验系统中8259的OCW1
MOVAL,0F5H;打开IR1和IR3的屏蔽位
OUTDX,AL
movdx,io8255;设8255为C口输入,A口输出
moval,8bh
outdx,al
QUERY:
MOVDX,MY8259_OCW3;向8259的OCW3发送查询命令
MOVAL,0CH
OUTDX,AL
NOP
NOP
NOP
MOVDX,MY8259_OCW3
INAL,DX;读出查询字
TESTAL,80H;判断中断是否已响应
JZQUERY;没有响应则继续查询
ANDAL,07H
CMPAL,01H
JEIR1ISR;若为IR1请求,跳到IR1处理程序
CMPAL,03H
JEIR3ISR;若为IR1请求,跳到IR1处理程序
JMPEOI
IR1ISR:
movdx,offsetmsg3;IR1处理,显示字符串'IR1okandexit'
movah,09h
int21h
JMPEOI
IR3ISR:
movdx,offsetmsg4;IR1处理,显示字符串'IR3okandexit'
movah,09h
int21h
moval,0f0h
movdx,io8255a;从A口输出刚才自C口
outdx,al;所输入的数据
EOI:
MOVDX,MY8259_OCW2;向实验系统中8259发送中断结束命令
MOVAL,20H
OUTDX,AL
jmpstart
codeends
endstart
6、实验结果
1)当程序运行时,可以通过控制逻辑开关控制LED灯的变化,因为逻辑开关是C口输入,所以当改变逻辑开关的选通或者截止的时候,LED灯显示亮或者灭。
完成程序要求。
2)理应实现:
当程序响应IR1中断时候,发光二极管的高四位灭(或亮),同时屏幕显示“IR1okandexit”,当程序响应IR3中断时候,发光二极管的低四位灭(或亮),同时屏幕显示“IR13okandexit”。
因为自己做实验的IR1中断源有问题,所以这里程序只实现了当响应IR1中断时候,发光二极管的高四位灭(或亮),同时屏幕显示“IR1okandexit”。
七、实验中遇到的问题及解决方法
实验三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
图3-2
三、实验步骤
1、连接线路
图3-1连接:
在实验板上将8253的D0~D7跟PC/XT的D0~D7连接,将8253CS信号线与Y0连接,RD、WR分别与IOR、IOW连接,中断源SP1与8253的CLK0连接,同时将OUT0接到LED灯的L0上面。
图3-2:
在实验板上将8253的D0~D7跟PC/XT的D0~D7连接,将8253CS信号线与Y0连接,RD、WR分别与IOR、IOW连接,8253的CLK0接1MHZ的中断源,采用级联方式,将OUT0与CLK1连接,同时将OUT1输出接到LED灯的L0上面。
2、编写程序
3、汇编、编译、连接及运行
四、参考程序
1、
ioportequ0ff00H-0280h
io8253kequioport+283h
io8253aequioport+280h
codesegment
assumecs:
code
start:
moval,10h;设置8253通道0为工作方式0,二进制计数
movdx,io8253k
outdx,al
movdx,io8253a;送计数初值为08H
moval,08h
outdx,al
lll:
inal,dx;读计数初值
calldisp;调显示子程序
pushdx
movah,06h
movdl,0ffh
int21h
popdx
jzlll
movah,4ch;退出
int21h
dispprocnear;显示子程序
pushdx
andal,0fh;首先取低四位
movdl,al
cmpdl,9;判断是否<=9
jlenum;若是则为'0'-'9',ASCII码加30H
adddl,7;否则为'A'-'F',ASCII码加37H
num:
adddl,30h
movah,02h;显示
int21h
movdl,0dh;加回车符
int21h
movdl,0ah;加换行符
int21h
popdx
ret;子程序返回
dispendp
codeends
endstart
2、
ioportequ0C400H-0280h
io8253aequioport+280h
io8253bequioport+281h
io8253kequioport+283h
codesegment
assumecs:
code
start:
movdx,io8253k;向8253写控制字
moval,36h;使0通道为工作方式3
outdx,al
movax,1000;写入循环计数初值1000
movdx,io8253a
outdx,al;先写入低字节
moval,ah
outdx,al;后写入高字节
movdx,io8253k
moval,76h;设8253通道1工作方式3
outdx,al
movax,1000;写入循环计数初值1000
movdx,io8253b
outdx,al;先写低字节
moval,ah
outdx,al;后写高字节
movah,4ch;程序退出
int21h
codeends
endstart
5、实验结果
图3-1结果:
手动逐个输入单脉冲,计数值在屏幕上显示,同时用L0或逻辑笔观察OUT0电平变化,初始时OUT0为高电平,当输入4个脉冲时,OUT0变为低电平,当输入5个脉冲后OUT0变高电平,如此循环。
图3-2结果:
采用级联方式,计数初值设为1000*1000,用电平指示灯L0或逻辑笔观察OUT1输出电平的变化,实验结果是每过一秒,LED灯的显示由亮到灭,由灭到亮,然后反复循环亮灭交替变化。
六、实验中遇到的问题及解决方法