北邮信通院微机原理实验报告Word下载.docx
《北邮信通院微机原理实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《北邮信通院微机原理实验报告Word下载.docx(37页珍藏版)》请在冰豆网上搜索。
2.分析以下程序段的作用
MOVAH,0BH
INT21H
ORAL,AL
JZ0100
INT20H
该段程序实现了检测键盘状态,在键盘有任意键输入时退出程序返回DOS的功能。
该实现依赖0BH号中断调用和巧妙使用程序入口返回地址直接返回。
在DOS的DEBUG模式下,地址不用添加十六进制H标志。
地址默认为16进制,多写了反而画蛇添足产生错误。
普通数据为了区分需要添加H。
3.编写跑马灯程序(含改进跑马灯思路)。
程序流程图如下:
程序源码如下:
1、基础跑马灯程序一,S0控制关断,S1控制灯速度,S2控制灯的方向
DATASEGMENT
COUNTDW0
SHOWDB0
DATAENDS
STACKSEGMENTSTACK'
STACK'
DB100DUP(?
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
BEGIN:
MOVAX,DATA
MOVDS,AX
MOVES,AX
START0:
MOVDX,0E8E0H
INAL,DX
TESTAL,01H;
S0,控制关断
JZEXIT
TESTAL,02H;
S1,控制速度
JZSPEED
MOVCX,0FFFH
MOVCOUNT,CX
JMPNEXT1
SPEED:
MOVCX,00FFH
NEXT1:
TESTAL,04H;
S2,控制方向
JZRIGHT
LEFT:
MOVDX,0E8E0H
MOVAL,0FEH
OUTDX,AL
LEFT1:
ROLAL,1;
跑马灯算法
MOVSHOW,AL;
暂存AL
CALLDELAY
MOVAL,0FFH
MOVAL,SHOW
JMPSTART0
JMPEXIT
RIGHT:
MOVAL,7FH
RIGHT1:
RORAL,1;
EXIT:
MOVAX,4C00H
INT21H
DELAYPROC;
延迟程序
PUSHCX
MOVCX,COUNT
LOOP1:
MOVCX,0EFFFH
LOOP2:
LOOPLOOP2
POPCX
LOOPLOOP1
RET
DELAYENDP
CODEENDS
ENDBEGIN
2、跑马灯程序二.S0控制关断,S1控制灯速度,S2控制灯的方向.将右移时跑马灯改为灯从两边左右交替移到中间
S1,控制灯速度
S2,控制灯方向
MOVDX,0E8E0H;
左移时仍然是跑马灯
ROLAL,1
PUSHCX;
右移时灯从两边左右交替移到中间
MOVCX,0
INCCX
ROLAL,CL;
先左移
MOVSHOW,AL
RORAL,CL;
再右移
MOVAX,4C00H;
返回DOS
延迟子程序
MOVCX,0EFFFH;
COUNT
四、心得体会
这是本学期第一次微机原理硬件实验,也是我们与汇编语言的第一次亲密接触,而所编写的程序与硬件的紧密结合也让我们对汇编语言有了更深一层的领悟。
跑马灯是一个非常经典的实验,我们也曾经用VHDL语言编写过跑马灯程序,可谓是殊途同归。
总的说来,第一次的实验还是非常成功的,这也消除了我们的畏惧心理,为后来几次实验奠定了良好的基础。
实验二8255A并行接口应用
1.掌握8255A的功能及方式0、1的实现。
2.熟悉8255A与CPU的接口,以及传输数据的工作原理及编程方法。
3.了解七段数码管显示数字的原理。
4.掌握同时显示多位数字的技术。
1.查找八段数码管的显示规律及数码管的位选规律。
2.六位数码管静态显示。
在数码管电路上静态地显示6位学号,当主机键盘按下任意键时,停止显示,返回DOS。
3.六位数码管动态显示。
要求在数码管电路1-6位数码管上,动态显示字符串HELLO,当主机键盘按下任意键时结束。
4.扩展部分:
完成扫描键盘(PC口)输入自己的学号,并在数码管上显示。
1、八段数码管位选规律
在方式0(输入输出)下,以A口为输出口,B口为输出口,A口接六个共阴极数码管的八位段码,高电平点亮数码管的某一段,B口接数码管的位选(即要使哪个数码管亮),高电平选中某一位数码管点亮。
测试结果如下图所示。
由此,容易得出数字0~9以及字母A~H的编码,如下表所示。
字形
1
2
3
4
5
6
7
编码
0EDH
21H
0F4H
0F1H
39H
0D9H
0DDH
61H
8
9
A
B
C
D
E
F
0FDH
0F9H
7DH
9DH
0CCH
0B5H
0DCH
5CH
2、六位数码管静态显示
电路6个数码管的同名阳极段已经复接,当段选寄存器寄存了一个字型编码之后,6个数码管都将显示出相同的数字。
如果要使6个数码管“同时”显示不同的数字,必须采用扫描显示的方法。
通过选位寄存器选择某一位数码管,显示其数字(对应段值为1),然后关闭此数码管,再选择下一位数码管进行显示;
如果在一秒钟内,每一位数码管都能显示30次以上,则人眼看到的是几位数码管同时在显示。
实验证明,在扫描显示过程中,每一位显示延迟1ms是最佳选择。
本程序采用了每次扫描一排6个数码管,然后反复循环的方式。
每个数码管间隔一定时间,也即显示延迟。
通过在每一排扫描之后检测键盘状态,可以达到任意键退出的功能。
3、8255的工作方式:
一片8255内部有3个端口,A口可以工作在方式0、方式1或方式2,B口可以工作在方式0、方式1,C口可以工作在方式0。
方式0是基本型输入输出。
这种方式和外设交换数据时,8255端口与外设之间不使用联络线。
方式1为选通型输入输出。
用这种方式和外界交换数据时,端口和外设之间要有联络信号。
方式2是双向数据传送,仅A口有这项功能。
当A口工作在方式2时,B口仍可以工作在方式0或方式1,但此时B口方式1只能用查询方式与CPU交换信息。
2.工作方式选择字
8255工作方式选择字共8位(如图),存放在8255控制寄存器中。
最高位D7为标志位,D7=1表示控制寄存器中存放的是工作方式选择字,D7=0表示控制寄存器中存放的是C口置位复位控制字。
3.C口置复位控制字
8255的C口可进行位操作,即:
可对8255C口的每一位进行置位或清零操作,该操作是通过设置C口置复位字实现的(图8-10)。
C口置复位字共8位,各位含义如下:
3.8255A的控制信号与传输动作的对应关系
4.命令字与初始化编程
8255有两个命令字,即方式选择控制字和C口置0置1控制字,初始化编程的步骤是:
①向8255控制寄存器写入“方式选择控制字”,从而预置端口的工作方式。
②当端口预置为方式1或方式2时,再向控制寄存器写入“C口置0置1控制字”。
这一操作的主要目的是使相应端口的中断允许触发器置0,从而禁止中断,或者使相应端口的中断允许触发器置1,从而允许端口提出中断请求。
注意:
“C口置0置1控制字”虽然是对C口进行操作,但是该控制字是命令字,所以要写入控制寄存器,而不是写入C口控制寄存器。
③向8255数据寄存器写入“数据”或从8255数据寄存器读出“数据”
通过测试A端口地址E800H
B端口地址E801H
C端口地址E802H
控制地址E803H
具体程序框图如下:
静态显示的流程图:
程序源代码如下。
1、静态显示学号
SHOWDB0F4H,021H,0EDH,039H,0F1H,0FDH;
"
2"
"
1"
0"
4"
3"
8"
COUNTEQU$-SHOW
CATDB01H
DW100HDUP(?
CODESEGMENT
CODE,DS:
DATA,SS:
STARTPROCFAR
PUSHDS
XORAX,AX
PUSHAX
MOVAX,DATA
NEXT:
LEABX,SHOW
MOVCAT,01H;
设置选通信号
AGAIN:
MOVAL,80H;
设置控制位
MOVDX,0E803H
MOVAL,CAT
MOVDX,0E801H
OUTDX,AL;
B口位选输出
MOVAL,[BX]
MOVDX,0E800H;
A口数码管输出
MOVAL,00H;
灭灯
MOVDX,0E800H
INCBX
SHLCAT,1
LOOPAGAIN;
将6位学号都显示
MOVAH,0BH;
检测是否有请求停止的键盘输入
ORAL,AL
JZNEXT
STARTENDP
ENDSTART
代码具体分析如下:
程序的实现思路是很明确而简单的,首先对8255A进行初始化,设置控制字,随即开始扫描数码管,这里使用了一个八位寄存器,赋值为一位为1,其余全零,依靠移位容易实现不同时刻亮不同的数码管,且每次只亮一个数码管,其余管熄灭。
亮灯的管查找显示该位应该显示的数字,每个数码管亮灯之后暂留一定的时间,依靠DELAY子程序来实现。
每次扫描六个管,然后反复,即可利用视觉暂留效应产生静态显示学号的功能。
在显示了每一位数之后,调用KEY子程序检测计算机键盘的状态,如果有任意键按下,则视为程序退出指令,终止程序并返回DOS,如果没有键按下,则跳回继续循环扫描。
3、六位数码管动态显示
数码管动态显示“HELLO”字符串,相当于每次显示6位静态字符串,然后显示一定的时间间隔之后,显示另外6位静态字符串。
其核心代码和静态显示并无差别,可将静态显示学号的代码作为一个子程序封装起来直接使用。
需要增加的只是在一定的时间间隔内去移位读取“HELLO”字符串中需要显示的部分。
实际实现时可以存储为码表的形式,移位往后读取即可。
可以在移位读取前通过读取拨码开关的状态,获得控制信息,比如暂停、速度变化等。
程序框图如下:
程序源代码如下:
3、按键显示学号
LEDDB0EDH,0EDH,0EDH,0EDH,0EDH,0EDH;
内存单元存入初值
AADB7FH;
C口的初始值
CATDB01H
COUNTDB06H
DB100DUP(?
CODE,SS:
STACK,DS:
DATA
DELAYPROCNEAR;
短延时过程
MOVCX,0FFFFH
WAIT1:
LOOPWAIT1
DELAY1PROCNEAR;
长延时过程定义
MOVCX,2FFH
WAIT3:
MOVCX,0FFFFH;
按键防抖延时
WAIT2:
LOOPWAIT2
LOOPWAIT3
DELAY1ENDP
PUSHKEYPROCFAR;
按键检测过程
MOVAL,81H;
给8255赋控制字
MOVDX,0E803H
MOVDX,0E802H;
DX赋为B口
MOVCX,4;
设置行循环四次
MOVAA,7FH;
检测赋初值
LOOP0:
MOVAL,AA
读出C口数据
C口高位赋值
INAL,DX;
取出C口低位值
CMPAL,0E7H;
比较是否是0
JNZY1;
不是0跳到1
Y0:
MOVDL,0EDH;
MOV[DI],DL
CALLDELAY1
INCDI
JMPTC
Y1:
CMPAL,0EBH
JNZY2
MOVDL,21H;
Y2:
CMPAL,0EDH
JNZY3
MOVDL,0F4H;
Y3:
CMPAL,0EEH
JNZY4
MOVDL,0F1H;
Y4:
CMPAL,0D7H
JNZY5
MOVDL,39H;
RORAA,1
LOOPLOOP0
Y5:
CMPAL,0DBH
JNZY6
MOVDL,0D9H;
Y6:
CMPAL,0DDH
JNZY7
MOVDL,0DDH;
Y7:
CMPAL,0DEH
JNZY8
MOVDL,61H;
Y8:
CMPAL,0B7H
JNZY9
MOVDL,0FDH;
Y9:
CMPAL,0BBH
JNZNEXT;
不是9跳出
MOVDL,0F9H;
INCDI;
标志位加一
JMPTC;
跳出过程
TC:
PUSHKEYENDP
START:
MOVDX,SEGLED;
主程序显示
MOVDS,DX
MOVSI,OFFSETLED
MOVDI,OFFSETLED
XORAH,AH
STA:
CALLPUSHKEY;
按键检测
MOVCAT,01H
MOVCOUNT,06H
MOVSI,OFFSETLED
MOVCX,280AH
MOVAL,80H
MOVDX,0E803H;
8255控制口赋值
SHOW:
DECCOUNT
MOVAL,CAT;
第一个数码管显示
MOVDX,0E801H
MOVAL,[SI];
打印第一个数
INCSI
CMPCOUNT,0
JNZSHOW
检测是否有按键退出
JZSTA
退出后使数码管熄灭
返回DOS
ENDSTART
代码的具体分析如下:
代码直接使用了本实验中六位数码管静态显示部分的代码,封装成为了DISP子程序,便于调用。
DISP子程序即为反复扫描显示静态字形的程序。
另外有DELAY作为延时子程序供调用。
这样主程序只要考虑把每个状态定义好,并以一定的时间间隔传递给DISP显示即可。
主程序中定义六种显示状态,分别对应于动态显示的六个画面,主程序中加入了拨码开关读取的代码,这样读入速度信息,依据速度信息置循环次数,用以控制显示速度。
四、心得建议
本次实验中,我们遭遇了一个困难——实验中使用的数码管的段码与平时不同,按照课本上的方式对应显示出来的并不是我们想
要的数字,通过反复的分析比对,最终我们确定了该数码管的显示规律,实现了显示对应数字。
本次实验相对第一次实验要复杂,但通过认真分析程序运行的流程,确认好输出输出的对应关系,我们还是成功完成了实验,进一步提高的自己的汇编语言编写能力以及硬件实验能力。
实验三8253计数器定时器的应用
学习掌握8253用作定时器的编程原理。
1.完成一个音乐发生器,通过蜂鸣器放出音乐,并在数码管上显示乐谱。
2.扩展部分:
利用小键盘实现弹琴功能,并显示弹奏的乐谱。
1、音乐发生器
由参考资料中的音符与频率对应表,根据计数器的性质,利用公式,使用MATLAB矩阵运算可以快速计算出七种音符在高中低音时计数器应该对应的计数值,如下表所示。
1(do)
2(re)
3(mi)
4(fa)
5(so)
6(la)
7(si)
低音
122
108
97
91
81
72
64
中音
61
54
48
45
40
36
32
高音
30
27
24
22
20
18
16
此次设计的音乐发生器主要实现了以下功能:
1.可演奏不同音阶的乐谱,音符间有节拍的控制和变化,因而音乐更加逼真;
2.放音同时可以同步显示出乐谱;
3.由表格形式给出乐谱,可调整性好,可以很容易更换乐谱。
本程序采用的是音符、节奏、音高以类似“三维数组”的方式组织,依靠当前播放的音符偏移值作为“下标”,容易一次性读取音符、节奏、音高信
息。
音符送往显示模块,节奏用于设定音符的延时,音高用于查找计数器的值。
2、8253初始化
使用8253前,要进行初始化编程。
初始化编程的步骤是:
①向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。
②向使用的计数器端口写入计数初值。
3.8253控制字
D7D6=00:
使用0号计数器