北京邮电大学微原硬件实验报告.docx
《北京邮电大学微原硬件实验报告.docx》由会员分享,可在线阅读,更多相关《北京邮电大学微原硬件实验报告.docx(46页珍藏版)》请在冰豆网上搜索。
北京邮电大学微原硬件实验报告
微原硬件实验报告
班级:
学号:
班内序号:
姓名:
ﻬ
实验一、二 基本的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输出一个负脉冲,执行下面两条指令
MOV DX,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、实验一源程序
DATA SEGMENT
DATAﻩENDS
STACK SEGMENTSTACK'STACK'
ﻩDB100H DUP(?
)
STACKENDS
CODEﻩﻩSEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
;延时子程序
DELAYﻩPROC ﻩNEAR
ﻩﻩMOVﻩBX,500
ﻩﻩPUSHCX
LOOP2:
MOV ﻩCX,0FFFH
WAIT:
LOOPWAIT
DECﻩBX
ﻩﻩﻩJNZ ﻩLOOP2
POPﻩCX
ﻩﻩRET
DELAY ENDP
START:
ﻩMOVﻩCX,0FFFFH
;二极管闪烁部分
LOOP1:
MOVDX,2A0Hﻩﻩ;灯亮
ﻩﻩMOVﻩAL,0FFH
ﻩﻩOUTﻩDX,AL
CALLﻩDELAY
ﻩ
ﻩﻩMOVﻩDX,2A8Hﻩ;灯灭
ﻩMOV ﻩAL,0
ﻩOUTﻩDX,AL
ﻩﻩﻩCALLDELAY
ﻩﻩﻩLOOPLOOP1
CODE ﻩﻩENDS
ENDSTART
2、实验二的源程序
DATA ﻩSEGMENT
DATAENDS
STACKﻩSEGMENTSTACK 'STACK'
ﻩDB100DUP(?
)
STACK ENDS
CODEﻩSEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
ﻩMOVAH,1ﻩ;键盘输入
INT 21H
CMPAL,27ﻩ;检测是否为ESC键
JZEXIT
ﻩMOVﻩDX,2A8H;输出
ﻩOUTﻩDX,AL
ﻩJMPﻩSTART
;返回DOS
EXIT:
MOVAX,4C00H
INTﻩ21H
CODEENDSﻩ
ﻩENDﻩSTART
五、实验结果
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、实验三源程序
DATAﻩSEGMENT
DATA ENDS
STACKSEGMENT STACK'STACK'
ﻩﻩDB 100DUP(?
)
STACKENDS
CODEﻩﻩSEGMENT
ﻩASSUME CS:
CODE,DS:
DATA,SS:
STACK
START:
ﻩMOV AX,DATA
ﻩMOV DS,AX
ﻩMOVDX,28BHﻩﻩ;8255初始化
ﻩMOV AL,89H
OUT DX,AL
LOOP1:
ﻩﻩMOVDX,28AHﻩﻩ
ﻩIN ﻩAL,DX
MOVﻩDX,288H
OUTﻩDX,AL
ﻩJMPﻩLOOP1
ﻩﻩMOV AH,4CH
ﻩﻩﻩINT 21H
CODEﻩENDS
ENDﻩSTART
2、实验四源程序
(1)显示学号
DATA ﻩSEGMENT
DATA ﻩENDS
STACK ﻩSEGMENTSTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ﻩﻩASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOV AX,DATA
ﻩﻩMOVDS,AX
ﻩﻩMOVﻩDX,28BHﻩﻩ;8255初始化
ﻩMOVAL,80H
ﻩOUTDX,AL
MOVCX,30
VIEW:
ﻩMOVDX,28AHﻩ;第一个数码管显示
MOV ﻩAL,00H
ﻩOUT ﻩDX,AL
ﻩMOVDX,288H
ﻩMOVﻩAL,6DH
OUTDX,AL
MOVﻩDX,28AH
MOVAL,01H
OUT ﻩDX,AL
ﻩﻩ;第二个数码管显示
MOV DX,28AH
MOVAL,00H
ﻩOUT DX,AL
MOVﻩDX,288H
ﻩMOVAL,6FH
ﻩOUT ﻩDX,AL
MOVﻩDX,28AH
ﻩMOVAL,02H
ﻩOUT ﻩDX,AL
ﻩﻩ;第三个数码管显示
ﻩMOVDX,28AH
MOV AL,00H
OUTDX,AL
MOV ﻩAL,0
MOVﻩDX,288H
MOVAL,07H
ﻩOUTDX,AL
MOVDX,28AH
ﻩMOVAL,04H
OUT DX,AL
ﻩ;第四个数码管显示
MOVDX,28AH
MOV ﻩAL,00H
OUTﻩDX,AL
ﻩMOV ﻩAL,0
MOVDX,288H
ﻩMOVAL,3FH
ﻩOUT DX,AL
MOVDX,28AH
ﻩﻩﻩMOVﻩAL,08H
ﻩOUTDX,AL
ﻩﻩﻩ循环显示
JZVIEW
ﻩﻩ;返回DOS
ﻩﻩMOVAH,4CH
ﻩINTﻩﻩ21H
CODEﻩENDS
ﻩﻩENDﻩSTART
(2)循环显示数字0~99
DATAﻩSEGMENT
TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;数码管显示
DATAﻩENDS
STACKﻩSEGMENTSTACK'STACK'
ﻩDB 100DUP(?
)
STACKﻩENDS
CODESEGMENT
ﻩﻩASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
ﻩMOV ﻩAX,DATA
ﻩﻩMOV DS,AX
ﻩﻩMOV DX,28BHﻩ;8255初始化
MOVﻩAL,80H
OUTﻩDX,AL
;循环显示
ﻩMOVBX,0H;控制重新从0开始计数的变量
LOOP1:
ﻩMOVﻩCX,100ﻩ;循环扫描数码管让两个数码管都显示
VIEW:
MOVﻩDX,28AHﻩ
MOVAL,00H
OUT ﻩDX,AL
ﻩMOVﻩDX,288H
;计算十位数,并显示
ﻩPUSH ﻩBX
MOVAX,BX
MOVBL,0AH
DIVBL
MOVﻩAL,AH
MOVﻩBX,OFFSETTABLE
MOVﻩAH,0H
ADD BX,AX
MOV ﻩAL,[BX]
OUTDX,AL
POPﻩﻩBX
ﻩMOVﻩDX,28AH
ﻩMOVﻩAL,01H
ﻩOUT DX,AL
ﻩﻩ;计算个位数显示
MOVﻩDX,28AH
MOVAL,00H
OUTﻩﻩDX,AL
ﻩMOVﻩDX,288H
PUSHﻩBX
MOVﻩAX,BX
MOV BL,0AH
DIVBL
MOVﻩBX,OFFSET TABLE
MOVAH,0H
ADDBX,AX
MOVAL,[BX]
ﻩ OUTﻩDX,AL
POPﻩBX
ﻩﻩMOVDX,28AH
ﻩMOVAL,02H
ﻩﻩﻩOUT ﻩDX,AL
LOOP ﻩVIEW
ﻩﻩ;修改变量显示下一个数
INCﻩBL
CMPﻩBL,64H
JNZ ﻩJUMP1
MOVBL,0H
JUMP1:
ﻩ JMP ﻩLOOP1
ﻩ;返回DOS
ﻩMOVﻩAH,4CH
ﻩﻩINTﻩ21H
CODEﻩENDS
ENDSTART
3.实验五的源程序
DATA SEGMENT
TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,
DB 39H,5EH,79H,71Hﻩ;数码管显示
NUM DB 00H,070H,0B0H,0D0H,0E0Hﻩ;用于扫描键盘
DATAENDS
STACK SEGMENTSTACK'STACK'
DB100DUP(?
)
STACK ENDS
CODEﻩ SEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
;延时子程序
DELAYﻩPROCﻩNEAR
ﻩPUSH ﻩCX
ﻩMOVCX,100H
WAIT1:
LOOP WAIT1
POPCX
RET
DELAYﻩENDP
;获取键盘的输入数字的子程序,通过BX寄存器传递
KEYBO PROC NEAR
PUSH AX;保护现场
PUSH CX
PUSH DX
ﻩ MOVﻩCX,01H;控制扫描4次
CHECK:
ﻩMOV ﻩDX,28AH;输出一行置低电平
MOV BX,OFFSETNUM
ﻩADDﻩBX,CX
MOVﻩAL,[BX]
OUT ﻩDX,AL
;防抖
INAL,DXﻩ;判断是否有键盘按下
MOV ﻩAH,AL
CALL DELAY
IN AL,DX
CMP AL,AH
JNZ ﻩCHECK
;判断是那一列按下了
AND AL,0FH
CMPAL,0FH
JZﻩNEXT
CMP ﻩAL,0EH
JZ NEXT1
CMP AL,0DH
JZ ﻩNEXT2
CMP AL,0BH
JZ NEXT3
MOVﻩBX,01H
JMP ﻩGOT
NEXT:
ﻩINC ﻩCXﻩ;修改变量扫描下一行
ﻩCMPCX,05H
JNZ ﻩJUMP1
MOV ﻩCX,01H
JUMP1:
JMP CHECK
NEXT1:
MOV ﻩBX,04H
JMPﻩGOT
NEXT2:
MOV ﻩBX,03H
JMP ﻩGOT
NEXT3:
MOV BX,02H
;计算按下键盘的数值
GOT:
ﻩSUBﻩCX,01H
MOV AL,CL
MOVﻩDL,04H
MUL DL
ﻩADD BL,AL
SUB ﻩBL,01H
POPﻩDXﻩ;恢复现场
ﻩPOP ﻩCX
POP ﻩAX
ﻩRET
KEYBO ENDP
;主程序
START:
MOV AX,DATA
MOVﻩDS,AX
;8255初始化
ﻩMOVDX,28BH
ﻩMOVﻩAL,81H
OUT ﻩDX,AL
MOV DX,289H
MOVﻩAL,01H
OUTDX,AL
;扫描键盘
LOOP1:
CALLKEYBO
ﻩ;数码管显示字符
ﻩMOV AX,BX
ﻩMOV BX,OFFSET TABLE
ﻩADDBX,AX
ﻩMOVAL,[BX]
MOVﻩDX,288H
OUT DX,AL
ﻩMOVﻩDX,28AH
INﻩAL,DX
;检测键盘弹起
MOV ﻩAH,AL
LOOP2:
ﻩCALLﻩDELAY
ﻩIN AL,DX
ﻩCMP AL,AH
ﻩJZ ﻩLOOP2
JMPﻩLOOP1
;返回DOS
MOV AX,4C00H
ﻩINT21H
CODE ENDS
ENDSTART
五、实验结果
1、实验三:
打开的那个开关对应的二极管亮。
2、实验四:
(1)四个数码管稳定的显示学号:
0795;
(2)两个数码管循环显示0~99数字;
3、实验五:
键盘输入数字,数码管显示相应的的输入的数字。
六、 实验总结
实验中主要遇到了下面的问题:
1、数码管显示总是有阴影,不清晰。
主要原因是数码管循环扫描的速度太快,以及视觉的停留效应。
解决办法发是显示下一个字符之前先对数码管进行初始化,使之不显示;
2、键盘的输入有错误,按键有时会获取错误数字。
主要是由于是键盘经常有毛刺,需要防抖。
通过先检测,延时,再检测的方式进行防抖,排除键盘抖动。
七、实验收获与心得体会
本次实验中,我们使用8255A并行接口芯片和数码管实现了一个数码管的静态和动态显示字符的程序。
为了实现同时显示不同字符,就要通过扫描(依次点亮数码管)的方式来实现,这就要给CAT信号依次赋值,并且在扫描的过程中要用到延时。
动态显示的程序设计思想与静态时的大体相同,只是对动态的每一种状态进行一段时间的静态显示然后换状态而已,所以通过一个二层循环就能很好地解决这个问题。
通过这次实验,我在编程过程中学到了很多东西,不但巩固了书本的知识,而且体会到了编程的过程中思维必须很缜密,否则写出来的程序常会导致无法运行甚至死机。
实验八可编程定时器/计数器(8253/8254)
一、实验目的
学习掌握8253用作定时器的编程原理;
二、实验原理及内容
1.完成一个音乐发生器,通过喇叭或蜂鸣器放出音乐,并在数码管上显示乐谱。
2.扩展部分:
利用小键盘实现弹琴功能,并显示弹奏的乐谱。
注意:
8253输入频率应小于2MHz。
三、硬件接线图与软件程序流程图
图1:
硬件连接图
图2:
程序流程图
四、给出源程序
1、播放音乐
程序:
DATASEGMENT
NOTE DW0001H,3906,3472,3125,2932,2604,2344,2083,1953;频率
TABLE ﻩDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;数码管
MUSIC DB3,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
;存放的乐符
DATA ﻩENDS
STACK ﻩSEGMENTSTACK'STACK'
ﻩDB100DUP(?
)
STACKﻩENDS
CODEﻩ ﻩﻩSEGMENT
ﻩﻩASSUMECS:
CODE,DS:
DATA,SS:
STACK
;延时子程序
DELAY PROC NEAR
ﻩPUSH ﻩCX
ﻩMOV ﻩCX,0FFFFH
WAIT1:
ﻩLOOP ﻩWAIT1
ﻩPOP CX
RET
DELAY ENDP
;主程序
START:
MOVﻩAX,DATA
MOVﻩﻩDS,AX
ﻩ;8254初始化
ﻩ MOVﻩﻩDX,283H
ﻩMOVﻩAL,36H
OUTDX,AL
ﻩﻩ;8255初始化
ﻩMOV DX,28BH
MOV ﻩﻩAL,80H
ﻩOUT DX,AL
MOV ﻩDX,28AH
ﻩﻩMOVﻩﻩAL,01H
ﻩ ﻩOUTﻩDX,AL
ﻩMOV ﻩCX,01H
;播放音乐
SPEAK:
ﻩPUSH ﻩCX;保护现场
ﻩﻩ;读取乐符
MOV ﻩBX,OFFSETMUSIC
ADD ﻩBX,CX
MOV AL,[BX]
MOV ﻩCL,AL
MOV CH,0H
;数码管显示
MOV BX,OFFSETTABLE
ADD ﻩBX,CX
MOV ﻩAL,[BX]
MOVﻩDX,288H
OUTﻩDX,AL
ﻩﻩﻩ;播放该乐符
MOV ﻩBX,OFFSETNOTE
MOV ﻩAX,CX
ADD ﻩAX,AX
ADDBX,AX
MOV AX,[BX]
MOV ﻩDX,280H
OUTﻩDX,AL
MOVﻩAL,AH
OUT ﻩDX,AL
POP ﻩCX
;延时,持续播放
MOV ﻩAX,90H
LOOP1:
CALLﻩDELAY
DECAX
JNZLOOP1
;判读继续播放还是重新播放
INC CX
CMP ﻩCX,41H
JNZ JUM
MOV CX,01H
JUM:
JMP SPEAK
CODEENDS
ENDSTART
2、拓展:
小键盘弹奏
DATA SEGMENT
NOTE DW0001H,3906,3472,3125,2932,2604,2344,2083,1953;频率
TABLE DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;数码管
NUM DB00H,070H,0B0H,0D0H,0E0H;检测键盘输出
DATA ENDS
STACK SEGMENTSTACK'STACK'
DB100 DUP(?
)
STACKENDS
CODEﻩSEGMENT
ﻩASSUME CS:
CODE,DS:
DATA,SS:
STACK
;延时子程序
DELAYPROCNEAR
ﻩPUSH CX
MOV CX,100H
WAIT1:
ﻩLOOPWAIT1
ﻩPOP CX
RET
DELAY ENDP
;获取键盘输入值的子程序,具体注释