C51控制转移类指令及位操作指令
C51汇编111条指令

54 逻辑与 ANL A, Rn 将累加器A的值和寄存器Rn的值进行与操作,结果保存到累加器A中
55 ANL A, direct 将累加器A的值和direct地址单元内的值进行与操作,结果保存到累加器A中
56 ANL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行与操作,结果保存到累加器A中
23 MOVX A , @DPTR 将DPTR寄存器所指外部RAM地址单元内的数据送累加器A
24 MOVX A, @Ri 寄存器Ri内为片外RAM地址,将该地址单元内的数据送累加器A
25 MOVX @Ri, A 寄存器Ri内为片外RAM地址,将该地址单元内的数据送累加器A
26 与ROM传送 MOVC A, @A+DPTR A+DPTR构成ROM地址,将该地址内的数据送累加器A内
85 CJNE A, #data, rel If(累加器A!= 立即数)则PC加2再加上rel作为目标地址
86 CJNE Rn, #data, rel If(寄存器Rn的值!= 立即数)则PC加2再加上rel作为目标地址
87 CJNE @Ri, #data, rel 寄存器Ri内为RAM地址,If(该地址单元的值!= 立即数)则PC加2再加上rel作为目标地址
66 逻辑异或 XRL A, Rn 将累加器A的值和寄存器Rn的值进行异或操作,结果保存到累加器A中
67 XRL A, direct 将累加器A的值和direct地址单元内的值进行异或操作,结果保存到累加器A中
68 XRL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行异或操作,结果保存到累加器A中
控制转移指令
MCS-51指令系统

4、控制转移类指令(二)
无条件转移:(LJMP,AJMP,SJMP,JMP—4条) LJMP addr16 长跳转指令
——可在64K范围内跳转 AJMP addr11 绝对跳转指令
——可在指令所在的2K范围内跳转 SJMP rel 相对跳转指令
——可在当前PC-128与+127范围内跳转 JMP @A+DPTR 间接长跳转指令
1
累加器清零/取反操作 (CLR,CPL—2条)
CLR A —对累加器清零
1 Byte 1 Tm
CPL A ——对累加器按位取非 1 Byte 1 Tm 15
3、逻辑运算及移位类指令(三)
逻辑运算指令在程序中的应用(下面的例子认为Acc 的内容为9AH)
逻辑与ANL运算用于对某些位进行清0或者保留: 例: ANL A, #0FH; 则(A) = 0AH
位清零/置位指令(4条): CLR bit(或C) —— (bit或 C)“0” SETB bit(或C) —— (bit或 C)“1”
位逻辑与/或/非指令(6条): ANL C,bit(或/bit) ORL C,bit(或/bit) CPL bit (或 C) 注: “/bit”表示对bit位先取反然后再参加运算
带借位减法(SUBB):(A) ← (A)- (Cy)- (第二操作数)
10
2、算术运算类指令(三)
加1/减1操作: (INC,DEC—9条) INC, DEC与用加/减法指令做加1/减1 操作不 同之处在于INC、DEC不影响标志位。
单字节乘/除运算: (MUL,DIV—2条) 两个单字节数的乘/除法运算只在A与B之间 进行。 MUL AB: (A)与(B)相乘, 积为16位数,
51单片机学习06-位指令转移指令

Relative
执行相对转移: 执行相对转移:PC ←
目标地址 下一指令址 + 偏移量
硬件逻辑电路图
【例B3-14】如下控制梯形图,请用MCS-51程序实现: B3-14】如下控制梯形图,请用MCS-51程序实现: MCS 程序实现 MOV C , P1.3 ANL C , P1.2 ORL C , P2.1 ANL C , /P2.0 MOV P2.0 , C ;取P1.3 取 ;串联 串联P1.2 串联 ;并联 P2.1 并联 ;串联 P2.0常闭点 串联 常闭点 ;输出 P2.0 输出
ORG 0030H MAIN:MOV A , #56H ADD A , #67H DA A MOV 30H , A SJMP $ END
PC
;
目标地址 下一指令址 + 偏移量 0030H ← 0002H + 0046H
rel=[目标地址 下一指令址] 目标地址+ rel ;∴rel=[目标地址-下一指令址]低8位
【例3-12】 MOV 12】 MOV
C , 06H 20H.6 P1.0 ,C
90H或 90H或90H.0
;20H.6→Cy ;Cy→P1.0
P.45
【例3-13】 13】 CLR CLR CPL SETB C
24H.7
;0→Cy ;0→24H.7位 0→24H.7位 求反→21H.0位 ;21H.0 求反→21H.0位 ;1→P1.7位 1→P1.7位
51系列单片机指令表

E5direct
2
1
MOVdirect.A
累加器A送直接寻址单元
F5direct
2
I
MOVRn.#data
立即数送寄存器
78~7Fdata
2
I
MOVdirect,#data
立即数送直接寻址单元
75directdata
3
2
MOV@Ri,#data
立即数送内部RAM单元
76~77data
2
1
MOVdirect,Rn
寄存器送直接寻址单元
88~8Fdireci
2
2
MOVRn.direct
直接寻址单元送寄存器
A8~AFdirect
2
2
MOVdirect.@Ri
内部RAM单元送直接寻址单元
86~87direct
2
2
MOV@Ri,direct
直接寻址单元送内部RAM单元
A6-A7direct
DOdireci
2
2
PUSHdirect
直接寻址单元压入栈顶
COdirect
2
2
算术运算类指令
指令
功能简述
指令代码
字节
数
T
ADDA,Rn
累加器A加寄存器
28-2F
1
1
ADDA.@Ri
累器A加内部RAM单元
26-27
1
I
ADDA.direct
照加器A加直接寻址单元
25direct
2
1
ADDA.#data
盛加器A与寄存器交换
C8~CF
1
1
XCHA,@Ri
C51单片机指令集大全

格式功能简述字节数周期一、数据传送类指令MOV A, Rn 寄存器送累加器 1 1MOV Rn,A 累加器送寄存器 1 1MOV A ,@Ri 内部RAM单元送累加器 1 1MOV @Ri ,A 累加器送内部RAM单元 1 1MOV A ,#data 立即数送累加器 2 1MOV A ,direct 直接寻址单元送累加器 2 1MOV direct ,A 累加器送直接寻址单元 2 1MOV Rn,#data 立即数送寄存器 2 1MOV direct ,#data 立即数送直接寻址单元 3 2MOV @Ri ,#data 立即数送内部RAM单元 2 1MOV direct ,Rn 寄存器送直接寻址单元 2 2MOV Rn ,direct 直接寻址单元送寄存器 2 2MOV direct ,@Ri 内部RAM单元送直接寻址单元 2 2 MOV @Ri ,direct 直接寻址单元送内部RAM单元 2 2 MOV direct2,direct1 直接寻址单元送直接寻址单元 3 2 MOV DPTR ,#data16 16位立即数送数据指针 3 2MOVX A ,@Ri 外部RAM单元送累加器(8位地址) 1 2 MOVX @Ri ,A 累加器送外部RAM单元(8位地址) 1 2 MOVX A ,@DPTR 外部RAM单元送累加器(16位地址) 1 2 MOVX @DPTR ,A 累加器送外部RAM单元(16位地址) 1 2 MOVC A ,@A+DPTR 查表数据送累加器(DPTR为基址) 1 2 MOVC A ,@A+PC 查表数据送累加器(PC为基址) 1 2 XCH A ,Rn 累加器与寄存器交换 1 1XCH A ,@Ri 累加器与内部RAM单元交换 1 1 XCHD A ,direct 累加器与直接寻址单元交换 2 1 XCHD A ,@Ri 累加器与内部RAM单元低4位交换 1 1 SWAP A 累加器高4位与低4位交换 1 1POP direct 栈顶弹出指令直接寻址单元 2 2 PUSH direct 直接寻址单元压入栈顶 2 2二、算术运算类指令ADD A, Rn 累加器加寄存器 1 1ADD A,@Ri 累加器加内部RAM单元 1 1ADD A, direct 累加器加直接寻址单元 2 1ADD A, #data 累加器加立即数 2 1ADDC A, Rn 累加器加寄存器和进位标志 1 1 ADDC A,@Ri 累加器加内部RAM单元和进位标志 1 1 ADDC A, #data 累加器加立即数和进位标志 2 1 ADDC A, direct 累加器加直接寻址单元和进位标志 2 1 INC A 累加器加1 1 1INC Rn 寄存器加1 1 1INC direct 直接寻址单元加1 2 1INC @Ri 内部RAM单元加1 1 1INC DPTR 数据指针加1 1 2DA A 十进制调整 1 1SUBB A, Rn 累加器减寄存器和进位标志 1 1 SUBB A,@Ri 累加器减内部RAM单元和进位标志 1 1 SUBB A, #data 累加器减立即数和进位标志 2 1 SUBB A, direct 累加器减直接寻址单元和进位标志 2 1 DEC A 累加器减1 1 1DEC Rn 寄存器减1 1 1DEC @Ri 内部RAM单元减1 1 1DEC direct 直接寻址单元减1 2 1MUL AB 累加器乘寄存器B 1 4DIV AB 累加器除以寄存器B 1 4三、逻辑运算类指令ANL A, Rn 累加器与寄存器 1 1ANL A,@Ri 累加器与内部RAM单元 1 1ANL A, #data 累加器与立即数 2 1ANL A, direct 累加器与直接寻址单元 2 1ANL direct, A 直接寻址单元与累加器 2 1ANL direct, #data 直接寻址单元与立即数 3 1ORL A, Rn 累加器或寄存器 1 1ORL A,@Ri 累加器或内部RAM单元 1 1ORL A,#data 累加器或立即数 2 1ORL A,direct 累加器或直接寻址单元 2 1ORL direct, A 直接寻址单元或累加器 2 1ORL direct, #data 直接寻址单元或立即数 3 1XRL A, Rn 累加器异或寄存器 1 1XRL A,@Ri 累加器异或内部RAM单元 1 1XRL A,#data 累加器异或立即数 2 1XRL A,direct 累加器异或直接寻址单元 2 1XRL direct, A 直接寻址单元异或累加器 2 1XRL direct, #data 直接寻址单元异或立即数 3 2RL A 累加器左循环移位 1 1RLC A 累加器连进位标志左循环移位 1 1 RR A 累加器右循环移位 1 1RRC A 累加器连进位标志右循环移位 1 1 CPL A 累加器取反 1 1CLR A 累加器清零 1 1四、控制转移类指令类ACCALL addr11 2KB 范围内绝对调用 2 2AJMP addr11 2KB 范围内绝对转移 2 2LCALL addr16 2KB 范围内长调用 3 2LJMP addr16 2KB 范围内长转移 3 2SJMP rel 相对短转移 2 2JMP @A+DPTR 相对长转移 1 2RET 子程序返回 1 2RET1 中断返回 1 2JZ rel 累加器为零转移 2 2JNZ rel 累加器非零转移 2 2CJNE A ,#data ,rel 累加器与立即数不等转移 3 2CJNE A ,direct ,rel 累加器与直接寻址单元不等转移 3 2 CJNE Rn,#data ,rel 寄存器与立即数不等转移 3 2CJNE @Ri ,#data,rel RAM 单元与立即数不等转移 3 2DJNZ Rn ,rel 寄存器减1不为零转移 2 2DJNZ direct ,rel 直接寻址单元减1不为零转移 3 2 NOP 空操作 1 1五、布尔操作类指令MOV C, bit 直接寻址位送C 2 1MOV bit, C C 送直接寻址位 2 1CLR C C 清零 1 1CLR bit 直接寻址位清零 2 1CPL C C 取反 1 1CPL bit 直接寻址位取反 2 1SETB C C 置位 1 1SETB bit 直接寻址位置位 2 1ANL C, bit C 逻辑与直接寻址位 2 2ANL C, /bit C 逻辑与直接寻址位的反 2 2ORL C, bit C 逻辑或直接寻址位 2 2ORL C, /bit C 逻辑或直接寻址位的反 2 2JC rel C为1 转移 2 2JNC rel C为零转移 2 2JB bit,rel 直接寻址位为1转移 3 2JNB bit,rel 直接寻址为0转移1、D1~D8八个彩灯按规定顺序依次点亮(间隔1秒),最后全亮;2、按规定顺序依次熄灭(间隔1秒),最后全灭;3、八个灯同时点亮,保持1秒;4、八个灯同时熄灭,保持0.5秒;再将第3、4步重复4遍,最后整个程序再重复N遍。
第六讲 80C51逻辑及控制转移类指令 091001

例10: 数据的拆分与拼装 :
要求: 中取出高5位 要求:从(30H)==x7x6x5x4x3x2x1x0中取出高 位,从 中取出高 (31H)=y7y6y5y4y3y2y1y0中取出低 位,拼装后存入 中取出低3位 拼装后存入40H中, 中取出低 中 (40H)=Y2Y1Y0X7X6X5X4X3 地址 机器码 ORG 0000H 0000 E5 30 0002 C4 0003 23 0004 F5 40 0006 53 40 1F MOV A,30H , SWAP A RL A ;X3X2X1X0 X7X6X5X4
胆欲大,心欲小,智欲圆,行欲方;
累加器移位/循环指令 累加器移位 循环指令
⒉ 带进位循环右移指令: RRC A 带进位循环右移指令 它是将累加器的内容和进位位一起循环右移一位, 它是将累加器的内容和进位位一起循环右移一位, 并且a0移入进位位 ,CY的内容移到 a7.此操作不 并且 移入进位位CY, 的内容移到 . 移入进位位 之外的标志位. 影响 CY之外的标志位. 之外的标志位 例:设(A)=B4H(10110100B),(CY)=1, = = , 执行指令: 执行指令: RRC A 执行结果为: = 执行结果为:(A)=DAH ( 11011010B),(CY)=0 =
胆欲大,心欲小,智欲圆,行欲方;
逻辑"异或" 逻辑"异或"运算指令
这组指令的助记符为XRL,用符号"⊕"表示: ,用符号" 这组指令的助记符为 表示: XRL XRL XRL XRL XRL XRL A,Rn , A,drect , A,@Ri , A,#data , direct,A , ;(A)←(A)⊕(Rn) ) ( ) ) ;(A)←(A)⊕(direct) ) ( ) ) ;(A)←(A)⊕(( )) ) ( ) ((Ri)) ;(A)←(A)⊕#data ) ( ) ;(direct)←(direct)⊕(A) ) ( ) )
C51中移位运算

在汇编中用RR RRC RL RLC就很容易实现移位,在c51中利用<<,>>就很容易的实现移出。
移入就显得比较麻烦,特别是右移入。
(1:)送数送两个单独字节的数据的程序,左送 &0x80(左移给数) ,从最高位-最低位顺序给数右送 &0x01 (右移给数),最低位-最高位给数bit out;out = low & 0x01;low >>= 1;low |= (high & 0x01)<<7;high >>= 1;( 2):取数(不管怎么移入,第一次操作之后获取的那一位数据必须在接受数据的最高位或者最低位上,从而选择是先取数还是先移位)a:如果是先接受高位后接受低位则先左移一位后接受一位数据(i2c总线)uchar i;uchar temp = 0;uchar date = 0x82;for (i = 0; i < 8; i++){temp <<= 1; //左移temp |= (bit)(date & 0x80);date <<= 1;}b:如果是先接受低位,后接受高位则先接受一位数据后循环右移一位(DS18B20)uchar i;uchar temp = 0;uchar date = 0x82;for (i = 0; i < 8; i ++){temp |= (bit)(date & 0x01);date >>= 1;temp = _cror_(temp,1);//循环右移,应用_cror_()需要包含头文件<intrins.h>}如果不用函数则for循环应该这样写for (i = 0; i < 8; i ++){temp >>= 1;temp |= (date & 0x01) << 7; date >>= 1;}(3.)任意一位的置位或者取反运算置位运算low |= 0x01; (置最低位为1)取反运算low |= ~low & 0x01;(4.)合并和拆分数据1:合并两个单字节数据为一个双字节数据 int len;uchar low;uchar high;Len |= high;Len <<= 8;Len |= low;2: 拆分一个双字节数据为两个单字节数据 int len;uchar low;uchar high;low |= len;high |= len >> 8;。
51单片机c51指令.

操作数存在程 序存储器中
操作数就包含在指令代码中,在操作码之后,称为 立即数,用“#”表示。
MCS-51
如:MOV P1, #80H MOV R7, #0F5H MOV DPTR,#1245H
2019/8/8
5
3.2.2 直接寻址
Direct Addressing
直接使用数所在单元的地址找到了操作数,所以称 这种方法为直接寻址。
操作数在SFR、内部RAM、位地址空间。 如: MOV A,00H
MOV C,60H MOV A,0F0H
2019/8/8
6
3.2.3 寄存器寻址
Register Addressing
对选定的工作寄存器R0~R7、累加器A、通用寄存器B、 地址寄存器DPTR中的数进行操作。 例:MOV A,R0;将R0工作寄存器中的数据送到累加器A中去。
提一个问题:我们知道,工作寄存器就是内存单元 的一部分,如果我们选择工作寄存器组0,则R0就 是RAM的00H单元,那么这样一来,MOV A,00H 和 MOV A,R0不就没什么区别了吗?
2019/8/8
7
的确,这两条指令执行的结果是完全相同的, 都是将00H单元中的内容送到A中去,但是执行的过 程不同,执行第一条指令需要2个机器周期,而第二 条则只需要1个机器周期,第一条指令变成最终的目 标码要两个字节(E5H 00H),而第二条则只要一个 字节(E8H)就可以了。
25
例: 1067H+30A0H
0001 0000 0110 0111 0011 0000 1010 0000 0100 0001 0000 0111
1067H 30A0H
4107H
先做67H+A0H=107H,而107H显然超过了0FFH, 因此最终保存在A中的是07H,而1则到了PSW中的 CY位了。换言之,CY就相当于是100H。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
80C5设有丰富的控制转移指令,可分为无条件转 移指令、条件转移指令、循环转移指令、子程序调用 和返回指令及空操作指令等。
采用助记符有:AJMP、LJMP、SJMP、JZ、 JNZ、CJNE、DJNZ、ACALL、LCALL、RET、 RETI、NOP等13种。
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
;若(A)≠0,则(PC)=(PC)+2
JNZ rel
;若(A)≠0,则(PC)= (PC+2)+rel
;若(A)=0,则(PC)=(PC)+2
满足各自条件时,程序转向指定的目标地址执行(相当于执 行SJMP rel) 。当不满足各自条件时,程序顺序往下执行。
偏移量rel是用补码形式表示的带符号的8 位数,因此.程序 转移的目标地址为指令前128 B或指令后 127 B。
LJMP dr16
该指令提供16位地址,目标地址由指令第二字 节(高8位地址)和第三字节(低8位地址)组成。因此,程 序转向的目标地址可以包含程序存储器的整个64 KB 空间。
例:设(PC)=0123H,标号ADR所指单元地址为 3456H。
执行指令∶ LJMP ADR
执行结果为(PC)=3456H
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
无条件转移指令
指令 SJMP rel AJMP addr11 LJMP addrl6 JMP @A+DPTR 这类指令的功能是程序无条件地转移到各自指定 的目标地址去执行,不同的指令形成的目标地址不同。
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
1. 长转移指令
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
例:设(PC)=0456H,标号ADR所指的单元为0123H。 执行指令∶ AJMP ADR 执行结果程序转向为(PC)=0123H。
例:某应用系统外扩了8K字节RAM,要求把内部 RAM的20H~2FH单元内容发送到外部RAM的 800H~80FH单元中。
执行指令:
MOV
DPTR,#800H
MOV
R0,#20H
MOV
R7,#10H
AGAIN:MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R7,AGAIN
第三章 80C51单片机指令系统
本讲教学内容: 控制转移类指令
控制转移类指令
程序的顺序执行是由PC自动加1来实现的,但在 应用系统中,往往会遇到一些情况,需要强迫改变程 序执行顺序,比如调用子程序,比如根据检测值与设 定值的比较结果要求程序转移到不同的分支入口等。 要改变程序的执行顺序进行分支转向,应通过强迫修 正PC值得方法来实现,这就是控制转移类指令的基本 功能。
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
比如 CJNE Rn,#data,rel指令
这组指令的功能是对指定的两操作数进行比较,即 (操作数1)-(操作数2) ,但比较结果均不改变两个操作数 的值,仅影响标志位CY。
• 若不等,程序转移到(PC)十3加上第三字节带符号 的8 位偏移量(rel)所指向的目标地址;
程序转向3456H单元执行。
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
⒉ 绝对转移指令
AJMP addr11
该指令提供11位地址,目标地址由指令提供的 11位地址去取代当前PC的低11位,形成新的PC值, 即为本绝对转移地址。因此,程序的目标地址必须包 含AJMP指令后第一条指令的第一个字节(即当前PC 地址)在内的2 KB范围内(即高5位地址必须相同)。
?:请将以上循环控制改用CJNE指令来实现 ?:请将以上循环控制改用JZ指令来实现
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
请看Keil C下演示实例,程序段如下: ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV A,#01H JZ Lable1 DEC A JZ Lable2 NOP Lable1: NOP Lable2: MOV B,#0FFH END
条件转移指令
条件转移指令仅仅在满足指令中规定的条件(如累 加器内容是否为零,两个操作数是否相等) 时才执行无 条件转移,否则程序顺序执行。
6条指令可分为累加器判零转移指令、数值比较 转移指令和减1条件转移指令。
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
⒈ 累加器判零转移指令
JZ rel
;若(A)=0,则(PC)=(PC+2)+rel
CJNE A,30H , LOOP
AJMP FH
;等于T30,转FH
LOOP: JNC JW
;大于T30,降温
CJNE A,20 H,LOOP1
AJMP FH
;等于T20,转FH
LOOP1:JC SW
;小于T20,升温
FH:------
;保温
JW:------
; 降温
SW:------
; 升温
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
减1条件转移指令
DJNZ Rn,rel DJNZ direct,rel 指令功能是:每执行一次本指令,先将指定的Rn或 direct的内容减1,再判别其内容是否为0。若不为0, 转向目标地址,继续执行循环程序;若为0,则结束 循环程序段,程序往下执行。
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
这些指令执行后不影响任何操作数和标志位。
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
⒉ 数值比较转移指令
CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,# data,rel CJNE @Ri,#data,rel 其指令格式为: CJNE(操作数1),(操作数2),rel 数值比较转移指令是三字节指令,是80C51单片微机 指令系统中仅有的四条三个操作数的指令,在程序设计中非 常有用。同时具有比较转移和数值大小比较的功能。
若(操作数1) >(操作数2),清进位标志(CY)。
若(操作数1) <(操作数2),则置位进位标志(CY)。
• 值相等,程序继续执行。
程序转移的范围是从(PC)+3为起始的+127~一128B 的单元地址。
刘海燕
磨砺当如百炼之金,急 就者,非邃养;
例:温度控制程序
某温度控制系统,A中存温度采样值Ta,(20H)=温度下限 值T20,(30H)=温度上限值T30。若Ta>T30,程序转降温JW, 若Ta<T20,程序转升温SW,若T30≥Ta≥T20程序转FH返回主程 序。