1、程序流程图:代码:code segment assume cs:code org 0100h ; 在代码段0100h偏移地址处开始存放代码start: mov ax,0100h; mov ds,ax; 数据段地址 mov es,ax mov si,1000h ;偏移地址 mov cx,0100h ;循环次数 mov al,0; al的值置0intram: mov si,al ;0赋给si inc si ;si加1 loop intram; 使得0100:1000开始处的256个单元中的数据清0 mov si,1000h; 设置断点处 mov cx,0010h; 设置循环次数为16fil: mo
2、v si,al; RAM区循环置数地址指针加1 inc al ; al中的值每执行一次循环加1,初始值为00,加到0F loop fil nop ;设置断点处 jmp startcode ends end start结果:九、实验中的问题及其解决方法问题:(1)范例程序中按题目要求设置两个断点时,全速运行时只能运行第一个断点处的程序,而不知道怎么运行下一个断点处的程序,导致出不来结果(2)做思考题时,运行所写程序时发现内存空间中上一个题目的运行结果还在里面解决方法:(1)针对问题(1),当执行完第一个断点执行完毕应该取消该断点,这样在全速运行时可以运行到下一个断点,就可以观察到程序运行结果了。
3、(2)针对问题(2),发现在初始化程序时,自己把所有的循环初值都设成了0010H(16),导致只有前16个内存单元清零,而后面的内存单元没有初始化,保留了上次运行的程序运行结果。所以将初始化(清零)的循环初值设成0100H,这样就可以初始化256个内存单元了,把上次的结果初始化为0。而后一个赋值循环的循环次数仍然为0010十、体会这个题目比较简单,程序很简单,主要是把循环值设置对。但是由于对软件使用的不熟悉,因此导致了一些问题。在调试运行上还是花了一些时间。通过发现问题,解决问题的过程,使我对这个软件的使用更加熟练,为后面的程序设计中打下良好的基础。实验2 简单I/O口扩展实验 1、 熟悉74
4、LS273,74LS244的应用接口方法。 2、掌握用锁存器、三态门扩展简单并行输入、输出口的方法。 逻辑电平开关的状态输入74LS244,然后通过74LS273锁存输出,利用LED显示电路作为输出的状态显示。本实验用到两部分电路:开关量输入输出电路,简单I/O口扩展电路。五、实验步骤1、实验接线:(表示相互连接)CS0 CS244; CS1CS273; 平推开关的输出K1K8 IN0IN7(对应连接); O0O7LED1LED8。2、编辑程序,单步运行,调试程序3、调试通过后,全速运行程序,观看实验结果。4、编写实验报告。74LS244或74LS273的片选信号可以改变,例如连接CS2,此时
5、应同时修改程序中相应的地址。七、实验结果程序全速运行后,逻辑电平开关的状态改变应能在LED上显示出来。例如:K2置于L位置,则对应的LED2应该点亮。八、实验范例程序框图(实验程序名: T244273.ASM)九、程序源代码清单十、思考题:将74LS244的片选信号CS244改接CS2,将74LS273的片选信号CS273改接CS3,修改程序实现与范例程序相同的功能。assume cs: code segment public org 100h mov dx,04c0h ;74LS244地址 in al,dx ;读输入开关量 mov dx,04d0h ;74LS273地址 out dx,al
6、;输出至LED jmp start code ends end start分析:原CS244接CS0,CS0端口地址04a0h,CS273接CS1,CS1端口地址为04b0h。只需把接线换掉后,把对应的端口地址改正即可.即CS2的地址为04c0h,CS3的地址为04d0h十一、遇到的问题该实验在调试的过程中,没有遇到问题,只是第一次的那台仪器坏了,发现灯都不亮,之后换了一台仪器,连线,编译,运行,就得到正确结果了。实验3 8255并行口实验掌握8255A的编程原理。 8255A的A口作为输入口,与逻辑电平开关相连。8255A的B口作为输出口,与发光二极管相连。编写程序,使得逻辑电平开关的变化在
7、发光二极管上显示出来。开关量输入输出电路和8255可编程并口电路。1、实验接线CS0CS8255; PA0PA7 平推开关的输出K1K8; PB0PB7发光二极管的输入LED1LED8。2、编程并全速或单步运行。3、全速运行时拨动开关,观察发光二极管的变化。当开关某位置于L时,对应的发光二极管点亮,置于H时熄灭。8255A是比较常用的一种并行接口芯片,其特点在许多教科书中均有介绍。8255A有三个8位的输入输出端口,通常将A端口作为输入用,B端口作为输出用,C端口作为辅助控制用,本实验也是如此。实验中,8255A工作于基本输入输出方式(方式0)。八、实验范例程序框图及源代码(实验程序名:t82
8、55.asm)九、思考题:1、修改接线CS2CS8255,并要求开关置“H”(下)位置时对应LED亮,修改程序实现相应功能。 code segment public org 100h mov dx,04c6h ;控制寄存器地址(改为04c6h) mov ax,90h ;设置为A口输入,B口输出 out dx,ax start1: mov dx,04c0h ;A口地址(改为04c0h) in ax,dx xor ax,0ffffh; 取反输入 mov dx,04c2h ;B口地址(改为04c2h) out dx,ax ;输出 jmp start1code endsend start说明:由于换成
9、CS2和CS8255相连,因此三个地址应分别修改为:04c6h,04c0h,04c2h由于要求开关置下时灯亮,因此需要从A口读取开关状态到AX后,对AX中的内容取反,即可实现要求。取反的方法可以用not ax语句,也可以用异或xor的取反,要取反的位与1异或我这里采用异或。实验4 8253定时器/计数器接口实验掌握8253定时器的编程原理,用示波器观察不同模式下的输出波形。 微机实验箱、8086CPU模块、示波器。 了解8253计数器的不同工作方式,掌握其初始化控制字对定时/记数效果的影响。脉冲产生电路、8253定时器/计数器电路1、实验连线:CS0CS8253 OUT08253CLK2 OU
10、T2LED1 OUT1LED2CLK38253CLK0,CLK38253CLK12、编程调试程序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中设置初值为
11、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提供
12、,其频率为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
13、、修改片选信号接线使CS1和CS8253连接,并要求LED1的闪烁周期变为4秒(亮2秒,灭2秒),修改程序实现功能。求设置的计数初值:4/0.05=80=50h代码及注释:code segment publicorg 100h ; mov dx,04b6h ;控制寄存器 mov ax,36h ;计数器0,方式3 out dx,ax mov dx,04b0h ;计数器0的地址 mov ax,7Ch ;计数初值的低位为7Ch mov ax,92h ;计数初值的高位为92h out dx,ax ;计数值927Ch mov dx,04b6h ;控制寄存器地址 mov ax,76h ;计数器1,方式3
14、mov dx,04b2h ;计数器1的地址 mov ax,32h ;计数初值的低位为32h mov ax,0 ;计数初值的高位为00h out dx,ax ;计数值32h mov dx,04b6h mov ax,0b6h ;计数器2,方式3 mov dx,04b4h ;计数器2的地址 mov ax,50h ; 计数值低位为50h计数值高位为0计数值50hnext: nop jmp next ;让程序一直循环执行将所有CS0的端口地址(04a_)都改为CS1的端口地址(04b_)。再将计数器2的计数初值改为50H(4/0.05=80=50H)遇到的问题:第一次连线调试的时候,发现灯闪烁得频率很快
15、,仔细检查程序,发现初始计数值设计小了,通过公式计算,得到计数值需要设置为50H,才使得周期为4s。重新调试,得到了正确结果实验58259中断控制器实验1、掌握8259A的工作原理。2、掌握编写中断服务程序方法。3、掌握初始化中断向量的方法。了解中断处理的原理,掌握利用中断控制器进行中断申请和中断操作的方法。本实验用到三部分电路:电平开关电路、简单I/O口扩展电路和8259中断控制器电路。CS0 CS8259 CS3 CS273 O0O3LED1LED4 K1K4IR0IR3 INTINT( 8086CPU板) INTAINTA(8086CPU板)2、编译调试程序3、全速运行程序,拨动某一电平
16、开关,观察LED的亮灭情况。1、 8259的使用说明请详细阅读教科书。2、8086的中断系统是向量中断方式。内存中特定位置有一中断向量表,表内存有不同中断类型的中断向量(中断入口地址)。不同中断类型的中断向量在表内有对应的偏移地址,其计算方法是:中断类型*4。3、中断类型由8259通过数据总线送给8086,8086内部电路会将该类型值自动乘4,而后赋给指令指针,从而转向中断向量表的相应单元取得中断入口地址,之后就进入中断服务程序。请仔细研读8259的工作时序。4、中断类型的高5位由8259寄存器ICW2决定,低3位由中断源IRx的编码自动填入。IR0IR7的编码分别为000,001,010,0
17、11,100,101,110,111。全速运行程序,由上往下拨动开关时,相应位置的LED点亮,其余LED全灭。t8259.asm) 1、 说明源代码8259初始化所设置的所有中断控制字的值和含义(按位说明)。 (1)movdx,04a0hmovax,13houtdx,axICW1(初始化字),写入的值为13h,化为二进制后:00010011。含义:边沿触发,地址间距为8,单片8259A,需要ICW4。 (2)movdx,04a2hax,80hICW2(中断类型码字),写入的值为80h,化为二进制后:10000000。说明对应于IR0IR7的中断类型码为80h87h。(3)movax,01hIC
18、W4(中断结束方式字),写入的值为01h,化为二进制后:00000001。普通全嵌套方式,非缓冲方式,正常EOI,8086/8088模式。 (4)movax,00hOCW1(屏蔽控制字),写入的值为00h,即00000000b。全部为复位屏蔽,开放所有中断。2、 修改接线IR3P+(实验箱右下角),并修改源程序,使按实验箱右下角“Pules”键时LED1LED4全亮。 code segment public org 100h; mov cx,0 cli ;关中断,防止有些硬件中断对程序的干扰 mov dx,04a0h ; 写入ICW1的端口地址为04a0h mov ax,13h ; ICW1为
19、13H,化为二进制为00010011 out dx,ax ;ICW1, ICW4需要 mov dx,04a2h ;写入ICW2的端口地址为04a2h mov ax,80h ; ICW2为80H,化为二进制为10000000 out dx,ax ;ICW2中断类型80h,IR0IR7的中断类型码为80h87h mov ax,01h; ICW4为01H,化为二进制为00000001 out dx,ax;ICW4;普通全嵌套方式,非缓冲方式,正常EOI,8086/8088模式 mov ax,00hOCW1, 开放所有中断 nop ;以上为8259初始化 mov ax,0 mov ds,ax mov
20、di,200h ;初始化中断向量表 mov ax,offset int0 ;IR0的中断服务程序入口地址放入中断向量表中 mov ds:di,ax ;先放IP add di,2di,100h ;再放CS值 add di,2 mov ax,offset int1 ; IR1的中断服务程序入口地址放入中断向量表中di,axdi,100h mov ax,offset int2; IR2的中断服务程序入口地址放入中断向量表中 mov ax,offset int3 ; IR3的中断服务程序入口地址放入中断向量表中 add di,2 ;上述程序为芯片8259的初始化程序 di,100h ;建议不熟练者不要
21、修改。main: mov ax,0 sti ;开中断。waiting: cmp ax,0h je waiting ;没发生中断,则等待 nopmov dx,04d0h out dx,ax ;对应LED灯亮delay: loop delay ;数字滤波,按键去抖 jmp start1int0: cli ;关中断。以下类推。 nop ;此两行为IR0的中断服务程序 mov ax,0feh ;用户可修改。 iret ;中断返回,以下类推。int1: cli此两行为IR1的中断服务程序, mov ax,0fdh ; iretint2:此两行为IR2的中断服务程序, mov ax,0fbh ;int3:
22、此两行为IR3的中断服务程序, mov ax,0f0h ;code ends原AX的内容为0f7H,最低四位为7(0111),从左到右依次表示LED4,LED3,LED2,LED1,所以原代码IR3只接受LED4对应的开关K4产生的中断。将其改为0(0000)后,表示四盏灯同时产生中断,所以同时亮。一开始没有弄清楚中断服务程序的工作原理,导致不知从何下手去修改程序,通过查阅微机课本有关中断的内容,再对比程序,发现,只需要改变IR3中断服务程序,把IR3全部置0,就代表四盏灯同时中断,即同时亮实验总结经过三周的微机硬件实验,我学到了很多东西,对于书本上的知识也有了更深层次的认识,通过第一个给存储
23、单元赋值的操作,我明白了程序是如何运行的,以及各个寄存器及存储器内容是如何变化的。这使得我用汇编语言编程的能力得到提升,同时也明白了汇编语言虽然是低级语言,但却是最接近计算机核心结构的,因此汇编语言更易被计算机识别。后面几个硬件实验,不仅锻炼了我的动手操作能力以及程序调试能力,更关键的是明白了几个芯片8255以及计数器8253的工作原理,对中断有了更深的理解,比如中断控制字是如何设定的等等。总之这次硬件实验需要理论与实践的结合,在知识点理解的基础上,通过实验来加深理解,这样使得知识更加形象生动。当然还要感谢老师和同学们在我遇到困难时所给予的帮助,让我顺利的完成这次硬件实验。二、综合设计实验部分一、实验设备微机实验箱、8086CPU模块。二、实验要求红绿灯的定时切换(每10秒切换一次)设置灯光测试开关K1,当K1打开(高电平)时,LED1LED4全亮,关闭时恢复正常切换。三、实验步骤CS08255CS;CS1CS8253;CLK38253CLK0;OUT08253CLK2OUT2PA0,PA1,PA2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1