admin 管理员组

文章数量: 887021


2023年12月18日发(作者:php代码的开始标记)

实验二 分支程序,查表程序编写实验

一、实验目的

1.掌握跳转指令

2.掌握子程序调用指令

3.掌握查表程序运用

二、实验设备

单片机IDE集成开发软件

三、实验要求

验证“实验原理”一节中给出的实例程序,熟悉各种跳转指令、子程序调用指令,以及查表程序编写方法。

四、实验原理

作为软件实验,可以在没有硬件及仿真仪的情况下,利用集成开发环境进行。

1.跳转指令

控制转移的指令包括无条件转移指令和有条件跳转指令。

(1)长跳转指令LJMP addr16

长跳转,把16位(2个字节)的地址送入PC中。

〔2〕绝对转移指令AJMP addr11

在存储空间2kB内转移。与PC当前值高5位共同组成16位目标地址。

(3)短跳转指令SJMP rel

8位补码表示的地址。可以在-128到127之间跳转。

(4)间接跳转指令JMP @A+DPTR

这是一条很有用的散转指令。跳转地址在程序运行时动态决定。

(5)累加器判零转移指令JZ rel,JNZ rel,

JZ rel,累加器为0转移,JNZ rel,累加器不为0转移。

(6)比较转移指令,CJNE <目的字节>,<源字节>,rel。

CJNE A,#data,rel

CJNE A,direct,rel

CJNE @Ri,#data,rel

CJNE Rn,#data,rel

(8)循环转移指令

DJNZ Rn,rel。首先Rn减1,然后判断是否是零,不是则跳转。

DJNZ direct , rel。首先直接地址中的数据减1,然后判断是否是零,不是则跳转。

(9)位控制转移指令

JC rel,若Cy=1,则(PC)<--(PC)+2+rel

若Cy=0,则(PC)<--(PC)+2

JNC rel若Cy=0,则(PC)<--(PC)+2+rel

若Cy=1,则(PC)<--(PC)+2

JB bit,rel; 若(bit)=1,则(PC)<--(PC)+3+rel

若(bit)=0,则(PC)<--(PC)+3

JNB bit,rel若(bit)=0,则(PC)<--(PC)+3+rel

若(bit)=1,则(PC)<--(PC)+3

JBC bit,rel; 若(bit)=1,则(PC)<--(PC)+3

若(bit)=0,则(PC)<--(PC)+3+rel,(bit)0

2.子程序调用和返回指令。

把重复使用的程序段编写为一个子程序,通过主程序调用它。这样不断减少编程工作量,而且减少程序所占存储空间。

1)长调用指令

LCALL addr16 ; (PC)(PC)+3

(SP)(SP)+1, ((SP))(PC)7~0

(SP)(SP)+1, ((SP))(PC)15~8

(PC)addr16

除了PC要断点保护,注意其他寄存器不能冲突。

2)绝对调用指令

ACALL addr11 ; (PC)(PC)+2

(SP)(SP)+1, ((SP))(PC)7~0

(SP)(SP)+1, ((SP))(PC)15~8

(PC)addr11

3)返回指令

RET:子程序返回指令,

RETI:中断程序返回指令;

当RET或RETI被执行时,系统通过以下步骤恢复了PC指针:

(PC)15~8((SP)), (SP) (SP)-1

(PC)7~0 ((SP)), (SP)(SP)-1

利用以上转移指令,我们编写分支程序,查表程序,子程序。

3.应用实例

1)分支程序

包括无条件转移和条件转移指令。根据不同的条件,条件分支程序执行不同的程序段。MCS-51中直接用来判断分支条件的指令有JZ、JNZ、CJNE、JC、JNC、JB、JNB等。正确合理地运用条件转移指令是编写条件分支程序的关键。

[例27-1] 设变量X存放于R2,函数值y存放在R3。试按照下式的要求给y赋值:

1 X>0

y = 0 X=0

-1 X<0

解:这是一个三分支的条件转移程序,通常可分为“先分支后赋值”和“先赋值后分支”两种求解办法。分述如下:

①先分支后赋值。自变量X是个带符号数,故可采用累加器判零条件转移和位控制条件转移指令来分析判断。程序流程图如图27-1(a)所示。程序如下:

ORG 0000H

MOV A,R2 ;自变量-->(A)

CJNE A,#0,L1 ;(A)与0比较,不等则转移

MOV R3,#0 ;若相等,0(R1)

SJMP L3

L1: JB ACC.7,L2 ;自变量<0则转移

MOV R3,#01H ;自变量>0,1+(R1)

SJMP L3

L2; MOV R3,#0FFH ;自变量<0,1(R1)

L3; SJMP $

END

②先赋值后分支。先把X调入累加器A,并判断它是否为零。若X=0,则A中内容送R3;若X≠0,则先给R0赋值(=-1)。然后判断A<0。若A<0,则R0送R3;若A>0,则把R0修改为1后送R3,程序流程如图27-1(b)所示。程序如下:

ORG 0000H

MOV A,R2 ;取X到A

JZ L2 ;X=0则转移

MOV R0,#0FFH

JB ACC.7,L1 ;若X<0则转移

MOV R0,#1 ;若X>0,(R0)=1

L1: MOV A,R0

L2: MOV R3,A ; 存结果

SJMP $

END

开始

(A)X

Y

(A)=0?

N

(A)>0?

N

(A)=-1

存结果

开始

(A)X

(A)=0?

N

Y

(R0)=-1

(A)=1

(A)<0?

N

(R0)=-1

Y

结果

存结果

结果

(a)

(b)

图2-1 流程图

2)查表程序设计

查表程序是根据查表算法设计的。该方法把事先计算或实验数据按一定顺序编成表格,存于程序存储器内,然后根据输入参数值,从表中取得结果。查表程序可完成数据补偿、计算和转换等功能。采用MCS-51汇编语言查表非常方便。它有两条专门的查表指令:

MOVC A,@A+DPTR,

MOVC A,@A+PC

第一条查表指令采用DPTR存放数据表格的地址,查表过程比较简单。查表前需要把数据表格表头地址存人DPTR,然后把所要查得的数在表中相对表头地址的偏移量送入累加器A,最后使用“MOVC A,@A+DPTR”完成查表。

采用“MOV A,@A+PC”指令查表,所需操作有所不同,可分为三步:

①用传送指令把所查数据的项数送人累加器A;

②使用“ADD A,#data"指令对累加器A进行修正,data值由PC当前值+data=数据表头地址。确定,

实际上data值等于查表指令和数据表格之间的字节数;

③用指令“MOVC A,@A十PC”完成查表。

查表程序主要用于代码转换、代码显示、实时值查表计算和按命令号实现转移等。

范例:

求函数y=X!(X=0,„,7)的值。设自变量存放在ABC单元,表头的地址为TABL,y值为双字节存放在寄存器R2R3中,R3存放y值低字节,写出查表程序。

程序如下:

ORG 0000H

ABC EQU 30H

L1: MOV A,ABC ;取X

ADD A,ABC ;X乘2与双字节Y相对应

MOV R3,A ;保存指针

ADD A,#07H ;计算偏移量

MOVC A,@A+PC ;查低字节

XCH A,R3

ADD A,#04H ;计算偏移量

MOVC A,@A+PC ;查高字节

MOV R2,A

SJMP $

TABLE: DB 01,00,01,00,02,00,06,00

DB 24H,00,20H,01,20H,07,40H,50H

END

五、实验步骤

1、分别编写简单分支程序,及子程序调用程序,然后在开发环境中编译运行。

2、编写查表程序。然后在开发环境中编译运行。

六、实验报告

1、给出各个程序的清单,要求有注释。

2、MCS-51系列单片机有那些跳转指令?列出这些指令,并说明其功能。

3、MCS-51系列单片机有哪些子程序调用和返回指令?列出这些指令,并说明其功能。

4、MCS-51系列单片机有哪些查表指令?列出这些指令,并说明其功能。


本文标签: 指令 程序 查表 转移