北邮信通院微机原理实验报告.docx

上传人:b****7 文档编号:9659461 上传时间:2023-02-05 格式:DOCX 页数:37 大小:232.75KB
下载 相关 举报
北邮信通院微机原理实验报告.docx_第1页
第1页 / 共37页
北邮信通院微机原理实验报告.docx_第2页
第2页 / 共37页
北邮信通院微机原理实验报告.docx_第3页
第3页 / 共37页
北邮信通院微机原理实验报告.docx_第4页
第4页 / 共37页
北邮信通院微机原理实验报告.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

北邮信通院微机原理实验报告.docx

《北邮信通院微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《北邮信通院微机原理实验报告.docx(37页珍藏版)》请在冰豆网上搜索。

北邮信通院微机原理实验报告.docx

北邮信通院微机原理实验报告

(此文档为word格式,下载后您可任意编辑修改!

信息与通信工程学院

微机原理硬件实验报告

 

班级:

姓名:

学号:

序号:

日期:

实验一熟悉实验环境及IO的使用1

一、实验目的1

二、实验内容1

三、实验过程1

四、实验总结7

实验二8255A并行接口应用8

一、实验目的8

二、实验内容8

三、实验过程8

四、实验总结20

实验三8253计数器定时器的应用21

一、实验目的21

二、实验内容21

三、实验过程21

四、实验总结28

实验四串行口8251A实验30

一、实验目的30

二、实验内容30

三、实验过程36

实验一熟悉实验环境及IO的使用

一、实验目的

1.通过实验了解和熟悉实验台的结构,功能及使用方法。

2.通过实验掌握直接使用Debug的I、O命令来读写IO端口。

3.学会Debug的使用及编写汇编程序。

二、实验内容

1.学习使用Debug命令,并用I、O命令直接对端口进行读写操作。

2.用汇编语言编写跑马灯程序。

实现功能:

A.通过读入端口状态,选择工作模式(灯闪烁方式、速度等);

B.通过输出端口控制灯的工作状态(低电平灯亮)。

三、实验过程

1.在Debug下,用I是命令读输入端口的状态,即拨码开关的状态,用O命令向端口输出数据,通过发光管来查看。

测试结果:

A.使用命令:

E8E0读取开关状态,得出的结果是从左低右高,即是低位,是高位。

B.使用命令:

OE8E0测试数码管的低位,改变输入的值可依次测试各个数码管是否正常。

七段数码管左边为高位,右边为低位。

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

MOVCOUNT,CX

NEXT1:

TESTAL,04H;S2,控制方向

JZRIGHT

LEFT:

MOVDX,0E8E0H

MOVAL,0FEH

OUTDX,AL

LEFT1:

ROLAL,1;跑马灯算法

MOVSHOW,AL;暂存AL

OUTDX,AL

CALLDELAY

MOVAL,0FFH

OUTDX,AL

CALLDELAY

MOVAL,SHOW

JMPSTART0

JMPEXIT

RIGHT:

MOVDX,0E8E0H

MOVAL,7FH

OUTDX,AL

RIGHT1:

RORAL,1;跑马灯算法

MOVSHOW,AL;暂存AL

OUTDX,AL

CALLDELAY

MOVAL,0FFH

OUTDX,AL

CALLDELAY

MOVAL,SHOW

JMPSTART0

JMPEXIT

EXIT:

MOVAX,4C00H

INT21H

DELAYPROC;延迟程序

PUSHCX

MOVCX,COUNT

LOOP1:

PUSHCX

MOVCX,0EFFFH

LOOP2:

LOOPLOOP2

POPCX

LOOPLOOP1

POPCX

RET

DELAYENDP

CODEENDS

ENDBEGIN

2、跑马灯程序二.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

MOVCOUNT,CX

NEXT1:

TESTAL,04H;S2,控制灯方向

JZRIGHT

LEFT:

MOVDX,0E8E0H;左移时仍然是跑马灯

MOVAL,0FEH

OUTDX,AL

LEFT1:

ROLAL,1

MOVSHOW,AL;暂存AL

OUTDX,AL

CALLDELAY

MOVAL,0FFH

OUTDX,AL

CALLDELAY

MOVAL,SHOW

JMPSTART0

JMPEXIT

RIGHT:

PUSHCX;右移时灯从两边左右交替移到中间

MOVCX,0

MOVDX,0E8E0H

MOVAL,7FH

OUTDX,AL

CALLDELAY

RIGHT1:

INCCX

ROLAL,CL;先左移

MOVSHOW,AL

OUTDX,AL

CALLDELAY

MOVAL,0FFH

OUTDX,AL

CALLDELAY

MOVAL,SHOW

INCCX

RORAL,CL;再右移

MOVSHOW,AL

OUTDX,AL

CALLDELAY

MOVAL,0FFH

OUTDX,AL

CALLDELAY

MOVAL,SHOW

JMPSTART0

JMPEXIT

EXIT:

MOVAX,4C00H;返回DOS

INT21H

DELAYPROC;延迟子程序

PUSHCX

MOVCX,COUNT

LOOP1:

PUSHCX

MOVCX,0EFFFH;COUNT

LOOP2:

LOOPLOOP2

POPCX

LOOPLOOP1

POPCX

RET

DELAYENDP

CODEENDS

ENDBEGIN

四、心得体会

这是本学期第一次微机原理硬件实验,也是我们与汇编语言的第一次亲密接触,而所编写的程序与硬件的紧密结合也让我们对汇编语言有了更深一层的领悟。

跑马灯是一个非常经典的实验,我们也曾经用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的编码,如下表所示。

字形

0

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、静态显示学号

DATASEGMENT

SHOWDB0F4H,021H,0EDH,039H,0F1H,0FDH;"2","1","0","4","3","8"

COUNTEQU$-SHOW

CATDB01H

DATAENDS

STACKSEGMENTSTACK'STACK'

DW100HDUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

STARTPROCFAR

PUSHDS

XORAX,AX

PUSHAX

MOVAX,DATA

MOVDS,AX

NEXT:

MOVCX,COUNT

LEABX,SHOW

MOVCAT,01H;设置选通信号

AGAIN:

MOVAL,80H;设置控制位

MOVDX,0E803H

OUTDX,AL

MOVAL,CAT

MOVDX,0E801H

OUTDX,AL;B口位选输出

MOVAL,[BX]

MOVDX,0E800H;A口数码管输出

OUTDX,AL

MOVAL,00H;灭灯

MOVDX,0E800H

OUTDX,AL

INCBX

SHLCAT,1

LOOPAGAIN;将6位学号都显示

MOVAH,0BH;检测是否有请求停止的键盘输入

INT21H

ORAL,AL

JZNEXT

RET

STARTENDP

CODEENDS

ENDSTART

代码具体分析如下:

程序的实现思路是很明确而简单的,首先对8255A进行初始化,设置控制字,随即开始扫描数码管,这里使用了一个八位寄存器,赋值为一位为1,其余全零,依靠移位容易实现不同时刻亮不同的数码管,且每次只亮一个数码管,其余管熄灭。

亮灯的管查找显示该位应该显示的数字,每个数码管亮灯之后暂留一定的时间,依靠DELAY子程序来实现。

每次扫描六个管,然后反复,即可利用视觉暂留效应产生静态显示学号的功能。

在显示了每一位数之后,调用KEY子程序检测计算机键盘的状态,如果有任意键按下,则视为程序退出指令,终止程序并返回DOS,如果没有键按下,则跳回继续循环扫描。

3、六位数码管动态显示

数码管动态显示“HELLO”字符串,相当于每次显示6位静态字符串,然后显示一定的时间间隔之后,显示另外6位静态字符串。

其核心代码和静态显示并无差别,可将静态显示学号的代码作为一个子程序封装起来直接使用。

需要增加的只是在一定的时间间隔内去移位读取“HELLO”字符串中需要显示的部分。

实际实现时可以存储为码表的形式,移位往后读取即可。

可以在移位读取前通过读取拨码开关的状态,获得控制信息,比如暂停、速度变化等。

程序框图如下:

程序源代码如下:

3、按键显示学号

DATASEGMENT

LEDDB0EDH,0EDH,0EDH,0EDH,0EDH,0EDH;内存单元存入初值

AADB7FH;C口的初始值

CATDB01H

COUNTDB06H

DATAENDS

STACKSEGMENTSTACK'STACK'

DB100DUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,SS:

STACK,DS:

DATA

DELAYPROCNEAR;短延时过程

PUSHCX

MOVCX,0FFFFH

WAIT1:

LOOPWAIT1

POPCX

RET

DELAYENDP

DELAY1PROCNEAR;长延时过程定义

PUSHCX

MOVCX,2FFH

WAIT3:

PUSHCX

MOVCX,0FFFFH;按键防抖延时

WAIT2:

LOOPWAIT2

POPCX

LOOPWAIT3

POPCX

RET

DELAY1ENDP

PUSHKEYPROCFAR;按键检测过程

MOVAL,81H;给8255赋控制字

MOVDX,0E803H

OUTDX,AL

MOVDX,0E802H;DX赋为B口

AGAIN:

MOVCX,4;设置行循环四次

MOVAA,7FH;检测赋初值

LOOP0:

MOVAL,AA

MOVDX,0E802H;读出C口数据

OUTDX,AL;C口高位赋值

INAL,DX;取出C口低位值

CMPAL,0E7H;比较是否是0

JNZY1;不是0跳到1

Y0:

MOVDL,0EDH;0

MOV[DI],DL

CALLDELAY1

INCDI

JMPTC

Y1:

CMPAL,0EBH

JNZY2

MOVDL,21H;1

MOV[DI],DL

CALLDELAY1

INCDI

JMPTC

Y2:

CMPAL,0EDH

JNZY3

MOVDL,0F4H;2

MOV[DI],DL

CALLDELAY1

INCDI

JMPTC

Y3:

CMPAL,0EEH

JNZY4

MOVDL,0F1H;3

MOV[DI],DL

CALLDELAY1

INCDI

JMPTC

Y4:

CMPAL,0D7H

JNZY5

MOVDL,39H;4

MOV[DI],DL

CALLDELAY1

INCDI

JMPTC

NEXT:

RORAA,1

LOOPLOOP0

JMPTC

Y5:

CMPAL,0DBH

JNZY6

MOVDL,0D9H;5

MOV[DI],DL

CALLDELAY1

INCDI

JMPTC

Y6:

CMPAL,0DDH

JNZY7

MOVDL,0DDH;6

MOV[DI],DL

CALLDELAY1

INCDI

JMPTC

Y7:

CMPAL,0DEH

JNZY8

MOVDL,61H;7

MOV[DI],DL

CALLDELAY1

INCDI

JMPTC

Y8:

CMPAL,0B7H

JNZY9

MOVDL,0FDH;8

MOV[DI],DL

CALLDELAY1

INCDI

JMPTC

Y9:

CMPAL,0BBH

JNZNEXT;不是9跳出

MOVDL,0F9H;9

MOV[DI],DL

CALLDELAY1

INCDI;标志位加一

JMPTC;跳出过程

TC:

RET

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控制口赋值

OUTDX,AL

SHOW:

DECCOUNT

MOVAL,CAT;第一个数码管显示

MOVDX,0E801H

OUTDX,AL

MOVAL,[SI];打印第一个数

MOVDX,0E800H

OUTDX,AL

CALLDELAY

INCSI

SHLCAT,1

CMPCOUNT,0

JNZSHOW

MOVAH,0BH;检测是否有按键退出

INT21H

ORAL,AL

JZSTA

EXIT:

MOVAL,00H;退出后使数码管熄灭

MOVDX,0E801H

OUTDX,AL

MOVAX,4C00H;返回DOS

INT21H

CODEENDS

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号计数器

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 电大

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1