最新范文 方案 计划 总结 报告 体会 事迹 讲话 倡议书 反思 制度 入党

微机原理与接口技术单片机软件报告

日期:2021-01-20  类别:最新范文  编辑:一流范文网  【下载本文Word版

微机原理与接口技术单片机软件报告 本文关键词:微机,单片机,接口,原理,报告

微机原理与接口技术单片机软件报告 本文简介:实验报告课程名称:___微机原理与接口技术_指导老师:_____________成绩:__________________实验名称:__单片机软件实验_____一、实验目的和要求(必填)二、实验内容和原理(必填)三、主要仪器设备(必填)四、操作方法和实验步骤五、实验数据记录和处理六、实验结果与分析(

微机原理与接口技术单片机软件报告 本文内容:

实验报告

课程名称:___微机原理与接口技术_指导老师:_____________成绩:__________________

实验名称:__

单片机软件实验

_____

一、实验目的和要求(必填)二、实验内容和原理(必填)

三、主要仪器设备(必填)四、操作方法和实验步骤

五、实验数据记录和处理六、实验结果与分析(必填)

七、讨论、心得

线

实验一、内存操作

一、

实验目的

a)

掌握数据传送指令;

b)

掌握各种数据传送指令的寻址方式;

c)

熟练运用keil

环境对汇编程序进行调试;

d)

掌握数据传送、复制等程序的设计与调试方法。

二、

实验内容

基础型实验内容

1、

下列程序的功能是给外部RAM8000~80FFH的256个单元的内容赋值,赋值的内容取决于程序中A的赋值。在Keil环境运行该程序,并观察寄存器及内存单元的变化

2、

下列程序将3000H起始的256个字节存储块移动到4000H起始的256个字节存储块,在Keil环境运行如下程序,观察寄存器及存储单元的变化。

设计型实验内容

1、

在keil环境修改内部RAM

30H

~3FH的内容分别为#00H-#0FH,设计程序实现将内部RAM30H-3FH到40H-4FH的数据块拷贝。

2、

在keil环境修改内部RAM

30H

~3FH的内容分别为#00H-#0FH,设计程序实现将片内30H~3FH单元的内容复制到片外1030H~103FH中。

3、

在keil环境修改内部RAM

30H

~3FH的内容分别为#00H-#0FH,设计程序实现将内部RAM30H

~3FH内容逆序拷贝到外部数据XRAM:0000H

~000FH中。使用单步、断点方式调试程序,查看特殊功能寄存器、内部数据RAM、外部数据空间的变化。

三、

实验设备

计算机一台

四、

实验代码

基础型

1、

ORG

0000H

START

EQU

8000H

MAIN:

MOV

DPTR,#START

;起始地址

MOV

R0,#0

;设置256字节计数值

MOV

A,#1H

Loop:

MOVX

@DPTR,A

INC

DPTR

;指向下一个地址

DJNZ

R0,Loop

;计数值减一

NOP

SJMP

$

END

2、

ORG

0000H

MOV

DPTR,#3000H

MOV

A,#01H

MOV

R5,#0

;设置256字节计数值

LOOP:

MOVX

@DPTR,A

INC

DPTR

DJNZ

R5,LOOP

MOV

R0,#30H

MOV

R1,#00H

MOV

R2,#40H

MOV

R3,#00H

MOV

R7,#0

LOOP1:

MOV

DPH,R0

MOV

DPL,R1

;外部地址

MOVX

A,@DPTR

MOV

DPH,R2

MOV

DPL,R3

MOVX

@DPTR,A

INC

R1

INC

R3

DJNZ

R7,LOOP1

SJMP

$

END

设计型

1、

ORG

0000H

MAIN:MOVR2,#10H

;循环次数赋值

MOV

A,#00H

MOVR1,#30H

LOOP1:[email protected],A

INC

R1

INC

A

DJNZ

R2,LOOP1

;计数值减1

MOV

R2,#10H

;循环次数重新赋值

MOVR1,#30H

MOV

R0,#40H

;赋值完成

LOOP2:MOV

A,@R1

[email protected],A

INC

R1

INC

R0

DJNZR2,LOOP2

;拷贝完成

LJMP

1000H

END

2、

ORG

1000H

MAIN:MOV

R2,#10H

;循环次数赋值

MOV

A,#00H

MOV

R1,#30H

LOOP3:MOV

@R1,A

INC

R1

INC

A

DJNZ

R2,LOOP3

;计数值减1

MOV

R2,#10H

;循环次数重新赋值

MOV

DPTR,#1030H

MOV

R1,#30H

;赋值完成

LOOP4:MOV

A,@R1

MOVX

@DPTR,A

INC

R1

INC

DPTR

DJNZ

R2,LOOP4

;拷贝完成

LJMP

2000H

END

3、

ORG

2000H

MAIN:MOV

R2,#10H

;循环次数赋值

MOV

A,#00H

MOV

R1,#30H

LOOP5:MOV

@R1,A

INC

R1

INC

A

DJNZ

R2,LOOP5

;计数值减1

MOV

R2,#10H

;循环次数重新赋值

MOV

R1,#3FH

MOV

DPTR,#0000H

CLR

C

LOOP6:MOV

A,@R1

MOVX

@DPTR,A

DEC

R1

;减一,实现逆序

INC

DPTR

DJNZ

R2,LOOP6

SJMP

$

END

五、

实验结果

基础型

1、

2、

X:3000H

X:4000H

设计型

1、

2、

3、

六、

讨论心得

这次实验主要熟悉了keil环境的使用,简单练习了循环语句、赋值语句、对外部存储器的读取与赋值等,比较基础,主要积累经验。开始认识到代码规范、注释的重要性,以后注意。

实验二、数制与代码转换

一、

实验目的

a)

了解微机系统中的数制与代码表示方法;

b)

掌握计算机中使用的各种代码转换方法;

c)

掌握实现分支、循环的指令及其程序的编写方法;

二、

实验内容

基础型实验内容

1、

以下程序完成单字节的ASCII码到十六进制数转换,完成空白处程序填写,并在Keil环境运行程序,观察寄存器及内存单元的变化。

2、

以下程序完成单字节的BCD码到十六进制数转换,,在Keil环境运行程序,观察寄存器及内存单元的变化。

3、

以下程序将单字节十六进制数A的值转换为十进制数,存放在30H~32H中,完成空白处程序填写,并在Keil环境运行程序,观察寄存器及内存单元的变化。

设计型实验内容

1、

设一串字母的ASCII存于30H起始的单元中,设计程序判断字母是否为大写字母,是则将大写字母的ASCII字符转换成小写字母的ASCII字符,为小写则不转换。

2、

将单字节十六进制数D8H转换为十进制数,存放在30H~33H中。,

3、

设计程序,将十六进制数614EH转换成ASCII码,使用单步、断点方式调试程序,查看结果。

三、

实验设备

计算机一台

四、

实验代码

基础型

1、

RESULT

EQU

30H

ORG

0000H

MOV

A,#41H;“A”的ASCII码

CLR

C

SUBB

A,#37H

;

转换为十六进制

A

MOV

RESULT,A

LJMP

1000H

END

2、

RESULT

EQU

30H

ORG

1000H

MOV

A,#23H

MOV

R0,A

ANL

A,#0F0H

SWAP

A

MOV

B,#0AH

MUL

AB

MOV

RESULT,A

;转换高位

MOV

A,R0

MOV

B,#0FH

ANL

A,B

ADD

A,RESULT

MOV

RESULT,A

;

转换低位

LJMP

2000H

END

3、

RESULT

EQU

30H

ORG

2000H

MOV

A,#7BH

MOV

B,#64H

DIV

AB

MOV

RESULT,A

;除以100得百位数

MOV

A,B

MOV

B,#0AH

DIV

AB

MOV

RESULT+1,A

;除以10得十位数

MOV

RESULT+2,B

;余数为个位数

SJMP

$

END

设计型

1、

ORG

0000H

MOV

R0,#30H

MOV

30H,#41H

MOV

31H,#42H

MOV

32H,#43H

MOV

33H,#61H

MOV

34H,#62H

MOV

35H,#63H

L0:CJNE

@R0,#0,SUB1

LJMP

1000H

SUB1:

ACALL

HASC1

INC

R0

LJMP

L0

ORG

0200H;子程序:将大写字母ASCII码转换为小写字母ASCII码

HASC1:

CJNE

@R0,#41H,L1

;与A的ASCII码比较

MOV

@R0,#61H

RET

L1:

JC

L2

CJNE

@R0,#56H,L3

;与Z的ASCII码比较

MOV

@R0,#75H

RET

L2:RET

L3:JC

L4

RET

L4:MOV

A,@R0

;A与Z之间则转换为小写

ADD

A,#20H

MOV

@R0,A

RET

END

2、

RESULT

EQU

30H

ORG

1000H

MOV

A,#0D8H

MOV

B,#64H

DIV

AB

MOV

RESULT+1,A

;除以100得百位数

MOV

A,B

MOV

B,#0AH

DIV

AB

MOV

RESULT+2,A

;除以10得十位数

MOV

RESULT+3,B

;余数为个位数

LJMP

2000H

END

3、

ORG

2000H

MOV

30H,#61H

MOV

31H,#4EH

MOV

R1,#40H

MOV

R0,#30H

MOV

R2,#2

L5:MOV

A,@R0

MOV

B,#0F0H

ANL

A,B

SWAP

A

ACALL

HASC2

INC

R1

MOV

A,@R0

MOV

B,#0FH

ANL

A,B

ACALL

HASC2;调用子程序:将十六进制数转换为ASCII码

INC

R1

INC

R0

DJNZ

R2,L5

SJMP

$

HASC2:

CJNE

A,#0AH,L6

;与A的十六进制数比较

MOV

@R1,#41H

RET

L6:JC

L7

ADD

A,#37H

;0~9的数字加#37H

MOV

@R1,A

RET

L7:

ADD

A,#30H

;A~F的数字加#30H

MOV

@R1,A

RET

END

五、

实验结果

基础型

1、ASCII码41H为十六进制数0AH

3、

BCD码为23H的十六进制数为17H

3、十六进制数7BH转换为十进制数为123

设计型

1、

给30H及之后的地址赋值ABCabc的ASCII码

将大写字母转换为小写字母

2、将单字节十六进制数

D8H

转换为十进制数,存放在

30H~33H

3、十六进制数

614EH存放在30H、31H,转换后的ASCII码在40H到43H

六、

讨论心得

这次实验学习的内容主要是十六进制数、十进制BCD码、ASCII码之间的转换,以及子程序的书写与调用。对于判断是否为十六进制数、大小写字母,主要使用CJNE然后根据C的大小来判断比给定数大还是小,对于判断是否在一个区间需要使用两个CJNE来进行。

10

篇2:微机原理期末考试重点总结

微机原理期末考试重点总结 本文关键词:微机,期末考试,原理,重点

微机原理期末考试重点总结 本文简介:把寻找操作数的方式叫做(操作数)寻址方式立即数寻址方式寄存器寻址方式存储器寻址方式1、直接寻址方式2、寄存器间接寻址方式3、寄存器相对寻址方式4、基址变址寻址方式5、相对基址变址寻址方式微处理器的定义微处理器即中央处理单元,采用大规模集成电路技术制成的半导体芯片,内部集成了计算机的主要部件:控制器、

微机原理期末考试重点总结 本文内容:

把寻找操作数的方式叫做(操作数)寻址方式

立即数寻址方式

寄存器寻址方式

存储器寻址方式

1、直接寻址方式

2、寄存器间接寻址方式

3、寄存器相对寻址方式

4、基址变址寻址方式

5、相对基址变址寻址方式

微处理器的定义

微处理器即中央处理单元,采用大规模集成电路技术制成的半导体芯片,内部集成了计算机的主要部件:控制器、运算器、寄存器组。微处理器通过执行指令序列完成指定的操作,处理器能够执行全部指令的集合就是该处理器的指令系统。

微机的总线结构的好处,使用特点。包括总线定义,分类。

总线定义:指传递信息的一组公用导线,

总线结构的好处:总线结构使得微机系统组态灵活,扩展方便。

使用特点:在某个时刻只有一个总线主控设备控制系统总线。

某一时刻只能有一个设备向总线发送信号,但可以有多个设备同时从总线上获取信号。

总线按传输信号可以分为

数据总线(用于CPU与其他部件之间传递信息,具有三态功能,且是双向的)、

地址总线(用于传递CPU要访问的存储单元或I/O接口的地址信号)、

控制总线(连接CPU的控制部件和内存、I/O设备等,用来控制内存和I/O设备的全部工作)

冯×诺依曼存储程序工作原理

1、

将采取二进制形式表示数据和指令。指令由操作码和地址码组成

2、

将程序和数据存放在存储器中,计算机在工作时从存储器取出指令加以执行,自动完成计算任务。

3、

指令的执行是顺序的,即一般按照指令在存储器中存放的顺序执行,程序分支由转移指令实现。

4、

计算机由存储器、运算器、控制器、输入设备和输出设备五大基本部件组成,并规定了各部件的基本功能。

8086微处理器的构成、每一个T状态的主要工作。基本的存储读、写总线周期构成。常用的控制信号。

总线周期是指CPU通过总线与外部(存储器或I/O端口)进行一次数据交换的过程,即完成一次总线操作的时间

指令周期是指一条指令经取指、译码、操作数读写直到指令完成所需要的时间。

存储器读总线周期:T1状态——输出存储器的地址

T2状态——输出控制信号-RD,选通存储器;DEN信号,选通数据收发器

T3和Tw状态——检测数据传送是否能够完成

T4状态——前沿读取数据,完成数据传送

存储器写总线周期:T1状态——输出20位存储器地址A19~

A0

T2状态——

-WR信号有效,-DEN信号有效以输出数据D7~D0

T3和Tw状态——

-WR、-DEN等控制信号持续有效,T3时钟下降沿检测READY信号,决定是否插入Tw;Tw期间,各信号延续状态。

T4状态——完成数据传送,并准备过渡到下一操作。-WR、-DEN转为无效。

常用的控制信号:

ALE地址锁存允许,输出、三态、高电平有效

IO/-M:I/O或存储器访问,输出、三态

-WR:写控制,输出、三态、低电平有效

-RD:读控制,输出、三态、低电平有效

INTR、-INTA等

存储器地址的译码问题

全译码:

所有的系统地址线均参与对存储单元的译码寻址

特点:采用全译码,每个存储单元的地址都是唯一的,不存在地址重复

译码电路可能比较复杂、连线也较多

部分译码:

只有部分(高位)地址线参与对存储芯片的译码

特点:每个存储单元将对应多个地址(地址重复),需要选取一个可用地址

可简化译码电路的设计、但系统的部分地址空间将被浪费

存储芯片为什么要设置片选信号?它与系统地址总线有哪些连接方式?采用何种连接方式可避免地址重复?采用哪些连接方式可节省用于译码的硬件?

解答:

片选信号说明该存储器芯片是否被选中正常工作,设置它可以比较方便地实现多个存储器芯片组成大容量的存储空间

存储器片选信号通常与CPU地址总线的高位地址线相关联,可以采用“全译码”、“部分译码”、“线选译码”方式

采用全译码方式可以避免地址重复

采用部分或线选译码可以节省译码硬件

8086微处理器的内部结构,EU、BIU的定义和作用,流水线。

BIU(总线接口单元):由指令队列、指令指针、段寄存器、地址加法器和总线控制逻辑构成。该单元管理着8088与系统总线的接口、负责CPU对存储器和外设进行访问。

EU(执行单元):由ALU、通用寄存器、标志寄存器和指令译码逻辑等构成,它负责指令的译码、执行和数据的运算。

两个单元相互独立,分别完成各自操作。两个单元可以并行执行,实现指令取指和执行的流水线操作

8086的寻址方式。物理地址和逻辑地址的定义。两者之间转换。8086系统存储器采用分段管理方式。(要求很熟练)

对于每个存储器单元都有一个唯一的20位地址,称为物理地址。

在8088的总线内部和用户编程时,所采用的“段地址:偏移地址”形式,称为逻辑地址。

一个存储器单元可以拥有多个逻辑地址,但可能拥有唯一的物理地址。

转换过程:先将段寄存器提供的16位段地址左移四位,低位补0,恢复为20位地址,然后与由各种寻址方式提供的16位偏移地址相加,即得到20位的物理地址。

8086微处理器的内部构成。8086的寄存器结构,标志寄存器中每一个标志位的含义及应用。8086复位时各寄存器的初始状态。

内部构成:算术逻辑单元(运算器)、寄存器组、指令处理单元(控制器)

寄存器结构:8086/8088共有8个的通用寄存器,1个标志寄存器,4个段寄存器和1个指令指针寄存器。

进位标志

CF:计算结果的最高有效位有进位,则CF=1,否则CF=0

溢出标志

OF:若算术运算的结果有溢出,则OF=1;否则

OF=0

全零标志位

ZF:若运算结果为全0,则ZF=1,否则ZF=0

符号标志

CF:运算结果最高位为1,则SF=1;否则SF=0

奇偶标志位

PF:当运算结果最低字节中1的个数为零或偶数时,PF=1;否则PF=0(奇校验)

辅助进位标志

AF:运算时D3位(低半字节)有进位或借位时,AF=1;否则AF=0

方向标志

DF:存储地址自动增加,DF=1,否则DF=0

中断允许标志:

IF=1,则允许中断,IF=0,则禁止中断

陷阱标志TF:

TF=0,处理器正常工作;TF=1,处理器每执行一条指令就中断一次

中断向量表。掌握中断向量表的构成,计算中断类型号,中断服务程序入口地址。中断的工作过程。

中断向量表是一种表数据结构,是中断向量号与其对应的中断服务程序入口之间的链接表。该地址包括:偏移地址IP

、段地址CS

(共32位)

每个中断向量的低字是偏移地址、高字是段地址,需占用4个字节(低对低,高对高)。

8088

微处理器从物理地址000H开始到3FFH(1KB),依次安排各个中断向量,向量号从0到255。256个中断向量所占用的1KB区域,称中断向量表

中断向量的存放首址=N*4

中断类型:

8088

CPU具有哪些中断类型?各种中断如何产生,如何得到中断向量号?

除法错中断:在执行除法指令时,除数为0或商超过了寄存器所能表达的范围产生

指令中断:在执行中断指令INT

n时产生

溢出中断:在执行溢出中断指令INTO时,溢出标志OF为1产生

单步中断:单步标志TF为1,在每条指令执行结束后产生

非屏蔽中断:外部通过NMI请求信号向微处理器提出请求时产生

可屏蔽中断:外部通过INTR请求信号向微处理器提出请求,并在允许可屏蔽中断的条件下产生

(2)除法错中断、溢出中断、单步中断、非屏蔽中断的向量号是8086微处理器内部已经确定

指令中断的操作数n就是向量号

可屏蔽中断的向量号在响应中断时通过数据总线从外部获得

什么是8259A的中断结束字(EOI)?

(1)IRi被响应时,ISR中对应的Di位被置1;

(2)中断处理完毕,相应的Di位应置0。

(3)向8259A送中断结束指令,使ISR的某位清0,指令的内容叫作中断结束字。

8259A中IRR、IMR和ISR三个寄存器的含义

中断请求寄存器IRR:

保存8条外界中断请求信号IR0~IR7的请求状态

Di位为1表示IRi引脚有中断请求;为0表示无请求

中断屏蔽寄存器IMR:

保存对中断请求信号IRi的屏蔽状态

Di位为1表示IRi中断被屏蔽(禁止);为0表示允许

中断服务寄存器ISR:

保存正在被8259A处理的中断的状态

Di位为1表示IRi中断正在处理中;为0表示没有被处理

中断的概念。中断向量表的含义。深入理解8259的工作方式,优先权设置、中断结束处理、中断源屏蔽、中断触发等等。8259的初始化编程。中断服务程序编写。

中断:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。

优先权设置:在ISR的

Di

位置位期间,禁止再发生同级和低级优先权的中断,但允许高级优先权中断的嵌套

中断结束处理:自动中断结束方式、普通中断结束方式、特殊中断结束方式;

中断向量表的含义:256个中断向量所占用的1KB区域,称中断向量表

计算机主机和I/O设备之间进行数据传送的方法。重点掌握查询方式完成数据传送的流程,要会编程。

查询传送的特点是:工作可靠,适用面宽,但传送效率低

查询输入接口(考电路):

代码如下:

mov

dx,8000h

;dx指向状态端口

Status:

in

al,dx

;读状态端口

test

al,01h

;测试标志位D0

jz

status

;D0=0,未就绪,继续查询

inc

dx

;D0=1,就绪,DX指向数据端口

in

al,dx

;从数据端口输入数据

中断传送:

中断传送是一种效率更高的程序传送方式;

中断过程的完成由中断系统(硬件,如8259和CPU)和中断服务程序(软件)共同控制完成

中断工作过程:

1、

中断请求(外设)

2、中断响应(CPU)

3、关中断(CPU)

4、断点保护(CPU)

5、中断识别(软件/硬件)

6、现场保护(用户)

7、中断服务(用户)

8、恢复现场(用户)

9、开中断(用户/CPU)

10、中断返回(IRET/用户)

最小组态的写总线周期时序:

如何限制只能输入小写字母(

61h~7Ah,课本P22),否则要求重新输入。

.data

msg

db

not

a

lowercase,input

again,db0dh,0ah,$

input:mov

ah,1;输入小写字母

int

21h

cmp

al,61h

jl

once-again

cmp

al,7Ah

ja

once-again

jmp

convert

once-again:

mov

dx,offset

msg

mov

ah,9

int

21h

jmp

input

convert:sub

al,20h

;转换为大写字母

……

采用查表法,实现一位16进制数转换为ASCII码显示

04h——34h(4)

0bh——42h(B)

ASCIIdb

30h,31h,32h,33h,34h,35h,36h,37h,38h,39h

;对应0

~

9的ASCII码

db

41h,42h,43h,44h,45h,46h

;对应A

~

F的ASCII码

hexdb

04h,0bh

;假设两个16进制数

;代码段

mov

bx,offset

ASCII

;BX指向ASCII码表

mov

al,hex

;AL取得一位16进制数;恰好就是ASCII码表中的位移

and

al,0fh

;只有低4位是有效的,高4位清0

xlat

;换码:AL←DS:[BX+AL]

mov

dl,al;欲显示的ASCII码送DL

mov

ah,2;2号DOS功能调用

int

21h;显示一个ASCII码字符

mov

al,hex+1;转换并显示下一个数据

and

al,0fh

xlat

mov

dl,al

mov

ah,2

int

21h

编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码值显示出来,如果按下ESC键则程序退出。(可调用书中的HTOASC子程序)

HTOASCproc

and

al,0fh

;al低四位保存待转;换的16进制数

cmp

al,9

jbe

htoasc1

add

al,37h

;是A

~

F,加37H

ret

;子程序返回

htoasc1:add

al,30h

;0

~

9,加30H

ret

;子程序返回

HTOASCendp

push

ax

mov

cl,4

ror

al,cl

call

HTOASC

call

disp_a_char

pop

ax

call

HTOASC

call

disp_a_char

把从键盘输入的一个小写字母用大写字母显示出来(大小写字母转换)。

mov

ah,1;输入小写字母

int

21h

sub

al,20h;转换为大写字母

mov

dl,al

mov

ah,2

int

21h;显示

写一个子程序,根据入口参数AL=0、1、2,依次实现对大写字母转换成小写、小写转换成大写或大小写字母互换。欲转换的字符串在string中,用0表示结束。

lucaseproc

push

bx

mov

bx,offset

string

cmp

al,0

je

case0

cmp

al,1

jz

case1

cmp

al,2

jz

case2

jmp

done

case0:cmp

byte

ptr

[bx],0

je

done

cmp

byte

ptr

[bx],’A’

jb

next0

cmp

byte

ptr

[bx],’Z’

ja

next0

add

byte

ptr

[bx],20h

next0:inc

bx

jmp

case0

case1:cmp

byte

ptr

[bx],0

je

done

cmp

byte

ptr

[bx],’a’

jb

next1

cmp

byte

ptr

[bx],’z’

ja

next1

sub

byte

ptr

[bx],20h

next1:inc

bx

jmp

case1

case2:cmp

byte

ptr

[bx],0

je

done

cmp

byte

ptr

[bx],’A’

jb

next2

cmp

byte

ptr

[bx],’Z’

ja

next20

add

byte

ptr

[bx],20h

jmp

next2

next20:cmp

byte

ptr

[bx],’a’

jb

next2

cmp

byte

ptr

[bx],’z’

ja

next2

sub

byte

ptr

[bx],20h

next2:inc

bx

jmp

case2

done:pop

bx

ret

lucaseendp

循环累加(调用子程序)

arraydb

12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h

countequ

$-array;数组元素个数

resultdb

?;校验和;代码段(主程序)

mov

bx,offset

array;BX←数组的偏移地址

mov

cx,count;CX←数组的元素个数

call

checksum;调用求和过程

mov

result,al;处理出口参数

checksumproc

xor

al,al;累加器清0

sum:add

al,[bx];求和

inc

bx;指向下一个字节

loop

sum

Ret

Checksum

endp

计算AX中有符号数的绝对值

cmp

ax,0

jge

nonneg;条件满足(AX≥0),转移

neg

ax;条件不满足,求补(即绝对值P43)

nonneg:

mov

result,ax;保存结果;不恰当的分支

cmp

ax,0

jl

yesneg;条件满足(AX<0),转移

jmp

nonneg

yesneg:neg

ax;条件满足,求补

nonneg:mov

result,ax;保存结果

设置两个变量maxay和minay存放最大和最小值

arraydw

10

dw

-3,0,20,900,587,-632,777,234,-34,-56

maxaydw

?;存放最大值

minaydw

?;存放最小值

lea

si,array

mov

cx,[si];取得元素个数

dec

cx;减1后是循环次数

add

si,2

mov

ax,[si]

mov

bx,ax

maxck:add

si,2

cmp

[si],ax;与下一个数据比较

jle

minck

mov

ax,[si];AX取得更大的数据

jmp

next

minck:cmp

[si],bx

jge

next

mov

bx,[si];BX取得更小的数据

next:loop

maxck;计数循环

mov

maxay,ax;保存最大值

mov

minay,bx;保存最小值

挑出数组中正数(不含0)和负数,分别形成正、负数组

DATAS

SEGMENT

count

equ

10

array

dw

23h,9801h…

ayplus

dw

count

dup(0)

ayminus

dw

count

dup(0)

DATAS

ENDS

STACKS

SEGMENT

STACKS

ENDS

CODES

SEGMENT

ASSUME

CS:CODES,DS:DATAS,SS:STACKS

START:

MOV

AX,DATAS

MOV

DS,AX

mov

si,offset

array

mov

di,offset

ayplus

mov

bx,offset

ayminus

mov

ax,ds

mov

es,ax

mov

cx,count

cld

again:

lodsw

cmp

ax,0

jl

minus

jz

next

minus:

xchg

bx,di

stosw

xchg

bx,di

next:

loop

again

MOV

AH,4CH

INT

21H

CODES

ENDS

END

START

8259A

的初始化程序段(7.8)

mov

al,13H

;写入ICW1:设定边沿触发方式,单片方式

mov

dx,0FFDCH

out

dx,al

jmp

intr1

intr1:mov

al,90H

;写入ICW2:设定IR0的中断向量号为90h

mov

dx,0FFDEH

out

dx,al

jmp

intr2

intr2:mov

al,1

;写入ICW4:设定普通嵌套方式,普通中断方式

mov

dx,0FFDEH

out

dx,al

8259的初始化编程:

主片:

mov

al,11h;写入ICW1

out

20h,al

intr1:mov

al,08h;写入ICW2

out

21h,al

intr2:mov

al,04h;写入ICW3

out

21h,al

intr3:mov

al,05h;写入ICW4

out

21h,al

从片:

mov

al,11h;写入ICW1

out

0a0h,al

intr5:mov

al,70h;写入ICW2

out

0a1h,al

intr6:mov

al,02h;写入ICW3

out

0a1h,al

intr7:mov

al,01h;写入ICW4

out

0a1h,al

试按如下要求分别编写8253的初始化程序,已知8253的计数器0~2和控制字I/O地址依次为204H~207H。⑶

使计数器2工作在方式2,计数值为02F0H。

mov

al,0b4h

mov

dx,207h

out

dx,al

mov

ax,02f0h

mov

dx,206h

out

dx,al

;先写入低字节

mov

al,ah

out

dx,al

;后写入高字节

8255的初始化编程

要求:A口:方式1输入、CH口:输出、CL口:输入、B口:方式0输出

方式控制字:1

0110

001

B或B1H

初始化的程序段:

mov

dx,0fffeh;假设控制端口为FFFEH

mov

al,0b1h;方式控制字

out

dx,al;送到控制端口

某系统中8253芯片中计数器的0-2和控制字端口地址分别是FFF0H~FFF3H。

编写8253两个计数器初始化程序及两个计数器的连通图。

计数器0的计数值:5M/1K=5000=1388H

方式控制字:00100101=25H、2DH、35H、3DH

(十进制计数)

00100100=24H、2CH、34H、3CH

(二进制计数)

计数器1的计数值:1000

方式控制字:01101001=69H、79H

(十进制计数)

01101000=68H、78H

(二进制计数)

MOV

DX,0FFF3H

MOV

AL,25H

;通道0,只写高字节,方式2,十进制

OUT

DX,AL

MOV

DX,0FFF0H

MOV

AL,50H

;计数初值5000

OUT

DX,AL

MOV

DX,0FFF3H

MOV

AL,69H

;通道1,方式4

OUT

DX,AL

MOV

DX,0FFF1H

MOV

AL,10H

;计数初值1000

OUT

DX,AL

3、某字符输出设备(如打印机),其数据口和状态口的地址均为80H。在读取状态时,当标志位D7=0时,表明该设备闲,可以接收一个字符,请编写利用查询方式进行数据传送的程序段。要求将存放于符号地址addr处的一串字符(以$为结束标志)输出给该设备。

mov

bx,offset

addr

;利用offset操作符,可在汇编过程中得到addr的偏移地址

again:mov

ah,[bx]

cmp

ah,’$’

jz

done

status:in

al,80h

;查询一次

test

al,80h

;两个80h不一样

jnz

status

;D7=1,表示设备忙,继续查询

mov

al,ah

out

80h,al

;输出一个字节

inc

bx

jmp

again

;循环

done:……

如图10.23为用一片8255A控制8个8段共阴极LED数码管的电路。现要求按下某个开关,其代表的数字(K1为1,K2为2,…K8为8)在数码管从左到右循环显示(已有一个延时子程序delay可以调用),直到按下另一个开关。假定8255A的数据端口A、B、C及控制端口的地址依次为FFF8H~FFFBH。编写完成上述功能的程序,应包括8255A的初始化、控制程序和数码管的显示代码表

;显示代码表

tabledb

0c0h;对应0(任意)

db

0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h

;对应1~8

;8255A初始化

mov

dx,0fffbh

mov

al,10001001b;=89h

out

dx,al

;控制程序

again0:mov

dx,0fffah;输入开关状态

in

al,dx

mov

cx,8;确定哪个开关闭合

mov

ah,01h;mov

ah,08h

again1:shr

al,1;shl

al,1

jnc

disp0

inc

ah;dec

ah

loop

again1

jmp

disp1;显示字段

disp0:mov

bx,offset

table

mov

al,ah

xlat

mov

dx,0fff8h

out

dx,al;输出段码

disp1:mov

cx,8;循环显示8位

mov

al,01h

mov

dx,0fff9h

disp2:out

dx,al;输出位码

call

delay

shl

al,1

loop

disp2

jmp

again0;写入方式字

mov

al,100×00×1b;=81h

mov

dx,控制口地址;0fffeh

out

dx,al;加入下一段更好,使L0~L3全亮

mov

al,0fh

mov

dx,端口C地址;0fffch

out

dx,al;控制程序段

mov

dx,端口C地址;0fffch

in

al,dx;读入PC0~PC3

mov

cl,4shl

al,cl;左移4位

out

dx,al;控制PC4~PC7

以8255的B口作输入口、连接逻辑电平开关;以8255的A口作输出口、连接发光二极管电路。要求:当输入不是全0时,输出与输入保持一致(即高电平时点亮);当输入是全0时,令发光二极管循环点亮(或闪烁告警)。

begin:

mov

dx,portc

;

8255

初始化

mov

al,82h

A组方式0,A口出,

B组方式0,B口入

out

dx,al

mov

ah,0ffh

mov

bl,0

lp:

mov

dx,portb

;

B

口读入开关状态

in

al,dx

test

al,ah

;与ffh比较,看是否8个开关全闭合(0信号)

jz

shift

mov

dx,porta

;

A

口输出开关状态

not

al

out

dx,al

jmp

lp

shift:

mov

al,bl

;bl初值为0

mov

dx,porta

not

al

out

dx,al

call

delay

;

延时

shl

bl,1

;

移位

test

bl,ah

;ah初值为ffh

jnz

lp

mov

bl,1

jmp

lp

2、如果有一个输入设备,其数据口地址为FFE0H,状态口地址为FFE2H,当状态标志D0=1时,表明一个字节的输入数据就绪,请编写利用查询方式进行数据传送的程序段。要求从该设备读取100个字节并写到从2000H:2000H开始的内存中。

通过读取状态寄存器的标志位来检查外设是否就绪。若不就绪就继续查询,即程序不断循环;直至就绪。然后,进行下一步的传送工作。

mov

bx,2000h

mov

ds,bx

mov

cx,100

again:mov

dx,0ffe2h

status:in

al,dx

;读入状态标志D0

test

al,01h

;al

输入一个字节

mov

[bx],al

;al→ds:[bx],寄存器间接寻址

inc

bx

查询方式完成数据传送。

1、编程实现以下功能:当K0键单独按下时,发光二极管L0~L7将流水点亮(Ln→Ln+1),每个维持200ms;当K1键单独按下时,发光二极管L0~L7将反向流水点亮(Ln←Ln+1),每个也维持200ms;在其他情况下各发光二极管均不点亮。假定有延时200ms的子程序DELAY可直接调用。

again:

mov

dx,8000h

;8000h是I/O端口地址

in

al,dx

;读入端口数据

not

al

;开关闭合,读入数据是0;反相,保证如图二极管点亮;

cmp

al,1

;K7~K0=11111110B

?或al=00000001B?

je

l1

;单独按下K0,转移到l1

cmp

al,2

je

l2

;单独按下K1,转移到l2

jmp

again

;其它情况,都不亮

l1:

mov

cx,8

;计数器设为8

mov

al,1

l11:

out

dx,al

;点亮一个LED

call

delay

;调用延时子程序,点亮状态保持200ms

rol

al,1

;循环左移(shl行吗?)

loop

l11

;循环直到cx减到0为止

jmp

again

;转到起点,继续查询端口变动

l2:

mov

cx,8

;计数器设为8

mov

al,1

l21:

out

dx,al

;点亮一个LED

call

delay

;调用延时子程序,点亮状态保持200ms

ror

al,1

loop

l21

;

jmp

again

delay

proc

mov

cx,0bfffh

;延时200ms。0bffh=3071(D),

loop

$

;延时时间=49151*33

(时钟周期)/8000000(CPU工作频率)≈200ms

delay

endp

loop

again

;循环,输入100个字节

4、按照图6-14所示的中断查询接口与相应的流程图,请编写用于中断服务的程序段。具体要求是,当程序查到中断设备A有中断请求(对应数据线D0),它将调用名为PROC0的子程序;如此,依次去查中断设备B~中断设备D,并分别调用名为PROC1~PROC3的子程序。

sti

;开中断

push

ax

push

dx

……

mov

dx,8001h

;接口地址是8001h

status:in

al,dx

test

al,01h

jnz

service0

test

al,02h

jnz

service1

test

al,04h

jnz

service2

test

al,08h

jnz

service3

……

service0:call

proc0

jmp

done

service1:call

proc1

jmp

done

service2:call

proc2

jmp

done

service3:call

proc3

jmp

done

……

done:pop

dx

pop

ax

iret

;中断返回

15

篇3:北京邮电大学微机原理硬件实验报告

北京邮电大学微机原理硬件实验报告 本文关键词:微机,北京,邮电大学,原理,实验

北京邮电大学微机原理硬件实验报告 本文简介:实验报告一:I/0地址译码和简单并行接口——实验一点亮灯CALLDELAY;延时MOVDX,2A8HOUTDX,AL;熄灭灯CALLDELAYJMPLOPCODEENDSENDSTARTDELAYPROCNEAR;延时子程序PUSHCXPUSHBXMOVBX,250;250×65535LP2:MOV

北京邮电大学微机原理硬件实验报告 本文内容:

实验报告一:I/0地址译码和简单并行接口

——实验一点亮灯

CALL

DELAY

;延时

MOV

DX,2A8H

OUT

DX,AL

;熄灭灯

CALL

DELAY

JMP

LOP

CODE

ENDS

END

START

DELAY

PROC

NEAR

;延时子程序

PUSH

CX

PUSH

BX

MOV

BX,250

;250×65535

LP2:

MOV

CX,0FFFFH

LP1:

LOOP

LP1

DEC

BX

JNZ

LP2

POP

BX

POP

CX

RET

DELAY

ENDP

2、简单并行接口电路

STACK

SEGMENT

STACK

STACK

DB

100

DUP(?)

STACK

ENDS

DATA

SEGMENT

DATA

ENDS

CODE

SEGMENT

ASSUME

CS:CODE,SS:STACK,DS:DATA

START:MOV

AX,DATA

MOV

DS,AX

LOP:

MOV

AH,01H

INT

21H

CMP

AL,1BH

;检查是否按下退出esc键

JZ

ENDING

MOV

DX,2A8H

;将ascii码输出

OUT

DX,AL

JMP

LOP

ENDING:MOV

AL,0

OUT

DX,AL

MOV

AX,4C00H

INT

21H

CODE

ENDS

END

START

六、

实验总结

在这三次实验中出现的问题以及相应的解决方法如下:

实验一:因为对D触发器的特性有些遗忘,在编写程序时犯了不少错误,最终通过请教助教解决了一些疑问,从而顺利写出了代码。

实验二:实验二的程序逻辑比较简单,但连线比较多,在实验过程中,也多次连错了线,通过检查纠正了连线错误,也很快完成了实验。

七、

实验收获与心得体会

这次实验是第一次用汇编语言控制接口,因为理论课尚未讲到相关内容,做实验时,上手地比较慢。通过实验一实验二,熟练了对IN、OUT指令的使用,对接口有了初步认识。同时通过研究译码电路,对“地址”也有了进一步的认识。

实验报告二:可编程并行接口8255的应用

——实验三A口输出C口输入,工作方式为00

MOV

DX,28BH

;控制端口地址

OUT

DX,AL

;8255初始化,写入工作方式控制字

LOP:

MOV

DX,28AH

;将开关状态读入

IN

AL,DX

MOV

DX,288H

;讲状态输出到A口

OUT

DX,AL

MOV

AH,0BH

;检测键盘状态

INT

21H

CMP

AL,0FFH

;如果键盘上有输入则停止程序

JZ

ENDING

JMP

LOP

ENDING:MOV

AL,0

MOV

DX,288H

OUT

DX,AL

MOV

AX,4C00H

INT

21H

CODE

ENDS

END

START

b)

实验四

STACK

SEGMENT

STACK

STACK

DB

100

DUP(?)

STACK

ENDS

DATA

SEGMENT

DATA

ENDS

CODE

SEGMENT

ASSUME

CS:CODE,SS:STACK,DS:DATA

START:MOV

AX,DATA

MOV

DS,AX

MOV

AL,10000000B

MOV

DX,28BH

OUT

DX,AL;8255初始化

LOP:

MOV

AL,3FH;

将0的段码输出给A口

MOV

DX,288H

OUT

DX,AL

MOV

AL,08H;输出位码给C口

MOV

DX,28AH

OUT

DX,AL

CALL

DELAY;延时程序

MOV

AL,06H

;将1的段码输出的A口

MOV

DX,288H

OUT

DX,AL

MOV

AL,04H

;输出选通位码

MOV

DX,28AH

OUT

DX,AL

CALL

DELAY

MOV

AL,7FH

;将8的段码输出的A口

MOV

DX,288H

OUT

DX,AL

MOV

AL,02H;输出选通位码

MOV

DX,28AH

OUT

DX,AL

CALL

DELAY

MOV

AL,06H;将8的段码输出的A口

MOV

DX,288H

OUT

DX,AL

MOV

AL,01H

;输出选通位码

MOV

DX,28AH

OUT

DX,AL

call

DELAY

MOV

AH,0BH

;检查键盘是否有输入

INT

21H

CMP

AL,0ffh

JZ

ENDING

;有则退出

JMP

LOP

ENDING:

MOV

AL,00H

MOV

DX,28AH

OUT

DX,AL

MOV

AX,4C00H

INT

21H

DELAY

PROC

NEAR

PUSH

CX

PUSH

BX

MOV

BX,005H

;250×65535

LP2:

MOV

CX,0fFFFH

LP1:

LOOP

LP1

DEC

BX

JNZ

LP2

POP

BX

POP

CX

RET

DELAY

ENDP

CODE

ENDS

END

START

c)

实验五

STACK

SEGMENT

STACK

STACK

DB

100

DUP(?)

STACK

ENDS

DATA

SEGMENT

KEYVALUE

DB

71H,7CH,07H,4FH

;键盘值对应的段码表,LINE0

DB

79H,77H,7DH,5BH

;LINE1

DB

5EH,6FH,6DH,06H

;LINE2

DB

39H,7FH,66H,3FH

;LINE3

ROW

DB

0EFH,0DFH,0BFH,7FH

DATA

ENDS

CODE

SEGMENT

ASSUME

CS:CODE,SS:STACK,DS:DATA

START:MOV

AX,DATA

MOV

DS,AX

MOV

AL,10000001B;C口高4位接键盘行输出,低4位列输入,A口输出

MOV

DX,28BH

OUT

DX,AL

LEA

BX,KEYVALUE

MOV

SI,0

SCANROW:MOV

AL,ROW[SI]

;扫描行

MOV

DX,28AH

OUT

DX,AL

;输出行

CALL

DELAY

;延迟消抖

IN

AL,DX

;读取列

AND

AL,0FH

CMP

AL,0FH

JZ

NEXT

;此行无键按下

CMP

AL,0EH

JZ

LINE0

;按下第0列的键

CMP

AL,0DH

JZ

LINE1;按下第1列的键

CMP

AL,0BH

JZ

LINE2;按下第2列的键

JMP

LINE3

NEXT:

INC

SI

CMP

SI,4

JB

NEXT1

MOV

SI,0

NEXT1:JMP

SCANROW

LINE0:MOV

CL,[BX+SI+0];查表或许按下的键相应的输出段码

JMP

OUTPUT

LINE1:MOV

CL,[BX+SI+4]

JMP

OUTPUT

LINE2:MOV

CL,[BX+SI+8]

JMP

OUTPUT

LINE3:MOV

CL,[BX+SI+12]

OUTPUT:CMP

CL,3FH

;检查是否是0,是0就退出

JZ

ENDING

MOV

AL,CL

MOV

DX,288H

;传送段码给A口

OUT

DX,AL

MOV

AL,01H

;传送位码给B口

MOV

DX,289H

OUT

DX,AL

MOV

SI,0

JMP

SCANROW

;继续扫描

ENDING:MOV

AL,00

MOV

DX,289H

OUT

DX,AL

MOV

AX,4C00H

INT

21H

DELAY

PROC

NEAR

PUSH

CX

PUSH

BX

MOV

BX,1

;250×65535

LP2:

MOV

CX,0FFFH

LP1:

LOOP

LP1

DEC

BX

JNZ

LP2

POP

BX

POP

CX

RET

DELAY

ENDP

CODE

ENDS

END

START

六、

实验总结

在这三次实验中出现的问题以及相应的解决方法如下:

实验三:一开始没法用开关控制LED的亮灭,程序一运行就直接退出了,检查代码发现自己的退出条件写错了,修改后就能正常工作了。

实验四:四个数码管显示不正常,四个数字都没法稳定的显示,经过调整延时的大小,能够使后两个数码管正常显示,但前两个数码管不受控制,最后发现是前两个数码管坏了。

实验五:按下的键与数码管中显示的图形不一样,经过检查代码和实验箱,发现代码中按键对应的段码表行列顺序与实验箱不一致,经过调整,解决了不一致的问题。

七、

实验收获与心得体会

这三次实验都是围绕着8255并行接口做一些小的应用,其中实验三与实验四逻辑比较简单,实验五稍微难一点,因为理论课还未讲到接口部分,硬件实验需要自己自学接口电路,但从中收获了不少知识,大致明白了如何使用一个接口芯片,学会了自己看手册,根据说明来编程使用接口电路,对地址有了更深刻的理解。

代码都是实验前自己课下独立编写的,因此上实验室操作时比较顺利,但也遇到了一些小错误,但也都独立解决了,在这样的一个过程中,增强了自己的学习能力和独立解决问题的能力。

实验报告三:可编程定时器/计数器(8253/8254)

一、实验目的

学习掌握8253用作定时器的编程原理;

二、实验原理及内容

(1)8253应用小结

8253和8254都是可编程计数器,它们的引脚兼容,功能与使用方法相同。8254是8253的改进型。

1.8253初始化

使用8253前,要进行初始化编程。初始化编程的步骤是:

向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。

向使用的计数器端口写入计数初值。

2.8253控制字

D7D6=00:使用0号计数器,D7D6=01:使用1号计数器

D7D6=10:使用2号计数器,D7D6=11:无效

D5D4=00:锁存当前计数值

D5D4=01:只写低8位(高8位为0),读出时只读低8位

D5D4=10:只写高8位(低8位为0),读出时只读高8位

D5D4=11:先读/写低8位,后读/写高8位计数值

D3D2D1=000:选择方式0,D3D2D1=001:选择方式1

D3D2D1=X10:选择方式2,D3D2D1=X11:选择方式3

D3D2D1=100:选择方式4,D3D2D1=101:选择方式5

D0=0:计数初值为二进制,D0=1:计数初值为BCD码数

(2)实验电路

1、按图4-8-1虚线连接电路

2、接线:

CS

/8253

Y0

/IO

地址

GATE0

/8253

+5V

CLK0

/8253

1M时钟

OUT0

/8253

喇叭或蜂鸣器

(3)实验内容

1.完成一个音乐发生器,通过喇叭或蜂鸣器放出音乐,并在数码管上显示乐谱。

2.扩展部分:利用小键盘实现弹琴功能,并显示弹奏的乐谱。

注意:8253输入频率应小于2MHz。

三、硬件连线图

四、软件流程图

1、主程序流程

2、

放音子程序流程

3、

弹琴子程序流程

4、

五、源程序

STACK

SEGMENT

STACK

STACK

DB

100

DUP(?)

STACK

ENDS

DATA

SEGMENT

INPUTINFO

DB

0AH,0DH,Please

choose

mode:1

is

playing

music;2

is

spieling,0AH,0DH

DB

$

ERROR_INFO

DB

0AH,0DH,illegal

input,please

input

again!,0AH,0DH,$

TONE

DW

3906,3472,3125,2932,2604,2347,2083

;音调1-7

计数初始值

TIME

DW

1000H,1000H,1000H,2000H,2000H,4000H,4000H

;持续时间

DUANMA

DB

06H,5BH,4FH,66H,6DH,7DH,07H

;与乐谱所对应的数码管段码

KEYVALUE

DB

71H,7CH,07H,4FH

;键盘值对应的段码表,LINE0

DB

79H,77H,7DH,5BH

;LINE1

DB

5EH,6FH,6DH,06H

;LINE2

DB

39H,7FH,66H,3FH

;LINE3

TUNEK

DW

0,0,2083,3125

DW

0,0,2347,3472

DW

0,0,2604,3906

DW

0,0,2932,0

ROW

DB

0EFH,0DFH,0BFH,7FH

DATA

ENDS

CODE

SEGMENT

ASSUME

CS:CODE,SS:STACK,DS:DATA

START:MOV

AX,DATA

MOV

DS,AX

MOV

AL,10000001B;8255初始化;C口高4位接键盘行输出,低4位列输入,A口输出

MOV

DX,28BH

OUT

DX,AL

MOV

AL,00110110B

;8253初始化,工作方式3,使用计时器0

MOV

DX,283H

OUT

DX,AL

BEGIN:MOV

AH,09H

;输入提醒,选择放音或弹琴模式或者退出程序

LEA

DX,INPUTINFO

INT

21H

MOV

AH,01H

INT

21H

CMP

AL,1

JZ

PLAY_MUSIC

CMP

AL,2

JZ

SPIELING

CMP

AL,1BH

JZ

ENDING

JMP

INPUT_ERROR

;输入检错

INPUT_ERROR:MOV

AH,09H

LEA

DX,ERROR_INFO

INT

21H

JMP

BEGIN

PLAY_MUSIC:CALL

PLAYMUSIC

JMP

BEGIN

SPIELING:CALL

SPIELINGP

JMP

BEGIN

ENDING:

MOV

AX,4C00H

INT

21H

PLAYMUSIC

PROC

PUSH

SI

;保护现场数据

PUSH

DI

PUSH

AX

PUSH

BX

PUSH

CX

PUSH

DX

LEA

SI,TONE

;音调表

LEA

DI,TIME

;每一个音调持续时间表

LEA

BX,DUANMA;段码表

MOV

CX,7

;循环控制变量赋值

LOP1:

MOV

AX,[SI]

;计数器赋值

MOV

DX,280H;

计时器0的地址

OUT

DX,AL

;先写入低八位,再写入高八位

MOV

AL,AH

OUT

DX,AL

INC

SI

INC

SI

MOV

AL,[BX]

;在数码管上显示乐谱

MOV

DX,288H

;8255A口地址

OUT

DX,AL

INC

BX

MOV

AL,01H

;传送位码给B口

MOV

DX,289H

OUT

DX,AL

MOV

AX,[DI];延迟,AX为入口参数

CALL

DELAY

INC

DI

INC

DI

MOV

AH,0BH

;检测键盘是否有输入,有则跳出

INT

21H

CMP

AL,0FFH

JZ

POUT

LOOP

LOP1

LEA

SI,TONE

LEA

DI,TIME

LEA

BX,DUANMA

MOV

CX,7

;重新循环

JMP

LOP1

POUT:

POP

DX

POP

CX

POP

BX

POP

AX

POP

DI

POP

SI

RET

PLAYMUSIC

ENDP

SPIELINGP

PROC

PUSH

AX

PUSH

BX

PUSH

CX

PUSH

DX

PUSH

BP

PUSH

SI

PUSH

DI

LEA

BX,KEYVALUE

LEA

BP,TUNEK

MOV

SI,2;只扫描2,3行(0123

4567)

SCANROW:MOV

AL,ROW[SI]

;扫描行

MOV

DX,28AH

OUT

DX,AL

;输出行

PUSH

AX

MOV

AX,1

CALL

DELAY

;延迟消抖

POP

AX

IN

AL,DX

;读取列

AND

AL,0FH

CMP

AL,0FH

JZ

NEXT

;此行无键按下

CMP

AL,0EH

JZ

LINE0

CMP

AL,0DH

JZ

LINE1

CMP

AL,0BH

JZ

LINE2

JMP

LINE3

NEXT:

MOV

AL,36H

;键盘弹起,对8253重新初始化,是蜂鸣器停止发音

MOV

DX,283H

OUT

DX,AL

INC

SI

CMP

SI,4

JB

NEXT1

MOV

SI,2

NEXT1:JMP

SCANROW

LINE0:MOV

CL,[BX+SI+0]

;查表

MOV

DI,SI

SHL

DI,1

MOV

AX,DS:[BP+DI+0]

JMP

OUTPUT

LINE1:MOV

CL,[BX+SI+4]

MOV

DI,SI

SHL

DI,1

MOV

AX,DS:[BP+DI+8]

JMP

OUTPUT

LINE2:MOV

CL,[BX+SI+8]

MOV

DI,SI

SHL

DI,1

MOV

AX,DS:[BP+DI+16]

JMP

OUTPUT

LINE3:MOV

CL,[BX+SI+12]

MOV

DI,SI

SHL

DI,1

MOV

AX,DS:[BP+DI+24]

OUTPUT:CMP

CL,3FH

;检查是否是0,是0就退出

JZ

ENDSP

MOV

DX,280H

;

输出数据给计数器

OUT

DX,AL

MOV

AL,AH

OUT

DX,AL

MOV

AL,CL

;数码管显示乐谱

MOV

DX,288H

;传送段码给A口

OUT

DX,AL

MOV

AL,01H

;传送位码给B口

MOV

DX,289H

OUT

DX,AL

JMP

SCANROW

;继续扫描

ENDSP:POP

DI

POP

SI

POP

BP

POP

DX

POP

CX

POP

BX

POP

AX

RET

SPIELINGP

ENDP

DELAY

PROC

NEAR

PUSH

CX

PUSH

AX

;

MOV

AX,1

;250×65535

LP2:

MOV

CX,08FFH

LP1:

LOOP

LP1

DEC

AX

JNZ

LP2

POP

AX

POP

CX

RET

DELAY

ENDP

CODE

ENDS

END

START

六、实验总结

在本次实验中主要出现了如下问题:

延迟函数没处理好,在本次实验中,我将弹琴功能和放音功能写在同一个程序中,两个部分都需要使用到延迟函数,在放音子程序中,延迟函数起到控制音调持续时间长短的作用,在弹琴功能中,延迟函数主要起键盘消抖的作用。不同的作用所要求的延迟时间长短不一样,一开始没注意到这个问题,导致放出来的音乐很刺耳。

七、实验收获与心得体会

本次实验主要内容是使用8254定时器来播放音乐,经过前几次实验,自己对接口电路的使用越来越熟练,按照手册对接口电路进行初始化和读写即可。实验过程也并不是一帆风顺,出现了一些错误,通过解决代码中的错误,我的调试能力得到了很大的锻炼,也变得更加有耐心去解决一些问题。

实验报告四:串行通讯8251

一、

实验目的

1、了解串行通讯的基本原理。

2、掌握串行接口芯片8251的工作原理和编程方法。

二、

实验原理及内容

1、按图4-16-1连接好电路,(8251插通用插座)其中8254计数器用于产生8251的发送和接收时钟,TXD和RXD连在一起。

2、编程:

从键盘输入一个字符,将其ASCII码加

1

后发送出去,再接收回来在屏幕上显示,(或将内存制定区域内存放的一批数据通过8251A的TXD发送出去,然后从RXD接收回来,并在屏幕上或数码管上显示出来。)实现自发自收。

3、接线:

CLK0

/8254

1M时钟

GATE0

/8254

+5V

0UT0

/8254

TX/RXCLK

/8251

CS

/8254

Y0

/IO地址

CS

/8251

Y7

/IO地址

RXD

/8251

TXD

/8251

三、

硬件连线图

四、

软件流程图

五、

源程序

STACK

SEGMENT

STACK

STACK

DB

100

DUP(

0

)

STACK

ENDS

DATA

SEGMENT

REMIND_MSG

DB

0AH,0DH,please

input

character:,0AH,0DH,$

NEXTROW

DB

0AH,0DH,$

DATA

ENDS

CODE

SEGMENT

ASSUME

DS:DATA,CS:CODE,SS:STACK

START:MOV

AX,DATA

MOV

DS,AX

MOV

AL,52

;设置8253计数器初值为52

MOV

DX,280H

OUT

DX,AL

MOV

DX,2B9H

MOV

AL,40H;先内部复位

OUT

DX,AL

NOP

MOV

AL,01111110B

;方式控制字

OUT

DX,AL

NOP

MOV

AL,37H;命令控制字

OUT

DX,AL

NOP

MOV

AH,09H;输出提示语

LEA

DX,REMIND_MSG

INT

21H

LOP:

MOV

DX,2B9H

;读状态字,检查发送器是否准备好

WAITT1:IN

AL,DX

TEST

AL,01H

JZ

WAITT1

;没准备好,继续查询

MOV

AH,01H

;输入字符

INT

21H

CMP

AL,1BH

;检查是否是结束字符

JZ

ENDING

INC

AL

MOV

DX,2B8H

OUT

DX,AL

;将数据传出

MOV

DX,2B9H

WAITTT2:IN

AL,DX

;读状态字,检查接收器是否准备好

TEST

AL,02H;

JZ

WAITTT2

MOV

DX,2B8H

IN

AL,DX

MOV

AH,02H

;输出字符

MOV

DL,AL

INT

21H

MOV

AH,09H;换行

LEA

DX,NEXTROW

INT

21H

JMP

LOP

;准备下一次输入

ENDING:MOV

AX,4C00H

INT

21H

CODE

ENDS

END

START

六、

实验总结

本次实验的内容是利用8251芯片实现简单的串行通信,CPU通过查询方式与8251进行联络,实验中并没有出现明显问题。代码的缺陷是没有对接收到的数据进行检错就直接拿来使用。

七、

实验收获及心得体会

本次实验是本学期的最后一次实验,通过前三次实验的训练,本次实验的代码写地比较顺利,

通过四次微机硬件实验,对接口电路有了更深刻的认识,实践了理论课上的知识,对地址有了更准确的理解。掌握了认识、使用一个接口芯片的方法,同时还锻炼了自己编写汇编程序的能力。

    以上《微机原理与接口技术单片机软件报告》范文由一流范文网精心整理,如果您觉得有用,请收藏及关注我们,或向其它人分享我们。转载请注明出处 »一流范文网»最新范文»微机原理与接口技术单片机软件报告
‖大家正在看...
设为首页 - 加入收藏 - 关于范文吧 - 返回顶部 - 手机版
Copyright © 一流范文网 如对《微机原理与接口技术单片机软件报告》有疑问请及时反馈。All Rights Reserved