完整版北航微机原理实验报告.docx
《完整版北航微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《完整版北航微机原理实验报告.docx(34页珍藏版)》请在冰豆网上搜索。
完整版北航微机原理实验报告
微计算机原理及运用实验报告
实验一:
I/O地址译码实验
一、实验目的
掌握I/O地址译码电路的工作原理。
二、实验原理和内容
实验电路如附图1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。
译码输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:
280H~287H,Y1:
288H~28FH,……当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。
附图1I/O地址译码电路
利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。
接线:
Y4/IO地址接CLK/D触发器
Y5/IO地址接CD/D触发器
D/D触发器接SD/D角发器接+5V
Q/D触发器接逻辑笔
三、实验程序
;*******************************;
;*I/O地址译码*;
;*******************************;
outport1equ2a0h
outport2equ2a8h
codesegment
assumecs:
code
start:
movdx,outport1
outdx,al
calldelay;调延时子程序
movdx,outport2
outdx,al
calldelay;调延时子程序
movah,1
int16h
jestart
movah,4ch
int21h
delayprocnear;延时子程序
movbx,200
lll:
movcx,0
ll:
loopll
decbx
jnelll
ret
delayendp
codeends
endstart
四.实验总结
这次实验让我对I/O地址译码电路有了直观的认识,也对地址译码器74LS138、74LS74D触发器也有了更深一步地了解,也对汇编程序的设计和编写更加熟悉。
实验二:
8255并行接口实验
一、实验目的
通过实验,掌握8255工作于方式0以及设置A口为输出口,C口为输入口的方法。
二.实验原理和内容
1.8255模块简介:
8255是Intel公司生产的与Intel8080/8085系列的MPU配套的可编程外围接口电路,简称PPI。
它有A、B、C三个八位端口寄存器,通过24位端口线与外部设备相连,基中C口可分为上半部和下半部。
这24根端口线全部为双向三态。
三个端口可分二组来使用,可分别工作于三种不同的工作方式。
2.8255方式选择控制字分析,如下图所示:
Ø8255端口C置1/置0控制字分析(A1、A0=11),下图所示:
Ø实验连线
3.实验电路,8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。
编程从8255C口输入数据,再从A口输出。
附图28255并行接口电路
接线:
PC7~PC0/8255接K7~K0/逻辑电平开关
PA7~PA0/8255接L7~L0/LED显示
CS/8255接Y1/IO地址
三、程序框图
四.实验程序
;*******************************;
;*8255方式0的C口输入,A口输出*;
;*******************************;
io8255aequ288h
io8255bequ28bh
io8255cequ28ah
codesegment
assumecs:
code
start:
movdx,io8255b;设8255为C口输入,A口输出
moval,8bh
outdx,al
inout:
movdx,io8255c;从C口输入一数据
inal,dx
movdx,io8255a;从A口输出刚才自C口
outdx,al;所输入的数据
movdl,0ffh;判断是否有按键
movah,06h
int21h
jzinout;若无,则继续自C口输入,A口输出
movah,4ch;否则返回
int21h
codeends
endstart
五.实验总结
通过这次试验我了解了8255工作于方式0以及设置A口为输出口,C口为输入口的方法,也对8255控制字的设置和初始化程序编写、各端口功能控制方面的能力有所提高。
实验三:
键盘显示控制实验
一、实验目的
掌握8255控制键盘及显示电路的基本功能及编程方法。
掌握一般键盘和显示电路的工作原理。
二、实验内容及原理
1.实验线路图
按原理图接线,
8255端口A地址为:
288H
端口C地址为:
28AH
控制口地址为:
28BH
接线:
PC7~PC0/8255接行3~列0/4X4键盘
PA7~PA0/8255接dp~a/LED数码管
CS/8255接Y1/IO地址
+5V接S0/LED数码管
GND接S3~S1/LED数码管
2.实验内容
使得在小键盘上每按一个健,4位数码管上显示出相应字符,
三、流程图
四.程序
;********************;
;*8255薄膜按键实验*;
;********************;
a8255equ288H;8255A口
c8255equ28aH;8255C口
k8255equ28bH;8255控制口
datasegment
table1dw0770h,0B70h,0D70h,0E70h,07B0h,0BB0h,0DB0h,0EB0h
dw07D0h,0BD0h,0DD0h,0ED0h,07E0h,0BE0h,0DE0h,0EE0h;键盘扫描码表
LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH
DB39h,5EH,79h,71h,0ffh;LED段码表,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
chardb'0123456789ABCDEF';字符表
mesdb0ah,0dh,'PLAYANYKEYINTHESMALLKEYBOARD!
',0ah,0dh
db'ITWILLBEONTHESCREEN!
ENDWITHE',0ah,0dh,'$'
key_indb0h
dataends
stackssegmentstack;堆栈空间
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks,es:
data
start:
cli
movax,data
movds,ax
moves,ax
movax,stacks
movss,ax
movdx,offsetmes;显示提示信息
movah,09
int21h
MOVDX,k8255;初始化8255控制字
moval,81h
outdx,al
main_key:
callkey;getacharin(key_in)anddisplayit
calldisply;调显示子程序,显示得到的字符
cmpbyteptrkey_in,'E'
jnzmain_key
movax,4c00h;if(dl)='E'returntoEXIT!
int21h;退出
keyprocnear
key_loop:
movah,1
int16h
jnzexit;pc键盘有键按下则退出
movdx,c8255
moval,0fh
outdx,al
inal,dx;读行扫描值
andal,0fh
cmpal,0fh
jzkey_loop;未发现有键按下则转
calldelay;delayforamoment
movah,al
MOVDX,k8255
moval,88h
outdx,al
movdx,c8255
moval,ah
oral,0f0h
outdx,al
inal,dx;读列扫描值
andal,0f0h
cmpal,0f0h
jzkey_loop;未发现有键按下则转
movsi,offsettable1;键盘扫描码表首址
movdi,offsetchar;字符表首址
movcx,16;待查表的表大小
key_tonext:
cmpax,[si];cmp(col,row)witheveryword
jzkey_findkey;inthetable
deccx
jzkey_loop;未找到对应扫描码
addsi,2
incdi
jmpkey_tonext
key_findkey:
movdl,[di]
movah,02
int21h;显示查找到的键盘码
movbyteptrkey_in,dl
key_waitup:
MOVDX,k8255
moval,81h
outdx,al
movdx,c8255
moval,0fh
outdx,al
inal,dx;读行扫描值
andal,0fh
cmpal,0fh
jnzkey_waitup;按键未抬起转
calldelay;delayforamoment
ret
exit:
movbyteptrkey_in,'E'
ret
keyendp
delayprocnear
pushax;delay50ms--100ms
movah,0
int1ah
movbx,dx
delay1:
movah,0
int1ah
cmpbx,dx
jzdelay1
movbx,dx
delay2:
movah,0
int1ah
cmpbx,dx
jzdelay2
popax
ret
delayendp
DISPLYPROCNEAR
PUSHax
MOVBX,OFFSETLED
MOVAL,byteptrkey_in
SUBal,30h
CMPal,09h
JNGDIS2
SUBal,07h
DIS2:
XLAT
MOVDX,a8255
OUTDX,AL;输出显示数据,段码
POPAX
RET
DISPLYENDP
codeends
endstart
五.实验总结
通过这次实验了解了8255控制键盘及显示电路的基本功能及编程方法和一般键盘和显示电路的工作原理。
并且对复杂的汇编程序编写分模块用call指令调用的方法更加熟悉。
实验四:
8254定时器/计数器实验
一、实验目的
掌握8254的基本工作原理和编程方法,用示波器观察不同方式下的波形。
二、实验原理和内容
按图4-8-1虚线连接电路,将计数器0设置为方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。
接线:
CS/8254接Y0/IO地址
GATE0/8254接+5V
CLK0/8254接单脉冲
三、实验程序
;*************************;
;*8254方式0计数器实验*;
;*************************;
io8253aequ283h
io8253bequ280h
codesegment
assumecs:
code
start:
moval,14h;设置8254通道0为工作方式2,二进制计数
movdx,io8253a
outdx,al
movdx,io8253b;送计数初值为0FH
moval,0fh
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
四.实验总结
通过这次实验对8254的基本工作原理和编程方法有了更加实际的认识,而用示波器观察波形也让我重新复习了示波器的使用。
实验五:
继电器控制实验
一、实验目的
1、了解微机控制直流继电器的一般方法。
2、进一步熟悉使用8255、8254。
二、实验原理和内容
实验电路如附图6,按虚线连接电路:
CLK0接1MHZ,GATE0,GATE1,接+5V,OUT0接CLK1,OUT1接PA0,PC0接继电器驱动电路的开关输入端Ik。
继电器常开触点串联一个发光二极管,编程使用8254定时,让继电器周而复始的闭合5秒钟(指示灯灯亮),断开5秒钟(指示灯灯灭)。
附图6继电器控制实验电路图
接线:
CS/8254接Y0/IO地址
GATE0/8254接+5V
CLK0/8254接1M时钟
OUT0/8254接CLK1/8254
GATE1/8254接+5V
OUT1/8254接PC7/8255
PC0/8255接继电器
CS/8255接Y1/IO地址
三、实验中使用的程序
io8255aequ280h
io8255bequ281h
io8255cequ283h
io8255dequ288h
io8255eequ28bh
codesegment
assumecs:
code
start:
movdx,io8255e;设8255为A口输入,C口输出
moval,90h
lll:
outdx,al
moval,01;将PC0置位
outdx,al
calldelay;延时5s
moval,0;将PC0复位
outdx,al
calldelay;延时5s
jmplll;转lll
delayprocnear;延时子程序
pushdx
movdx,io8255c;设8253计数器为方式3
moval,36h
outdx,al
movdx,io8255a
movax,10000;写入计数器初值10000
outdx,al
moval,ah
outdx,al
movdx,io8255c
moval,70h;设计数器1为工作方式0
outdx,al
movdx,io8255b
movax,500;写入计数器初值500
outdx,al
moval,ah
outdx,al
ll2:
movah,06;是否有键按下
movdl,0ffh
int21h
jneexit;若有则转exit
movdx,io8255d
inal,dx;查询8255的PA0是否为高电平
andal,01
jzll2;若不是则继续
popdx
ret;定时时间到,子程序返回
exit:
movah,4ch
int21h
delayendp
codeends
endstart
四.实验总结
通过这次试验了解微机控制直流继电器的一般方法,对8255、8254的使用进一步熟悉。
通过将8254计数器0设置为方式3、计数器1设置为方式0并联使用,CLK0接1MHZ时钟,设置两个计数器的初值(乘积为5000000)启动计数器工作后,经过5秒钟OUT1输出高电平。
通过8255A口查询OUT1的输出电平,用C口PC0输出开关量控制继电器动作。
实现了程序控制。
实验六:
DMA传送
一、实验目的
1、掌握PC机工作环境下进行DMA方式数据传送(BlockMODE和DemandMode)(块传送、外部请求传送)方法。
2、掌握DMA的编程方法。
二、实验原理和内容
用通用插座按图4-11-2连接好电路(74LS74利用实验台上的D触发器)。
编程将主机内存缓冲区D4000H,偏移量为0的10个数据,使用DemandModeDMA方式从内存向外设传送。
接线:
按各实验图接线,图中虚线为实验所需接线
图中为实验台中单脉冲。
74LS74为实验台上D触发器
三、程序
codesegment
assumecs:
code
start:
movax,0D000h
moves,ax
movbx,4000h
movcx,0ffh;100h
movdl,40h
rep1:
incdl
moves:
[bx],dl
incbx
cmpdl,5ah
jnzss1
movdl,40h
ss1:
looprep1
movdx,18h;关闭8237
moval,04h
outdx,al
movdx,1dh;复位
moval,00h
outdx,al
movdx,12h;写目的地址低位
moval,00h
outdx,al
movdx,12h;写目的地址高位
moval,60h;
outdx,al
movdx,13h;传送字节数低位
moval,0ffh;
outdx,al
movdx,13h;传送字节数高位
moval,0;1h
outdx,al
movdx,10h;源地址低位
moval,00h
outdx,al
movdx,10h;源地址高位
moval,40h
outdx,al
movdx,1bh;通道1写传输,地址增
moval,85h
outdx,al
movdx,1bh;通道0读传输,地址增
moval,88h
outdx,al
movdx,18h;DREQ低电平有效,存储器到存储器,开启8237
moval,41h
outdx,al
movdx,19h;通道1请求
moval,04h
outdx,al
movcx,0F000h
delay:
loopdelay
movax,0D000h;---
moves,ax
movbx,06000h
movcx,0ffh;
rep2:
movdl,es:
[bx]
movah,02h
int21h
incbx
looprep2
movax,4c00h
int21h
codeends
endstart
四.实验总结
通过这次DMA方式传送数据这次方式有了更加深刻的认识,DMA的传输速度比一般的传输方式要快很多,这也体现了DMA方式的便捷性。
对DMA的初始化,牢记各个控制字的寻址,访问各端口的地址寄存器和字节计数器时要注意先传地位,再传高位。
实验七:
8259中断控制实验
一、实验目的
1、掌握中断控制器8259管理
2、掌握扩展中断
二、实验原理和内容
1、采用查询方式
2、如图4-14-1接线,按单脉冲请求一次中断,屏幕上显示相应的中断请求号
3、接线:
Y6/IO地址接CS/8259
+5V接INTA/8259
单脉冲接IR0/IR1/……IR7/8259
三、流程图
四.程序
I8259_1EQU2B0H;8259的ICW1端口地址
I8259_2EQU2B1H;8259的ICW1端口地址
I8259_3EQU2B1H;8259的ICW2端口地址
I8259_4EQU2B1H;8259的ICW3端口地址
08259_1EQU2B1H;8259的OCW1端口地址
08259_2EQU2B0H;8259的OCW2端口地址
08259_3EQU2B0H;8259的OCW3端口地址
Datasegment
Mes1db‘youcanplayakeyonthekeyboard!
’,0dh,0ah,24h
Mes2ddmes1
Mess1db‘Hello!
Thisisinterrupt*0*!
’,0dh,oah,’$’
Mess2db‘Hello!
Thisisinterrupt*1*!
’,0dh,oah,’$’
Mess3db‘Hello!
Thisisinterrupt*2*!
’,0dh,oah,’$’
Mess4db‘Hello!
Thisisinterrupt*3*!
’,0dh,oah,’$’
Mess5db‘Hello!
Thisisinterrupt*4*!
’,0dh,oah,’$’
Mess6db‘Hello!
Thisisinterrupt*5*!
’,0dh,oah,’$’
Mess7db‘Hello!
Thisisinterrup