1、北京邮电大学微机原理与接口技术硬件实验报告 学院:信息与通信工程学院班级:学号:班内序号:姓名:实验一 I/O地址译码 一、实验目的 掌握I/O地址译码电路的工作原理。 二、实验原理和内容 1、实验电路如图1-1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。 译码输出端Y0Y7在实验台上 “I/O地址 “输出端引出,每个输出端包含8个地址,Y0:280H287H,Y1:288H28FH, 当CPU执行I/O指令且地址在280H2BFH范围内,译码器选中,必有一根译码线输出负脉冲。 例如:执行下面两条指令 MOV DX,2A0H OUT
2、 DX,AL(或IN AL,DX) Y4输出一个负脉冲,执行下面两条指令 MOV DX,2A8H OUT DX,AL(或IN AL,DX) Y5输出一个负脉冲。图1-1利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、),时间间隔通过软件延时实现。 2、接线: Y4/IO地址 接 CLK/D触发器 Y5/IO地址 接 CD/D触发器 D/D触发器 接 SD/D角发器 接 +5V Q/D触发器 接 L7(LED灯)或 逻辑笔三、硬件接线图和软件程序流程图1、硬件连线图如图1-1;2、软件程序流程图开始自端口2A0H输出自端口2A8H输出延时有输入吗结束NY图1-2四、源程序DATA1 EQU 2A
3、0H;定义数据变量代表地址2A0HDATA2 EQU 2A8H;定义数据变量代表地址2A8HCODE SEGMENT ASSUME CS:CODEBEGIN: MOV DX,DATA1 OUT DX,AL;向地址DATA1输出信号 CALL DELAY;调用延时子程序 MOV DX,DATA2 OUT DX,AL CALL DELAY MOV AH,1;检测是否有键盘输入 INT 16H JE BEGIN;如果没有输入,则循环 MOV AX,4C00H;返回DOS INT 21HDELAY PROC NEAR;延时子程序MOV CX,0FFFFHLP1: MOV BX,200LP2:DEC B
4、XJNZ LP2LOOP LP1RETDELAY ENDPCODE ENDS END BEGIN 五、实验结果运行程序后可以看到LED灯亮灭交替,改变延时时间,灭的持续时间增加。六、实验总结由于这个实验是第一次接触,虽然比较简单,但是还是出现了很多的问题。刚开始忘记写延时子程序,后来发现后加上,发现LED灯还是一直亮,到最后才发现原来是延时的时间太短,所以延时采用了两层循环以增加延时长度。七、实验收获与心得体会通过这个实验,首先让我对汇编程序的要素有了更加清晰的认识,就是汇编程序便需要有代码段;其次,当汇编程序出现问题时,掌握了一定的解决方法。实验二 简单并行接口 一、实验目的 掌握简单并行接
5、口的工作原理及使用方法。 二、实验原理和内容 1、 按下面图4-2-1简单并行输出接口电路图连接线路(74LS273插通用插座, 74LS32用实验台上的“或门”)。74LS273为八D触发器,8个D输入端分别接数据总线D0D7,8个Q输出端接LED显示电路L0L7。 2、编程从键盘输入一个字符或数字,将其ASC码通过这个输出接口输出,根据8个发光二极管发光情况验证正确性。 3、 按下面图4-2-2简单并行输入接口电路图连接电路(74LS244插通用插座, 74LS32用实验台上的“或门”)。74LS244为八缓冲器,8个数据输入端分别接逻辑电平开关输出K0K7,8个数据输出端分别接数据总线D
6、0D7。 4、用逻辑电平开关预置某个字母的ASC码,编程输入这个ASC码,并将其对应字母在屏幕上显示出来。5、接线:1)输出 按图4-2-1接线(图中虚线为实验所需接线,74LS32为实验台逻辑或门) 2)输入 按图4-2-2接线(图中虚线为实验所需接线,74LS32为实验台逻辑或门)三、硬件接线图和软件程序流程图1、硬件接线图图2-12、软件程序流程图图2-2四、源代码CODESEGMENTASSUME CS:CODEBEGIN:XOR AX,AXMOV AH,1INT 21HCMP AL,1BHJZ EDMOV DX,2A8HOUT DX,ALLOOP BEGINED:MOV AX,4C0
7、0HINT 21HCODEENDSEND BEGIN五、实验结果连接好电路后,运行程序,然后用键盘输入任意一个字母或者数字,然后发现LED灯的亮灭情况正好表示了所输入字符的ASC码。六、实验总结此次实验代码比较简单,看好输出端基本上就不会有什么大的代码问题,这个实验关键的一点我觉得是连接电路,由于实验所需电路要连接的线比较多,所以在连接线的时候一定要认真仔细,一旦连错很难检查出来,那样的话就只能重新连接了。七、实验收获与心得体会这个实验主演还是让我们进一步接触这种软硬结合的方式,以便不断地了解熟悉它,通过这次实验,除实验本身外,由于要检测键盘的输入,我还对理论课上讲的中断号01H有了更加深刻的
8、印象。实验三 可编程并行接口8255 一、实验目的 1、通过实验,掌握8255工作于方式0以及设置A口为输出口,C口为输入口的方法。 二、实验原理及内容 18255的工作方式 一片8255内部有3个端口,A口可以工作在方式0、方式1或方式2,B口可以工作在方式0、方式1,C口可以工作在方式0。 方式0是基本型输入/输出。这种方式和外设交换数据时,8255端口与外设之间不使用联络线。 方式1为选通型输入/输出。用这种方式和外界交换数据时,端口和外设之间要有联络信号。 方式2是双向数据传送,仅A口有这项功能。当A口工作在方式2时,B口仍可以工作在方式0或方式1,但此时B口方式1只能用查询方式与CP
9、U交换信息。 2. 工作方式选择字 8255工作方式选择字共8位(如图) ,存放在8255控制寄存器中。最高位D7为标志位,D7=1表示控制寄存器中存放的是工作方式选择字,D7=0表示控制寄存器中存放的是C口置位/复位控制字。3C口置/复位控制字 8255的C口可进行位操作,即:可对8255C口的每一位进行置位或清零操作,该操作是通过设置C口置/复位字实现的(图8-10)。C口置/复位字共8位,各位含义如下:48255A的控制信号与传输动作的对应关系5命令字与初始化编程 8255有两个命令字,即方式选择控制字和C口置0/置1控制字,初始化编程的步骤是: 向8255控制寄存器写入“方式选择控制字
10、”,从而预置端口的工作方式。 当端口预置为方式1或方式2时,再向控制寄存器写入“C口置0/置1控制字”。这一操作的主要目的是使相应端口的中断允许触发器置0,从而禁止中断,或者使相应端口的中断允许触发器置1,从而允许端口提出中断请求。 注意:“C口置0/置1控制字”虽然是对C口进行操作,但是该控制字是命令字,所以要写入控制寄存器,而不是写入C口控制寄存器。 向8255数据寄存器写入“数据”或从8255数据寄存器读出“数据”实验内容:1)、实验电路如图4-3-1,8255C口接逻辑电平开关K0K7,A口接LED显示电路L0L7。 2)、编程从8255C口输入数据,再从A口输出。3)、接线:PC7P
11、C0/8255 接 K7K0/逻辑电平开关 PA7PA0/8255 接 L7L0/LED显示 CS/8255 接 Y1/IO地址三、硬件连线图和软件程序流程图1、硬件连线图图3-12、软件程序流程图 四、源程序CODESEGMENTASSUME CS:CODEBEGIN:MOV DX,28BHMOV AL,10001001BOUT DX,ALMOV DX,28AHIN AL,DXMOV DX,288HOUT DX,ALINT 21HMOV AX,4C00HCODE ENDSEND BEGIN五、实验结果连接好电路,运行程序后,可以发现根据开关闭合的不同,LED灯亮灭的情况也随之而改变,实现了实
12、验中的要求。六、实验总结由于此实验比较简单,实验过程中没有出现什么大的问题。只是一开始的时候发现在我运行完后,发现改变开关的闭合情况,LED灯的亮灭情况不变,后来发现每次程序运行时只读取一次数据,而在程序运行的过程中并不读取数据,所以就出现了那样的情况。七、实验收获与心得体会通过这次试验,让我对8255这个元器件有了一定的认识,进一步熟悉了汇编语言编程,为将来更加困难的实验做了准备。实验四 七段数码管 一、实验目的 掌握数码管显示数字的原理 二、实验原理和内容 、静态显示:按4-4-1连接好电路,将8255的A口PA0PA7分别与七段数码管的段码驱动输入端adp相连,位码驱动输入端S0、S1
13、、S2、S3接PC0、PC1、PC2、PC3,编程在数码管显示自己的学号的后四位。 (或编程在数码管上循环显示 “00-99” , 位码驱动输入端S0、S1 接PC0、PC1;S2、S3接地。)2、接线: PA7PA0/8255 接 dpa/LED数码管 PC3PC0/8255 接 S3S0/LED数码管 CS/8255 接 Y1/IO地址三、硬件连接图和软件程序流程图1、硬件连接图图4-12、软件程序流程图图4-2 四、源代码DATA SEGMENTDATA0EQU 3FHDATA3EQU 4FHDATA4EQU 66HDATA6EQU 7DHDATA ENDSSTACK SEGMENT S
14、TACK STACKDB 100 dup(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FAR MOV AX, DATAMOV DS, AXMOV AL,80HMOV DX,28BHOUT DX,ALLOOP1:MOV DX,28AHMOV AL,08HOUT DX,ALMOV DX,288HMOV AL,DATA0OUT DX,ALCALL DELAYMOV DX,28AHMOV AL,04HOUT DX,ALMOV DX,288HMOV AL,DATA3OUT DX,ALCALL DELAYMOV DX,
15、28AHMOV AL,02HOUT DX,ALMOV DX,288HMOV AL,DATA4OUT DX,ALCALL DELAYMOV DX,28AHMOV AL,01HOUT DX,ALMOV DX,288HMOV AL,DATA6OUT DX,ALCALL DELAYMOV AH,1INT 16HJZ LOOP1RETSTART ENDPDELAY PROC NEARMOV CX,00FFHLP1: MOV BX,200LP2:DEC BXJNZ LP2LOOP LP1RETDELAY ENDPCODE ENDSEND START五、实验结果连接好电路图,然后运行程序,在数码管上显示我的
16、学号0346四个数字。六、实验总结最开始的时候实验确实出现了一些问题,跟我想的不一样。由于实验要求是在4个数码管上同时显示四个数字,所以刚开始我认为如果要延时程序,延时时间应该很短,因此我认为不用延时程序,而结果没有延时程序出不来结果,显示一群乱码。之后我加上延时程序后,数码管显示就变得正常了。这个程序的关键应该就是控制字的确定,然后数码管方面一定要有一组选通信号。七、实验收获与心得体会这个实验告诉我在做这类实验时千万不要想当然,一定要按照实际的要求一步一步来,不要想着“偷工减料”图省事,关键是要踏实。其次是通过这个实验让我对8255这个芯片有了更加深刻的认识,对于控制字的理解更加深刻。实验八
17、 可编程定时器计数器(8253/8254) 一、实验目的: 学习掌握8253用作定时器的编程原理; 二、实验原理和内容 8253和8254都是可编程计数器,它们的引脚兼容,功能与使用方法相同。8254是8253的改进型。 18253初始化 使用8253前,要进行初始化编程。初始化编程的步骤是: 向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。 向使用的计数器端口写入计数初值。 28253控制字 D7D600:使用0号计数器,D7D601:使用1号计数器 D7D610:使用2号计数器,D7D611:无效 D5D400:锁存当前计数值 D5D401:只写低8位(高8位为0),读出时只读低
18、8位 D5D410:只写高8位(低8位为0),读出时只读高8位 D5D411:先读/写低8位,后读/写高8位计数值 D3D2D1000:选择方式0,D3D2D1001:选择方式1 D3D2D1X10:选择方式2,D3D2D1X11:选择方式3 D3D2D1100:选择方式4,D3D2D1101:选择方式5 D00:计数初值为二进制,D01:计数初值为BCD码数3、接线: CS /8253 接 Y0 /IO 地址 GATE0 /8253 接 +5V CLK0 /8253 接 1M时钟 OUT0 /8253 接 喇叭或蜂鸣器4、完成一个音乐发生器,通过喇叭或蜂鸣器放出音乐,并在数码管上显示乐谱。
19、音符频率对照三、硬件接线图和软件程序连接图1、硬件接线图 2、软件程序连接图四、源程序DATASEGMENTBUF1DB 06H 5BH 4FH 66H 6DH 7DH 07H 7FHBUF2DW 3906,3472,3125,2933,2604,2344,2083,1953DATAENDSCODESEGMENTASSUME DS:DATA,CS:CODEBEGIN:MOV CX,08HLEA SI,BUF1MOV BX,OFFSET BUF2MOV DX,283HMOV AL,37HOUT DX,AL MOV DX,28BHMOV AL,80HOUT DX,ALL1:MOV DX,280HM
20、OV AX,BXOUT DX,ALMOV AL,AHOUT DX,ALMOV DX,28AHMOV AL,01HOUT DX,ALMOV DX,288HMOV AL,SIOUT DX,ALCALL DELAYINC SIINC BXINC BXLOOP L1MOV AH,1 INT 16H JE BEGIN MOV AX,4C00H INT 21HDELAY PROC NEARPUSH CXPUSH BXMOV CX,0FFFFHLP1: MOV BX,100LP2:DEC BXJNZ LP2LOOP LP1POP BXPOP CXRETDELAY ENDPCODEENDSEND BEGIN五
21、、实验结果连接好电路后,运行程序,然后会听见蜂鸣器按照do/re/mi/fa/so/la/si/do依次响,当有键盘输入时,声音中止。六、实验总结这个实验思路比较简单,所以在写好代码后就基本上没有什么问题,只是个人觉得我写的原来的代码有点冗杂(原来是每一个音符都单独写一段汇编程序),其实有很多都可以用一个循环实现的,并且后来我也做了很多的尝试,但是多次的尝试都失败了,失败基本上都是由于寄存器不够用了。后来突然想到了理论课上讲的推入堆栈保护,一下子恍然大悟,这就是现在代码的由来,个人觉得这个实验我还是下了一番苦心的。七、实验收获与心得体会这个实验毋庸置疑地让我学会了很多东西,更加熟悉了汇编程序,
22、之前老师上课讲的什么推入堆栈保护,当时根本不理解,不知道为什么要这样做,这次实验让我彻底明白了这样做的意义:就是有时候要多次用到一个寄存器时一定要先推入堆栈保护,这样的话就不会影响在别的地方用相同的寄存器了。此外,又学习了一种元器件,即8253计数器,对于微机的原理有了更加上课的理解。实验十六 串行通讯8251 一、实验目的 1、了解串行通讯的基本原理。 2、掌握串行接口芯片8251的工作原理和编程方法。 二、实验原理和内容 1、 按图4-16-1连接好电路,(8251插通用插座)其中8254计数器用于产生8251的发送和接收时钟,TXD和RXD连在一起。 2、编程: 从键盘输入一个字符,将其
23、ASCII码加 1 后发送出去,再接收回来在屏幕上显示,(或将内存制定区域内存放的一批数据通过8251A的TXD发送出去,然后从RXD接收回来,并在屏幕上或数码管上显示出来。)实现自发自收。3、接线: CLK0 /8254 接 1M时钟 GATE0 /8254 接 +5V 0UT0 /8254 接 TX/RXCLK /8251 CS /8254 接 Y0 /IO地址 CS /8251 接 Y7 /IO地址 RXD /8251 接 TXD /82514、图示电路8251的控制口地址为2B9H,数据口地址为2B8H。 5、8254计数器的计数初值=时钟频率/(波特率波特率因子),这里的时钟频率接
24、1MHz,波特率若选1200,波特率因子若选16,则计数器初值为52。 6、收发采用查询方式。三、硬件接线图与软件程序流程图1、硬件接线图图16-12、软件程序流程图四、源程序CODESEGMENTASSUME CS:CODEBEGIN:MOV DX,283HMOV AL,16HOUT DX,ALMOV DX,280HMOV AL,52OUT DX,ALMOV DX,2B9HMOV AL,40HOUT DX,ALNOPMOV AL,0EHOUT DX,ALMOV AL,37HOUT DX,ALGOON:MOV DX,2B9HIN AL,DXTEST AL,01HJZ GOONMOV AH,01
25、HINT 21HCMP AL,1BHJE EDADD AL,01HMOV DX,2B8HOUT DX,ALRECIEVE:MOV DX,2B9HIN AL,DXTEST AL,02HJZ RECIEVEMOV DX,2B8HIN AL,DXMOV AH,02HMOV DL,ALINT 21HJMP GOONED:MOV AX,4C00HINT 21HCODEENDSEND BEGIN五、实验结果连接好硬件电路后,运行程序,然后会提示用键盘输入一个字符,结果发现当输入一个字符后,在屏幕上紧接着会显示出来在ASC码表中排在该字符后的字符,比如输入1,紧接着在屏幕上会显示2.六、实验总结这次实验过程
26、中一度出现了“超出我能力范围“的问题,怎么做都解决不了,问了很多人,都没有办法,后来经过我反复的看书上讲的关于8251的那部分内容终于弄懂了。实验过程中出现的问题是,每次在我输入一个字符时,屏幕上显示的不是该字符后面的字符,而是上次输入字符后面的字符。经过我反复对书上的内容进行了研究后,发现当接收字符时,不能仅仅判断一次状态字,要一直判断状态字直到它有效,这样就可以解决上述问题了。七、实验收获与心得体会这次实验真正让我体会到了,当我们遇到问题时,不要“病急乱投医”,一定要静下心来自己找一下问题的所在,想不出来就回去重新研究一下元器件的工作原理,因为万变不离其宗,只要你对它的原理了解的一清二楚后,什么样的问题都可以解决了。然后就是深刻的明白了8251的工作原理,以及在对它写控制字时命令控制字和状态控制字的顺序。实验总结通过几次的微原硬件实验,虽然不能说对汇编语言编程完全掌握了,但是确实汇编能力增长了不少,不得不肯定微原实验的意义。此外对课上讲的一些元器件起到了巩固的作用,个人觉得微机原理硬件实验很有必要,理论实践相结合。最后感谢王老师在实验过程中对我的指导和帮助。 20 / 20