微机原理实验指导书硬件部分1分解.docx
《微机原理实验指导书硬件部分1分解.docx》由会员分享,可在线阅读,更多相关《微机原理实验指导书硬件部分1分解.docx(22页珍藏版)》请在冰豆网上搜索。
微机原理实验指导书硬件部分1分解
实验1存储器读写实验
一、实验目的
1.掌握PC机外存扩展的方法。
2.熟悉6264芯片的接口方法。
3.掌握8086十六位数据存储的方法。
二、实验设备
微机实验箱、8086CPU模块。
三、实验内容
向02000~020FFH单元的偶地址送入AAH,奇地址送入55H。
四、实验原理介绍
本实验用到存储器电路
五、实验步骤和要求
1、实验接线:
本实验无需接线。
2、编写调试程序
3、运行实验程序,可采取单步、设置断点方式,打开内存窗口可看到内存区的变化。
本实验的主要目的是学会用使用工具软件,掌握用单步执行和断点方式运行程序,观察寄存器和内存中的数据变化等程序调试的手段。
六、实验提示
1、RAM区的地址为02000H,编程时可将段地址设为0100H,则偏移地址为1000H。
2、如果按字节进行存储,则AL为55H或AAH;如果按字进行存储,则AX应为55AAH。
3、6264、62256等是计算机系统扩展中经常用到的随机存储器芯片(RAM),主要用作数据存储器扩展。
本实验所进行的内存置数在程序中经常用到。
计算机系统运行中会频繁地进行内存与外设或者内存与内存之间的数据传输,所以本实验虽然简单但对理解系统程序的运行很关键,望学习和实验时认真对待。
七、实验范例程序框图及源代码(实验程序名:
RAM.ASM)
八、思考题
1、单步执行到“intram”标号的语句时,ds寄存器的数据是什么?
采用断点方式运行时执行到第一个断点处,2000H~202FH内存单元的数据是什么?
执行到第二个断点处,2000H~200FH内存单元的数据是什么?
并根据观察结果和对源程序的判读简述源程序的运行效果。
如图,单步执行到“intram”标号的语句时ds寄存器的数据为0100
采用断点方式运行时执行到第一个断点处,2000H~202FH内存单元的数据如图所示。
由源程序知道第一个断点前的程序是为了把数据段内存单元清0,符合上图结果
其实清零在这里可以不用,直接进行后面的置数
执行到第二个断点处,2000H~200FH内存单元的数据如图所示。
由源程序可知程序的运行结果为向02000~020FFH单元的偶地址送入AAH,奇地址送入55H,符合上图的结果
2、修改程序,实现从2000H到200FH单元依次赋值00H~0FH的功能。
设计思想:
通过把AL值赋给【si】,然后使AL,si同时自加1,循环16次即可
程序流程图:
代码:
codesegment
assumecs:
code
org0100h;在代码段0100h偏移地址处开始存放代码
start:
movax,0100h;
movds,ax;数据段地址
moves,ax
movsi,1000h;偏移地址
movcx,0100h;循环次数
moval,0;al的值置0
intram:
mov[si],al;0赋给[si]
incsi;si加1
loopintram;使得0100:
1000开始处的256个单元中的数据清0
movsi,1000h;设置断点处
movcx,0010h;设置循环次数为16
fil:
mov[si],al;RAM区循环置数
incsi;地址指针加1
incal;al中的值每执行一次循环加1,初始值为00,加到0F
loopfil
nop;设置断点处
jmpstart
codeends
endstart
结果:
九、实验中的问题及其解决方法
问题:
(1)范例程序中按题目要求设置两个断点时,全速运行时只能运行第一个断点处的程序,而不知道怎么运行下一个断点处的程序,导致出不来结果
(2)做思考题时,运行所写程序时发现内存空间中上一个题目的运行结果还在里面
解决方法:
(1)针对问题
(1),当执行完第一个断点执行完毕应该取消该断点,这样在全速运行时可以运行到下一个断点,就可以观察到程序运行结果了。
(2)针对问题
(2),发现在初始化程序时,自己把所有的循环初值都设成了0010H(16),导致只有前16个内存单元清零,而后面的内存单元没有初始化,保留了上次运行的程序运行结果。
所以将初始化(清零)的循环初值设成0100H,这样就可以初始化256个内存单元了,把上次的结果初始化为0。
而后一个赋值循环的循环次数仍然为0010
十、体会
这个题目比较简单,程序很简单,主要是把循环值设置对。
但是由于对软件使用的不熟悉,因此导致了一些问题。
在调试运行上还是花了一些时间。
通过发现问题,解决问题的过程,使我对这个软件的使用更加熟练,为后面的程序设计中打下良好的基础。
实验2简单I/O口扩展实验
一、实验目的
1、熟悉74LS273,74LS244的应用接口方法。
2、掌握用锁存器、三态门扩展简单并行输入、输出口的方法。
二、实验设备
微机实验箱、8086CPU模块。
三、实验内容
逻辑电平开关的状态输入74LS244,然后通过74LS273锁存输出,利用LED显示电路作为输出的状态显示。
四、实验原理介绍
本实验用到两部分电路:
开关量输入输出电路,简单I/O口扩展电路。
五、实验步骤
1、实验接线:
(表示相互连接)
CS0CS244;CS1CS273;平推开关的输出K1~K8IN0~IN7(对应连接);O0~O7LED1~LED8。
2、编辑程序,单步运行,调试程序
3、调试通过后,全速运行程序,观看实验结果。
4、编写实验报告。
六、实验提示
74LS244或74LS273的片选信号可以改变,例如连接CS2,此时应同时修改程序中相应的地址。
七、实验结果
程序全速运行后,逻辑电平开关的状态改变应能在LED上显示出来。
例如:
K2置于L位置,则对应的LED2应该点亮。
八、实验范例程序框图(实验程序名:
T244273.ASM)
九、程序源代码清单
十、思考题:
将74LS244的片选信号CS244改接CS2,将74LS273的片选信号CS273改接CS3,修改程序实现与范例程序相同的功能。
程序流程图:
代码:
assumecs:
code
codesegmentpublic
org100h
start:
movdx,04c0h;74LS244地址
inal,dx;读输入开关量
movdx,04d0h;74LS273地址
outdx,al;输出至LED
jmpstart
codeends
endstart
分析:
原CS244接CS0,CS0端口地址04a0h,CS273接CS1,CS1端口地址为04b0h。
只需把接线换掉后,把对应的端口地址改正即可.即CS2的地址为04c0h,CS3的地址为04d0h
十一、遇到的问题
该实验在调试的过程中,没有遇到问题,只是第一次的那台仪器坏了,发现灯都不亮,之后换了一台仪器,连线,编译,运行,就得到正确结果了。
实验38255并行口实验
一、实验目的
掌握8255A的编程原理。
二、实验设备
微机实验箱、8086CPU模块。
三、实验内容
8255A的A口作为输入口,与逻辑电平开关相连。
8255A的B口作为输出口,与发光二极管相连。
编写程序,使得逻辑电平开关的变化在发光二极管上显示出来。
四、实验原理介绍
本实验用到两部分电路:
开关量输入输出电路和8255可编程并口电路。
五、实验步骤
1、实验接线
CS0CS8255;PA0~PA7平推开关的输出K1~K8;PB0~PB7发光二极管的输入LED1~LED8。
2、编程并全速或单步运行。
3、全速运行时拨动开关,观察发光二极管的变化。
当开关某位置于L时,对应的发光二极管点亮,置于H时熄灭。
六、实验提示
8255A是比较常用的一种并行接口芯片,其特点在许多教科书中均有介绍。
8255A有三个8位的输入输出端口,通常将A端口作为输入用,B端口作为输出用,C端口作为辅助控制用,本实验也是如此。
实验中,8255A工作于基本输入输出方式(方式0)。
七、实验结果
程序全速运行后,逻辑电平开关的状态改变应能在LED上显示出来。
例如:
K2置于L位置,则对应的LED2应该点亮。
八、实验范例程序框图及源代码(实验程序名:
t8255.asm)
九、思考题:
1、修改接线CS2CS8255,并要求开关置“H”(下)位置时对应LED亮,修改程序实现相应功能。
程序流程图:
代码:
assumecs:
code
codesegmentpublic
org100h
start:
movdx,04c6h;控制寄存器地址(改为04c6h)
movax,90h;设置为A口输入,B口输出
outdx,ax
start1:
movdx,04c0h;A口地址(改为04c0h)
inax,dx
xorax,0ffffh;取反输入
movdx,04c2h;B口地址(改为04c2h)
outdx,ax;输出
jmpstart1
codeends
endstart
说明:
由于换成CS2和CS8255相连,因此三个地址应分别修改为:
04c6h,04c0h,04c2h
由于要求开关置下时灯亮,因此需要从A口读取开关状态到AX后,对AX中的内容取反,即可实现要求。
取反的方法可以用notax语句,也可以用异或xor的取反,要取反的位与1异或
我这里采用异或。
实验48253定时器/计数器接口实验
一、实验目的
掌握8253定时器的编程原理,用示波器观察不同模式下的输出波形。
二、实验设备
微机实验箱、8086CPU模块、示波器。
三、实验内容
了解8253计数器的不同工作方式,掌握其初始化控制字对定时/记数效果的影响。
四、实验原理介绍
本实验用到两部分电路:
脉冲产生电路、8253定时器/计数器电路
五、实验步骤
1、实验连线:
CS0CS8253OUT08253CLK2OUT2LED1OUT1LED2
CLK3
8253CLK0,CLK3
8253CLK1
2、编程调试程序
3、全速运行,观察实验结果
六、实验提示
8253是计算机系统中经常使用的可编程定时器/计数器,其内部有三个相互独立的计数器,分别称为T0,T1,T2。
8253有多种工作方式,其中方式3为方波方式。
当计数器设好初值后,计数器递减计数,在计数值的前一半输出高电平,后一半输出低电平。
实验中,T0、T1的时钟由CLK3提供,其频率为750KHz。
程序中,T0的初值设为927CH(37500十进制),则OUT0输出的方波周期为(37500*4/3*10-6=0.05s)。
T2采用OUT0的输出为时钟,则在T2中设置初值为n时,则OUT2输出方波周期为n*0.05s。
n的最大值为FFFFH,所以OUT2输出方波最大周期为3276.75s(=54.6分钟)。
可见,采用计数器叠加使用后,输出周期范围可以大幅度提高,这在实际控制中是非常有用的。
七、实验结果
程序全速运行后,LED1按一定周期闪烁(周期理论值为0.2s),LED2在高频脉冲信号(约15KHz)影响下,有微弱的光亮,但无明显的周期变化现象。
八、实验范例程序框图及源代码(实验程序名:
t8253.asm)
九、思考题:
1、为什么说范例程序运行时LED1闪烁周期的理论值是0.2秒?
在范例程序设置LED2的最大闪烁周期是多少?
请分析说明。
(1)LED1 与OUT2连接
计数器0的初值设为927CH(37500),它的时钟由CLK3提供,其频率为750KHz,所以OUT0输出的方波周期为(37500*4/3*10^-6=0.05s)。
计数器2采用OUT0的输出为时钟,它的频率为(1/0.05)Hz,计数器2设置初值为04H(4)时,所以OUT2输出方波周期为4*0.05s=0.2s
所以LED1的闪烁周期为0.2s
(2) LED2与OUT1连接
所LED2的闪烁周期即为计数器1的周期
计数器1的初值为32H(50),它的时钟也由CLK3提供,频率为750KHz,所以OUT1输出的周期为(50*4/3*10^-6=6.7*10^(-5)s),即LED2的闪烁周期。
由于周期过小,人眼无法识别
所以实验结果中,LED2有微弱变化,但无明显闪烁。
2、修改片选信号接线使CS1和CS8253连接,并要求LED1的闪烁周期变为4秒(亮2秒,灭2秒),修改程序实现功能。
程序流程图:
求设置的计数初值:
4/0.05=80=50h
代码及注释:
assumecs:
code
codesegmentpublic
org100h;在代码段0100h偏移地址处开始存放代码
start:
movdx,04b6h;控制寄存器
movax,36h;计数器0,方式3
outdx,ax
movdx,04b0h;计数器0的地址
movax,7Ch;计数初值的低位为7Ch
outdx,ax
movax,92h;计数初值的高位为92h
outdx,ax;计数值927Ch
movdx,04b6h;控制寄存器地址
movax,76h;计数器1,方式3
outdx,ax
movdx,04b2h;计数器1的地址
movax,32h;计数初值的低位为32h
outdx,ax
movax,0;计数初值的高位为00h
outdx,ax;计数值32h
movdx,04b6h
movax,0b6h;计数器2,方式3
outdx,ax
movdx,04b4h;计数器2的地址
movax,50h;计数值低位为50h
outdx,ax
movax,0;计数值高位为0
outdx,ax;计数值50h
next:
nop
jmpnext;让程序一直循环执行
codeends
endstart
分析:
将所有CS0的端口地址(04a_)都改为CS1的端口地址(04b_)。
再将计数器2的计数初值改为50H(4/0.05=80=50H)
遇到的问题:
第一次连线调试的时候,发现灯闪烁得频率很快,仔细检查程序,发现初始计数值设计小了,通过公式计算,得到计数值需要设置为50H,才使得周期为4s。
重新调试,得到了正确结果
实验5 8259中断控制器实验
一、实验目的
1、掌握8259A的工作原理。
2、掌握编写中断服务程序方法。
3、掌握初始化中断向量的方法。
二、实验设备
微机实验箱、8086CPU模块。
三、实验内容
了解中断处理的原理,掌握利用中断控制器进行中断申请和中断操作的方法。
四、实验原理介绍
本实验用到三部分电路:
电平开关电路、简单I/O口扩展电路和8259中断控制器电路。
五、实验步骤
1、实验接线
CS0CS8259CS3CS273O0~O3LED1~LED4K1~K4IR0~IR3INTINT(8086CPU板)INTAINTA(8086CPU板)
2、编译调试程序
3、全速运行程序,拨动某一电平开关,观察LED的亮灭情况。
六、实验提示
1、8259的使用说明请详细阅读教科书。
2、8086的中断系统是向量中断方式。
内存中特定位置有一中断向量表,表内存有不同中断类型的中断向量(中断入口地址)。
不同中断类型的中断向量在表内有对应的偏移地址,其计算方法是:
中断类型*4。
3、中断类型由8259通过数据总线送给8086,8086内部电路会将该类型值自动乘4,而后赋给指令指针,从而转向中断向量表的相应单元取得中断入口地址,之后就进入中断服务程序。
请仔细研读8259的工作时序。
4、中断类型的高5位由8259寄存器ICW2决定,低3位由中断源IRx的编码自动填入。
IR0~IR7的编码分别为000,001,010,011,100,101,110,111。
七、实验结果
全速运行程序,由上往下拨动开关时,相应位置的LED点亮,其余LED全灭。
八、实验范例程序框图及源代码(实验程序名:
t8259.asm)
九、思考题:
1、说明源代码8259初始化所设置的所有中断控制字的值和含义(按位说明)。
(1)mov dx,04a0h
mov ax,13h
out dx,ax
ICW1(初始化字),写入的值为13h,化为二进制后:
00010011。
含义:
边沿触发,地址间距为8,单片8259A,需要ICW4。
(2)mov dx,04a2h
mov ax,80h
out dx,ax
ICW2(中断类型码字),写入的值为80h,化为二进制后:
10000000。
含义:
说明对应于IR0~IR7的中断类型码为80h~87h。
(3)mov ax,01h
out dx,ax
ICW4(中断结束方式字),写入的值为01h,化为二进制后:
00000001。
含义:
普通全嵌套方式,非缓冲方式,正常EOI,8086/8088模式。
(4)mov ax,00h
out dx,ax
OCW1(屏蔽控制字),写入的值为00h,即00000000b。
含义:
全部为复位屏蔽,开放所有中断。
2、修改接线IR3P+(实验箱右下角),并修改源程序,使按实验箱右下角“Pules”键时LED1~LED4全亮。
程序流程图:
代码及注释:
assumecs:
code
codesegmentpublic
org100h;在代码段0100h偏移地址处开始存放代码
start:
movcx,0
start1:
cli;关中断,防止有些硬件中断对程序的干扰
movdx,04a0h;写入ICW1的端口地址为04a0h
movax,13h;ICW1为13H,化为二进制为00010011
outdx,ax;ICW1,ICW4需要
movdx,04a2h;写入ICW2的端口地址为04a2h
movax,80h;ICW2为80H,化为二进制为10000000
outdx,ax;ICW2中断类型80h,IR0~IR7的中断类型码为80h~87h
movax,01h;ICW4为01H,化为二进制为00000001
outdx,ax;ICW4;普通全嵌套方式,非缓冲方式,正常EOI,8086/8088模式
movax,00h
outdx,ax;OCW1,开放所有中断
nop;以上为8259初始化
movax,0
movds,ax
movdi,200h;初始化中断向量表
movax,offsetint0;IR0的中断服务程序入口地址放入中断向量表中
movds:
[di],ax;先放IP
adddi,2
movds:
[di],100h;再放CS值
adddi,2
movax,offsetint1;IR1的中断服务程序入口地址放入中断向量表中
movds:
[di],ax
adddi,2
movds:
[di],100h
adddi,2
movax,offsetint2;IR2的中断服务程序入口地址放入中断向量表中
movds:
[di],ax
adddi,2
movds:
[di],100h
adddi,2
movax,offsetint3;IR3的中断服务程序入口地址放入中断向量表中
movds:
[di],ax
adddi,2;上述程序为芯片8259的初始化程序
movds:
[di],100h;建议不熟练者不要修改。
main:
movax,0
sti;开中断。
waiting:
cmpax,0h
jewaiting;没发生中断,则等待
nop
nop
movdx,04d0h
outdx,ax;对应LED灯亮
movcx,0
delay:
loopdelay;数字滤波,按键去抖
jmpstart1
int0:
cli;关中断。
以下类推。
nop;此两行为IR0的中断服务程序
movax,0feh;用户可修改。
iret;中断返回,以下类推。
int1:
cli
nop;此两行为IR1的中断服务程序,
movax,0fdh;用户可修改。
iret
int2:
cli
nop;此两行为IR2的中断服务程序,
movax,0fbh;用户可修改。
iret
int3:
cli
nop;此两行为IR3的中断服务程序,
movax,0f0h;用户可修改。
iret
codeends
endstart
分析:
原AX的内容为0f7H,最低四位为7(0111),从左到右依次表示LED4,LED3,LED2,LED1,所以原代码IR3只接受LED4对应的开关K4产生的中断。
将其改为0(0000)后,表示四盏灯同时产生中断,所以同时亮。
遇到的问题:
一开始没有弄清楚中断服务程序的工作原理,导致不知从何下手去修改程序
,通过查阅微机课本有关中断的内容,再对比程序,发现,只需要改变IR3中断服务程序,把IR3全部置0,就代表四盏灯同时中断,即同时亮
实验总结
经过三周的微机硬件实验,我学到了很多东西,对于书本上的知识也有了更深层次的认识,通过第一个给存储单元赋值的操作,我明白了程序是如何运行的,以及各个寄存器及存储器内容是如何变化的。
这使得我用汇编语言编程的能力得到提升,同时也明白了汇编语言虽然是低级语言,但却是最接近计算机核心结构的,因此汇编语言更易被计算机识别。
后面几个硬件实验,不仅锻炼了我的动手操作能力以及程序调试能力,更关键的是明白了几个芯片8255以及计数器8253的工作原理,对中断有了更深的理解,比如中断控制字是如何设定的等等。
总之这次硬件实验需要理论与实践的结合,在知识点理解的基础上,通过实验来加深理解,这样使得知识更加形象生动。
当然还要感谢老师和同学们在我遇到困难时所给予的帮助,让我顺利的完成这次硬件实验。
二、综合设计实验部分
一、实验设备
微机实验箱、8086CPU模块。
二、实验要求
红绿灯的定时切换(每10秒切换一次)设置灯光测试开关K1,当K1打开(高电平)时,LED1~LED4全亮,关闭时恢复正常切换。
三、实验步骤
1、实验接线:
CS08255CS;CS1CS8253;CLK38253CLK0;OUT08253CLK2
OUT2PA0,PA1,PA2