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系列单片机有哪些查表指令?列出这些指令,并说明其功能。
版权声明:本文标题:实验二 分支程序,查表程序编写实验 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1702864978h433773.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论