2009-03-24

8051微控制器和嵌入式系统-2

CH03 跳、循环和调用指令

3.1 循环和跳指令
--循环:DJNZ reg, label
寄存器reg递减,若它不等于0,就跳到由标号label所指引的目标地址。
循环开始之前,该寄存器加载计数器用以计算循环的次数。
注意:寄存器的递减和跳的与否的决定组合成单一的指令。
MOV A, #0 ;A=0,ACC清零
MOV R2, #10 ;加载寄存器R2=10
AGAIN: ADD A, #03 ;将3加到ACC
DJNZ R2, AGAIN ;重复做加法,直至R2=0(10次)
MOV R5, A ;将ACC中的结果保存在R5中

--循环嵌套
由于R2寄存器是8位,最大值FFH,只能重复256次
例程:将累加器ACC加载值55H,将ACC值置反700次
MOV A, #55H ;A=55H
MOV R3, #10 ;加载寄存器R3=10, 外循环计数
NEXT: MOV R2, #70 ;加载寄存器R2=70,内循环计数
AGAIN: CPL A ;将寄存器A置反
DJNZ R2, AGAIN ;重复做70次(内循环)
DJNZ R3, NEXT

--其它条件跳指令
指令 动作
JZ 若A=0则跳
JNZ 若A!=0则跳
DJNZ 若寄存器!=0则递减并跳
CJNE A, #数据 若A!=数据则跳
CJNE 寄存器,#数据 若寄存器!=数据则跳
JC 若CY=1则跳
JNC 若CY=0则跳
JB 若bit=1则跳
JNB 若bit=0则跳
JBC 若bit=1则跳 并清零

例子:求79H F5H E2H值之和,和值放入寄存器R0(低字节)与R5(高字节)
MOV A, #0 ;A=0
MOV R5, A ;R5=0
ADD A, #79H ;A=0+79H=79H
JNC N_1 ;若无进位则加下一个数
INC R5 ;若CY=1,则递增R5
N_1: ADD A, #0F5H ;A=79H+F5H=6EH 及 CY=1
JNC N_2 ;若无进位则加下一个数
INC R5 ;若CY=1,则递增R5
N_2: ADD A, #OE2H ;A=6EH+E2H=50H 及 CY=1
JNC OVER ;若CY=0则跳
INC R5 ;若CY=1则递增R5
OVER: MOV R0, A ;现在R0=50H 及 R5=02

所有条件跳指令都是短跳指令,范围-128、+127

--无条件跳指令
8051有两条无条件跳指令 LJMP和SJMP
LJMP有3个字节长,第一字节操作码,第二三表示目标位置的16位地址,可以跳0000-FFFF任何单元。
SJMP是2字节指令,00-FFH,前跳和后跳

--计算短跳地址
前跳
后跳(加法替代减法)!!

3.2 调用指令
--LCALL 长调用
3字节指令,可以调用64KB地址,处理子程序时先保存LCALL后随指令的地址在栈中
ORG 0
BACK: MOV A, #55H
MOV P1, A
LCALL DELAY
MOV A, #0AAH
MOV P1, A
LCALL DELAY
SJMP BACK
------------
ORG 300H
DELAY: MOV R5, #0FFH
AGAIN: DJNZ R5, AGAIN
RET
END

--CALL指令和栈的作用
针对上例:下面是栈中存储的内容
0A
09 00(高位)
08 07(低位)
sp=09

--在子程序中PUSH和POP指令的使用

--ACALL绝对调用
目标地址只能限制于2KB范围

3.3 8051产生时间延迟
-- 8051机器周期
指令列表及其机器周期查询附表!!
11.0592MHZ/12=921.6KHZ,机器周期是1/921.6khz=1.085us微秒
16MHZ/12=1.333MHZ,机器周期是1/1.333MHZ=0.75us
常用的是11.0592MHZ晶体振荡器,其与串行口相兼容

--8051延迟计算
大部分是由循环体实施,忽略循环外部的指令时间
DELAY: MOV R3, #200 机器周期1
HERE: DJNZ R3, HERE 2
RET 2
时间延迟为[(200x2)+1+2]x1.085us=436.255us

DELAY: MOV R3, #250 机器周期1
HERE: NOP 1
NOP 1
NOP 1
NOP 1
DJNZ R3, HERE 2
RET 2
时间延迟为[250x(1+1+1+1+2)]x1.085us=1627.5us
加上外循环的两个指令3x1.085us

--嵌套循环
DELAY: MOV R2, #200 机器周期1
AGAIN: MOV R3, #250 1
HERE: NOP 1
NOP 1
DJNZ R3, HERE 2
DJNZ R2, AGAIN 2
RET
HERE循环,(4x250)x1.085us=1085us
AGAIN, 1085x200=217000us
mov&djnz 3x200x1.085=651us
::::217000+651=217.651ms

HERE: SJMP HERE=SJMP $

没有评论:

发表评论