
不让发那么多 所有分两次 这里接上面的4.循环移位指令(4条)
循环移位指令的功能是将累加器A中内容循环位移或者和进位位一起移位。
例 A=01H, Cy=1
若执行一次 RRC A后,结果为:A=10000000B Cy=1
若执行一次 RLC A后,结果为:A=00000011B Cy=0
5.取反、清0指令
CPL A ;累加器内容按位取反。如果1就变0,如果0就变1
CLR A ;累加器A清0 控制转移类指令计算机运行过程中,有时因为 *** 作的需要,程序不能按顺序逐条执行指令,需要改变程序运行方向,即将程序跳转到某个指定的地址再顺序执行下去。
控制转移类指令的功能就是根据要求修改程序计数器PC的内容,以改变程序运行方向,实现转移。
控制转移类指令可分为:无条件转移、条件转移、绝对转移、相对转移和调用、返回指令。下面我们将分类介绍。
1.无条件转移指令(4条)
LJMP add16 ;add16→PC,无条件跳转到add16地址,可在64KB范围内
转移,称为长转移指令
AJMP add11 ;add11→PC,无条件转向add11地址,在2KB范围内转移
SJMP rel ;PC+2+rel→PC,相对转移,rel是偏移量,8 位有符号
数,范围-128~127,即可向后跳转128,向前可跳转127
JMP @A+DPTR ;A+DPTR→PC ,属散转指令,无条件转向A与DPTR内容相
加后形成的新地址
例1 执行指令
LJMP 9100H
不管这条指令存放在哪里,执行时将使程序转移到9100H,和AJMP,SJMP指令是有差别的。
例2 程序
2000H MOV R0 , #10H ;10H→PC
2002H SJMP 03H ;PC+2+rel=2002H+2+03H=2007H→PC
┇ ┇
2006H ┇
2007H ┇
从说明中可见,执行SJMP 03H 指令后,马上跳转到2007H地址执行程序。
2.条件转移指令(8条)
条件转移指令是根据某种特定条件转移的指令。条件满足时转移,条件不满足时则顺序
执行下面的指令。
JZ rel ;A=0转向PC+2+rel→PC,A≠0顺序执行
JNZ rel ;A≠转向PC+2+rel→PC ,A=0顺序执行
CJNE A, direct, rel ;A≠ (direct)转向PC+3+rel→PC且当A>(direct),Cy=0
;当A<(direct),Cy=1
;否则A=(direct),PC+3→PC即顺序执行
CJNE A, #data, rel ;A data P转向PC+3+rel→PC且当A >data,Cy=0
;当A <data,Cy=1,
;A=data,PC+3→PC顺序执行
CJNZ Rn, #data, rel ;Rn≠data转向PC+3+rel→PC
;且当Rn>data,Cy=0,当Rn<data,Cy=1
;Rn=data,PC+3→PC顺序执行
CJNE @Ri,#data, rel ;(Ri) ≠data ,PC+3+rel→PC
;且当(Ri)>data ,Cy=0,当(Ri)<data,Cy=1
;(Ri)=data, PC+3→PC顺序执行
DJNZ Rn, rel ;Rn-1→Rn ,Rn ≠0转向PC+2+rel→PC
;Rn=0,PC+2→PC顺序执行
DJNZ direct, rel ;(direct)-1→(direct),(direct) ≠0转向 PC+2+rel
→PC
;(direct)=0 ,PC+2→PC顺序执行
注意:
1)CJNE类指令借用进位标志Cy作为比较结果的标志位。从指令中可知,目的 *** 作数内容小于原 *** 作数内容Cy置1,反之Cy清0,该类指令多用于分支程序。
2) DJNZ指令执行时Rn或direct先减1,然后再判断Rn或direct内容是否等于0。不为0则转,为0顺序执行。DJNZ用在循环程序中,控制循环次数很方便。
3) JZ和JNZ的 *** 作数只有一个,是对A的内容的进行判断的指令。
例1 以下程序的循环次数是多少,最后(R0)=?
MOV R0 , #0
LL: ┇
DJNZ R0 , LL
分析:由于DJNZ是减1再判断大小的,因为R0=0,所以第一次执行DJNZ R0 , LL后R0=FFH=255,则程序要执行的次数为256次,R0最后的值为0。
解:程序要循环的次数为256次,最后R0=0
3调用、返回、控 *** 作指令
在程序设计中,常常要把具有一定功能的公用程序编制成子程序。当主程序转至子
程序时用调用指令,而在子程序的最后安排一条返回指令,使执行完子程序后再返回到主程序。
(1) LCALL addr16 ;调用入口地址为addr16的子程序
这是一条长调指令,可调用64KB范围内的子程序,因此,可放在程序的任何位置。
指令的执行过程分两步:第一步把断点(当前执行指令的下一条指令地址)压入堆栈。第二步将调用的子程序的入口地址装入PC。即addr16(16位地址)→PC,转向执行子程序。
(2) ACALL addr11 ;子程序入口地址为addr11的子程序
这是一条短调指令,只能实现2KB范围内的子程序的调用。其指令执行过程与LCALL
指令一样。但是需要注意的是:ACALL中addr11只占用PC的PC0~PC10位。
(3) RET ;放在子程序最后,使程序准确返回到主程序断点处
执行过程为:(SP)→PC8~PC15断点地址高字节送入PC
SP-1→SP,(SP) →PC0~PC7断点低字节送入PC,
这时PC中为主程序断点地址,程序准确返回到调用指令的下一条。
例 设SP=62H,(62H)=07H,(61H)=30H,执行指令RET
结果:SP=60H,(PC)=0730H,CPU从0730H开始执行程序。
(4) RETI ;中断返回指令
该指令用于中断服务程序,使中断程序结束后准确返回到主程序断点处,执行过程同RET,它还能清除优先级状态。
(5) NOP ;空 *** 作
执行该指令时,CPU只进行取指令、译码,而不进行任何 *** 作,故称为控 *** 作。常用于产生一个机器周期延时。位 *** 作指令MCS-51单片机的特色之一是具有很强的位处理功能。位 *** 作指令又称为布尔指令,其功能是对内部RAM中可进行位 *** 作的区域进行位 *** 作。
在进行位 *** 作时,位累加器C即进位标志Cy,位地址是片内RAM字节地址20H~2FH单元中连续的128个位(位地址00H~7FH)和部分功能寄存器。凡SFR中字符等地址能被8整除的特殊功能寄存器都具有可寻址的位地址,其中ACC(位地址E0H~E7H),B(位地址F0H~F7H)和片内RAM中128个位都可作软件标志或存储位变量。
1 位数据传送类指令(2条)
MOV C , bit ;(bit) →C,寻址位的状态送入C
MOV bit , C ;C→(bit),C的状态送入位地址中
2 位修正指令(6条)
CLR C ;0→C, 清0累加器
CLR bit ;0→(bit);清0寻址位
CPL C ;/C→C,取反
CPL bit ;(/bit) →(bit),寻址位取反
SETB C ;1→C,C置1
SETB bit ;1→ (bit),寻址位置1
3 位逻辑运算指令(4条)
ANL C , bit ;C∩(bit) →C,寻址位和C“与”,结果放在C
ANL C , /bit ;C∩(/bit) →C,寻址位的非和C“与”,结果放在C
ORL C , bit ;C∪(bit) →C,寻址位和C“或”,结果放在C
ORL C , /bit ;C∪(bit) →C,寻址位和C的非“或”,结果放在C
4 位条件转移指令(5条)
JC rel ;C=1转向PC+2+rel→PC
C=0顺序执行PC+2→PC
JNC rel ;C=0转向PC+2+rel→PC
C=1顺序执行PC+2→PC
JB bit , rel ;(bit) =1转向PC+3+rel→PC
(bit) =0顺序执行PC+3→PC
JNB bit , rel ;(bit) =0转向PC+3+rel→PC
(bit) =1顺序执行PC+3→PC
JBC bit , rel ;(bit) =1转向PC+3+rel→PC;同时0→(bit)
(bit) =0顺序执行PC+3→PC
注意:JBC与JB指令区别,前者转移后并把寻址位清0,后者只转移不清0寻址位。
例1 设P1为输入口,P30作输出线,执行下列指令:
MOV C , P10 ;(P10) →C
ANL C , P11 ;(C)∩(P11) →C
ANL C , /P132 ;(C)∩(/P12) →C
MOV P30 , C ;C→P30
结果是:P30=(P10) ∩(P11) ∩(/P12)
例2 用位 *** 作指令编程计算逻辑方程
P15=ACC0 ∩ (B0∪P12) ∪P13
解: MOV C , B0 ;B0→C
ORL C , P12 ;C∪P12→C 即B0+P12→C
ANL C , ACC0 ;C∩ACC0→C 即ACC0∩(B0∪P12)→C
ORL C , P13 ;C∪P13→C 即 ACC0∩(B0∪P12)∪P13→C
MOV P15 , C ;C→P15
ORG
000H
;设置程序存储区初始地址的伪指令
LJMP
MAIN
;跳到main语句,绕过中断入口
ORG
1000H
;设置程序存储区初始地址的伪指令
MAIN:
MOV
SP,#60H
;堆栈入口地址
MOV
81H,#50H
;把立即数50H送到数据区81H地址
MOV
R0,#20H
;把立即数20H送到R0
MOV
@R0,#45H
;寄存器间接寻址,把45H送到R0存的数据对应的地址
;就是20H这个地址
INC
R0
;R0加一
MOV
@R0,#74H
;寄存器间接寻址,把74H送到R0存的数据对应的地址
;就是21H这个地址
MOV
R1,#30H
;把30H送到R1
MOV
@R1,#67H
;寄存器间接寻址,把67H送到R1存的数据对应的地址
;就是30H这个地址
INC
R1
;R1加一
MOV
@R1,#28H
;寄存器间接寻址,把28H送到R1存的数据对应的地址
;就是31H这个地址
CLR
C
;清除符号位
MOV
R2,#02
;把2送到R2
L2:ACALL
L1
;调子函数L1
DEC
R0
;R0减一
DEC
R1
;R1减一
DJNZ
R2,L2
;如果R2减到0,就执行下一句,否则跳到L2
CLR
A
;累加器清零
MOV
ACC0,C
;把符号位移到累加器的第零位
NOP
;延时一个周期
MOV
@R0,A
;寄存器间接寻址,把A里的数据传送到R0对应的地址
L3:
SJMP
L3
;死循环
L1:
MOV
A,@R0
;寄存器间接寻址,把R0对应的地址
;里的数据传送到
A
ADDC
A,@R1
;把R1里存放的地址里的数据和A相加,再加进位位。
DA
A
;十进制调整指令
MOV
@R0,A
;寄存器间接寻址,把A里的数据传送到R0对应的地址
RET
;
子程序返回
END
;结束
单片机指令功能一览表
助记符 代码 说明
MOV A,Rn E8~EF 寄存器A
MOV A,direct E5 dircet 直接字节送A
MOV A,@Ri ER~E7 间接RAM送A
MOV A,#data 74 data 立即数送A
MOV Rn,A F8~FF A送寄存器
MOV Rn,dircet A8~AF dircet 直接字节送寄存器
MOV Rn,#data 78~7F data 立即数送寄存器
MOV dircet,A F5 dircet A送直接字节
MOV dircet,Rn 88~8F dircet 寄存器送直接字节
MOV dircet1,dircet2 85 dircet1 dircet2 直接字节送直接字节
MOV dircet,@Ro 86~87 间接RAM送直接字节
MOV dircet,#data 75 dircet data 立即数送直接字节
MOV @Ri,A F6~F7 A送间接RAM
MOV @Ri,#data 76~77 data 直接字节送间接RAM
MOV @Ri,#data 76~77 data 立即数送间接RAM
MOV DPTR,#data16 90 data 15~8 16位常数送数据指针
data7~0
MOVC A,@A+DPTR 93 由((A)+(DPTR))寻址的程序存贮
器字节选A
MOVC A,@A+PC 83 由((A)+(PC));寻址的程序存贮器字节送A
MOVX A,@Ri E2~E3 送外部数据(8位地址)送A
MOVX A,@DPTR E0 送外部数据(16位地址)送A
MOVX @Ri,A F2~F3 A送外部数据(8位地址)
MOVX @DPTR,A F0 A送外部数据(16位地址)
PUSH dircet C0 dircet 直接字节进栈,SP加1
POP dircet D0 dircet 直接字节退栈,SP减1
XCH A,Rn C8~CF 交换A和寄存器
XCH A,dircet C5 dircet 交换A和直接字节
XCH A,@Ri C6~C7 交换A和间接RAM
XCH A,@Ri D6~D7 交换A和间接RAM的低位
SWAP A C4
算术 *** 作 (A的二个半字节交换)
ADD A,Rn 28~2F 寄存器加到A
ADD A,dircet 25 dircet 直接字节加到A
ADD A,@Ri 26~27 间接RAM加到A
ADD A,#data 24data 立即数加到A
ADD A,Rn 38~3F 寄存器和进位位加到A
ADD A,dircet 35dircet 直接字节和进位位加到A
ADD A,@Ri 36~37 间接字节和进位位加到A
ADD A,data 34 data 立即数和进位位加到A
ADD A,Rn 98~9F A减去寄存器和进位位
ADD A,dircet 95 dircet A减去直接字节和进位位
ADD A,@Ri 36~37 间接RAM和进位位加到A
ADD A,data 34 data 立即数和进位位加到A
SUBB A,Rn 98~9F A减去寄存器和进位位
SUBB A,dircet 95 dircet A减去直接字节和进位位
SUBB A,@Ri 96~97 A减去间接RAM和进位位
SUBB A,#data 94 data A减去立即数和进位位
INC A 04 A加1
INC Rn 08~0F 寄存器加1
INC dircet 05 dircet 直接字节加1
INC @Ri 06~07 间接RAM加1
DEC A 14 A减1
DEC Rn 18~1F 寄存器减1
DEC dircet 15 dircet 直接字节减1
DEC @Ri 16~17 间接RAM减1
INC DPTR A3 数据指针加1
MUL AB A4 A乘以B
DIV AB 84 A除以B
DA A D4 A的十进制加法调整
逻辑 *** 作
ANL A,Rn 58~5F 寄存器“与”到A
ANL A,dircet 55 dircet 直接字节“与”到A
ANL A,@Ri 56~57 间接RAm“与”到A
ANL A,#data 54 data 立即数“与”到A
ANL dircet A 52 dircet A“与”到直接字节
ANL dircet,#data 53 dircet data 立即数“与”到直接字节
ORL A,Rn 48~4F 寄存器“或”到A
ORL A,dircet 45 dircet 直接字节“或”到A
ORL A,@Ri 46~47 间接RAM“或”到A
ORL A,#data 44 data 立即数“或”到A
ORL dircet,A 42 dircet A“或”到直接字节
ORL dircet,#data 43 dircet data 立即数“或”到直接字节
XRL A,Rn 68~6F 寄存器“异或”到A
XRL A,dircet 65 dircet 直接字节“异或”到A
XRL A,@Ri 66~67 间接RAM“异或”到A
XRL A,#data 64 data 立即数“异或”到A
XRL dircet A 62 dircet A“异或”到直接字节
XRL dircet,#data 63 dircet data 立即数“异或”到直接字节
CLR A E4 清零
CPL A F4 A取反
RL A 23 A左环移
RLC A 33 A通过进位左环移
RR A 03 A右环移
RRC A 13 A通过进位右环移
控制程序转移
ACALL addr 11 1 addr(a7~a0) 绝对子程序调用
LCALL addr 16 12 addr(15~8) 长子程序调用
addr(7~0)
RET 22 子程序调用返回
RETI addr 11 32 中断调用返回
AJMP addr 11 △1 addr(a7~a6) 绝对转移
LJMP addr 16 02addr(15~8) 长转移
addr(7~0)
SJMP rel 80 rel 短转移,相对转移
JMP @A+DPTR 73 相对于DPTR间接转移
JZ rel 60 rel A为零转移
JNZ rel 70 rel A为零转移
CJNE A,dircet,rel B5 dircet rel 直接字节与A比较,不等则转移
CJNE A,#data,rel B4 data rel 立即数与A比较,不等则转移
CJNE A,Rn,#data,rel B8~BF data rel 立即数与寄存器比较,不等则转移
CJNE @Ri,#data,rel B6~B7 data rel 立即数与间接RAM比较,不等则转移
DJNZ Rn,rel D8~DF rel 寄存器减1,不为零则转移
DJNZ dircet,rel B5 dircet rel 直接字节减1,不为零则转移
NOP 00 空 *** 作
=a10a9a8l
△=a10a9a80
布尔变量 *** 作
CLR C C3 清零进位
CLR bit C2 清零直接位
SETB C D3 置位进位
SETB bit D2 置位直接位
CPL C B3 进位取反
CPL bit B2 直接位取反
ANL C,bit 82 dit 直接数“与”到进位
ANL C,/bit B0 直接位的反“与”到进位
ORL C,bit 72 bit 直接位“或”到进位
ORL C,/bit A0 bit 直接位的反“或”到进位
MOV C,bit A2 bit 直接位送进位
MOV bit,C 92 bit 进位送直接位
JC rel 40 rel 进位位为1转移
JNC rel 50 rel 进位位为0转移
JB bit,rel 20 bit rel 直接位为1相对转移
JNB bit,rel 30 bit rel 直接位为0相对转移
JBC bit,rel 10 bit rel 直接位为1相对转移,然后清零该位
以上就是关于有关单片机的指令系统,专业的来全部的内容,包括:有关单片机的指令系统,专业的来、单片机中程序每条语句的意思、单片机指令等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)