830 likes | 971 Views
单片机原理接口及其应用. (Principle and Application of Single Chip Microcomputer). 第 1 章 概述 第 2 章 MCS-51 单片机硬件结构 第 3 章 MCS-51 寻址方式和指令系统 第 4 章 MCS-51 汇编程序设计 第 5 章 中断系统 第 6 章 定时器 / 计数器及串行口 第 7 章 存储器扩展 第 8 章 接口电路扩展 第 9 章 应用举例. 第 3 章 MCS-51 寻址方式和指令系统. 重点:掌握 MCS-51 的寻址方式和主要指令的功能、格式、使用。
E N D
单片机原理接口及其应用 (Principle and Application of Single Chip Microcomputer)
第1章 概述 第2章 MCS-51单片机硬件结构 第3章MCS-51寻址方式和指令系统 第4章MCS-51汇编程序设计 第5章 中断系统 第6章 定时器/计数器及串行口 第7章 存储器扩展 第8章 接口电路扩展 第9章 应用举例
第3章 MCS-51寻址方式和指令系统 重点:掌握MCS-51的寻址方式和主要指令的功能、格式、使用。 3.1 MCS-51指令系统概述 3.2 MCS-51寻址方式 3.3 指令系统分类介绍
单片机所能执行的指令集合称为指令系统。 MCS-51的基本指令共111条,按指令所占的字节来分: (1) 单字节指令49条; (2) 双字节指令45条; (3) 三字节指令17条。 按指令的执行时间来分: (1)单机器周期(12个时钟振荡周期)的指令64条; (2)二机器周期(24个时钟振荡周期)的指令45条; (3)只有乘、除两条指令的执行时间为4个机器周期(48个时钟振荡周期)。 3.1 MCS-51指令系统概述 返回本章
在MCS-51指令中,指令主要由操作码、操作数组成。在MCS-51指令中,指令主要由操作码、操作数组成。 指令具有以下功能: (1)操作码指明执行什么性质和类型的操作。例 如,数的传送、加法、减法等。 (2)操作数指明参与操作的数本身或者是其所在的 地址。 (3)指定操作结果存放的地址。 指令一般格式: 标号:操作码助记符[(目的操作数),(源操作数)] ;注释 指令格式
3.2.1寄存器寻址 3.2.2 直接寻址 3.2.3寄存器间接寻址 3.2.4立即寻址 3.2.5 变址寻址 3.2.6位寻址 3.2.7相对寻址 3.2 寻址方式(7种) 返回本章
以通用寄存器的内容为操作数的寻址方式。通用寄以通用寄存器的内容为操作数的寻址方式。通用寄 存器指A、B 、DPTR以及R0~R7(当前工作寄存器 组)。 例如: CLR A ;A←0 INC DPTR ;DPTR←(DPTR)+1 ADD A,# 20H ;A←(A) + #20H 3.2.1 寄存器寻址
指令中直接给出操作数地址的寻址方式,能进行直指令中直接给出操作数地址的寻址方式,能进行直 接寻址的存储空间有SFR寄存器和内部数据RAM。 例如: MOV PSW,# 20H ;PSW←#20H PSW为直接寻址寄存器的符号地址。 MOV A,30H ;A←(30H) 30H为直接给出的内部RAM的地址。 MOV A,P0 ;读P1口引脚 MOV A,80H 直接寻址方式是访问特殊功能寄存器的唯一寻址方 式。 3.2.2 直接寻址
以寄存器中内容为地址,以该地址中内容为操作数以寄存器中内容为地址,以该地址中内容为操作数 的寻址方式。寄存器间接寻址的存储器空间包括内 部数据RAM和外部数据RAM。 能用于寄存器间接寻址的寄存器有R0,R1, DPTR,SP。其中R0、R1必须是当前工作寄存器组 中的寄存器。SP仅用于堆栈操作。 在寄存器的名称前面加前缀标志“@”表示间接寻 址 MOV A,@Ri ;i=0或1 MOVX A,@DPTR 3.2.3 寄存器间接寻址
例如: MOV @R0,A ;内部RAM (R0)←(A),其指令 操作过程示意图如图4-1所示。 片内RAM R0 30H 34H 30H A 34H 图3-1 MOV @R0,A间接寻址示意图
又如: MOVX A,@R1 ;A←外部RAM (P2R1)其指令操作过程示意图如图3-2所示。 片外RAM 45H 3410H A 45H P2 34H R1 10H 图3-2 MOVX A,@R1 间接寻址示意图
再如: MOVX @DPTR,A;外部RAM (DPTR)←(A) 其指令操作过程示意图如图3-3所示。 片外RAM DPTR 2000H 30H 2000H A 30H 图3-3 MOVX @DPTR,A 间接寻址示意图
指令中直接给出操作数的寻址方式。立即操作数用指令中直接给出操作数的寻址方式。立即操作数用 前面加有#号的8位或16位数来表示。 例如: MOV A,# 60H ;A←#60H MOV DPTR,# 3400H ;DPTR←#3400H MOV 30H,# 40H ;30H单元←#40H 上述三条指令执行完后,累加器A中数据为立即数 60H,DPTR寄存器中数据为3400H,30H单元中数据 为立即数40H。 3.2.4 立即寻址方式
变址寻址是由基址寄存器加变址寄存器形成的寻址变址寻址是由基址寄存器加变址寄存器形成的寻址 方式。它只能对程序存储器中数据进行操作。 由于程序存储器是只读的,因此变址寻址只有读操 作而无写操作,在指令符号上采用MOVC的形式。 例如:MOVC A,@A+DPTR ;A←((A)+(DPTR)) 又如: MOVC A,@ A+PC ;A←((A)+(PC)) 这条指令与上条指令不同的是,基址寄存器是 PC (当前PC值)。 JMP @A+DPTR;PC ← (A)+(DPTR) 3.2.5 变址寻址
DPTR 程序存储器 2000H A 10H 2000H 64H(10H) 2010H 64H MOVC A,@A+DPTR 图3 -4 变址寻址示意图
位寻址只能对有位地址的单元作位寻址操作。 位寻址其实是一种直接寻址方式,不过其地址是 位地址。 例如:SETB 10H ;将10H位置1。 若22H单元中存放着数据40H,22H单元D0位的位 地址即10H,执行上述指令后,(22H)=41H。 又如:MOV 32H,C ;32H←进位位C ORL C ,32H ;C←(C)∨(32H) 3.2.6 位寻址 返回本节
位寻址范围包括: (1)内部RAM中的位寻址区。位有两种表示方法: 位地址: 40H; 单元地址加上位:(28H).0,指的是28H单元中的最低位。它们是等价的。 (2)特殊功能寄存器中的可寻址位 可寻址位在指令中有4种表示方法: a.特殊功能寄存器符号加位数。如: PSW.5。 b.直接使用位地址。PSW.5的位地址为0D5H。 c.位名称。PSW.5是F0标志位,可使用F0表示该位。 d.单元地址加位数。例如 :(0D0H).5。
相对寻址用于修改PC值,主要用于实现程序的分支转移。相对寻址用于修改PC值,主要用于实现程序的分支转移。 以当前(取指令后)程序计数器PC的内容为基础,加上指令中给出的一字节补码数(偏移量rel)形成新的PC值的寻址方式。 目的地址 = 转移指令所在的地址 + 转移指令字节数+ rel 例如,SJMP 08H ;PC←(PC)+2+08H 指令操作示意图如图3-5所示。 3.2.7 相对寻址
程序存储器 PC 2000H SJMP (2000H) 200AH 08H 2000H+2 08H 200AH 目的地址=当前PC值+偏移量 图3-5 相对寻址示意图
MCS-51的指令系统: 49条单字节指令 45条双字节指令 17条3字节指令 在111条指令中(主频取12MHz时): 64条指令执行时间是1个机器周期,1us 45条指令执行时间是2个机器周期,2us 2条乘、除法运算指令执行时间是4个机器周期,4us 3.3 指令系统分类介绍
3.3.1指令描述符号介绍 3.3.2 数据传送类指令 3.3.3 算术运算类指令 3.3.4 逻辑运算与循环类指令 3.3.5 程序转移类指令 3.3.6 调用子程序及返回指令 3.3.7 位操作指令 3.3.8 空操作指令 返回本章
Rn——当前选中的寄存器区中的8个工作寄存器 R0~R7(n=0~7)。 Ri——当前选中的寄存器区中的2个工作寄存器 R0、R1(i=0,1)。 direct—8位内部数据存储器单元的地址。 #data——包含在指令中的8位常数。 #data16—包含在指令中的16位常数。 addr16——16位目的地址。 addr11——11位目的地址。 3.3.1 指令描述符号介绍
rel——8位带符号的偏移字节,简称偏移量。 DPTR—数据指针,可用作16位地址寄存器。 bit——内部RAM或专用寄存器中的直接寻址位。 A——累加器。 B——专用寄存器,用于乘法和除法指令中。 C——进位标志(进位位),或布尔处理机中的位累 加 器。
@——间址寄存器或基址寄存器的前缀, 如 @Ri,@DPTR。 / ——位操作数的前缀,表示对该位操作数取反, 如 /bit。 ×——片内RAM的直接地址或寄存器。 (×)——由×寻址的单元中的内容。 ——箭头左边的内容被箭头右边的内容所代替。 返回本节
数据传送类指令共28条,将源操作数复制到目的操作数。指令执行后,源操作数不变,目的操作数被源操作数取代。指令执行后对CY、AC、OV无影响。数据传送类指令共28条,将源操作数复制到目的操作数。指令执行后,源操作数不变,目的操作数被源操作数取代。指令执行后对CY、AC、OV无影响。 数据传送类指令用到的助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP 8种。 源操作数可采用寄存器、寄存器间接、直接、立即、变址5种寻址方式寻址,目的操作数可以采用寄存器、寄存器间接、直接寻址3种寻址方式。MCS-51单片机片内数据传送途径如图3-6所示。 3.3.2 数据传送类指令
直接地址 direct 累加器 A 直接地址 direct 间接地址 @Ri 寄存器 Rn 立即数 #data 寄存器 DPTR 图3-6 MCS-51单片机片内数据传送图
MOV A,Rn ;A← (Rn) MOV A,direct ;A←(direct) MOV A,@Ri ;A←((Ri)) MOV A,#data ;A← #data MOV A, R0 MOV A, 30H MOV A, @R1 MOV A, #03 1.以A为目的操作数
MOV Rn,A ;Rn ← (A) MOV Rn,direct ;Rn ←(direct) MOV Rn,#data ;Rn ← #data MOV R4, A MOV R2, 25H MOV R5, #0FH 2.以Rn为目的操作数
MOV direct,A ; direct ← (A) MOV direct,direct ; direct ←(direct) MOV direct,Rn ; direct ← (Rn) MOV direct,#data ; direct ← #data MOV direct,@Ri ; direct ← ((Ri)) 3.以直接地址为目的操作数
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。 4.以间接地址为目的操作数
MOV DPTR,#data16 ;DPTR← #data16 例如执行 MOV DPTR,#2000H 后, (DPTR)= 2000H。 5.以DPTR为目的操作数
MOVX A,@DPTR ;A ← ((DPTR)) MOVX @DPTR,A ;(DPTR)← A MOVX A,@Ri ;A ← ((P2Ri)) MOVX @Ri,A ;(P2Ri)← A 6.访问外部数据RAM
MOVC A,@A+DPTR ;A ← ((A)+(DPTR)) MOVC A,@A+PC ;PC ←(PC)+1, A ← ((A)+(PC)) ; 例如已知(A)=30H,(DPTR)=3000H,程序存储器单元 (3030H)=50H,执行MOVC A,@ A+DPTR后,(A)=50H。 例:查表:设(A)=0~3, 按(A)=2的值查表,结果是什么? REL-PC: INC A ;跳过RET MOVC A, @A+PC ; 查表 RET DB 66H ; 表格 DB 77H DB 88H DB 99H 7.读程序存储器(查表) 指令单元处PC值 0030H 04H 0031H 83H 0032H 22H 0033H 66H 0034H 77H 0035H 88H 0036H 99H
l字节交换 XCH A,Rn ;(A)<=>(Rn) XCH A ,direct ;(A)<=>(direct) XCH A,@Ri ;(A)<=>((Ri)) l半字节交换 XCHD A,@Ri ;(A)0~3<=>((Ri))0~3 SWAP A ;(A)0~3<=>(A)4~7 8.数据交换
堆栈是在片内RAM中按“先进后出,后进先出”原堆栈是在片内RAM中按“先进后出,后进先出”原 则设置的专用存储区。数据的进栈出栈由指针SP统 一管理。堆栈的操作有如下两条专用指令: PUSH direct ;SP←(SP)+1,(SP)←(direct) POP direct ;direct←((SP)),SP ←(SP)-1 例: 设中断时,(SP)=09h, (DPTR)=1034h, 保护DPTR进栈。 PUSH DPL PUSH DPH 则 (0AH)=34H, (0BH)=10H, (SP)=0BH 9.堆栈操作
片内RAM 片内RAM 片内RAM 片内RAM 50H 50H 40H 40H 40H 40H 30H ×× 50H 30H 30H 30H 11H 11H 11H 50H 11H 50H ×× 50H SP SP 10H ×× 10H 10H ×× SP ×× 10H ×× SP 执行前PUSH指令后 执行前 执行前 执行POP指令后 POP 30H PUSH 40H 指令POP操作示意图 指令PUSH操作示意图
方法1(直接地址传送法): MOV 31H,30H MOV 30H,40H MOV 40H,31H SJMP $ 方法2(间接地址传送法): MOV R0,#40H MOV R1,#30H MOV A,@R0 MOV B,@R1 MOV @R1,A MOV @R0,B SJMP $ 【例3.1】 将片内RAM 30H单元与40H单元中的内容互换。
方法3(字节交换传送法): MOV A,30H XCH A,40H MOV 30H,A SJMP $ 方法4(堆栈传送法): PUSH 30H PUSH 40H POP 30H POP 40H SJMP $ 返回本节
算术运算指令执行后对 CY、AC、OV 有影响(除INC和DEC指令)。 1.加法指令 ADD A,Rn ;A← (A) +( Rn) ADD A,direct ;A←( A) +(direct) ADD A,@Ri ;A← (A) + ((Ri)) ADD A,#data ;A← (A) + #data 3.3.3 算术运算类指令
使用加法指令时,要注意累加器A的运算结果对各个使用加法指令时,要注意累加器A的运算结果对各个 标志位的影响: (1)如果位7有进位,则置“1”进位标志Cy,否则清“0” Cy。 (2)如果位3有进位,置“1”辅助进位标志Ac,否则 清“0” Ac(Ac为PSW寄存器中的一位)。 (3)如果位6有进位,而位7没有进位,或者位7有进位,而位6没有,则溢出标志位OV置“1”,否则清“0”标志位OV。 溢出标志位OV的状态,只有在带符号数加法运算时才有意义。当两个带符号数相加时,OV=1,表示加法运算超出了累加器A所能表示的带符号数的有效范围。
例: (A)=53H,(R0)=FCH,执行指令 ADD A,R0 结果为: (A)=4FH,Cy=1,Ac=0,OV=0,P=1 注意:上面的运算中,由于位6和位7同时有进位,所 以标志位OV=0。 例:(A)=85H,(R0)=20H,(20H)=AFH,执行指令: ADD A,@R0 结果为:(A)=34H,Cy=1,Ac=1,OV=1,P=1 注意:由于位7有进位,而位6无进位,所以标志位 OV=1
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 A,R0后,(A)=42H。
【例3.2】 试把存放在 R1R2 和 R3R4 中的两个16位数相加,结果存于 R5R6 中。 解:参考程序如下: MOV A,R2 ;取第一个数的低8位 ADD A,R4 ;两数的低8位相加 MOV R6,A ;保存和的低8位 MOV A,R1 ;取第一个数的高8位 ADDC A,R3 ;两数的高8位相加,并把低8位 相加时的进位位加进来 MOV R5,A ;把相加的高8位存入R5寄存器中 SJMP $ 返回本节
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。 一般在做减法时,要先将C清零。
例:多字节减法 被减数和结果放在由R0间址的单元,减数放在 由R1间址的单元,字节数存于R2中。 SUBSTR: CLR C SUBS1: MOV A, @R0 SUBB A, @R1 MOV @R0, A INC R0 INC R1 DJNZ R2, SUBS1 SJMP $
4.乘法指令 MUL AB ;BA← (A)×(B) A和B中各存放一个8位无符号数,指令执行 后,16位乘积的高8位在B中,低8位存A中。 例如,(A)=30H,(B)=60H,执行 MUL AB 后, (A)=00H,(B)=12H。
5.除法指令 DIV AB ; (A)÷(B)→商在A中,余数在B中 A和B中各存放一个8位无符号数,A放被除数,B放除数。指令执行后,A中存放商,B中存入余数。若除数(B)=00H,则指令执行后OV=1,A与B不变。 例如,(A)=30H,(B)=07H,执行 DIV AB 后,(A)=06H,(B)=06H。
6.加1指令 INC A ;A← (A) + 1 INC Rn ;Rn← (Rn) + 1 INC direct ;(direct)← (direct) + 1 INC @Ri ;(Ri)←((Ri)) + 1 INC DPTR;DPTR← (DPTR) + 1 例如,(30H)=22H,执行 INC 30H 后 (30H)=23H。