北京邮电大学微原硬件实验报告.docx
《北京邮电大学微原硬件实验报告.docx》由会员分享,可在线阅读,更多相关《北京邮电大学微原硬件实验报告.docx(38页珍藏版)》请在冰豆网上搜索。
![北京邮电大学微原硬件实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/29/a429e4b7-3520-4899-82ae-783170db4033/a429e4b7-3520-4899-82ae-783170db40331.gif)
北京邮电大学微原硬件实验报告
微原硬件实验报告
班级:
学号:
班内序号:
姓名:
实验一、二基本的I/O实验
一、实验目的
1、掌握I/O地址译码电路的工作原理。
2、掌握简单并行接口的工作原理及使用方法。
二、实验原理及内容
1、实验电路如图1-1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。
译码输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:
280H~287H,Y1:
288H~28FH,……当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。
例如:
执行下面两条指令
MOVDX,2A0H
OUTDX,AL(或INAL,DX)
Y4输出一个负脉冲,执行下面两条指令
MOVDX,2A8H
OUTDX,AL(或INAL,DX)
Y5输出一个负脉冲。
利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。
2、按下面图4-2-1简单并行输出接口电路图连接线路(74LS273插通用插座,74LS32用实验台上的“或门”)。
74LS273为八D触发器,8个D输入端分别接数据总线D0~D7,8个Q输出端接LED显示电路L0~L7。
3、编程从键盘输入一个字符或数字,将其ASCⅡ码通过这个输出接口输出,根据8个发光二极管发光情况验证正确性。
4、按下面图4-2-2简单并行输入接口电路图连接电路(74LS244插通用插座,74LS32用实验台上的“或门”)。
74LS244为八缓冲器,8个数据输入端分别接逻辑电平开关输出K0~K7,8个数据输出端分别接数据总线D0~D7。
5、用逻辑电平开关预置某个字母的ASCⅡ码,编程输入这个ASCⅡ码,并将其对应字母在屏幕上显示出来。
三、硬件接线图与软件程序流程图
图1:
实验一的硬件接线图
图2:
实验二的硬件接线图
图3:
实验二的程序流程图
四、源程序
1、实验一源程序
DATASEGMENT
DATAENDS
STACKSEGMENTSTACK'STACK'
DB100HDUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
;延时子程序
DELAYPROCNEAR
MOVBX,500
PUSHCX
LOOP2:
MOVCX,0FFFH
WAIT:
LOOPWAIT
DECBX
JNZLOOP2
POPCX
RET
DELAYENDP
START:
MOVCX,0FFFFH
;二极管闪烁部分
LOOP1:
MOVDX,2A0H;灯亮
MOVAL,0FFH
OUTDX,AL
CALLDELAY
MOVDX,2A8H;灯灭
MOVAL,0
OUTDX,AL
CALLDELAY
LOOPLOOP1
CODEENDS
ENDSTART
2、实验二的源程序
DATASEGMENT
DATAENDS
STACKSEGMENTSTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAH,1;键盘输入
INT21H
CMPAL,27;检测是否为ESC键
JZEXIT
MOVDX,2A8H;输出
OUTDX,AL
JMPSTART
;返回DOS
EXIT:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
五、实验结果
1、实验一:
二极管闪烁显示
2、实验二:
键盘输入,然后二极管显示键盘输入的ASCⅡ码
六、实验总结
本实验遇到的问题主要是:
1、二极管显示不正常,主要是延时的问题,调整一下就好了。
七、实验收获与心得体会
这次实验的要点是对I/O接口译码电路的理解以及使用。
我们测试了外设功能,这使我们了解了地址与端口的对应情况,从而明确了程序编写的流程和注意事项。
通过该译码电路实验,我掌握了地址译码电路的设计方法和实现原理,对硬件的I/O接口技术有了进一步的认识。
这次实验也为以后的实验打下了基础,特别是,应先理解了译码电路的工作原理,然后才能进行编程。
实验三、四、五可编程并行接口8255实验
一、实验目的
1、通过实验,掌握8255工作于方式0以及设置A口为输出口,C口为输入口的方法。
2、掌握数码管显示数字的原理。
3、掌握8255控制键盘及显示电路的基本功能及编程方法。
4、掌握一般键盘和显示电路的工作原理。
二、实验原理及内容
实验三:
1、实验电路如图4-3-1,8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。
2、编程从8255C口输入数据,再从A口输出。
实验四:
1、静态显示:
按4-4-1连接好电路,将8255的A口PA0~PA7分别与七段数码管的段码驱动输入端a~dp相连,位码驱动输入端S0、S1、S2、S3接PC0、PC1、PC2、PC3,编程在数码管显示自己的学号的后四位。
(或编程在数码管上循环显示“00-99”,位码驱动输入端S0、S1接PC0、PC1;S2、S3接地。
)
实验五:
1、编程:
使得在小键盘上每按一个健,4位数码管上显示出相应字符。
三、硬件接线图与软件程序流程图
图1:
实验三的硬件接线图
图2:
实验四的硬件接线图
图3:
实验三的程序流程图
图4:
实验四的程序流程图
四、源程序
1、实验三源程序
DATASEGMENT
DATAENDS
STACKSEGMENTSTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVDX,28BH;8255初始化
MOVAL,89H
OUTDX,AL
LOOP1:
MOVDX,28AH
INAL,DX
MOVDX,288H
OUTDX,AL
JMPLOOP1
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2、实验四源程序
(1)显示学号
DATASEGMENT
DATAENDS
STACKSEGMENTSTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVDX,28BH;8255初始化
MOVAL,80H
OUTDX,AL
MOVCX,30
VIEW:
MOVDX,28AH;第一个数码管显示
MOVAL,00H
OUTDX,AL
MOVDX,288H
MOVAL,6DH
OUTDX,AL
MOVDX,28AH
MOVAL,01H
OUTDX,AL
;第二个数码管显示
MOVDX,28AH
MOVAL,00H
OUTDX,AL
MOVDX,288H
MOVAL,6FH
OUTDX,AL
MOVDX,28AH
MOVAL,02H
OUTDX,AL
;第三个数码管显示
MOVDX,28AH
MOVAL,00H
OUTDX,AL
MOVAL,0
MOVDX,288H
MOVAL,07H
OUTDX,AL
MOVDX,28AH
MOVAL,04H
OUTDX,AL
;第四个数码管显示
MOVDX,28AH
MOVAL,00H
OUTDX,AL
MOVAL,0
MOVDX,288H
MOVAL,3FH
OUTDX,AL
MOVDX,28AH
MOVAL,08H
OUTDX,AL
循环显示
JZVIEW
;返回DOS
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
(2)循环显示数字0~99
DATASEGMENT
TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;数码管显示
DATAENDS
STACKSEGMENTSTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVDX,28BH;8255初始化
MOVAL,80H
OUTDX,AL
;循环显示
MOVBX,0H;控制重新从0开始计数的变量
LOOP1:
MOVCX,100;循环扫描数码管让两个数码管都显示
VIEW:
MOVDX,28AH
MOVAL,00H
OUTDX,AL
MOVDX,288H
;计算十位数,并显示
PUSHBX
MOVAX,BX
MOVBL,0AH
DIVBL
MOVAL,AH
MOVBX,OFFSETTABLE
MOVAH,0H
ADDBX,AX
MOVAL,[BX]
OUTDX,AL
POPBX
MOVDX,28AH
MOVAL,01H
OUTDX,AL
;计算个位数显示
MOVDX,28AH
MOVAL,00H
OUTDX,AL
MOVDX,288H
PUSHBX
MOVAX,BX
MOVBL,0AH
DIVBL
MOVBX,OFFSETTABLE
MOVAH,0H
ADDBX,AX
MOVAL,[BX]
OUTDX,AL
POPBX
MOVDX,28AH
MOVAL,02H
OUTDX,AL
LOOPVIEW
;修改变量显示下一个数
INCBL
CMPBL,64H
JNZJUMP1
MOVBL,0H
JUMP1:
JMPLOOP1
;返回DOS
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3.实验五的源程序
DATASEGMENT
TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,
DB39H,5EH,79H,71H;数码管显示
NUMDB00H,070H,0B0H,0D0H,0E0H;用于扫描键盘
DATAENDS
STACKSEGMENTSTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
;延时子程序
DELAYPROCNEAR
PUSHCX
MOVCX,100H
WAIT1:
LOOPWAIT1
POPCX
RET
DELAYENDP
;获取键盘的输入数字的子程序,通过BX寄存器传递
KEYBOPROCNEAR
PUSHAX;保护现场
PUSHCX
PUSHDX
MOVCX,01H;控制扫描4次
CHECK:
MOVDX,28AH;输出一行置低电平
MOVBX,OFFSETNUM
ADDBX,CX
MOVAL,[BX]
OUTDX,AL
;防抖
INAL,DX;判断是否有键盘按下
MOVAH,AL
CALLDELAY
INAL,DX
CMPAL,AH
JNZCHECK
;判断是那一列按下了
ANDAL,0FH
CMPAL,0FH
JZNEXT
CMPAL,0EH
JZNEXT1
CMPAL,0DH
JZNEXT2
CMPAL,0BH
JZNEXT3
MOVBX,01H
JMPGOT
NEXT:
INCCX;修改变量扫描下一行
CMPCX,05H
JNZJUMP1
MOVCX,01H
JUMP1:
JMPCHECK
NEXT1:
MOVBX,04H
JMPGOT
NEXT2:
MOVBX,03H
JMPGOT
NEXT3:
MOVBX,02H
;计算按下键盘的数值
GOT:
SUBCX,01H
MOVAL,CL
MOVDL,04H
MULDL
ADDBL,AL
SUBBL,01H
POPDX;恢复现场
POPCX
POPAX
RET
KEYBOENDP
;主程序
START:
MOVAX,DATA
MOVDS,AX
;8255初始化
MOVDX,28BH
MOVAL,81H
OUTDX,AL
MOVDX,289H
MOVAL,01H
OUTDX,AL
;扫描键盘
LOOP1:
CALLKEYBO
;数码管显示字符
MOVAX,BX
MOVBX,OFFSETTABLE
ADDBX,AX
MOVAL,[BX]
MOVDX,288H
OUTDX,AL
MOVDX,28AH
INAL,DX
;检测键盘弹起
MOVAH,AL
LOOP2:
CALLDELAY
INAL,DX
CMPAL,AH
JZLOOP2
JMPLOOP1
;返回DOS
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
五、实验结果
1、实验三:
打开的那个开关对应的二极管亮。
2、实验四:
(1)四个数码管稳定的显示学号:
0795;
(2)两个数码管循环显示0~99数字;
3、实验五:
键盘输入数字,数码管显示相应的的输入的数字。
六、实验总结
实验中主要遇到了下面的问题:
1、数码管显示总是有阴影,不清晰。
主要原因是数码管循环扫描的速度太快,以及视觉的停留效应。
解决办法发是显示下一个字符之前先对数码管进行初始化,使之不显示;
2、键盘的输入有错误,按键有时会获取错误数字。
主要是由于是键盘经常有毛刺,需要防抖。
通过先检测,延时,再检测的方式进行防抖,排除键盘抖动。
七、实验收获与心得体会
本次实验中,我们使用8255A并行接口芯片和数码管实现了一个数码管的静态和动态显示字符的程序。
为了实现同时显示不同字符,就要通过扫描(依次点亮数码管)的方式来实现,这就要给CAT信号依次赋值,并且在扫描的过程中要用到延时。
动态显示的程序设计思想与静态时的大体相同,只是对动态的每一种状态进行一段时间的静态显示然后换状态而已,所以通过一个二层循环就能很好地解决这个问题。
通过这次实验,我在编程过程中学到了很多东西,不但巩固了书本的知识,而且体会到了编程的过程中思维必须很缜密,否则写出来的程序常会导致无法运行甚至死机。
实验八可编程定时器/计数器(8253/8254)
一、实验目的
学习掌握8253用作定时器的编程原理;
二、实验原理及内容
1.完成一个音乐发生器,通过喇叭或蜂鸣器放出音乐,并在数码管上显示乐谱。
2.扩展部分:
利用小键盘实现弹琴功能,并显示弹奏的乐谱。
注意:
8253输入频率应小于2MHz。
三、硬件接线图与软件程序流程图
图1:
硬件连接图
图2:
程序流程图
四、给出源程序
1、播放音乐
程序:
DATASEGMENT
NOTEDW0001H,3906,3472,3125,2932,2604,2344,2083,1953;频率
TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;数码管
MUSICDB3,3,2,3,5,6,5,8,6,5,5,3,3,5,5,5,6,0,8,8,2,2,3,3,2,1,6,1,5,5,0,5,
DB5,3,3,5,5,6,8,8,2,2,3,3,1,1,6,6,5,5,5,0,5,5,2,2,3,5,3,2,1,6,6,1,1
;存放的乐符
DATAENDS
STACKSEGMENTSTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
;延时子程序
DELAYPROCNEAR
PUSHCX
MOVCX,0FFFFH
WAIT1:
LOOPWAIT1
POPCX
RET
DELAYENDP
;主程序
START:
MOVAX,DATA
MOVDS,AX
;8254初始化
MOVDX,283H
MOVAL,36H
OUTDX,AL
;8255初始化
MOVDX,28BH
MOVAL,80H
OUTDX,AL
MOVDX,28AH
MOVAL,01H
OUTDX,AL
MOVCX,01H
;播放音乐
SPEAK:
PUSHCX;保护现场
;读取乐符
MOVBX,OFFSETMUSIC
ADDBX,CX
MOVAL,[BX]
MOVCL,AL
MOVCH,0H
;数码管显示
MOVBX,OFFSETTABLE
ADDBX,CX
MOVAL,[BX]
MOVDX,288H
OUTDX,AL
;播放该乐符
MOVBX,OFFSETNOTE
MOVAX,CX
ADDAX,AX
ADDBX,AX
MOVAX,[BX]
MOVDX,280H
OUTDX,AL
MOVAL,AH
OUTDX,AL
POPCX
;延时,持续播放
MOVAX,90H
LOOP1:
CALLDELAY
DECAX
JNZLOOP1
;判读继续播放还是重新播放
INCCX
CMPCX,41H
JNZJUM
MOVCX,01H
JUM:
JMPSPEAK
CODEENDS
ENDSTART
2、拓展:
小键盘弹奏
DATASEGMENT
NOTEDW0001H,3906,3472,3125,2932,2604,2344,2083,1953;频率
TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;数码管
NUMDB00H,070H,0B0H,0D0H,0E0H;检测键盘输出
DATAENDS
STACKSEGMENTSTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
;延时子程序
DELAYPROCNEAR
PUSHCX
MOVCX,100H
WAIT1:
LOOPWAIT1
POPCX
RET
DELAYENDP
;获取键盘输入值的子程序,具体注释
KEYBOPROCNEAR
PUSHAX
PUSHCX
PUSHDX
MOVCX,01H
CHECK:
MOVDX,28AH
MOVBX,OFFSETNUM
ADDBX,CX
MOVAL,[BX]
OUTDX,AL
INAL,DX
MOVAH,AL
CALLDELAY
INAL,DX
CMPAL,AH
JNZCHECK
ANDAL,0FH
CMPAL,0FH
JZNEXT
CMPAL,0EH
JZNEXT1
CMPAL,0DH
JZNEXT2
CMPAL,0BH
JZNEXT3
MOVBX,01H
JMPGOT
NEXT:
INCCX
CMPCX,05H
JNZJUMP1
MOVCX,01H
JUMP1:
JMPCHECK
NEXT1:
MOVBX,04H
JMPGOT
NEXT2:
MOVBX,03H
JMPGOT
NEXT3:
MOVBX,02H
GOT:
SUBCX,01H
MOVAL,CL
MOVDL,04H
MULDL
ADDBL,AL
SUBBL,01H
POPDX
POPCX
POPAX
RET
KEYBOENDP
;主程序
START:
MOVAX,DATA
MOVDS,AX
;8254初始化
MOVDX,283H
MOVAL,36H
OUTDX,AL
;8255初始化
MOVDX,28BH