51指令
51单片机位操作指令

51单片机位操作指令摘要:1.51 单片机简介2.位操作指令概述3.常见位操作指令a.位清零指令b.位置位指令c.位取反指令d.位测试指令4.位操作指令应用实例a.简单按键控制b.计数器应用c.矩阵键盘扫描5.位操作指令在51 单片机中的重要性正文:51 单片机是一种广泛应用的8 位微控制器,其功能强大且成本低廉,被广泛应用于嵌入式系统和自动控制领域。
在51 单片机的指令系统中,位操作指令占据着重要地位,它们可以实现对单片机内部寄存器和外设状态的快速操作。
位操作指令主要针对单个二进制位进行操作,包括位清零指令、位置位指令、位取反指令和位测试指令等。
这些指令可以实现对二进制数据的设置、检测和修改等功能,为实际应用提供了极大的便利。
位清零指令(如CLR)用于将指定寄存器的某一位设置为0。
例如,我们可以使用CLR P1.0 来将P1 寄存器的第0 位清零。
位置位指令(如SETB)则用于将指定寄存器的某一位设置为1。
例如,我们可以使用SETB P1.0 来将P1 寄存器的第0 位设置为1。
位取反指令(如CPL)用于将指定寄存器的某一位取反,即0 变1,1 变0。
例如,我们可以使用CPL P1.0 来将P1 寄存器的第0 位取反。
位测试指令(如JC、JNC、JB、JNB 等)用于根据指定寄存器的某一位的值来决定程序的执行流程。
例如,我们可以使用JC P1.0 来检查P1 寄存器的第0 位是否为1,若为1 则跳转到指定地址执行程序。
位操作指令在实际应用中有着广泛的应用。
例如,我们可以使用位清零指令和位置位指令来实现简单按键的控制,根据按键的状态来控制LED 灯的点亮和熄灭。
又如,我们可以使用位操作指令来实现计数器功能,通过位清零指令和位测试指令来计数和判断计数器是否达到预定值。
此外,位操作指令还可以应用于矩阵键盘扫描,通过位操作指令来检测并识别按键的按下。
总之,位操作指令在51 单片机中具有举足轻重的地位,掌握这些指令的使用方法对于进行51 单片机编程至关重要。
51单片机汇编指令详解

51单片机汇编指令详解mcs-51系列单片机指令目录:1、a2、x3、r4、s5、n6、o7、p8、m9、j10、l11、d12、i13、c一、以a结尾的指令存有18条,分别为:acalladdr11adda,rnadda,directadda,@riadda,#dataaddca,rnaddca,directaddca,@riaddca,#dataajmpaddr11anla,rnanla,directanla,@rianla,#dataanldirect,aanldirect,#dataanlc,bitanlc,/bit1、acalladdr11指令名称:绝对调用指令指令代码:{a10,a9,a8,10001},a[7:0]指令功能:结构目的地址,展开子程序调用。
其方法就是以指令提供更多的11十一位地址(al0~a0),替代pc的高11十一位,pc的高5十一位维持不变。
操作方式内容:pc←(pc)+2sp←(sp)+1(sp)←(pc)7~0sp←(sp)+1(sp)←(pc)15~8pc10~0←addrl0~0字节数:2机器周期:2采用表明:由于指令只得出子程序入口地址的高11十一位,因此调用范围就是2kb。
2、adda,rn指令名称:寄存器乘法指令指令代码:28h~2fh指令功能:累加器内容与寄存器内容相加操作内容:a←(a)+(rn),n=0~7字节数:1机器周期;1影响标志位:c,ac,ov3、adda,direct指令名称:轻易串行乘法指令指令代码:25h指令功能:累加器内容与内部ram单元或专用寄存器内容相加操作内容:a←(a)+(direct)字节数:2机器周期:1影响标志位:c,ac,ov4、adda,@ri指令名称:间接串行乘法指令指令代码:26h~27h指令功能:累加器内容与内部ram高128单元内容相乘操作方式内容:a←(a)+((ri)),i=0,1字节数:1机器周期:1影响标志位:c,ac,ov5、adda,#data指令名称:立即数加法指令指令代码:24h指令功能:累加器内容与立即数相乘操作方式内容:a←(a)+data字节数:2机器周期:1影响标志位:c,ac,ov6、addca,rn指令名称:寄存器带进位加法指令指令代码:38h~3fh指令功能:累加器内容、寄存器内容和位次位相乘操作方式内容:a←(a)+(rn)+(c),n =0~7字节数:1机器周期:1影响标志位:c,ac,ov7、addca,direct指令名称:直接寻址带进位加法指令指令代码:35h指令功能:累加器内容、内部ram高128单元或专用寄存器内容与位次位加操作内容:a←(a)+(direct)+(c)字节数:2机器周期:1影响标志位:c,ac,ov8、addca,@ri指令名称:间接串行拎位次乘法指令指令代码:36h~37h指令功能:累加器内容、内部ram低128单元内容及进位位相加操作方式内容:a←(a)+((ri))+(c),i=0,1字节数:1机器周期:1影响标志位:c,ac,ov9、addca,#data指令名称:立即数带位次乘法指令指令代码:34h指令功能:累加器内容、立即数及进位位相加操作内容:a←(a)+data+(c)字节数:2机器周期:1影响标志位:c,ac,ov10、ajmpaddr11指令名称:绝对迁移指令指令代码:{a10,a9,a8,00001},a[7:0]指令功能:构造目的地址,实现程序转移。
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
51单片机指令大全

51单片机指令大全1 MOV A,Rn 寄存器内容送入累加器2 MOV A,direct 直接地址单元中的数据送入累加器3 MOV A,@Ri 间接RAM 中的数据送入累加器4 MOV A,#tata 立即数送入累加器5 MOV Rn,A 累加器内容送入寄存器6 MOV Rn,direct 直接地址单元中的数据送入寄存器7 MOV Rn,#data 立即数送入寄存器8 MOV direct,A 累加器内容送入直接地址单元9 MOV direct,Rn 寄存器内容送入直接地址单元10 MOV direct,direct 直接地址单元中的数据送入另一个直接地址单元11 MOV direct,@Ri 间接RAM 中的数据送入直接地址单元12 MOV direct,#data 立即数送入直接地址单元13 MOV @Ri,A 累加器内容送间接RAM 单元14 MOV @Ri,direct 直接地址单元数据送入间接RAM 单元15 MOV @RI,#data 立即数送入间接RAM 单元16 MOV DRTR,#dat16 16 位立即数送入地址寄存器17 MOVC A,@A+DPTR 以DPTR为基地址变址寻址单元中的数据送入累加器18 MOVC A,@A+PC 以PC 为基地址变址寻址单元中的数据送入累加器19 MOVX A,@Ri 外部RAM(8 位地址)送入累加器20 MOVX A,@DPTR 外部RAM(16 位地址)送入累加器21 MOVX @Ri,A 累计器送外部RAM(8 位地址)22 MOVX @DPTR,A 累计器送外部RAM(16 位地址)23 PUSH direct 直接地址单元中的数据压入堆栈24 POP direct 弹栈送直接地址单元25 XCH A,Rn 寄存器与累加器交换26 XCH A,direct 直接地址单元与累加器交换27 XCH A,@Ri 间接RAM 与累加器交换28 XCHD A,@Ri 间接RAM 的低半字节与累加器交换算术操作类指令:1 ADD A,Rn 寄存器内容加到累加器2 ADD A,direct 直接地址单元的内容加到累加器3 ADD A,@Ri 间接ROM 的内容加到累加器4 ADD A,#data 立即数加到累加器5 ADDC A,Rn 寄存器内容带进位加到累加器6 ADDC A,direct 直接地址单元的内容带进位加到累加器7 ADDC A,@Ri 间接ROM 的内容带进位加到累加器8 ADDC A,#data 立即数带进位加到累加器9 SUBB A,Rn 累加器带借位减寄存器内容10 SUBB A,direct 累加器带借位减直接地址单元的内容11 SUBB A,@Ri 累加器带借位减间接RAM 中的内容12 SUBB A,#data 累加器带借位减立即数13 INC A 累加器加114 INC Rn 寄存器加115 INC direct 直接地址单元加116 INC @Ri 间接RAM 单元加117 DEC A 累加器减118 DEC Rn 寄存器减1 1 1219 DEC direct 直接地址单元减120 DEC @Rj 间接RAM 单元减 121 INC DPTR 地址寄存器DPTR 加 122 MUL AB A 乘以B,结果放在A23 DIV AB A 除以B,结果放在A24 DA A 累加器十进制调整布尔变量操作类指令:1 CLR C 清进位位2 CLR bit 清直接地址位3 SETB C 置进位位4 SETB bit 置直接地址位5 CPL C 进位位求反6 CPL bit 置直接地址位求反7 ANL C,bit 进位位和直接地址位相“与”8 ANL C,bit 进位位和直接地址位的反码相“与”9 ORL C,bit 进位位和直接地址位相“或”10 ORL C,bit 进位位和直接地址位的反码相“或”11 MOV C,bit 直接地址位送入进位位12 MOV bit,C 进位位送入直接地址位13 JC rel 进位位为1 则转移14 JNC rel 进位位为0 则转移15 JB bit,rel 直接地址位为1 则转移16 JNB bit,rel 直接地址位为0 则转移17 JBC bit,rel 直接地址位为1 则转移,该位清零逻辑操作数指令:1 ANL A,Rn 累加器与寄存器相“与”2 ANL A,direct 累加器与直接地址单元相“与”3 ANL A,@Ri 累加器与间接RAM 单元相“与”4 ANL A,#data 累加器与立即数相“与”5 ANL direct,A 直接地址单元与累加器相“与”6 ANL direct,#data 直接地址单元与立即数相“与”7 ORL A,Rn 累加器与寄存器相“或”8 ORL A,direct 累加器与直接地址单元相“或”9 ORL A,@Ri 累加器与间接RAM 单元单元相“或”10 ORL A,#data 累加器与立即数相“或”11 ORL direct,A 直接地址单元与累加器相“或”12 ORL direct,#data 直接地址单元与立即数相“或”13 XRL A,Rn 累加器与寄存器相“异或”14 XRL A,direct 累加器与直接地址单元相“异或”15 XRL A,@Ri 累加器与间接RAM 单元单元相“异或”16 XRL A,#data 累加器与立即数相“异或”17 XRL direct,A 直接地址单元与累加器相“异或”18 XRL direct,#data 直接地址单元与立即数相“异或”19 CLR A 累加器清“0”20 CPL A 累加器求反21 RL A 累加器循环左移22 RLC A 累加器带进位位循环左移23 RR A 累加器循环右移24 RRC A 累加器带进位位循环右移25 SWAP A 累加器半字节交换控制转移类指令:1 ACALL addr11 绝对(短)调用子程序2 LCALL addr16 长调用子程序3 RET 子程序返回4 RETI 中数返回5 AJMP addr11 绝对(短)转移6 LJMP addr16 长转移7 SJMP rel 相对转移8 JMP @A+DPTR 相对于DPTR 的间接转移9 JZ rel 累加器为零转移10 CJNE rel 累加器非零转移11 CJNE A,direct,rel 累加器与直接地址单元比较,不相等则转移12 CJNE A,#data,rel 累加器与立即数比较,不相等则转移13 CJNE Rn,#data,rel 寄存器与立即数比较,不相等则转移14 CJNE @Ri,#data,rel 间接RAM 单元与立即数比较,不相等则转移15 DJNZ Rn,rel 寄存器减1,非零转移16 DJNZ direct,erl 直接地址单元减1,非零转移17 NOP 空操作。
常见51单片机指令及详解

常见51单片机指令及详解1. 简介单片机是一种集成电路,具备处理和控制功能。
51单片机是指Intel公司推出的一系列8位单片机,常用于嵌入式系统和物联网设备。
本文将介绍一些常见的51单片机指令,并对其进行详解。
2. 数据传送指令2.1 MOV指令MOV指令用于将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。
例如:MOV A, #10 ;将立即数10传送给累加器AMOV R0, R1 ;将寄存器R1的值传送给R02.2 XCH指令XCH指令用于交换两个寄存器或内存位置中的数据。
例如:XCH A, B ;交换累加器A和B的值3. 算术运算指令3.1 ADD指令ADD指令用于将两个操作数相加,并将结果保存在累加器中。
例如:ADD A, B ;将累加器A和寄存器B的值相加,结果存储在A中3.2 SUBB指令SUBB指令用于将第二个操作数的补码与累加器的值相减,并将结果存储在累加器中。
例如:SUBB A, B ;将B的补码与累加器A的值相减,结果存储在A中4. 逻辑运算指令4.1 ANL指令ANL指令用于对两个操作数进行按位与运算,并将结果存储在目的操作数中。
例如:ANL A, B ;将累加器A和寄存器B的值按位与,结果存储在A 中4.2 ORL指令ORL指令用于对两个操作数进行按位或运算,并将结果存储在目的操作数中。
例如:ORL A, B ;将累加器A和寄存器B的值按位或,结果存储在A 中5. 跳转指令5.1 JMP指令JMP指令用于无条件跳转至指定的目标地址。
例如:JMP 2000H ;跳转至内存地址2000H处执行指令5.2 JZ指令JZ指令用于在累加器为零时跳转至指定的目标地址。
例如:JZ 3000H ;当累加器为零时,跳转至内存地址3000H处执行指令6. 输入输出指令6.1 IN指令IN指令用于将外部设备的数据输入到累加器或指定的寄存器中。
例如:IN A, P1 ;将P1端口的数据输入到累加器A中6.2 OUT指令OUT指令用于将累加器或指定的寄存器中的数据输出到外部设备。
51汇编指令大全

51汇编指令大全Rn: 表示当前寄存器区的8个工作寄存器R0~R7Ri: 表示当前寄存器区的R0或R1,可作地址指针即间接寻址寄存器(i=0或1)@: 为间接寄存器或基址寄存器的前缀.Direct: 表示8位内部数据存储单元的地址.它可以是内部RAM的单元地址0~127.特殊功能寄存器SFR的地址(128~255)或名称,A: 累加器ACC.B: 特殊功能寄存器B,用于MUL和DIV指令中.C: 进位位Cy.#data: 表示包含在指令中的单字节(8位)立即数.如果用16位进制表示,后缀字母为”H”,数据范围00~0FFH,不得一字母开头;如果用16进制表示无须任何后缀,但必须在0~255之间.#data16: 表示包含在指令中的双字节(16位)立即数.Adda16: 表示16位的目的地址.用于LCALL和LJMP指令中,目的地址范围是从0000H~FFFFH的整个64KB存储地址空间.Adda11: 表示11位的目的地址.用于ACALL和AJMP的指令中,目的地址必须和下一条指令第一个字节同处一页.Rel: 表示8位带符号的相对偏移量.用语SJMP和所有的条件转移指令中.偏移量相对于下一条指令的第一个字节计算,在-128~+127范围内取值.DPTR: 为数据指针,可用作16位的地址寄存器./: 加在位操作的前面,表示对该位进行非运算.bit: 表示内部可寻址位或特殊功能寄存器中的直接寻址位.(x): 寄存器或地址单元中的内容.((x)): 用x间接寻址的单元中的内容.<-: 表示将箭头右边的内容传送至箭头的左边.$: 当前指令的地址.单片机指令系统(一) 内部数据传送指令(1) 以累加器A为目的的传送指令:MOV A, #data ;(A)<-dataMOV A, direct ;(A)<-(direct)MOV A, Rn ;(A)<-(Rn)MOV A, @Ri ;(A)<- ((Ri))(2) 以通用寄存器Rn为目的的传送指令:MOV Rn, A ;(Rn)<-(A)MOV Rn, direct ;(Rn)<(direct)MOV Rn, #data: ;(Rn)<-data(3) 以直接地址为目的的传送指令:MOV direct, A ;(direct)<-(A)MOV direct, Rn ;(direct)<-(Rn) MOV direct, direct2 ;(direct)<-(direct2) MOV direct, @Ri ;(direct)<-((Rn)) MOV direct, #data ;(direct)<-data (4) 以寄存器间接地址为目的的传送指令:MOV @Ri, A ;((Ri))<-(A)MOV @Ri, direct ;((Ri))<-(direct)MOV @Ri, #data ;((Ri))<-data(二) 数据指针赋值指令(16位数据传送指令)MOV DPTR, #data16;(三) 片外数据传送指令MOVX A, @Ri ;(A)<-((Ri))片外MOVX A, @DPTR ;(A)<-((DPTR))片外MOVX @Ri, A ;((Ri))片外<-(A)MOVX @DPTR, A ;((DPTR))片外<-(A)(四) ROM数据访问指令(查表指令)MOVC A, @A+DPTR ;(A)<-((A)+(DPTR))romMOVC A, @A+PC ;(PC)<-(PC)+1,(A)<-((A)+(PC))rom (五) 堆栈操作指令PUSH direct ;(SP)<-(SP)+1,(SP)<-(direct)堆栈指针先加1,将数据压入栈顶POP direct ;(direct)<-(SP),(SP)<-(SP)-1将数据从栈顶弹出存入direct,SP再减1(六) 数据交换指令(1)整字节(8位)交换指令:XCH A, Rn ;A和Rn中的数互换XCH A, direct ;A和direct单元中的数互换XCH A, @Ri ;A和Ri间址单元中的数互换(2)半字节交换指令:XCHD A, @Ri ;A的低4位Ri间接单元的低4位互换,高4位不动(3)累加器高低半字节交换指令:SWAP A, ;A的高4位(D7~D4)和低4位(D3~D0)互换(七) 加法指令(1)不带Cy加法指令:ADD A, Rn ;(A)<-(A)+(Rn)ADD A, direct ;(A)<-(A)+(direct)ADD A, @Ri ;(A)<-(A)+((Ri))ADD A, #data ;(A)<-(A)+data(2)带进位加法指令:ADDC A, Rn ;(A)<-(A) +Cy+(Rn)ADDC A, direct ;(A)<-(A) +Cy+(direct)ADDC A, @Ri ;(A)<-(A) +Cy+((Ri))ADDC A, #data ;(A)<-(A) +Cy+data(3)加1指令:INC A, ;(A)<-(A)+1INC Rn ;(Rn)<-(Rn)+1INC @Ri ;((Ri))<-((Ri))+1INC direct ;(direct)<-(direct)+1INC DPTR ;(FPTR)<-(DPTR)+1(八) 减法指令(1)带进位减法指令:SUBB A, Rn ;(A)<-(A) -Cy-(Rn)SUBB A, direct ;(A)<-(A) -Cy-(direct)SUBB A, @Ri ;(A)<-(A) -Cy-((Ri))SUBB A, #data ;(A)<-(A) -Cy-data(2)减1指令:DEC A ;(A)<-(A)-1DEC direct ;(direct)<-(direct)-1DEC Rn ;(Rn)<-(Rn)-1DEC @Ri ;((Ri))<-((Ri))-1(九) 乘除指令(1)乘法指令MUL AB ;(B)(A)<-(A)*(B)指令功能是把累加器A和特殊功能寄存器B中两个8位无符号整数相乘,并把积的高8位字节存入B寄存器,低8位字节存入累加器A.(2)除法指令DIV AB ;A/B,商存入A,余数存入B指令的功能是把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数商的整数部分存入累加器A中,余数保留在B中.(十) 十进制调整指令DA A(十一) 逻辑运算指令(1) 逻辑与运算指令:ANL A, Rn ;(A)<-(A)∧(Rn)ANL A, direct ;(A)<-(A)∧(direct)ANL A, @Ri ;(A)<-(A)∧((Ri))ANL A, #data ;(A)<-(A)∧dataANL direct, A ;(direct)<-(A)∧(direct) ANL direct, #data ;(direct<-(direct)∧data (2) 逻辑或运算指令:ORL A, Rn ;(A)<-(A)∨(Rn)ORL A, direct ;(A)<-(A)∨(direct)ORL A, @Ri ;(A)<-(A)∨((Ri))ORL A, #data ;(A)<-(A)∨dataORL direct, A ;(direct)<-(A)∨(direct) ORL direct, #data ;(direct)<-(direct)∨data (3) 逻辑异或运算指令:XRL A, Rn ;(A)<-(A)⊙(Rn)XRL A, direct ;(A)<-(A)⊙(direct)XRL A, @Ri ;(A)<-(A)⊙((Ri))XRL A, #data ;(A)<-(A)⊙dataXRL direct, A ;(direct)<-(A)⊙(direct) XRL direct, #data ;(direct)<-(d irect)⊙data (4) 累加器清0和取反指令CLR A ;(A)<-0 (累加器清0指令) CPL A ;(A)<-(A) (累加器取反指令) (5) 累加器移位指令:不带进位Cy循环左移:RL A ;Dn+1<-Dn,D0<-D7D7 D6 D5 D4 D3 D2 D1 D0不带进位Cy循环右移:RR A ;Dn+1->Dn,D0<-D7D7 D6 D5 D4 D3 D2 D1 D0带进位Cy循环左移:RLC A ;Cy<-D7,Dn+1<-Dn,D0<-CyD7 D6 D5 D4 D3 D2 D1 D0带进位Cy循环右移:RRC A ;Cy->D7,Dn+1->Dn,D0->Cy(十二) 控制转移指令[1] 无条件转移指令:(1) 长转移指令LJMP addr16 ;(PC)<-addr16(2) 绝对转移指令AJMP addr11 ;(PC)<-(PC)+2,(PC)10~0<-addr11 (3) 短转移指令SJMP rel ;(PC)<-(PC)+2+rel(4) 变址寻址转移指令JMP @A+DPTR ;(PC)<-(A)+(DPTR)[2] 条件转移指令:(1) 累加器判0转移指令:JZ rel ;如果(A)=0,跳转到目标语句,否则顺序执行JNZ rel ;如果(A)≠0,跳转到目标语句,否则顺序执行(2) 比较转移指令:CJNZ A, #data, rel ;如果(A)≠data,则跳转到目标语句,否则程序顺序执行CJNZ A, direct, rel ; 如果(A)≠(direct),则跳转到目标语句,否则程序顺序执行CJNZ Rn, #data, rel ; 如果Rn≠data,则跳转到目标语句,否则程序顺序执行CJNZ @Ri #data, rel ; 如果(A)≠data,则跳转到目标语句,否则程序顺序执行(3) 循环控制转移指令:DJNZ Rn, rel ;(Rn)先减1,如减1后(Rn)≠0,则跳转到目标语句;否则顺序执行DJNZ direct, rel ; (direct)先减1,如减1后(direct)≠0,则跳转到目标语句;否则顺序执行(十三) 子程序调用和返回指令(1) 绝对调用指令:ACALL addr11(2) 长调用指令:LCALL addr16(3) 返回指令:RET 子程序返回RETI 中断服务程序返回(十四) 空操作指令NOP 空操作指令是一条特殊指令,单片机在执行该指令时不进行任何操作,只是消耗1个机器周期的时间,所以该指令长用于延时程序.软件陷阱程序等(十五) 位操作类指令(1) 位传送指令:MOV C,bit ;(Cy)<-(bit),bit位的状态不变MOV bit,C ; (bit) <- (Cy),Cy位的状态不变(2) 置位和复位指令:SETB C ;(Cy)<-1SETB bit ;(bit)<-1CLR C ;(Cy)<-0CLR bit ;(bit)<-0(3) 位运算指令:ANL C, bit ;(Cy)<-(Cy)∧(bit),Cy位和bit位相与,结果赋给CyANL C, /bit ;(Cy)<-(Cy)∧(bit),Cy位和bit位相与,结果赋给CyORL C,bit ;(Cy)<-(Cy)∨(bit),Cy位和bit位相或,结果赋给CyORL C,/bit ;(Cy)<-(Cy)∨(bit),Cy位和bit位相或,结果赋给CyCPL C ;(Cy)<-(Cy),Cy位取反CPL bit ;(bit)<-(bit),bit位取反(4) 位测试转移指令:(1) 以Cy位状态为条件的转移指令JC rel ;如果Cy位=1,跳转到目标语句,否则顺序执行JNC rel ;如果Cy位=0,跳转到目标语句,否则顺序执行(2) 以指定位状态为条件的转移指令:JB bit, rel ;如果bit=1,跳转到目标语句,否则顺序执行JNB bit, rel ;如果bit=0,跳转到目标语句,否则顺序执行JBC bit, rel ;如果bit=1,跳转到目标语句,同时将bit 位清0;否则顺序执行。
常见51单片机指令及详解

常见51单片机指令及详解数据传递类指令(1)以累加器为目的操作数的指令MOV A,RnMOV A,directMOV A,@RiMOV A,#data第一条指令中,Rn代表的是R0-R7。
第二条指令中,direct就是指的直接地址,而第三条指令中,就是我们刚才讲过的。
第四条指令是将立即数data送到A中。
下面我们通过一些例子加以说明:MOV A,R1 ;将工作寄存器R1中的值送入A,R1中的值保持不变。
MOV A,30H ;将内存30H单元中的值送入A,30H单元中的值保持不变。
MOV A,@R1 ;先看R1中是什么值,把这个值作为地址,并将这个地址单元中的值送入A中。
如执行命令前R1中的值为20H,则是将20H单元中的值送入A中。
MOV A,#34H ;将立即数34H送入A中,执行完本条指令后,A中的值是34H。
(2)以寄存器Rn为目的操作的指令MOV Rn,AMOV Rn,directMOV Rn,#data这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。
(3)以直接地址为目的操作数的指令MOV direct,A 例: MOV 20H,AMOV direct,Rn MOV 20H,R1MOV direct1,direct2 MOV 20H,30HMOV direct,@Ri MOV 20H,@R1MOV direct,#data MOV 20H,#34H(4)以间接地址为目的操作数的指令MOV @Ri,A 例:MOV @R0,AMOV @Ri,direct MOV @R1,20HMOV @Ri,#data MOV @R0,#34H(5)十六位数的传递指令MOV DPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入DPTR中去。
其中高8位送入DPH,低8位送入DPL。
例:MOV DPTR,#1234H,则执行完了之后DPH中的值为12H,DPL中的值为34H。
51单片机指令表汇总

51单片机指令表汇总51 单片机是一种广泛应用于电子工程和嵌入式系统开发的微控制器。
要熟练掌握 51 单片机的编程,了解其指令表是至关重要的。
下面就为大家汇总一下 51 单片机的常见指令。
数据传送类指令MOV 指令:这是最基本的数据传送指令,用于在寄存器之间、寄存器与存储器之间传送数据。
例如,“MOV A, 50H”就是将立即数 50H传送到累加器 A 中。
MOVX 指令:用于在片外数据存储器和累加器 A 之间进行数据传送。
比如“MOVX A, @DPTR”,将片外数据存储器中由数据指针 DPTR 所指定单元的内容传送到累加器 A 中。
MOVC 指令:用于访问程序存储器中的数据表格。
“MOVC A, @A+DPTR”是常见的用法。
算术运算类指令ADD 指令:实现加法运算。
像“ADD A, R0”就是将累加器 A 的内容和寄存器 R0 的内容相加,结果存放在累加器 A 中。
ADDC 指令:带进位加法指令。
考虑了上一次运算产生的进位标志。
SUBB 指令:用于减法运算,并且会考虑借位标志。
逻辑运算类指令ANL 指令:进行逻辑与操作。
例如“ANL A, R0”,将累加器 A 和寄存器 R0 的内容进行逻辑与运算,结果存放在累加器 A 中。
ORL 指令:执行逻辑或操作。
XRL 指令:实现逻辑异或运算。
控制转移类指令JC 指令:若进位标志为 1 则跳转。
JZ 指令:若累加器 A 的内容为 0 则跳转。
LJMP 指令:长跳转指令,可以跳转到 64KB 程序存储器空间的任意位置。
位操作类指令SETB 指令:将指定的位设置为 1。
例如“SETB P10”,将 P1 端口的第 0 位置 1。
CLR 指令:把指定的位清零。
这些只是 51 单片机指令的一部分,实际应用中还有更多的指令和组合使用方式。
在编程时,合理选择和运用这些指令能够实现各种复杂的功能。
比如,通过数据传送指令来初始化变量和读取外部数据;利用算术运算指令进行数值计算;借助逻辑运算指令处理逻辑关系;使用控制转移指令实现程序的分支和循环;运用位操作指令控制单个引脚的状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3节 MCS-51指令系统[学习要求]熟悉MCS-51单片机的指示系统。
[重点与难点]重点:指令系统。
难点:MCS-51的寻址方式;控制转移指令。
[理论内容]一、MCS-51指令系统概述一个单片机所需执行指令的集合即为单片机的指令系统。
单片机使用的机器语言、汇编语言及高级语言,但不管使用是何种语言,最终还是要“翻译”成为机器码,单片机才能执行之。
现在有很多半导体厂商都推出了自己的单片机,单片机种类繁多,品种数不胜数,值得注意的是不同的单片机它们的指令系统不一定相同,或不完全相同。
但不管是使用机器语言、汇编语言还是高级语言都是使用指令编写程序的。
所谓机器语言即指令的二进制编码,而汇编语言则是指令的表示符号。
在指令的表达式上也不会直接使用二进制机器码,最常用的是十六进制的形式。
但单片机并不能直接执行汇编语言和高级语言,都必须通过汇编器“翻译”成为二进制机器码方能执行,但如果直接使用二进制来编写程序,那将十分不便,也很难记忆和识别,不易编写、难于辨读,极易出错,同时出错了也相当难查找。
所以现在基本上都不会直接使用机器语言来编写单片机的程序。
最好的办法就是使用易于阅读和辨认的指令符号来代替机器码,常称这些符号为助记符,用助记符的形式表示的单片机指令就是汇编语言,为便于记忆和阅读,助记符号通常都使用易于理解的英文单词和拼音字母来表示。
每种单片机都有自己独特的指令系统,那么指令系统是开发和生产厂商定义的,如要使用其单片机,用户就必须理解和遵循这些指令标准,要掌握某种(类)单片机,指令系统的学习是必须的。
1、MCS-51共有111条指令,可分为5类:[1] 数据传送类指令(共29条)[2] 算数运算类指令(共24条)[3] 逻辑运算及移位类指令(共24条)[4] 控制转移类指令(共17条)[5] 布尔变量操作类指令(共17条)2、一些特殊符号的意义在介绍指令系统前,先了解一些特殊符号的意义,这对今后程序的编写都是相当有用的。
Rn——当前选中的寄存器区的8个工作寄存器R0—R7(n=0-7)。
Ri——当前选中的寄存器区中可作为地址寄存器的两个寄存器R0和R1(i=0,1)direct—内部数据存储单元的8位地址。
包含0—127(255)内部存储单元地址和特殊功能寄存地址。
#data—指令中的8位常数。
#data16—指令中的16位常数。
addr16—用于LCALL和LJMP指令中的16目的地地址,目的地址的空间为64kB 程序存储器地址。
#addr11—用于ACALL和AJMP指令中的11目的地地址,目的地址必须放在与下条指令第一个字节同一个2kB程序存储器空间之中。
rel—8位带符号的偏移字节,用于所有的条件转移和SJMP等指令中,偏移字节对于下条指令的第一个字节开始的-128——+127范围内。
@—间接寄存器寻址或基址寄存器的前缀。
/—为操作的前缀,声明对该位操作书取反。
DPTR—数据指针。
bit—内部RAM和特殊功能寄存器的直接寻址位。
A—累加器。
B—累加器B。
用于乘法和除法指令中。
C—进位标志位。
(x)—某地址单元中的内容。
((x))—由X寻址单元中的内容。
3、MCS-51的寻址方式寻址的“地址”即为操作数所在单元的地址,绝大部分指令执行时都需要用到操作数,那么到哪里去取得操作数呢?最易想到的就是告诉CPU操作数所在的地址单元,从那里可取得响应的操作数,这便是“寻址”之意。
MCS-51的寻址方式很多,使用起来也相当方便,功能也很强大,灵活性强。
这便是MCS-51指令系统“好用”的原因之一。
下面分别讨论几种寻址方式的原理。
[1] 直接寻址指令中操作数直接以单元地址形式出现,例如:MOV A,68H这条指令的意义是把内部RAM中的68H单元中的数据内容传送到累加器A中。
值得注意的是直接寻址方式只能使用8位二进制地址,因此这种寻址方式仅限于内部RAM进行寻址。
低128位单元在指令中直接以单元地址的形式给出。
对于特殊功能寄存器可以使用其直接地址进行访问,还可以以它们的符号形式给出,只是特殊功能寄存器只能用直接寻址方式访问,而无其它方法。
[2] 寄存器寻址寄存器寻址对选定的8个工作寄存器R0-R7进行操作,也就是操作数在寄存器中,因此指定了寄存器就得到了操作数,寄存器寻址的指令中以寄存器的符号来表示寄存器,例如:MOV A, R1这条指令的意义是把所用的工作寄存器组中的R3的内容送到累加器A中。
值得一提的是工作状态寄存器的选择是通过程序状态字寄存器来控制的,在这条指令前,应通过PSW设定当前工作寄存器组。
[3] 寄存器间接寻址寄存器寻址方式,寄存器中存放的是操作数,而寄存器间接寻址方式,寄存器中存放的则为操作数的地址,也即操作数是通过寄存器指向的地址单元得到的,这便是寄存器间接寻址名称的由来。
例如指令:MOV A, @R0这条指令的意义是R0寄存器指向地址单元中的内容送到累加器A中。
假如R0=#56H,那么是将56H单元中的数据送到累加器A中。
寄存器间接寻址方式可用于访问内部RAM或外部数据存储器。
访问内部RAM或外部数据存储器的低256字节时,可通过R0和R1作为间接寄存器。
然而有必要指出,内部RAM 的高128字节地址与专用积存器的地址是重叠的,所以这种寻址方式不能用于访问特殊功能寄存器。
外部数据存储器的空间为64kB,这时可采用DPTR作为间址寄存器进行访问,指令如下:MOVX A,@DPTR这条指令的意义是与上述类似,不再赘述。
[4] 立即寻址立即寻址就是把操作数直接在指令中给出,即操作数包含在指令中,指令操作码的后面紧跟着操作数,一般把指令中的操作数称为立即数,因此而得名。
为了与直接寻址方式相区别,在立即数前加上“#”符号,例如:MOVX A,#0EH这条指令的意义是将0EH这个操作数送到累加器A中。
[5] 变址寻址变址寻址是以DPTR或PC作为基址寄存器,以累加器A作为变址寄存器,将两寄存器的内容相加形成16位地址形成操作数的实际地址。
例如:MOV A,@A+DPTRMOVX A,@A+PCJMP @A+DPTR在这三条指令中,A作为偏移量寄存器,DPTR或PC作为变址寄存器,A作为无符号数与DPTR或PC的内容相加,得到访问的实际地址。
其中前两条是程序存储器读指令,后一条是无条件转移指令。
[6] 位寻址在MCS-51单片机中,RAM中的20H—2FH字节单元对应的位地址为00H—7FH,特殊功能寄存器中的某些位也可进行为寻址,这些单元既可以采用字节方式访问它们,也可采用位寻址的方式访问它们。
[7] 相对寻址相对寻址方式是为了程序的相对转移而设计的,其夜里是以PC的内容为基址,加上给出的偏移量作为转移地址,从而实现程序的转移。
转移的目的地址可参见如下表达式:目的地址=转移指令地址+转移指令字接数+偏移量值得注意的是,偏移量是有正负号之分的,偏移量的取值范围是当前PC值的-128—+127之间。
二、MCS-51数据传送指令数据传送指令共有29条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。
如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志C,AC和OV,但可能会对奇偶标志P有影响。
[1] 以累加器A为目的操作数类指令(4条)这4条指令的作用是把源操作数指向的内容送到累加器A。
有直接、立即数、寄存器和寄存器间接寻址方式:MOV A,data ;(data)→(A)直接单元地址中的内容送到累加器AMOV A,#data ;#data→(A)立即数送到累加器A中MOV A,Rn ;(Rn)→(A) Rn中的内容送到累加器A中MOV A,@Ri ;((Ri))→(A) Ri内容指向的地址单元中的内容送到累加器A [2] 以寄存器Rn为目的操作数的指令(3条)这3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。
有直接、立即和寄存器寻址方式:MOV Rn,data ;(data)→(Rn)直接寻址单元中的内容送到寄存器Rn中MOV Rn,#data ;#data→(Rn)立即数直接送到寄存器Rn中MOV Rn,A ;(A)→(Rn)累加器A中的内容送到寄存器Rn中[3] 以直接地址为目的操作数的指令(5条)这组指令的功能是把源操作数指定的内容送到由直接地址data所选定的片内RAM中。
有直接、立即、寄存器和寄存器间接4种寻址方式:MOV data,data ;(data)→(data)直接地址单元中的内容送到直接地址单元MOV data,#data ;#data→(data)立即数送到直接地址单元MOV data,A ;(A)→(data)累加器A中的内容送到直接地址单元MOV data,Rn ;(Rn)→(data)寄存器Rn中的内容送到直接地址单元MOV data,@Ri ;((Ri))→(data)寄存器Ri中的内容指定的地址单元中数据送到直接地址单元[4] 以间接地址为目的操作数的指令(3条)这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。
有直接、立即和寄存器3种寻址方式:MOV @Ri,data ;(data)→((Ri))直接地址单元中的内容送到以Ri中的内容为地址的RAM单元MOV @Ri,#data ;#data→((Ri))立即数送到以Ri中的内容为地址的RAM单元MOV @Ri,A ;(A)→((Ri))累加器A中的内容送到以Ri中的内容为地址的RAM单元[5] 查表指令(2条)这组指令的功能是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式:MOVC A,@A+DPTR ;((A))+(DPTR)→(A)表格地址单元中的内容送到累加器A中MOVC A,@A+PC ;((PC))+1→(A),((A))+(PC)→(A)表格地址单元中的内容送到累加器A中[6] 累加器A与片外数据存储器RAM传送指令(4条)这4条指令的作用是累加器A与片外RAM间的数据传送。
使用寄存器寻址方式:MOVX @DPTR,A ;(A)→((DPTR))累加器中的内容送到数据指针指向片外RAM地址中MOVX A, @DPTR ;((DPTR))→(A)数据指针指向片外RAM地址中的内容送到累加器A中MOVX A, @Ri ;((Ri))→(A)寄存器Ri指向片外RAM地址中的内容送到累加器A中MOVX @Ri,A ;(A)→((Ri))累加器中的内容送到寄存器Ri指向片外RAM 地址中[7] 堆栈操作类指令(2条)这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP所指单元的内容送到直接寻址单元中。