内容发布更新时间 : 2024/11/14 12:31:49星期一 下面是文章的全部内容请认真阅读。
.专业整理.
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. ;以直接寻址单元作为控制计数器 CJNE A,direct,rel ;比较不相等转移
这几条基本指令可派生出很多条不同控制计数器的循环转移指令,大大扩充了应用范围 和多重循环层次。
循环嵌套就是在循环内套用循环的结构形式,也称“多重循环”。 循环的执行过程是从内向外逐层展开的。内层执行完全部循环后,外层则完成一次循环, 逐次类推。层次必须分明,层次之间不能有交叉,否则将产生错误。
编程时要注意循环的正确退出,要防止出现“死循环”。 【4-10】什么是子程序?它的结构特点是什么?什么是子程序嵌套? 【答】在编制应用程序时,往往将需要多次应用但完成的运算或操作相同的程序段,编制 成一个子程序,并尽量使其标准化,存放于某存储区域。调用子程序的程序称为“主程序”或 “调用程序”。
子程序是由专门的子程序调用指令CALL调用,而以子程序返回指令RET结束的程序 段。子程序的第一条指令地址,通常称为“子程序首地址”或“人口地址”,往往采用标号(可用助记符)加以表示,调用(转子)指令的下一条指令地址,通常称为“返回地址”或“断
.学习帮手.
.专业整理.
点”。
在子程序中调用子程序的现象通常称为子程序嵌套。 【4-11】手工汇编下列程序: KEY EQU 2 0H ORG 2000H
MOV RO,#30H ;数据区首址 MOV Rl,#1 6 ;数据区长度
MOV 20H,#KEY ;关键字送20H单元 CLR F0 ;清用户标志位 MOV 21H,#0l ;序号置l LP: MOV A,@R0 ;取数 CJNE A,20H,LP1.
SJMP HERE ;找到关键字,结束. LPI: INC 21H ;序号加1
INC R0 ;数据区地址指针加1
DJNZ R1,LP ;继续
SETB F0 ;未搜索到关键字,则置位用户标志 HERE:SJMP HERE
【答】根据指令查指令表得到机器码,手工汇编结果如下: KEY EQU 20H ORG 2000H
2000 7830 MOV R0,#30H ;数据区首址 2002 7910 MOV R1,#1 6 ;数据区长度
2004 752020 MOV 20H,#KEY ;关键字送20H单元 2007 C2D5 CLR F0 ;清用户标志位 2009 752101 MOV 21H,#01 ;序号置1 200C E6 LP: MOV A,@R0 ;取数 200D B52002 CJNE A,20H,LPI
2010 8007 SJMP HERE ;找到关键字,结束 2012 0521 LPI:INC 21H ;序号加1
2014 08 INC R0 ;数据区地址指针加1 2015 D9F5 DJNZ R1,LP ;继续
2017 D2D5 SETB F0 ;未搜索到关键字,则置位用户标志 2019 80FE HERE:SJMP HERE 【4-12]把长度为10 H的字符串从内部RAM的输入缓冲区INBUF向设在外部RAM的输出缓冲区OUTBUF进行传送,一直进行到遇见字符“CR\时停止。若字符串中无字符“CR”,则整个字符串全部传送。加上必要的伪指令,并对源程序加以注释。 【答】程序如下: ORG 0000H AJMP MAIN ORG 0030H
MAIN: MOV R7,#10H ;数据长度 MOV R0,#INBUF ;源数据首地址 MOV DPTR,#OUTBUF ;目的数据首地址
.学习帮手.
.专业整理.
LOOP: MOV A,@R0 ;把源数据的值赋给A
CJNE A,#0DH,LOOPl ;判断是否为“CR”(ASCII码值为0DH)
SJMP ENDl ;是“CR\,则结束传送
LOOPl: MOVX @DPTR,A ;把A的值赋给目的数据 INC R0 ;源数据下一个地址值 INC DPTR ;目的数据下一个地址值
DJNZ R7,L00P ;判断数据传送是否完毕 ENDI: SJMP ENDI END
【4-13】内部RAM从2OH单元开始存放一个正数表,表中之数为无序排列,并以“-1”作为结束标志。编程实现在表中找出最小正数,存入10H。加上必要的伪指令,并对源程序加以注释。
【答】程序如下: ORG 0000H AJMP MAIN ORG 0030H
MAIN: MOV R0,#20H ;正数表首址
MOV 1 0H,#7FH ;初始值设为正数最大值 LOOP: MOV A,@R0 CJNE A,“-1’’,CHK ;比较结束标志“-1” SJMP END1 ;是“-l\,结束比较
CHK: CJNE A,10H,CHKI ;比较两个数大小 SJMP LOOP1 ;两个数相等,不交换 CHKI: JNC LOOP1 ;A较大,不交换 MOV 10H,A ;A较小,交换 LOOP1 INC R0 SJMP LOOP ‘
END1: SJMP END1 END
例如:已知(20H)=22 H,(21H)=23H,(22H)=0CH,(23H)=20H,(24H)=16H, (25H)=-1。 执行结果:(10H)=0CH
【4-14】比较两个ASCII码字符串是否相等。字符串的长度在内部RAM的2 H单元,第一个字符串的首地址在30H中,第二个字符串的首地址在50H中。如果两个字符串相等,则置用户标志FO为0;否则,置用户标志FO为1。加上必要的伪指令,并对源程序加以注释(每个ASCII码字符为一个字节,如ASCII码“A”表示为41H)。 LOOPl: MOVX @DPTR,A ;把A的值赋给目的数据 INC R0 ;源数据下一个地址值 INC DPTR ;目的数据下一个地址值
DJNZ R7,L00P ;判断数据传送是否完毕 ENDI: SJMP ENDI
END
【答】字符串中每一个字符都可以用一个ASCII码表示。只要有一个字符不相同,就可以判断字符串不相等。 ORG 0000H ’
.学习帮手.
.专业整理.
AJMP MAIN · ORG 0030H
MAIN: MOV R0,#30H 第一个字符串的首地址 MOV R1.,#5 0H 第二个字符串的首地址
LOOP: MOV A,@R0 第一个字符串的字符值赋给A MOV B,@R1 ;第二个字符串的字符值赋给B CJNE A,B,NEXT ;两个字符值比较 INC R0 字符值相等,则继续比较 INC R1.
DJNZ 20H,LOOP ;判断字符串是否比较完 CLR F0 字符串相等,则F0位清0 SJMP $
NEXT: SETB F0 字符串不等,则F0位置1 SJMP $ END
例如:(2OH)=03H,(3OH)=41H,(31H)=42H,(32H)=43H,(5OH)=41H,(51H)= 42H,(52H)=43H。两个字符串均为“ABC\。 执行结果:F0=0
【4—1 5】已知经A/D转换后的温度值存在4 0 H中,设定温度值存在4 1 H中。要求编写控制程序,当测量的温度值大于(设定温度值+2℃)时,从P 1.0引脚上输出低电平;当测量的温度值小于(设定温度值一2℃)时,从P 1.0引脚上输出高电平;其他情况下,P 1.0引脚输出电平不变(假设运算中C中的标志不会被置1)。加上必要的伪指令,并对源程序加以注释。
【答】程序如下: ORG 0000H AJMP MAIN ORG ‘0020H MAIN: .
MOV B,41H ;设定的温度值 MOV A.B
ADD A,#02H
MOV B,A ;设定温度值+2℃ MOV A,40H ;测量的温度值 CLR C SUBB A,B JNC LOWER ;测量的温度值>(设定温度值+2℃),转LOWER子程序,使P1.0引脚上输出低电平
MOV B,41H ;设定的温度值 MOV A,B DEC A
DEC A .
MOV B,A ;设定温度值一2℃ MOV A,40H ;测量的温度值 CLR C
.学习帮手.