资源描述
实验报告一:I/0地址译码和简单并行接口 实验一&实验二一、 实验目的掌握I/O地址译码电路的工作原理;掌握简单并行接口的工作原理及使用方法。二、 实验原理及内容 a) I/0地址译码 1、实验电路如图1-1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。译码输出端Y0Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:280H287H,Y1:288H28FH, 当CPU执行I/O指令且地址在280H2BFH范围内,译码器选中,必有一根译码线输出负脉冲。 例如:执行下面两条指令 MOV DX,2A0H OUT DX,AL(或IN AL,DX) Y4输出一个负脉冲,执行下面两条指令 MOV DX,2A8H OUT DX,AL(或IN AL,DX) Y5输出一个负脉冲。 利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、),时间间隔通过软件延时实现。 2、接线: Y4/IO地址 接 CLK/D触发器 Y5/IO地址 接 CD/D触发器 D/D触发器 接 SD/D触发器 接 +5V Q/D触发器 接 L7(LED灯)或逻辑笔b) 简单并行接口 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个数据输出端分别接数据总线D0D7。4、用逻辑电平开关预置某个字母的ASC码,编程输入这个ASC码,并将其对应字母在屏幕上显示出来。5、接线:1)输出 按图4-2-1接线(图中虚线为实验所需接线,74LS32为实验台逻辑或门) 2)输入 按图4-2-2接线(图中虚线为实验所需接线,74LS32为实验台逻辑或门)三、 硬件连线图1、 I/O地址译码2.简单并行接口四、 软件程序流程图1、 IO地址译码2、 简单并行接口五、 源程序1、 IO地址译码STACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSDATA SEGMENTDATA ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA MOV DS,AX LOP: MOV DX,2A0H OUT DX,AL ;点亮灯 CALL DELAY ;延时 MOV DX,2A8H OUT DX,AL ;熄灭灯 CALL DELAY JMP LOPCODE ENDS END STARTDELAY PROC NEAR ;延时子程序 PUSH CX PUSH BX MOV BX,250 ;25065535LP2: MOV CX,0FFFFHLP1: LOOP LP1 DEC BX JNZ LP2 POP BX POP CX RETDELAY ENDP2、简单并行接口电路STACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSDATA SEGMENTDATA ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA MOV DS,AX LOP: MOV AH,01H INT 21H CMP AL,1BH ;检查是否按下退出esc键 JZ ENDING MOV DX,2A8H ;将ascii码输出 OUT DX,AL JMP LOPENDING:MOV AL,0 OUT DX,AL MOV AX,4C00H INT 21H CODE ENDS END START六、 实验总结 在这三次实验中出现的问题以及相应的解决方法如下: 实验一:因为对D触发器的特性有些遗忘,在编写程序时犯了不少错误,最终通过请教助教解决了一些疑问,从而顺利写出了代码。 实验二:实验二的程序逻辑比较简单,但连线比较多,在实验过程中,也多次连错了线,通过检查纠正了连线错误,也很快完成了实验。 七、 实验收获与心得体会 这次实验是第一次用汇编语言控制接口,因为理论课尚未讲到相关内容,做实验时,上手地比较慢。通过实验一实验二,熟练了对IN、OUT指令的使用,对接口有了初步认识。同时通过研究译码电路,对“地址”也有了进一步的认识。实验报告二:可编程并行接口8255的应用 实验三&实验四&实验五一、 实验目的1、 通过实验,掌握8255工作于方式0以及设置A口为输出口,C口为输入口的方法。、2、 掌握数码管显示数字的原理。3、 掌握8255控制键盘及显示电路的基本功能及编程方法;掌握一般键盘和显示电路的工作原理。二、 实验原理及内容a)实验三、实验电路如图4-3-1,8255C口接逻辑电平开关K0K7,A口接LED显示电路L0L7。 、编程从8255C口输入数据,再从A口输出。 3、接线:PC7PC0/8255 接 K7K0/逻辑电平开关 PA7PA0/8255 接 L7L0/LED显示 CS/8255 接 Y1/IO地址b)实验四、静态显示:按4-4-1连接好电路,将8255的A口PA0PA7分别与七段数码管的段码驱动输入端adp相连,位码驱动输入端S0、S1 、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地址 C)实验五 1、编程:使得在小键盘上每按一个健,4位数码管上显示出相应字符,它们的对应关系如下:2、接线: PC7PC0 /8255 接 行3列0 /4X4键盘 PA7PA0 /8255 接 dpa /LED数码管 CS/8255 接 Y1 /IO地址 PB3PCB/8255 接 S3S0/LED数码管 (或哪位数码管要显示则位选 S 接 +5V 即高电平,不想显示的数码管 S接 GND 即低电平)三、 硬件连线图a) 实验三b) 实验四c) 实验五四、 软件流程图a) 实验三b) 实验四c) 实验五五、 源程序a) 实验三STACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSDATA SEGMENTDATA ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,10001001B ;A口输出C口输入,工作方式为00 MOV DX,28BH ;控制端口地址 OUT DX,AL ;8255初始化,写入工作方式控制字 LOP: MOV DX,28AH ;将开关状态读入 IN AL,DX MOV DX,288H ;讲状态输出到A口 OUT DX,AL MOV AH,0BH ;检测键盘状态 INT 21H CMP AL,0FFH ;如果键盘上有输入则停止程序JZ ENDINGJMP LOPENDING:MOV AL,0 MOV DX,288H OUT DX,AL MOV AX,4C00H INT 21HCODE ENDS END STARTb) 实验四STACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSDATA SEGMENTDATA ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,10000000B MOV DX,28BH OUT DX,AL;8255初始化 LOP: MOV AL,3FH; 将0的段码输出给A口 MOV DX,288H OUT DX,AL MOV AL,08H;输出位码给C口 MOV DX,28AH OUT DX,AL CALL DELAY;延时程序 MOV AL,06H ;将1的段码输出的A口 MOV DX,288H OUT DX,AL MOV AL,04H ;输出选通位码 MOV DX,28AH OUT DX,AL CALL DELAY MOV AL,7FH ;将8的段码输出的A口 MOV DX,288H OUT DX,AL MOV AL,02H;输出选通位码 MOV DX,28AH OUT DX,AL CALL DELAY MOV AL,06H;将8的段码输出的A口 MOV DX,288H OUT DX,AL MOV AL,01H ;输出选通位码 MOV DX,28AH OUT DX,AL call DELAY MOV AH,0BH ;检查键盘是否有输入 INT 21H CMP AL,0ffh JZ ENDING ;有则退出 JMP LOPENDING: MOV AL,00H MOV DX,28AH OUT DX,AL MOV AX,4C00H INT 21HDELAY PROC NEAR PUSH CX PUSH BX MOV BX,005H ;25065535LP2: MOV CX,0fFFFHLP1: LOOP LP1 DEC BX JNZ LP2 POP BX POP CX RETDELAY ENDPCODE ENDS END START c) 实验五STACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSDATA SEGMENTKEYVALUE DB 71H,7CH,07H,4FH ;键盘值对应的段码表,LINE0 DB 79H,77H,7DH,5BH ;LINE1 DB 5EH,6FH,6DH,06H ;LINE2 DB 39H,7FH,66H,3FH ;LINE3ROW DB 0EFH,0DFH,0BFH,7FH DATA ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,10000001B;C口高4位接键盘行输出,低4位列输入,A口输出 MOV DX,28BH OUT DX,AL LEA BX,KEYVALUE MOV SI,0 SCANROW:MOV AL,ROWSI ;扫描行 MOV DX,28AH OUT DX,AL ;输出行 CALL DELAY ;延迟消抖 IN AL,DX ;读取列 AND AL,0FH CMP AL,0FH JZ NEXT ;此行无键按下 CMP AL,0EH JZ LINE0 ;按下第0列的键 CMP AL,0DH JZ LINE1;按下第1列的键 CMP AL,0BH JZ LINE2;按下第2列的键 JMP LINE3NEXT: INC SI CMP SI,4 JB NEXT1 MOV SI,0NEXT1:JMP SCANROW LINE0:MOV CL,BX+SI+0;查表或许按下的键相应的输出段码 JMP OUTPUTLINE1:MOV CL,BX+SI+4 JMP OUTPUTLINE2:MOV CL,BX+SI+8 JMP OUTPUTLINE3:MOV CL,BX+SI+12OUTPUT:CMP CL,3FH ;检查是否是0,是0就退出 JZ ENDING MOV AL,CL MOV DX,288H ;传送段码给A口 OUT DX,AL MOV AL,01H ;传送位码给B口 MOV DX,289H OUT DX,AL MOV SI,0 JMP SCANROW ;继续扫描 ENDING:MOV AL,00 MOV DX,289H OUT DX,AL MOV AX,4C00H INT 21H DELAY PROC NEAR PUSH CX PUSH BX MOV BX,1 ;25065535LP2: MOV CX,0FFFHLP1: LOOP LP1 DEC BX JNZ LP2 POP BX POP CX RETDELAY ENDP CODE ENDS END START 六、 实验总结在这三次实验中出现的问题以及相应的解决方法如下:实验三:一开始没法用开关控制LED的亮灭,程序一运行就直接退出了,检查代码发现自己的退出条件写错了,修改后就能正常工作了。实验四:四个数码管显示不正常,四个数字都没法稳定的显示,经过调整延时的大小,能够使后两个数码管正常显示,但前两个数码管不受控制,最后发现是前两个数码管坏了。 实验五:按下的键与数码管中显示的图形不一样,经过检查代码和实验箱,发现代码中按键对应的段码表行列顺序与实验箱不一致,经过调整,解决了不一致的问题。七、 实验收获与心得体会这三次实验都是围绕着8255并行接口做一些小的应用,其中实验三与实验四逻辑比较简单,实验五稍微难一点,因为理论课还未讲到接口部分,硬件实验需要自己自学接口电路,但从中收获了不少知识,大致明白了如何使用一个接口芯片,学会了自己看手册,根据说明来编程使用接口电路,对地址有了更深刻的理解。代码都是实验前自己课下独立编写的,因此上实验室操作时比较顺利,但也遇到了一些小错误,但也都独立解决了,在这样的一个过程中,增强了自己的学习能力和独立解决问题的能力。实验报告三:可编程定时器/计数器(8253/8254)一、实验目的学习掌握8253用作定时器的编程原理;二、实验原理及内容(1)8253应用小结 8253和8254都是可编程计数器,它们的引脚兼容,功能与使用方法相同。8254是8253的改进型。 18253初始化 使用8253前,要进行初始化编程。初始化编程的步骤是: 向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。 向使用的计数器端口写入计数初值。 28253控制字D7D600:使用0号计数器,D7D601:使用1号计数器 D7D610:使用2号计数器,D7D611:无效 D5D400:锁存当前计数值 D5D401:只写低8位(高8位为0),读出时只读低8位 D5D410:只写高8位(低8位为0),读出时只读高8位 D5D411:先读/写低8位,后读/写高8位计数值 D3D2D1000:选择方式0,D3D2D1001:选择方式1 D3D2D1X10:选择方式2,D3D2D1X11:选择方式3 D3D2D1100:选择方式4,D3D2D1101:选择方式5 D00:计数初值为二进制,D01:计数初值为BCD码数(2)实验电路1、按图4-8-1虚线连接电路2、接线: CS /8253 接 Y0 /IO 地址 GATE0 /8253 接 +5V CLK0 /8253 接 1M时钟 OUT0 /8253 接 喇叭或蜂鸣器(3)实验内容1完成一个音乐发生器,通过喇叭或蜂鸣器放出音乐,并在数码管上显示乐谱。2扩展部分:利用小键盘实现弹琴功能,并显示弹奏的乐谱。 注意:8253输入频率应小于2MHz。三、硬件连线图四、软件流程图 1、主程序流程2、 放音子程序流程3、 弹琴子程序流程4、五、源程序STACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSDATA SEGMENTINPUTINFO DB 0AH,0DH,Please choose mode:1 is playing music;2 is spieling,0AH,0DH DB $ERROR_INFO DB 0AH,0DH,illegal input,please input again!,0AH,0DH,$TONE DW 3906,3472,3125,2932,2604,2347,2083 ;音调1-7 计数初始值TIME DW 1000H,1000H,1000H,2000H,2000H,4000H,4000H ;持续时间DUANMA DB 06H,5BH,4FH,66H,6DH,7DH,07H ;与乐谱所对应的数码管段码 KEYVALUE DB 71H,7CH,07H,4FH ;键盘值对应的段码表,LINE0 DB 79H,77H,7DH,5BH ;LINE1 DB 5EH,6FH,6DH,06H ;LINE2 DB 39H,7FH,66H,3FH ;LINE3TUNEK DW 0,0,2083,3125 DW 0,0,2347,3472 DW 0,0,2604,3906 DW 0,0,2932,0ROW DB 0EFH,0DFH,0BFH,7FH DATA ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,10000001B;8255初始化;C口高4位接键盘行输出,低4位列输入,A口输出 MOV DX,28BH OUT DX,AL MOV AL,00110110B ;8253初始化,工作方式3,使用计时器0 MOV DX,283H OUT DX,AL BEGIN:MOV AH,09H ;输入提醒,选择放音或弹琴模式或者退出程序 LEA DX,INPUTINFO INT 21H MOV AH,01H INT 21H CMP AL,1 JZ PLAY_MUSIC CMP AL,2 JZ SPIELING CMP AL,1BH JZ ENDING JMP INPUT_ERROR ;输入检错INPUT_ERROR:MOV AH,09H LEA DX,ERROR_INFO INT 21H JMP BEGINPLAY_MUSIC:CALL PLAYMUSIC JMP BEGINSPIELING:CALL SPIELINGP JMP BEGINENDING: MOV AX,4C00H INT 21HPLAYMUSIC PROC PUSH SI ;保护现场数据 PUSH DI PUSH AX PUSH BX PUSH CX PUSH DX LEA SI,TONE ;音调表 LEA DI,TIME ;每一个音调持续时间表 LEA BX,DUANMA;段码表 MOV CX,7 ;循环控制变量赋值LOP1: MOV AX,SI ;计数器赋值 MOV DX,280H; 计时器0的地址 OUT DX,AL ;先写入低八位,再写入高八位 MOV AL,AH OUT DX,AL INC SI INC SI MOV AL,BX ;在数码管上显示乐谱 MOV DX,288H ;8255A口地址 OUT DX,AL INC BX MOV AL,01H ;传送位码给B口 MOV DX,289H OUT DX,AL MOV AX,DI;延迟,AX为入口参数 CALL DELAY INC DI INC DI MOV AH,0BH ;检测键盘是否有输入,有则跳出 INT 21H CMP AL,0FFH JZ POUT LOOP LOP1 LEA SI,TONE LEA DI,TIME LEA BX,DUANMA MOV CX,7 ;重新循环 JMP LOP1 POUT: POP DX POP CX POP BX POP AX POP DI POP SI RET PLAYMUSIC ENDPSPIELINGP PROC PUSH AXPUSH BXPUSH CXPUSH DXPUSH BPPUSH SIPUSH DI LEA BX,KEYVALUE LEA BP,TUNEK MOV SI,2;只扫描2,3行(0123 4567)SCANROW:MOV AL,ROWSI ;扫描行 MOV DX,28AH OUT DX,AL ;输出行 PUSH AX MOV AX,1 CALL DELAY ;延迟消抖 POP AX IN AL,DX ;读取列 AND AL,0FH CMP AL,0FH JZ NEXT ;此行无键按下 CMP AL,0EH JZ LINE0 CMP AL,0DH JZ LINE1 CMP AL,0BH JZ LINE2 JMP LINE3NEXT: MOV AL,36H ;键盘弹起,对8253重新初始化,是蜂鸣器停止发音 MOV DX,283H OUT DX,AL INC SI CMP SI,4 JB NEXT1 MOV SI,2NEXT1:JMP SCANROW LINE0:MOV CL,BX+SI+0 ;查表 MOV DI,SI SHL DI,1 MOV AX,DS:BP+DI+0 JMP OUTPUTLINE1:MOV CL,BX+SI+4 MOV DI,SI SHL DI,1 MOV AX,DS:BP+DI+8 JMP OUTPUTLINE2:MOV CL,BX+SI+8 MOV DI,SI SHL DI,1 MOV AX,DS:BP+DI+16 JMP OUTPUTLINE3:MOV CL,BX+SI+12 MOV DI,SI SHL DI,1 MOV AX,DS:BP+DI+24OUTPUT:CMP CL,3FH ;检查是否是0,是0就退出 JZ ENDSP MOV DX,280H ; 输出数据给计数器 OUT DX,AL MOV AL,AH OUT DX,AL MOV AL,CL ;数码管显示乐谱 MOV DX,288H ;传送段码给A口 OUT DX,AL MOV AL,01H ;传送位码给B口 MOV DX,289H OUT DX,AL JMP SCANROW ;继续扫描ENDSP:POP DI POP SI POP BP POP DX POP CX POP BX POP AX RETSPIELINGP ENDP DELAY PROC NEAR PUSH CX PUSH AX ; MOV AX,1 ;25065535LP2: MOV CX,08FFHLP1: LOOP LP1 DEC AX JNZ LP2 POP AX POP CX RETDELAY ENDP CODE ENDS END START六、实验总结 在本次实验中主要出现了如下问题:延迟函数没处理好,在本次实验中,我将弹琴功能和放音功能写在同一个程序中,两个部分都需要使用到延迟函数,在放音子程序中,延迟函数起到控制音调持续时间长短的作用,在弹琴功能中,延迟函数主要起键盘消抖的作用。不同的作用所要求的延迟时间长短不一样,一开始没注意到这个问题,导致放出来的音乐很刺耳。七、实验收获与心得体会本次实验主要内容是使用8254定时器来播放音乐,经过前几次实验,自己对接口电路的使用越来越熟练,按照手册对接口电路进行初始化和读写即可。实验过程也并不是一帆风顺,出现了一些错误,通过解决代码中的错误,我的调试能力得到了很大的锻炼,也变得更加有耐心去解决一些问题。实验报告四:串行通讯8251一、 实验目的1、了解串行通讯的基本原理。 2、掌握串行接口芯片8251的工作原理和编程方法。二、 实验原理及内容1、按图4-16-1连接好电路,(8251插通用插座)其中8254计数器用于产生8251的发送和接收时钟,TXD和RXD连在一起。 2、编程: 从键盘输入一个字符,将其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 /8251三、 硬件连线图四、 软件流程图五、 源程序 STACK SEGMENT STACK STACK DB 100 DUP(0)STACK ENDSDATA SEGMENT REMIND_MSG DB 0AH,0DH,please input character:,0AH,0DH,$NEXTROW DB 0AH,0DH,$DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AL,52 ;设置8253计数器初值为52 MOV DX,280H OUT DX,AL MOV DX,2B9H MOV AL,40H;先内部复位 OUT DX,AL NOP MOV AL,01111110B ;方式控制字 OUT DX,AL NOP MOV AL,37H;命令控制字 OUT DX,AL NOP MOV AH,09H;输出提示语 LEA DX,REMIND_MSG INT 21H LOP: MOV DX,2B9H ;读状态字,检查发送器是否准备好WAITT1:IN AL,DX TEST AL,01H JZ WAITT1 ;没准备好,继续查询 MOV AH,01H ;输入字符 INT 21H CMP AL,1BH ;检查是否是结束字符 JZ ENDING INC AL MOV DX,2B8H OUT DX,AL ;将数据传出 MOV DX,2B9HWAITTT2:IN AL,DX ;读状态字,检查接收器是否准备好 TEST AL,02H; JZ WAITTT2 MOV DX,2B8H IN AL,DX MOV AH,02H ;输出字符 MOV DL,AL INT 21H MOV AH,09H;换行 LEA DX,NEXTROW INT 21H JMP LOP ;准备下一次输入ENDING:MOV AX,4C00H INT 21H CODE ENDS END START六、 实验总结 本次实验的内容是利用8251芯片实现简单的串行通信,CPU通过查询方式与8251进行联络,实验中并没有出现明显问题。代码的缺陷是没有对接收到的数据进行检错就直接拿来使用。七、 实验收获及心得体会 本次实验是本学期的最后一次实验,通过前三次实验的训练,本次实验的代码写地比较顺利, 通过四次微机硬件实验,对接口电路有了更深刻的认识,实践了理论课上的知识,对地址有了更准确的理解。掌握了认识、使用一个接口芯片的方法,同时还锻炼了自己编写汇编程序的能力。
展开阅读全文