【4—6】80C51单片机有哪些查表指令?它们有何本质区别?请编写按序号i 值查找Di(1 6位长度)的方法。设值i存放在R7中,将查找到的数据存放于片内RAM的30H、31H单元中。请画出程序流程图,编写查表程序段,加上必要的伪指令,并对源程序加以注释。
【答】80c51有两种查表指令,即近程查表指令“MOVC A,@A+PC”和远程查表指令 “MOVC A,@AA+ DPTR" 这两条指令的功能均是从程序存储器中读取数据(如表格、常数等),执行过程相同,其差别是基址不同,因此,适用范围也不同。
累加器A为变址寄存器,而PC、DPTR为基址寄存器。DPTR为基址寄存器时,允许数表存放在程序存储器的任意单元,称为“远程查表”,编程比较直观;而PC为基址寄存器时,数表只能放在该指令单元往下的256个单元中,称为“近程查表”。编程时需要计算累加器A中的值与数表首址的偏移量。
例如,按序号i值查找Di(1 6位长度)的源程序如下所示:
ORG XXXXH
MOV DPTR,#TABLE 指向表首址
MOV A,R7 ;取值i
RL A ;Di为二个字节
MOV R7,A ;i x 2
MOVC A,@A+DPTR ;查表获得Di的高字节
MOV 30H.A
MOV A,R7
INC A 指向表的下一个地址
MOVC A,@A+DPTR ;{表获得Di的低字节
MOV 31H, A
TABLE: Dw ;表(Dw为双字节,高字节在前)
RET
查表程序流程图如图4-1所示。
【4—7】根据运算结果给出的数据到指定的
数据表中查找对应的数据字。运算结果给出的
数据在片内RAM的40H单元中,给出的数据大
小在00~0FH之间,数据表存放在20H开始的
片内存储器中。查表所得数据字为双字节(高字
节在后),高字节存于42H、低字节存于41H单
元。其对应关系为:
给出数据: 00 H 0 1 H 0 2 H 0DH 0EH 0FH
对应数据:00 A0 H 7DC2 H FF09 H 3456H 89ABH 5678 H
请编制查表程序段,加上必要的伪指令,并加以注释。
【答】程序如下:
ORG 0000H
AJMP MAIN ,
0RG 0020H
TAB:DB OAOH,OOH,0C2H,7DH,09H,OFFH,...,56H,34H,0.ABH,89H,DB 78H,56H; 数据字表
ORG 0050H
很难找到
MAIN: MOV A,40H ;运算结果给出的数据放在40H中
MOV DPTR,#TAB ;指向数据字表首地址
RL A ;由于是双字节,所以A左移1位(乘2)
MOV 40H,A ;结果放在40H ’
MOVC A,@A+DPTR ;查表,找出对应的值
MOV 41H,A ;查找出的数据值低字节放入41H
MOV A.40H
ADD A,#01H ;查找数据的高位字节
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 42H,A 。 ;查找出的数据值高字节放入42H
SJMP$
注意:数据表存放在20 H开始的片内存储器中,该存储器应为内部程序存储器,因为查表指令MOVC的功能是从程序存储器中读数据。
【4—8】什么是分支结构程序?8OC 1的哪些指令可用于分支结构程序编程?有哪些多分支转移指令?由累加器A中的动态运行结果值进行选择分支程序,分支转移指令选用LJMP,请编写散转程序段和画出程序流程图,加上必要的伪指令,并加以注释。
【答】分支结构程序的主要特点是程序执行流程中必然包含有条件判断指令。符合条件要求和不符合条件要求的有不同的处理路径。编程的主要方法和技术是合理选用具有逻辑判断功能的指令。在程序设计时,往往借助程序框图(判断框)来指明程序的走向。
一般情况下,每个分支均需要单独执行一段程序,对分支程序的起始地址赋予一个地址标号,以便当条件满足时转向指定地址单元去执行程序,条件不满足时仍顺序往下执行程序。 80C51的条件判跳指令极其丰富,功能极强,特别是位处理判跳指令,对复杂问题的编程提供了极大方便。程序中每增加一条条件判跳指令,就应增加一条分支。
分支结构程序的形式有单分支结构和多分支结构两种。
①在80C51指令系统中·可实现单分支程序转移的指令有位条件转移指令,如JC、JNC、 JB、JNB和JBC等,还有一些条件转移指令,如JZ、JNZ和DJNZ等。 .
②80C51设有两条多分支选择指令。
(a)散转指令:JMP @A+DPTR
散转指令由数据指针DPTR决定多分支转移程序的首地址,由累加器A中内容动态地选择对应的分支程序。因此,可以从多达256个分支中选择一个分支散转。
(b)比较指令:CJNE A,direct,rel (共有4条)
比较两个数的大小,必然存在大于、等于、小于三种情况,这时就需要从三个分支中选择一 个分支执行程序。
例如:由累加器A中的动态运行结果值进行选择分支程序,分支转移指令选用LJMP。 ORG XXXXH
MOV DPTR,#JPTAB ;分支转移表首地址
CLR C
MOV B, A
RLC A
JNC TAB
INC DPTR
TAB: ADD A,B ;(A)* 3
JNC TABLE
很难找到
INC DPTR
TABLE: JMP@A+DPTR ;多分支转移
JPTAB:LTMP LOOPl ;长转移指令为3个字节
LJMP LOOP2
注意:长转移指令为3字节,因此,A中内容应乘以3。若大于一个字节,则DPH要加1。
分支程序流程图如图4-2所示。
【4-9】循环结构程序有何特点?80C51的循环转移指令有什么特点?何谓循环嵌套?编程时应注意什么?
【答】循环是强制CPU重复多次地执行一串指令的基本程序结构。从本质上看,循环程序结构只是分支程序中的一个特殊形式。循环程序由4个部分构成,即循环初始化、循环体、循环控制和结束部分。
循环次数已知情况下,采用计数循环程序,其特点是必须在初始化部分设定计数的初值,循环控制部分依据计数器的值决定循环次数。
根据控制循环结束的条件,决定是否继续循环程序的执行。所谓的结束条件可以是搜索 到某个关键字(比如回车符CR),也可以是发生的某种变化(如故障引起电路电平变化)等,什 么时候结束循环是不可预知的。
80C5 1设有功能强的循环转移指令:
DJNZ Rn,rel. . ;以工作寄存器作为控制计数器
DJNZ direct,rel. ;以直接寻址单元作为控制计数器