《单片机中级教程》由会员分享,可在线阅读,更多相关《单片机中级教程(82页珍藏版)》请在金锄头文库上搜索。
1、(3),主讲:王成义,办公室:文理大楼411,EMAIL: CYWANGSDAU.EDU.CN,单片机中级教程 原理与应用,2,3.1 概述,7种寻址方式,111条指令,字节数,运算速度,单字节指令:49条 双字节指令:45条 三字节指令:17条,单周期指令:64条 双周期指令:45条 四周期指令:2 条,Instruction Set,第三章 80C51单片机的指令系统,3,功能,数据传送类:29条 算术运算类:24条 逻辑运算类:24条 控制转移类:17条 位操作类: 17条,4,常用符号,Rn:工作寄存器中的寄存器R0、R1R7之一,,Ri:工作寄存器中的寄存器R0或R1,#data:8
2、位立即数,#data16:16位立即数,direct:片内RAM或SFR的地址(8位),:间接寻址寄存器的前缀标志,Bit:片内RAM或SFR的位地址,addr11:11位目的地址,addr16:16位目的地址,5,rel:补码形式的8位地址偏移量。偏移范围为-128127 C:进位标志位,也称为位累加器 /:位地址的前缀标志,表示对该位操作数取反 X:片内RAM的直接地址或寄存器 (X):相应寄存器或地址单元中的内容 :箭头左边的内容送入箭头右边的单元内 :箭头右边的内容送入箭头左边的单元内,6,3.2.1 立即寻址 Immediate Addressing,操作数就包含在指令代码中,在操作
3、码之后,称为立即数,用前缀“”表示。如:MOV P1, #80HMOV R7, #0F5H MOV DPTR,#1245H,寻址方式:在指令中用于说明操作数所在地址的方法。,3.2 寻址方式和寻址空间,7,直接寻址:在指令中直接给出操作数单元的地址。操作数在SFR、内部RAM空间。 如: MOV A,00HMOV A,0F0HMOV A,B,3.2.2 直接寻址Direct Addressing,直接寻址是访问SFR的唯一方法!,8,3.2.3 寄存器寻址Register Addressing,对选定的工作寄存器R0R7、累加器A、寄存器对AB、地址寄存器DPTR、位累加器C中的数进行操作。
4、例:MOV A,R0;将R0工作寄存器中的数据送到累加器A中去。,提一个问题:我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOV A,00H 和 MOV A,R0不就没什么区别了吗?,9,的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,第一条指令变成最终的目标码要两个字节(E5H 00H),而第二条则只要一个字节(E8H)就可以了。,10,3.2.4 寄存器间接寻址Register Indirect Addressi
5、ng,把地址放在一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。 R0,R1 8位地址,片内低128(或256)字节或片 外256字节。 DPTR 16位,片外64KB PUSH、POP 堆栈操作如: MOV A,R0MOVX A,R0MOVX A,DPTR,操作数在片内RAM中,操作数在片外RAM中,操作数在片外RAM中,11,3.2.5 相对寻址,将PC中的当前内容与指令第二字节给出的数相加,结 果作为跳转指令的转移地址(转移目的地址)。 PC中的当前内容称为基地址(本指令执行后的字节地址)指令第二字节给出的数据称为偏移量,1字节带符号数.目的地址=转移指令所在地址+转移指令
6、字节数+rel 常用于跳转指令。如: JC 23H若C=0,不跳转; C=1,跳转.,Relative Addressing,改变PC,12,如:JC 23H,1025H,23H,1002H,指令代码,PC当前值,如:JC 80H;则转移的目的地址=?,13,以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。常用于查表操作。MOVC A, A+DPTR ;(A+DPTR) A MOVC A, A+PC ; PC+1 PC,(A+PC)A,3.2.6 变址寻址(基址+变址),Base-Register-plus-Index-Register-Indirec
7、t Addressing,操作数在程序存储器中,14,如:MOVC A,A+DPTR 设DPTR=2000H,A=0E0H,20E0H,47,指令代码,15,如:MOVC A,A+PC 设A=0E0H,2121H,45,PC当前值,指令代码,16,对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。,3.2.7 位寻址 Bit Addressing,操作数在片内 RAM位地址区或SFR某些位中,如: SETB 3DH ; 将27H.5位置1 CLR C ; Cy位清0 MOV C , 60H,17,寻址方式涉及的存储器空间,18,3.3 数据传送类指令(29条)Data
8、 Transfer Instruction,助记符:MOV、MOVX、MOVC XCH、XCHD、SWAP PUSH、POP 源操作数寻址方式(5种):立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址。目的操作数寻址方式(3种):直接寻址、寄存器寻址、寄存器间接寻址除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。,19,3.3.1 以累加器为目的操作数的指令(4条),MOV A,Rn ;RnAMOV A,direct ;(direct)AMOV A,Ri ;(Ri)AMOV A,#data ;dataA将源操作数指定内容送到A中。,3.3.2 以寄存器Rn为目的操作数的
9、指令 (3条),MOV Rn,AMOV Rn,directMOV Rn,#data这组指令功能是把源操作数指定的内容送入当前工作寄存器,源操作数不变。,20,3.3.3 以直接地址为目的操作数的指令(5条),MOV direct,AMOV direct,RnMOV direct1,direct2MOV direct,RiMOV direct,#data这组指令功能是把源操作数指定的内容送入由直接地址指出的片内存储单元。 例: MOV 20H,AMOV 20H,R1MOV 20H,30HMOV 20H,R1MOV 0A0H,#34HMOV P2,#34H,21,3.3.4 以间接地址为目的操作数
10、的指令(3条),MOV Ri,A ;A (Ri)MOV Ri,direct ;(direct) (Ri)MOV Ri,#data ;data (Ri)功能:把源操作数指定的内容送入以R0或R1为地址指针的片内存储单元中。例: MOV R0,AMOV R1,20HMOV R0,#34H,22,3.3.5 十六位数的传递指令(1条),MOV DPTR,#data16 8051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例:MOV DPTR,#1234H 执行完了之后DPH中的值为12H,DPL中的值为34H。
11、 如果我们分别向DPH,DPL送数,则结果也一样。如下面两条指令: MOV DPH,#12HMOV DPL,#34H。则就相当于执行了 MOV DPTR,#1234H。,23,3.3.6 累加器A与片外RAM之间的数据传递类指令(4条),MOVX A,RiMOVX Ri,AMOVX A,DPTRMOVX DPTR,A 说明:1.在51中,与外部存储器RAM打交道的只可以是累加器A。所有 需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部 RAM中的数据也必需通过A读入。在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。比如,要将外部RAM中某一单
12、元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。,24,2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。MOV DPTR,#0100HMOVX A,DPTRMOV DPTR,#0200HMOVX DPTR,A,2
13、5,3.3.7 读程序存储器指令(2条),MOVC A,A+DPTRMOVC A,A+PC本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格 说明:查找到的结果被放在A中,因此,本条指令执行前后,A 中的值不一定相同。 例:有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5)MOV DPTR,#100H MOV A,R0 MOVC A,A+DPTR . ORG 0100HDB 0,1,4,9,16,25,如果R0中的值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。,26,3.3.8 堆栈操作(2条)
14、,PUSH direct ; SPSP+1,(SP)(direct)POP direct ; (direct) (SP), SPSP-1 第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到direct中。例: MOV SP,#5FHMOV A,#100MOV B,#20PUSH ACCPUSH B则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完
15、本条指令后, 61H单元中的值变为20。,27,3.3.9 交换指令(5条),XCH A,Rn ;ARnXCH A,direct ;A(direct)XCH A,Ri ;A(Ri)XCHD A,Ri ;A.3A.0(Ri).3(Ri).0SWAP A ;A.3A.0A.7A.4 例: 已知A中的内容为34H,R0中的内容为50H,50H中的内容为56HMOV R6, #29HXCH A, R6SWAP AXCH A, R6XCHD A, R0,;R6=29H ;A=29H,R6=34H ;A=92H ;A=34H,R6=92H ;A=36H,(R0)=54H,XCH:eXCHange,XCHD: Digit,28,(40H)= H 50H = H A= H (41H)= H 51H= H R0= H,课堂练习,1.设:内部RAM中,(40H)=50H,(41H)=60H,(50H)=30H,(51H)=70H,执行下列程序片段后:,MOV R0,40HMOV A,R0INC R0MOV R0,A,