版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,第3章 单片机指令系统,3.1 MCS-51单片机指令格式和寻址方式 3.2 MCS-51单片机指令分类介绍 3.3 MCS-51单片机指令汇总,内容提要:,3.1 MCS-51单片机指令格式和寻址方式,3.1.2 MCS-51单片机指令格式 指令的表示形式称指令格式。编写程序时必须严格按指令格式书写。 MCS-51指令由操作码和操作数组成。 指令应具有以下功能: (1)操作码指明执行什么性质和类型的操作。例如,数的传送、加法、减法等。 (2)操作数指明操作的数本身或者是操作数所在的地址。 (3)指定操作结果存放的地址。 汇编语言指令格式如下:,标号:,操作码助记符,第一操作数,,第二操作数
2、,;注释,1. 一字节指令(49条) 操作码与操作数信息同在一字节中。 如:INC DPTR (1010 0011) MOV A , Rn (1110 1rrr) 2. 二字节指令(45条) 第一字节为操作码,第二字节为操作数。 如:MOV A , #data (0111 0100 立即数) #data表示一个8位的二进制操作数,占一个字节,称为立即数。 3. 三字节指令(17条) 第一字节为操作码,第二、三字节为操作数(数据或地址)。 如:ANL direct , #data (0101 0011 直接地址 立即数) direct为单元地址,#data为8位立即数。,3.1.3 寻址方式,寄
3、存器寻址 直接寻址 寄存器间接寻址 立即寻址 变址寻址 位寻址 相对寻址,指令中,操作数可能是具体的数据,也可能是具体的存放数据的地址或符号,无论何种情况,都可由操作数取得参与指令运行的二进制数据。这个过程叫作寻址。,寄存器寻址,以寄存器的内容作为操作数的寻址方式。包括A、B 、DPTR寄存器以及通用寄存器R0R7 。 例如: CLR A ;A0 INC DPTR ;DPTR(DPTR)+1 ADDR5,# 20H ;R5#20H+(R5),直接寻址,指令中直接给出操作数地址的寻址方式,能进行直接寻址的存储空间有SFR寄存器和内部数据RAM(因为是8位地址)。 例如:MOV PSW,# 20H
4、 ;PSW#20H PSW为直接寻址寄存器的符号地址。 MOVA,30H;A内部RAM 30H单元中的内容 30H为直接给出的内部RAM的地址。 注意:这是访问大部分SFR寄存器的唯一方法,可写成单元地址形式,也可写成寄存器符号形式。,直接寻址方式示意图,思考问题:我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOV A,00H 和 MOV A,R0不就没什么区别了吗?,的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,
5、第一条指令变成最终的目标码要两个字节(E5H 00H),而第二条则只要一个字节(E8H)就可以了。,寄存器间接寻址,以寄存器中的内容作为操作数的地址,通过该地址获得操作数的寻址方式。可间接寻址的存储器空间包括内部数据RAM和外部数据RAM。 能用于寄存器间接寻址的寄存器有R0,R1,DPTR,SP。其中R0、R1必须是工作寄存器组中的寄存器。SP仅用于堆栈操作(POP和PUSH)。为区别于寄存器寻址,使用时寄存器前面加“”标志,例如:MOV R0,A ;内部RAM(R0)(A)其指令操作过程示意图如图3-1所示。 又如:MOVX A,R1;A外部RAM(R1)其指令操作过程示意图如图3-2所示
6、。 再如:MOVX DPTR , A ;外部RAM(DPTR)(A) 其指令操作过程示意图如图3-3所示。,图3-1 MOV R0,A间接寻址示意图,图3-2 MOVX A,R1间接寻址示意图,图3-3 MOVX DPTR,A间接寻址示意图,例:(R1)80H、(80H)=33H,则执行指令 MOV A,Ri后,累加器A的内容为33H而不是80H,寄存器间接寻址方式示意图,立即寻址,指令中直接给出操作数的寻址方式。立即数用前面加有#号的8位或16位数来表示,立即数只能是源操作数,不能作为目的操作数。 例如: MOV A ,# 60H ;A#60H MOV DPTR,# 3400H;DPTR#3
7、400H MOV 30H ,# 40H ;30H单元#40H 上述三条指令执行完后,累加器A中数据为立即数据60H,DPTR寄存器中数据为3400H,30H单元中数据为立即数40H。,立即寻址示意图,变址寻址,变址寻址只能对程序存储器中数据进行操作,寻址范围64K。以DPTR或PC作为基址寄存器,A作为变址寄存器(其中的数看作无符号数),并以两者内容相加形成的16位地址作为操作数地址。由于程序存储器是只读的,因此变址寻址只有读操作而无写操作,在指令符号上采用MOVC的形式(如图3-4所示)。 例如:MOVC A,A+DPTR ;A(A)+(DPTR) 又如,MOVC A, A+PC ;A(A)
8、+(PC) 这条指令与上条指令不同的是,基址寄存器是PC。 变址寻址的指令共3条,并且均为一字节指令。 另外一条是:JMP A+DPTR,图3-4 MOVC A,A+DPTR变址寻址示意图,例: MOVC A,A+DPTR,变址寻址方式示意图,位寻址,位寻址只能对有位地址的单元作位寻址操作。 位寻址其实是一种直接寻址方式,不过其地址是位地址。 例如:SETB 10H ;将10H位置1 如果22H单元中存放着数据40H,22H单元的D0位的位地址为10H,执行上述指令后(22H)=41H。 又如:MOV 32H,C ;32H (进位位CY) ORL C ,32H ;CY(CY)(32H),相对寻
9、址,以当前程序计数器PC的内容为基础,加上指令给出的一字节补码数(偏移量rel)形成新的PC值的寻址方式。 相对寻址用于修改PC值,主要用于实现程序的分支转移。 转移的目的地址=转移指令地址+指令字节数+rel 例如,SJMP 08H ;PC(PC)+2+08H 指令操作示意图如图3-5所示。 偏移量rel是一带符号8位二进数的补码数,范围为-128+127。实际书写程序时往往先用地址标号代替,在汇编为机器指令时再计算出来。,图3-5 相对寻址示意图,例: 指出下列每一条指令的寻址方式。 MOV 2FH,#40H MOV A , R0 MOV DPTR,#2020H MOV 45H,P0 MO
10、V A,R1 MOVC A,A+PC JC LOOP,中的源操作数为立即寻址,目的操作数为直接寻址。 中的源操作数为寄存器间接寻址,目的操作数为寄存器寻址。 中的源操作数为16位立即寻址,目的操作数为寄存器寻址。 中的源操作数和目的操作数都是直接寻址。 中的源操作数和目的操作数都为寄存器寻址。 中的源操作数为基址加变址寻址,目的操作数为寄存器寻址。 中的操作数为相对寻址。,例: 判断下列指令是否正确,若不正确请指出错误: MOV A , DPTR MOV DPTR,#03H MOV #80H,R7 MOV B,C,不正确。A是8位寄存器,DPTR为16位寄存器,不匹配。 正确。 不正确。#80
11、H为立即数,不能作为目的地址。 不正确。B为8位字节寄存器,C为1位位累加器,不匹配。,3.1.4 寻址方式小结,片内外程序存储器的指令寻址只能使用变址寻址 内部数据存储器由于使用频繁,寻址方式多 外部数据存储器,只能使用寄存器间接寻址 相对寻址只用于程序转移 左边操作数称为目的操作数,右边操作数称为源操作数 目的操作数只有寄存器寻址、直接寻址、寄存器间接寻址和位寻址4种方式,3.2 指令分类,按指令功能,MCS-51指令系统分为数据传送(29条)、算术运算(24条)、逻辑运算及移位(24条)、控制转移(17条)、位操作(17条)5大类。 位操作指令又称布尔处理指令。,3.2.1 指令描述符号
12、介绍,Rn当前选中的寄存器区中的8个工作寄存器R0R7(n=07) Ri当前选中的寄存器区中的2个工作寄存器R0、R1(i=0,1) direct8位的内部数据存储器单元中的地址 #data包含在指令中的8位常数 #data16包含在指令中的16位常数 addr1616位目的地址 addr1111位目的地址,rel8位带符号的偏移字节,简称偏移量 DPTR数据指针,可用作16位地址寄存器 bit内部RAM或专用寄存器中的直接寻址位 A累加器 ACC 直接寻址方式的累加器 B专用寄存器,用于乘法和除法指令中 C进位标志或进位位,或布尔处理机中的累加器,间址寄存器或基址寄存器的前缀,如Ri,DPT
13、R / 位操作数的前缀,表示对该位操作数取反,如/bit 寄存器或片内RAM的直接地址 ()某寄存器或存储单元的内容 ()由间接寻址的单元中的内容 箭头左边的内容被箭头右边的内容所代替,3.2.2 数据传送类指令,数据传送类指令共29条,是将源操作数送到目的操作数。指令执行后,源操作数不变,目的操作数被源操作数取代。数据传送类指令用到的助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP 8种。 源操作数可采用寄存器、寄存器间接、直接、立即、变址5种寻址方式寻址,目的操作数可以采用寄存器、寄存器间接、直接寻址3种寻址方式。MCS-51单片机片内数据传送途径如图3-6
14、所示。,图3-6 MCS-51单片机片内数据传送图,1以A为目的操作数,MOV A,Rn ;A (Rn) MOV A,direct ;A(direct) MOV A,Ri ;A(Ri) MOV A,#data ;A #data,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 direct2 ,direct1 ;direct2 (direct1) MOV
15、 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 例如:设(30H)=6FH,R1=40H,执行MOV R1,30H后,30H单元中数据取出送入R1间接寻址的40H单元,(40H)=6FH。,5以DPTR为目的操作数,MOV DPTR,#data16;DPTR #data16 例如执行 MOV DPTR,#2000H 后, (DPTR)= 2000H。,6访问外部数据
16、RAM,MOVX A,DPTR;A (DPTR) MOVX DPTR,A;(DPTR) (A) MOVX A,Ri; A (Ri) MOVX Ri,A;(Ri) (A),说明: 片外数据存贮单元与片内RAM之间的数据传送以及片外数据存贮单元之间的数据传送不能直接进行,必须通过累加器A中转。MOVX 20H, 2000H及MOVX 3000H, 2000H等都是错误的。 寻址方式只能是寄存器间接寻址。参与间接寻址的寄存器只有Ri和DPTR两种(3个)。DPTR为16位寄数器,寻址范围为0000H0FFFFH共64KB空间。而Ri是8位寄数器,只能寻址000FFH低256单元。,片外数据存储器数据
17、传送指令,解 MOV DPTR ,#2000H MOVX A,DPTR MOV 20H, A MOV DPTR ,#2000H MOVX A,DPTR MOV R0,#0FAH MOVX R0,A,例 将片外数据存贮器2000H单元的内容传送到片内的20H单元中;将片外数据存贮器2000H单元的内容传送到片外0FAH单元。,7读程序存储器,MOVC A,A+DPTR;A (A)+(DPTR) MOVC A,A+PC;A (A)+(PC) 例如已知A=30H,DPTR=3000H, 程序存储器单元(3030H)=50H,执行MOVC A, A+DPTR后,A=50H。,说明: 程序存贮器只能读出
18、,不能写入,所以其数据传送都是单向的,即从程序存贮器读出数据,并且只能向累加器A传送。 ROM片内、片外是统一编址,该指令既可访问片内,又可访问片外程序存贮器。 该类指令主要用于查表,又称查表指令。应用时,一般以PC或DPTR确定表格的首址,查表时,根据A中不同的内容查找到表格中的相应项,故此时称PC或DPTR为基址寄存器,A为变址寄存器,寻址方式为基址加变址寻址。 使用DPTR作基址寄存器比较灵活,且不易出错。建议尽可能使用MOVCA,DPTR指令。,解法一 以DPTR为基址寄存器,平方表首址可灵活安排在ROM中适当的位置如2000H,即平方表的内容从2000H单元放起。程序如下: ORG
19、1800H MOV DPTR ,#2000H MOV A,20H MOVC A,A+DPTR MOV 21H,A ORG 2000H DB 00H, 01H ,04H , 09H ,10H, 19H DB 24H, 31H, 40H , 51H ,64H,,例 以查表方式求出片内RAM中20H单元数的平方值,存入片内21H单元中。,RAM 21H,ORG 1000H 1000MOV A,20H 1001 ADD A,#03H 1003 MOVC A,A+PC 1004 MOV 21H,A 1006 RET 1007 DB 00H, 01H, 04H ,解法二 以PC为基址寄存器,此时表格须紧跟
20、程序之后,且要计算好表格首址位置(本例中要进行加3修正,原因?)。,XCH A,20H XCH A,30H XCH A,20H,例 改正下列指令中的错误,完成其功能: MOV A,2000H ;片外RAM 2000H单元内容送入A。 MOVX 20H,2000H ;片外RAM 2000H单元内容送入片内20H单元。 MOVC A,2000H ;将ROM 2000H单元内容送入A。 MOVX A,A+DPTR ;以查表方式将片外RAM单元的内容送入A。 XCH 40H,30H ;交换片内RAM 30H和40H单元的内容。 PUSH AB ;将寄存器对AB的内容压入堆栈。,解 MOV DPTR,#
21、2000H MOVX A,DPTR,MOV DPTR,#2000H MOVX A,DPTR MOV 20H,A,MOV DPTR,#2000H MOV A,#0 MOVC A,A+DPTR,无法以查表方式将片外RAM 存贮单元的内容送入A。,PUSH A PUSH B,例 设RAM 40H单元的内容为80H,80H单元内容为47H,P1口的输入状态为0FFH,试判断下列程序执行结果。 MOV R0,#40H MOV A,R0 MOV R1,A MOV B ,R1 MOV R1,P1 MOV P2,P1,解执行结果为: (A)80H,(B)47H,(R0)40H,(R1)80H,(P1)0FFH
22、,(P2)0FFH,(80H)0FFH。,; R0 40H ; A ( 40H)80H ; R1 80H ; B ( 80H)47H ;( 80H) 0FFH ; P2 0FFH,8数据交换,数据交换指令XCH、XCHD、和SWAP共5条,如图所示。 数据交换指令,l整字节交换 XCH A,Rn ;(A) (Rn) XCH A ,direct;(A)(direct) XCH A,Ri ;(A)(Ri),例:设(A)=08H,(R7)=0DCH, 执行指令 XCH A, R7 结果为:(A)=0DCH, (R7)=08H,功能:将累加器A中内容与源操作数互换,l半字节交换 XCHD A,Ri;(
23、A)03(Ri)03,例:(A)=80H,(R0)=30H,(30H)=0FH,执行XCHD A, R0 结果为:(A)=8FH, (30H)=00H,功能:累加器A中内容与源操作数低4位交换,高4位不变。,l累加器高低半字节交换 SWAP A;(A)03(A)47,功能:A中高4位与低4位互换。,例:(A)=80H ,执行SWAP A结果为:(A)08H.,解 XCH A,20H SWAP A MOV R1,21H XCHD A,R1 SWAP A XCH A,20H,例 试用交换指令使片内20H单元的高4位与21H单元的低4位交换。,所谓堆栈是在片内RAM中按“先进后出,后进先出”原则设置
24、的专用存储区。数据的进栈出栈由指针SP统一管理。数据写入堆栈称入栈,数据从堆栈中读出称出栈。,9. 堆栈操作,PUSH direct ;SP (SP)+1, (SP) (direct) 功能:将堆栈指针加1后,片内RAM单元内容送进栈顶单元,原RAM单元内容不变。 说明: PUSH指令常用于保护CPU现场。 栈操作是字节指令,每次只能压入或弹出1个字节的内容。 如PUSH DPTR是错误的,但可以用以下两条指令完成DPTR的入栈。 PUSH DPH PUSH DPL,1)入栈指令PUSH,例:设(A)=30H,(B)=80H ,(SP)=50H .则执行指令: PUSH A PUSH B,结果
25、为:(51H)=30H,(52H)=80H,(SP)=52H,POPdirect ; direct (SP), SP (SP)-1 功能:将(SP)内容传送给片内RAM单元,SP内容减1。 说明: 栈操作要注意先入后出的原则。 POP指令常用于恢复CPU现场,2)出栈指令POP,例 试用栈操作指令完成P0和P1内容的互换。 解 PUSH P0 PUSH P1 POP P0 POP P1,例: 将片内RAM 30H单元与40H单元中的内容互换。,方法1(直接地址传送法): MOV31H,30H MOV30H,40H MOV40H,31H SJMP$,方法2(间接地址传送法): MOVR0,#40
26、H MOVR1,#30H MOVA,R0 MOVB,R1 MOVR1,A MOVR0,B SJMP$,方法3 (字节交换传送法): MOVA,30H XCHA,40H MOV30H,A SJMP$,方法4(堆栈传送法): PUSH30H PUSH40H POP30H POP40H SJMP$,小结: 1. MCS-51系列单片机指令系统共有多少条指令? 分哪几类? 2.数据传送类指令有几种类型?它们是否影响标志位?,3.2.3 算术运算类指令,算术运算类指令包括:ADD、ADDC、SUBB、MUL、DIV、INC、DEC和DA,如图所示。 算术运算类指令,1加法指令 ADD A,Rn;A (A
27、) + (Rn) ADD A,direct;A (A) +(direct) ADD A,Ri;A (A) +(Ri) ADD A,#data;A (A) + #data,功能:把源操作数与累加器A内容相加,结果存在累加器中。该操作不改变源操作数,影响PSW中的C、AC、OV和P位。 说明: ADD指令的目的操作数只能是累加器A,且只有以上4种形式。如ADDB,40H或ADD A,203AH等都是不存在的,非法的。 指令中,参加运算的两个8位二进制数,即可看作是8位无符号数(0255),也可以看作是7位带符号数的补码数(-128+127)。,例 试编程计算40H和41H两单元字节数的和,并存放在
28、42H单元。若(40H)=0B3H,(41H)=79H,给出计算结果并判断PSW受影响的位。,解程序如下: MOV A , 40H ADD A , 41H MOV 42H,A,若(40H)=0B3H,(41H)=79H,则运算结果:若是无符号数,和为12CH;若是有符号数,和为+2CH。 (42H)=2CH, (C)=1,(AC)=0,(OV)=0,(P)=1。,例 (A)=85H,(R0)=20H,(20H)=0AFH,执行指令: ADD A,R0 10000101 +10101111 1 00110100 结果:(A)=34H;(C )=1;(AC)=1;(OV)=1。 对于加法,溢出只能
29、发生在两个加数符号相同的情况。在进行带符号数的加法运算时,溢出标志OV是一个重要的编程标志,利用它可以判断两个带符号数相加,和数是否溢出。,2带进位加法指令 ADDC A,Rn;A (A) + (Rn) + (C ) ADDC A,direct;A (A) +(direct)+( C) ADDC A,Ri;A (A) +(Ri)+( C) ADDC A,#data;A (A) + #data +( C) C为来自PSW状态寄存器中的进位位C。 例如,设(A)=20H,(R0)=21H,(C )=1,执行指令 ADDC , R0后,(A)=42H。,功能:该操作与ADD类似,只是PSW中的进位位
30、C参与运算。带进位加法指令通常用于多字节或多个数加法运算。,解当(C )0时,两指令运行结果一样,为(A)0A4H。 当(C)1时,两指令运行的结果不同,相差1。即ADD A, 30H的结果为(A)0A4H,而ADDC A,30H的结果是(A)0A5H。 显然,ADD指令与C值无关,而ADDC的运行结果与C值有关。,例已知(A)=26H , (30H)=7EH , 比较在(C )0、(C )1两种情况下执行 ADD A ,30H 和 ADDC A ,30H指令的结果。,解 MOV A,30H ADD A,40H ;低字节相加 MOV 50H,A MOV A,31H ADDC A,41H ;高字
31、节相加 MOV 51H,A MOV A, #00H ADDC A,#00H ;取高相加产生的进位 MOV 52H,A 说明: 多字节数求和,从低字节开始,最低字节相加用ADD指令,高字节相加用ADDC指令。 N字节数相加,结果可能为N+1字节数。 为单独取得进位的值,可参考本页范例。,例 两字节无符号数相加,被加数放在内部RAM30H,31H单元(低位放在前),加数放在内部RAM40H、41H单元。计算两数的和,放在50H52H单元中。,例试把存放在R1R2和R3R4中的两个16位数相加,结果存于R5R6中。 解:参考程序如下: MOVA,R2;取第一个数的低8位 ADDA,R4;两数的低8位
32、相加 MOVR6,A;保存和的低8位 MOVA,R1;取第一个数的高8位 ADDCA,R3;两数的高8位相加并把低8位相加时的进位位加进来 MOVR5,A;把相加的高8位存入R5寄存器中,3带借位减法指令 SUBB A,Rn;A (A) (Rn) ( C) SUBB A,direct;A (A) (direct)-( C) SUBB A,Ri ;A (A) ( (Ri) ( C) SUBB A,#data;A (A) - #data ( C) 例如,设A=39H,R0=20H,(20H)=32H,(C )=1,执行指令 SUBB A,R0后,(A)=06H。,功能: 指令功能是以A中数为被减数
33、,减去操作数,再减去进位,差存在A中。影响PSW中的C,AC,OV,和P位。 说明: MCS-51指令系统中,无不带进位(实为借位)的减法指令。若进行不带借的减法运算,要在运算前使用ADD A,#00H或CLR C等指令将进位标志清0。 减法指令中,无BCD码调整。,例 两个双字节数相减,被减数放在30H,31H,减数放在40H,41H中,差放入50H、51H。,解 ADD A,#00H ;将进位位清0 MOV A,30H SUBB A,40H ;低字节相减 MOV 50H,A MOV A,31H SUBB A,41H ;高字节相减 MOV 51H,A 说明:多字节相减,从低字节开始,最低字节
34、相减时,应先将进位位清0。,4乘法指令 MUL AB;BA (A)(B),功能:累加器A和寄存器B中的两个无符号8位数相乘,所得16位乘积的低8位放在A中,高8位放在B中。 说明:乘法指令影响PSW的状态。执行MUL指令后,C被清0,OV与结果有关,若OV=0,表示乘积小于255(0FFH),只在A中,(B)0;若OV=1,则乘积大于255,(B)0。 例如:(A)=20H, (B)=0A0H, 执行指令 MUL AB 结果:(A)00H,(B)=14H,即积为1400H, (C)=0,(OV)=1,5除法指令 DIV AB;(A)(B)商在A中,余数在B中,功能:两8位无符号数相除,被除数置
35、于累加器A中,除数置于寄存器B中。指令执行后,商存于A中,余数存于B中。 说明:该指令执行后,C清0,若除数为0(即寄存器B内数据为0),(OV)=1,表明除0没有意义;若除数不为0,则(OV)=0。 例:(A)=0FBH,(B)=12H ,则 DIV AB 结果:(A)=0DH,(B)=11H,(C)=0,(OV)=0,例 编程实现下列运算:FD1D2+D3/D4 ,其中D1、D2、D3、D4都为非0的8位二进制无符号数。,解 MOV A,#D1 MOV B, #D2 MUL AB ;计算D1D2 MOV R2,A ;暂存D1D2的结果 MOV R3,B MOV A,#D3 MOV B,#D
36、4 DIV AB ;计算D3/D4 ADD A,R2 ;乘积的低位与商相加 MOV R2,A ;存F低位 MOV A,R3 ADDC A,#0 ;乘积的高位与低位和的进位相加 MOV R3,A ;存F高位在R3中,例:试将A中的二进制数转换为3位BCD码,其中,百位数存放于31H单元,十位数和个位数压缩后存于30H单元中。,解: MOV B,#100 DIV AB MOV 31H,A MOV A,#10 XCH A,B DIV AB SWAP A ADD A,B MOV 30H,A,6加1指令 INC A;A (A) + 1 INC Rn;Rn (Rn) + 1 INC direct;(dir
37、ect) (direct)+ 1 INC Ri;(Ri)(Ri)+ 1 INC DPTR;DPTR (DPTR) + 1 功能:对A,Rn,内部RAM单元及数据指针DPTR进行加1操作,除INC A影响P外,不影响任何标志位。 说明:若原为0FFH,执行该指令后,将变为00H,但不影响进位位C。 例如,(30H)=22H,执行 INC 30H 后,(30H)=23H。,其结果为:(A)=00H,(R2)=10H,(R0)=40H,(40H)=01H,(DPTR)=1B00H,PSW中,(P)=0,C及其它位不变。,例(A)=0FFH, (R2)=0FH, (R0)=40H, (40H)=00H
38、, (DPTR)=1AFFH执行下列指令: INC A INC R2 INC R0 INC DPTR,7减1指令 DEC A;A (A) - 1 DEC Rn;Rn (Rn) - 1 DEC direct;direct (direct)- 1 DEC Ri;(Ri)(Ri)- 1,功能:减1运算 说明:与INC命令类似,但无DPTR减1指令。 若原为00H,执行该指令后,将变为0FFH 。 例如(A)=10H,(R5)=00H,(30H)=2FH,(R0)=40H,(40H)=0FFH。 则执行以下指令: DEC A, DEC R5, DEC 30H, DEC R0 结果为:(A)0FH, (
39、R5)=0FFH, (30H)=2EH, (40H)=0FEH, (P)=0,例:设(R0)=7FH,在内RAM中,(7EH)=00H, (7FH)=40H 执行: DEC R0 DEC R0 DEC R0 结果为 :(R0)= 7EH,(7EH)=0FFH,(7FH)=3FH。,8十进制调整指令 DA A ;,调整要完成的任务是:,(1)当累加器A中的低4位数出现了非BCD码(10101111)或低4位产生进位(AC=1),则应在低4位加6调整,以产生低4位正确的BCD结果。,(2)当累加器A中的高4位数出现了非BCD码(10101111)或高4位产生进位(CY=1),则应在高4位加6调整,
40、以产生高4位正确的BCD结果。 十进制调整指令执行后,PSW中的CY表示结果的百位值。,执行过程中,CPU能根据加法运算后,累加器中的值和PSW中的AC及C标志位的状况自动选择一个修正值(00H、06H、60H、66H)与原运算结果相加,进行二-十进制调整。,例:设(A) = 56H 为56的压缩的BCD码数,(R3)= 67H,(CY)=1 执行 ADDC A,R3 DA A 结果为:123 注意:1)DA指令只能跟在加法指令后面使用; 2)调整前参与运算的两数是BCD码数; 3)DA指令不能与减法指令配对使用,但可以实现对A中 压缩BCD数进行减一操作。 例:设(A)=30H(压缩BCD码
41、数),执行: ADD A,#99H DA A 后,便实现了30 1 = 29的操作。,例 若(A)0101 0110B,表示的BCD码为56,(R3)0110 0111B,表示的BCD码为67,(CY)0。执行以下指令: ADD A,R2 DA A 由于(A)0010 0011B,即,且(CY)1,即,结果为BCD数123。 应该注意,DA指令不能对减法进行十进制调整。,例 在20H、21H中分别存放压缩BCD码55和72,试将两数相加,并计算出结果。,解MOV A,20H ADD A,21H DA A 结果 (A)=27, C=1 如果不使用DAA指令,则结果为0C7H,是错误的。,例 设两
42、个4位BCD码分别存放在30H(十位、个位)和31H(百位、千位)、40H(十位、个位)和41H(百位、千位)。试编程求这两个数的和,结果存放在30H、31H、32H中。,解程序如下: MOV R0,#30H MOV R1,#40H MOV A , R0 ;取十位、个位 ADD A , R1 ;两数十位、个位相加 DA A ;调整为BCD码 MOV R0,A ;存十位、个位 INC R0 INC R1 MOV A ,R0 ;取千位、百位 ADDC A , R1 ;两数千位、百位和进位位相加 DA A ;调整为BCD码 MOV R0,A ;存千位、百位 MOV A,#0 ADDC A,#0 IN
43、C R0 MOV R0,A ;存万位,3.2.4 逻辑运算及移位类指令,1“与”操作指令 2“或”操作指令 3“异或”操作指令 4清零与求反指令 5移位指令,1.逻辑与指令ANL,ANL A,Rn ;A (A)(Rn) ANL A,direct ;A (A)(direct) ANL A,Ri ;A (A)(Ri) ANL A,#data ;A (A)#data ANL direct,A ;direct (A)(direct) ANL direct,#data ;direct (direct)#data,说明: 逻辑运算是按位进行的,对进位标志位C不产生影响。 该指令用于“屏蔽”某些位。,例:(
44、P1)= 35H,使其高4位输出0,低4位不变。 解; ANL P1,#0FH,例 将R1中的低4位清0,高4位不变。 解 MOV A,#11110000B ANL A, R1 MOV R1,A,结果为:(A)=62H,例:设(A)=7AH, (20H )=0E6H,执行指令 ANL A, 20H,2.逻辑或指令ORL,ORL A,Rn ;A (A)(Rn) ORL A,direct ;A (A) (direct) ORL A,Ri ;A (A) (Ri) ORL A,#data ;A (A) #data ORL direct, A ;direct (A) (direct) ORL direc
45、t, #data ;direct (direct) #data,例 将片外RAM 2000H单元的0、1位置1,2、3位清0,其它位不变。 解 MOV DPTR, # 2000H MOVX A,DPTR ORL A,#00000011B ANL A,#11110011B MOV DPTR,A,例:将A中的低3位送入P1中,并保持P1中高5位不变。 ANL A,#07H ANL P1,#0F8H ORL P1,A ;(P1)= P17P16P15P14P13A2A1A0 这称为“数位组合”。,3.逻辑异或指令XRL,XRL A,Rn ;A (A) (Rn) XRL A,direct ;A (A)
46、 (direct) XRL A,Ri ;A (A) (Ri) XRL A,#data ;A (A) #data XRL direct,A, ;direct (direct) (A) XRL direct,#data ;direct (direct) #data,说明: 若与0进行异或运算,结果保持不变; 若与1进行异或运算,结果取反; 自身异或等效于清0。 例 XRL A, A 结果为:(A)0,例 将20H单元内容1、3、5、7位保持不变,0、2、4、6位取反。,解XRL 20H, #01010101B 若 (20H)=11110110 则执行指令:,结果为(20H)=10100011B 这
47、称为“指定位取反”。,注意: 在上述ANL、ORL、XRL操作中,用于端口操作时,无论P0 P3是第一,还是第二操作数,都遵循“读修改写”端口锁存器的操作方式。,4.累加器清0指令 CLR,CLR A,CPL A,累加器取反指令 CPL,例如(A)0E6H执行CPL A ,结果为:(A)=19H 说明: 1)取反即为逻辑非运算。 2)MCS-51单片机没有求补指令,若对累加器A中数求补,则程序如下: CPL A INC A,5. 移位指令,循环左移 RL A ;An+1An, A0 A7 循环右移 RR A ;An An+1,A7 A0 带进位循环左移 RLC A ;An+1 An ,A0 C
48、,C A7 带进位循环右移 RRC A ;An An+1,A7 C,C A0,RL A RR A RLC A RRC A,后两条指令,影响P标志和CY。,例 分析下列程序段实现的功能: MOV A, direct RL A MOV R1,A RL A RL A ADD A,R1 MOV direct,A,解各指令实现的功能依次如程序右边注译,可知该程序实现的功能是将存贮单元的数乘以10。,;取数设为D0 ;D02 ;(R1)2D0 ;2D02 ;4D02 ;8D0+2D0 ;存数10D0,例 将20H单元存放的无符号数除2。 解 ADD A,#0 ;C清零 MOV A,20H RRC A MO
49、V 20H,A,3.2.5 控制转移类指令,程序的顺序执行是由PC自动加1实现的,要改变程序的执行顺序,实现分支转向,必须通过强迫改变PC值的方法来实现,这就是控制转移类指令的基本功能。控制转移类指令可以控制程序根据不同情况执行不同的程序段,令单片机应用系统做出相应的动作。控制转移类指令使单片机具有“智能化”功能。 控制类指令的掌握使用较复杂,包括无条件转移指令、条件转移指令及子程序调用与返回指令。,1无条件转移指令,长转移指令LJMP LJMP addr16 ;PC addr16 功能:指令执行后将16位地址(addr16)传送给PC,从而实现程序转移到新的地址开始运行。 说明:该指令可实现
50、64KB范围的任意转移。,SJMP rel ;PC (PC)+2+rel 功能:执行指令后,程序从当前位置向前或向后跳转rel个单元运行。 说明:该指令中寻址方式为相对寻址。 rel为8位带符号补码数,因此所能实现的程序转移是双向的,若rel为正数,则向前转移,若rel为负数向后转移。转移相对范围图是-128127H共256个单元; 注译中的“PC(PC)+2+rel”是这样得来的:注译中 “(PC)”是该指令执行前的值,前面的“PC”是指指令执行后的值。因“SJMP rel”指令存放在ROM中占用2个字节单元(为双字节指令),故程序从指令执行后“当前位置”向前或向后跳转rel个单元,也就是从
51、指令执行前的位置向前或向后跳转2rel个单元。,短转移指令SJMP,AJMP addr11 ;PC (PC)+2,PC100 addr11 功能: addr11的11位数取代该指令执行后程序指针PC的低11位PC100,程序根据PC值转移运行。 说明: addr11为11位无符号数,程序转移最大范围为2KB。,绝对转移指令AJMP,跳转的范围不同。,短转移类指令:AJMP addr11 长转移类指令:LJMP addr16 相对转移指令:SJMP rel,转移范围: 2KB 64KB -128+127,指令构成不同。 AJMP、LJMP后跟的是绝对地址, 而SJMP后跟的是相对地址。,指令长度
52、不同 原则上,所有用SJMP或AJMP的地方都可以用LJMP来替代。,以上三条指令,均可理解成:PC值改变,即跳转到一个标号处。 那么他们的区别何在呢?,JMP A+DPTR ;PC (A)+(DPTR) 功能: 由A及DPTR的内容决定程序转移的目的地址。 说明: DPTR为基址寄存器,A为变址寄存器,为基址加变址寻址方式。 把DPTR值固定,赋与A不同的值,则可实现程序的多分支转移。,变址寻址转移指令JMP,这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。 转移地址由A+DPTR形成,并直接送入PC。 指令对A、DPTR和标志位均无影响。 本指令可代替众多的判别跳转指
53、令,又称为散转指令,多用于多分支程序结构中。,这条指令与前三条指令相比有所不同,例: MOV DPTR,#TAB ;将TAB代表的地址送入DPTR JMP A+DPTR ;跳转 TAB: AJMP ROUT0 ;跳转ROUT0开始的程序段 TAB+2: AJMP ROUT1 ;跳转ROUT1开始的程序段 TAB+4: AJMP ROUT2 ;跳转ROUT2开始的程序段 TAB+6: AJMP ROUT3 ;跳转ROUT3开始的程序段 . ROUT0: . ROUT1: . ROUT2: . ROUT3:,执行该段程序后,程序将根据A中的内容转移到不同的程序段去执行-散转。 A=0,转ROUT0
54、 A=2,转ROUT1 A=4,转ROUT2 A=6,转ROUT3,2条件转移指令 所谓条件转移就是程序的转移是有条件的,当指令中规定的条则满足时,程序转移,否则程序不转移,仍顺序执行。 l累加器判零转移指令 l数值比较转移指令 l减1条件转移指令 l相对偏移量rel的求法,条件转移类指令,JZ rel : 若(A)= 0 ,则转移,否则顺序执行。 JNZ rel : 若(A) 0,则转移,否则顺序执行。 转移目的地址 = (PC)+ 2 + rel 不影响任何标志位。,累加器判零转移指令 JZ rel JNZ rel,例:将外RAM的一个数据块(首地址为DATA1)传送到内部数据RAM(首地
55、址为DATA2),遇到传送的数据为零时停止传送,试编程。,解 MOV R0,#DATA2 ;赋首址 MOV DPTR,#DATA1 LOOP1:MOVX A,DPTR ;取数 JZ LOOP2 ;判断是否为0 MOV R0,A ;不为0存数 INC R0 ;准备取下一个数 INC DPTR SJMP LOOP1 ;重复取数过程 LOOP2:RET ;为0结束,2、数值比较转移指令 功能:比较二个字节中的值,若不等,则转移。 CJNE A,#data,rel CJNE A,direct,rel CJNE Ri,#data,rel CJNE Rn,#data,rel,该类指令具有比较和判断双重功能
56、,比较的本质是做减法运算,用第一操作数内容减去第二操作数内容,但差值不回存。 转移目的地址 = (PC)+ 3 + rel 若第一操作数内容小于第二操作数内容,则(C)= 1,否则(C)= 0。,说明: 数据比较转移指令都为三字节指令。 利用该类指令不但可以实现程序的转移功能,也可以用以比较两数值的大小。 指令执行后进位位C的状态反映了被比较数与比较数相减有无借位。,该类指令可产生三分支程序: 即,相等分支;大于分支;小于分支。,例: 设P1口的P1.0 P1.3为准备就绪信号输入端,当该四位为全1时,说明各项工作已准备好,单片机可顺序执行,否则,循环等待。,解: MOV A,P1 ANL A,#0FH CJNE A,#0FH,WAIT ;P1.0 P1.3不为全1时,返 ; 回WAIT MOV A,R2 ,解 MOV R0,#DATA LOOP1: CJNE R0,#64H,LOOP2 SJMP LOOP3 LOOP2: INC R0 SJMP LOOP1 LOOP3: MOV A,R0,例 找出片内RAM的DATA为首址的数据块中第一个等于100的数,并将其地址存入A中。,3、减1条件转移指令 DJNZ Rn,rel ;(二
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025河南郑州大学第二附属医院招聘员额制工作人员(硕士)23人备考核心试题附答案解析
- 2025广东惠州市第一妇幼保健院招聘第二批员额制卫生专业技术人员13人笔试重点试题及答案解析
- 2025锦州市部分事业单位赴高校公开招聘2026年应届毕业生(第二批)备考核心试题附答案解析
- 2025湖北武汉市蔡甸区公立中学招聘教师2人备考笔试题库及答案解析
- 2026甘肃天水市引进高层次和急需紧缺人才219人考试重点题库及答案解析
- 2026天津市滨海新区大港医院招聘高层次人才1人考试核心试题及答案解析
- 2025年甘肃省临夏州康乐县融媒体中心招聘编辑记者、播音员备考核心试题附答案解析
- 2025青海海南州同德县人民医院招聘消防专职人员1人考试核心试题及答案解析
- 2026中国矿产资源集团校园招聘和所属单位社会招聘(河北有岗)考试重点试题及答案解析
- 2025黑龙江富裕经济开发区管理委员会招聘公益性岗位人员4人备考核心试题附答案解析
- 透水砖施工工艺及技术交底文档
- 晕针的护理及防护
- 公路工程试验检测实施细则22
- 阿司匹林肠溶片
- 2024包头轻工职业技术学院工作人员招聘考试试题及答案
- 海上应急搜救预案
- 劳动合同涨工资协议
- 2025年内蒙古执业药师继续教育答案(一)
- 2025年师德师风工作总结
- 网络安全知识培训教程课件
- 膝骨关节炎中西医结合诊疗指南
评论
0/150
提交评论