北京邮电大学 微机原理硬件实验报告Word下载.docx
《北京邮电大学 微机原理硬件实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《北京邮电大学 微机原理硬件实验报告Word下载.docx(41页珍藏版)》请在冰点文库上搜索。
再运行查看结果
分析
movah,0bh
该段程序的作用:
检测键盘有没有按键,有则返回DOS。
没有继续执行
3.利用EDIT工具编写汇编写跑马灯程序程序
实现功能
B.通过输出端口控制灯的工作状态(低电平灯亮)C>
EDIT文件名.asm
录入程序
按Alt键打开菜单进行存盘或退出
编译文件
MASM文件名.asm
连接文件
LINK文件名.obj
运行文件或用Debug进行调试。
四、程序流程图
软件程序流程图:
硬件连线图:
五、源程序代码:
DATSEGMENT
NUMDB0EFH
DATENDS;
定义数据段
STASEGMENTSTACK'
STACK'
DB100DUP(?
)
STAENDS;
定义堆栈段
CODSEGMENT
ASSUMECS:
COD,DS:
DAT,SS:
STA
STARTPROCFAR
PUSHDS
MOVAX,0
PUSHAX;
使用第一种返回DOS的方式
MOVAX,DAT
MOVDS,AX
MOVDX,0E8E0H;
输出端口设置
LOOP0:
INAL,DX
MOVAH,AL
TESTAL,01H
JZGG;
最低位为1则程序结束
TESTAL,02H;
检测中间位
JZLOOP0;
若输入端为0则继续等待
TESTAL,04H;
JZRR;
跑马灯向右运动
ROLNUM,1;
跑马灯向左运动
JMPLOOP2
RR:
RORNUM,1;
原数据循环右移,使得跑马灯向右跳转
LOOP2:
ANDAH,1FH
MOVCL,AH;
设置子程序调用的次数,间接控制延迟时间
MOVCH,0;
MOVAL,NUM
OUTDX,AL
INCCX
LOOP1:
CALLDELAY;
调用延时子程序
LOOPLOOP1
JMPLOOP0;
返回等待输入过程
GG:
RETF
STARTENDP
;
延时子程序
DELAYPROC
PUSHCX
MOVCX,008FFH;
外循环过程
D1:
MOVCX,004FFH;
内循环过程
D2:
LOOPD2
POPCX
LOOPD1
RET
DELAYENDP;
CODENDS
ENDSTART
六、思考题:
通过实验说明用debug中的a命令录入实验中给出的小程序中,有些语句可以不写出“h”字符的原因。
答:
在DEBUG环境下,地址都是默认以16进制显示的,所以当语句中的数据是地址时,可以不加H,如果输入的不是地址而是数据时,就要加上H以表示为十六进制数。
七、实验收获和体会:
本次试验涉及到了计算机对于外部设备的控制的基本过程,我们主要学会如何在debug环境下编写I/O命令对于外部设备进行输入和输出。
具体而言,利用命令点亮了LED灯,以及读取了拨码开关的状态。
通过上述读写的操作,以及编写子程序等过程完成了跑马灯的实现。
由于电路板的时钟信号周期很小,在完成一层循环时,形成的跑马灯无法被人眼识别捕捉,呈现出了八个LED灯都亮的状态,不符合要求。
于是我们将循环延迟的子程序改成了两层,并且由于输入端的拨码开关一共有三个可以控制跑马灯的模式,其中一个控制开关,另一个控制方向(可左可右),另一个辅助控制跑马灯的速度。
实际上我们在跑马灯开启状态下,读入三个拨码开关的状态并且将其转化为三位的二进制数,并且将这个二进制数作为控制延迟子程序的调用次数,从而实现了两种方向下七种速度的实现(本应该有八种,但是一种是关闭状态)。
实现了功能的拓展和创新。
我们通过本次实验,基本学会了汇编语言代码的编写,熟悉了DEBUG的工作环境和调试过程,并且对于计算机控制外部设备有了更客观清醒的认识,为今后汇编学习做了更充分的准备。
实验二8255A并行接口应用
1.掌握8255A的功能及方式0、1的实现
2.熟悉8255A与CPU的接口,以及传输数据的工作原理及编程方法。
3.了解七段数码管显示数字的原理。
4.掌握同时显示多位数字的技术。
在实验一的基础上学习PIO芯片(8255)编程应用,熟悉平台的主要内容。
CS用Y0(E800H)
(一)简要说明:
在方式0(输入/输出)下,以A口为输出口,B口为输出口,A口接六个共阴极数码管的八位段码,高电平点亮数码管的某一段,B口接数码管的位选(即要使哪个数码管亮),高电平选中某一位数码管点亮。
8255A中
A端口地址E800H
B端口地址E801H
C端口地址E802H
控制地址E803H八段数码管的显示规律及数码管的位选规律自己查找,可用实验一中,学过的I、O命令来做。
三、程序流程图:
程序一:
静态显示学号
程序二:
动态显示hello
硬件连线图:
四、源程序代码:
显示静态学号
DATASEGMENT
SHOWDB0F4H,21H,0EDH,0F1H,0D9H,0EDH;
210350的ASCII码值
COUNTEQU$-SHOW
SLDB?
DATAENDS
STACKSEGMENTSTACK'
DB100HDUP(?
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
延时子程序----------------------------------------------------
DELAYPROC
PUSHCX
MOVCX,800H
DELAY1:
PUSHCX;
外层循环
MOVCX,400H
DELAY2:
LOOPDELAY2;
内层循环
POPCX
LOOPDELAY1
POPCX
RET
DELAYENDP
主程序--------------------------------------------------------
START:
MOVAX,DATA
MOVDS,AX
NEXT:
MOVCX,COUNT;
字母个数
LEABX,SHOW
MOVSL,01H
AGAIN:
MOVAL,80H
MOVDX,0E803H
OUTDX,AL;
设置输出端口
MOVAL,SL
MOVDX,0E801H
OUTDX,AL
MOVAL,[BX]
MOVDX,0E800H
数码管显示已经保存在数据段的数字
MOVAL,00H
MOVDX,0E800H
清除原有字符
INCBX;
增加BX数值,显示下一个数字
SHLSL,1;
Sl左移依次向左选通数码管
LOOPAGAIN;
循环此过程
MOVAH,0BH
INT21H
ORAL,AL
JZNEXT
OK:
MOVAH,4CH
CODEENDS
动态显示HELLO
DATASEGMENT
MESGDB0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0
DATAENDS
STACKSEGMENTSTACK'
DB100DUP(0)
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
MAINPROCFAR
MOVDS,AX
MOVES,AX
MOVAL,80H
OUTDX,AL
LOP6:
MOVBX,OFFSETMESG
MOVCX,07H
LOP5:
MOVDX,0E8E0H;
从端口读入数据
INAL,DX
INCAL
ANDAL,07H
XORAH,AH
MOVDX,AX;
DX值设置为外循环次数
LOPZ:
CALLDISP;
显示子程序调用
DECDX
JNZLOPZ;
显示当前状态直至DX=0
INCBX;
BX决定哪个数码管应被点亮
LOOPLOP5;
重新设置数码管移动速度
JMPLOP6;
当六种状态都结束后重新开始显示“HELLO”过程
MAINENDP
;
显示子程序-------------------------------------------------------------
DISPPROCNEAR
PUSHCX
PUSHDX
PUSHAX
MOVBP,0044H;
控制显示速度
LOPX:
XORSI,SI
MOVCX,06H;
每次记录六个数码管的状态
MOVDX,0E800H;
从外部设备读入数据
MOVAH,00000001B;
每次显示一个数码管
LOP2:
MOVAL,MESG[BX+SI]
MOVAL,AH;
决定显示哪一个数码管
INCDX
OUTDX,AL;
控制哪一个LED灯亮
ROLAH,1;
使得下一个LED灯亮
INCSI
CALLDELAY;
CALLKEY;
检验按键是否有输入
LOOPLOP2;
循环执行LOP2直到所有六个数码管都被点亮
DECBP
JNZLOPX;
外层循环,控制显示时间
POPAX
POPDX
RET
DISPENDP
返回DOS子程序---------------------------------------------
KEYPROCNEAR;
检测键盘输入
MOVAH,0BH
ORAL,AL
JZGOON;
没有键盘输入则跳向GOON
MOVAH,4CH;
有任意输入则返回DOS
GOON:
POPAX
KEYENDP
延时子程序--------------------------------------------------
PUSHAX
MOVAX,0002H;
LOPD:
MOVCX,0H
LOOP$;
DECAX
JNZLOPD
POPAX
DELAYENDP
ENDMAIN
五、实验心得与体会:
这次的实验里我学习了使用8255芯片进行并口接口的应用,先用了I/O命令检测出了数码管的显示规律和段选规律。
在实际编写代码时,应该时刻都记住实际上数码管显示图形时,我们看到多个数码管的显示都是逐个选通。
应该给数码管加入高于24*6Hz的始终使得人眼无法分清数码管是被依次点亮。
在HELLO的动态显示时,这个问题更加复杂,不仅需要在每次显示时数码管被逐个点亮,还需要在每经过一个显示周期,HELLO字符都左移1位,这无法通过二进制数的左右移位实验,而需要另外编写代码。
另外还需要注意就是在实验中,每次换下一个数码管显示的时候还会显示之前数码管已经显示的字符,需要将原来的显示清零,才能呈现出所需的左右移动的变化过程。
本次过程经过多次调试,另外还经历了电脑死机、板子失灵、无法返回DOS等问题的干扰。
但最终我和组员能够相互协作,并且认真分析一些bug出现的原因,并且及时分析修改代码,使得我们能最终顺利完成实验,收获颇丰。
实验三8253计数器/定时器的应用
一、实验目的:
学习掌握8253用作定时器的编程原理
1.完成一个音乐发生器,通过蜂鸣器放出音乐,并在数码管上显示乐谱。
三,电路测试与连接
测试:
在Debug状态下,用“O”命令测试8353的发生功能,3组通道工作是否正常。
电路连接:
8253的CS接译码器输出Y1其地址为E820-E827H
8253的OUT接蜂鸣器的BELL端
8253的门控信号GATE接+5V
8253的CLK端接Q7(32KHz)
清零复位电路中的T/C端接地(或接RESET端)
注意:
由于8253计数速率应小于2MHz,CLK0的输入信号必须由8MHz经393分频到小于2MHz后使用。
393分频之后,Q0输出为4MHz,Q1输出为2MHz……Q7输出32KHz。
编程提示:
1.8253控制端口地址为E823H
定时器0地址为E820H
定时器1地址为E821H
定时器2地址为E822H
2.定时器可工作在方式3下。
四、程序流程图:
NUMSdw0fffh;
数据段
NUMdw01fffh;
NUMLdw02fffh;
延时大小
CODESEGMENT;
代码段
DELAYPROCFAR;
PUSHF
MOVCX,NUM
LOOPLOOP2
LOOPLOOP1
POPF
RETF
DELAYSPROCFAR;
LOOPS1:
MOVCX,NUMS
LOOPS2:
LOOPLOOPS2
LOOPLOOPS1
DELAYSENDP
DELAYLPROCFAR;
LOOPL1:
MOVCX,NUML
LOOPL2:
LOOPLOOPL2
LOOPLOOPL1
DELAYLENDP
singdoprocfar;
音阶do的发声及显示子程序
do:
movdx,0e8e0h;
inal,dx;
testal,02h;
;
teststopornot
jzdodelay;
;
stop
movdx,0E820h;
timer0set
moval,7Dh;
do
outdx,al
MOVDX,0E800H;
ledshow
MOVAL,21H;
"
1"
CALLDELAY
retf
dodelay:
moval,00h;
movdx,0e800h
moval,21h
jmpdo
singdoendp
singreprocfar;
音阶re的发声及显示子程序
re:
testal,02h;
teststopornot
jzredelay;
moval,6FH;
re
MOVAL,0F4H;
2"
redelay:
moval,00H;
jmpre
singreendp
singmiprocfar;
音阶mi的发声及显示子程序
mi:
jzmidelay;
movdx,0E820h;
moval,64H;
mi
MOVAL,0F1H;
3"
midelay:
jmpmi
singmiendp
singfaprocfar;
音阶fa的发声及显示子程序
fa:
testal,02h;
jzfadelay;
moval,5EH;
fa
MOVAL,39H;
4"
fadelay:
jmpfa
singfaendp
singsoprocfar;
音阶so的发声及显示子程序
so:
jzsodelay;
moval,53h;
so
MOVAL,0D9H;
5"
sodelay:
jmpso
singsoendp
singlaprocfar;
音阶la的发声及显示子程序
la:
jzradelay;
moval,4BH;
la
MOVAL,0DDH;
6"
radelay:
jmpla
singlaendp
singtiprocfar;
音阶ti的发声及显示子程序
ti:
jzxidelay;
stop
movdx,0E820h;
moval,43H;
ti
MOVAL,61H;
7"
CALLDELAY
xidelay:
jmp