第 3章 MCS-51单片机指 令系统
3.1 MCS-51单片机指令系统简介
3.2 MCS-51单片机指令系统
3.3 汇编语言程序设计
3.4 MCS-51汇编语言实用程序设计 (略 )
退出
3.1 MCS-51单片机指令系统简介
MCS-51单片机能够识别并执行的指令共有 111条 。
这 111条指令,构成了 MCS-51单片机的指令系统 。
3.1.1 MCS-51单片机指令系统的分类
1,MCS-51单片机指令系统按指令所占的字节数可分为以下三类:
( 1) 单字节指令 ( 49条 )
( 2) 双字节指令 ( 46条 )
( 3) 三字节指令 ( 16条 )
2、按指令的执行时间可分为以下三类:
(1) 单周期指令( 65条)
(2) 双周期指令( 44条)
(3) 四周期指令( 2条)
3、按指令的功能可分为以下五类:
(1) 数据传送类指令( 29条)
(2) 算术运算类指令( 24条)
(3) 逻辑运算类指令( 24条)
(4) 控制转移类指令( 17条)
(5) 位操作类指令( 17条)
3.1.2 指令格式
MCS-51单片机汇编语言指令由操作码和操作数两部分组成。
指令格式为:操作码 [操作数 ]
3.1.3 指令中的常用符号
· Rn,表示当前工作寄存器 R0~ R7中的一个。
· @Ri,表示寄存器间接寻址,常常作间接寻址的地址指针。其中 Ri代表 R0和 R1寄存器中的一个。
· Direct,表示内部数据存贮器单元的地址及特殊功能寄存器 SFR的地址,对 SFR而言,既可使用它的物理地址,也可直接使用它的名字。
· #date,表示 8位立即数,即 8位常数,取值范围为
#00H~ #0FFH
·#date16,表示 16位立即数,即 16位常数,取值范围为 #0000H~ #0FFFFH
· addr16,表示 16位地址
· addr11,表示 11位地址
· rel,用补码形式表示的地址偏移量,取值范围为 -
128~ +127。
· Bit,表示内部 RAM和 SFR中的具有位寻址功能的位地址。 SFR中的位地址可以直接出现在指令中,为了阅读方便,往往也可用 SFR的名字和所在的数位表示。如:表示 PSW中奇偶校验位,可写成 D0H,也可写成 PSW.0的形式出现在指令中。
· @,表示间接寻址寄存器或基址寄存器的前缀符号。
· $,表示当前指令的地址。
3.1.4 寻址方式
1,立即寻址立即寻址是将操作数直接存放在指令中,作为指令的一部分存放在代码段里。立即寻址中的数,称为立即数。
例如指令,MOV A,#30H
2,直接寻址直接寻址是将操作数的地址直接存放在指令中。
这种寻址方式的操作数只能存放在内部数据存贮器和特殊功能寄存器中。
例如,MOV A,30H
3,寄存器寻址寄存器寻址是指操作数存放在以上所说的寄存器中,并且寻址时的寄存器已隐含在指令的操作码中。
例如,MOV A,R0
4,寄存器间址寄存器间址是指操作数存放在以寄存器内容为地址的单元中例如,MOV A,@R0
5,变址寻址变址寻址是指操作数存放在变址寄存器和基址寄存器的内容相加形成的数为地址的单元中。其中累加器 A作变址寄存器、程序计数器 PC或寄存器 DPTR作基址寄存器。
例如,MOVC A,@A+DPTR
6,相对寻址相对寻址是将程序计数器 PC的当前值与指令第二字节给出的偏移量相加,从而形成转移的目标地址。
例如,JZ 61H
7,位寻址位寻址,是指对片内 RAM中 20H~ 2FH中的 128个位地址,以及 SFR中的 11个可进行位寻址的寄存器中的位地址寻址。
例如:位寻址指令 MOV C,20H,此指令是将
RAM中位寻址区 20H位地址中的内容,送给位累加器
C。字节地址寻址指令,MOV A,20H,此指令是将内部 RAM中 20H单元中的内容送给累加器 A。
3.2 MCS-51单片机指令系统
3.2.1 数据传送类指令
1,内部传送指令 ( 16条 )
(1) 将数据传送到累加器 A的指令 ( 4条 )
( 2) 将数据传送到工作寄存器 Rn的指令 ( 3条 )
( 3) 将 8位数据直接传送到直接地址 ( 内部 RAM
单元或 SFR寄存器 ) 指令 ( 5条 )
( 4) 将 8位数据传送到以间接寄存器寻址的 RAM
单元的指令 ( 3条 ) 。
( 5) 16位数据传送指令 ( 1条 )
3.3 汇编语言程序设计
3.3.1 汇编语言及其语句格式
1,汇编语言这里介绍 MCS-51单片机的汇编语言 。
2,汇编语言的语句格式一条汇编语言的语句包括四部分内容:标号,操作码,操作数和注释 。 其格式为:
标号:操作码 操作数;注释例如,LOOP,MOV A,#20H ; (A)← 20H
3.3.2 伪指令
1,定位伪指令格式,ORG n
2,定义字节伪指令格式:标号,DB X1,X2,……Xn
此伪指令的功能是把 Xi存入从标号开始连续的单元中。
3,定义双字节伪指令格式:标号,DW X1,X2,……Xn
此伪指令的功能是把 Xi存入从标号开始的连续单元中。
4,预留存贮区伪指令格式,DS n
DS n从标号指定单元开始,预留 n个单元的存贮区。
5,赋值伪指令格式:字符名称 x EQU n
此指令的功能是将数据或地址 n赋给字符名称。
6,结束汇编指令格式,END
END指示源程序到结束,常将其放在汇编语言源程序的末尾。
3.3.3 汇编语言程序设计过程
1,分析任务,确定算法或解题思路
2,根据算法和解决思路画出程序流程图流程图是由一些框图和流程线组合而成:
` 置的框图连接在一起,位于不同框图的圈内,应标注相同的字母。
3,根据流程图编写程序
4,上机调试程序
3.3.4 顺序结构程序设计按照程序编写的顺序,依次执行 。 任何复杂的程序,都含有较大成份的顺序结构程序 。
【 例 3-8】 将两位压缩 BCD码转换成二进制数编程思路,( a1a0) BCD= a1× 10+a0
编程说明:待转换的两位压缩 BCD码存放于 R2,
转换结果存回 R2。
程序流程图如图 3-1所示 。
编程如下:
START,MOV A,R2
ANL A,#0F0H ;取高位 BCD码
SWAP A
MOV B,#0AH
MVL AB
MOV R3,A
MOV A,R2
ANL A,#0FH ;取低位 BCD码
ADD A,R3
MOV R2,A
END
3.3.5 分支程序设计
【 例 3-9】 求符号函数的值
1 当 X>0
Y= 0 当 X=0 的值 。
-1 当 X<0
编程说明:设变量 X存放在 40H单元中,函数 Y存放在 41H单元中 。 此程序为三分支程序 。
程序流程图如图 3-3所示 。
编程如下:
START,MOV A,40H
JZ COMP
JNB ACC.7,POST
MOV A,#81H ;表示 -1
SJMP COMP
POSI,MOV A,#01H ;表示 +1
COMP,MOV 41H,A
END
【 例 3-10】 求单字节有符号二进制数的补码。
编程如下:
CMPT,MOV A,30H
JNB ACC.7,NCH ; ( A) ≥ 0,不需要转换
MOV C,ACC.7 ;保存符号
MOV 10H,C
CPL A
ADD A,#1
MOV C,10H
MOV ACC.7,C ;恢复符号
NCH,END
图 3-5中,K的最大值一般为 128。
【 例 3-1‰】 用单片机作四则运算 。
编程说明:在单片机系统中,设置 +,-,×,÷
四个运算键,这四个运算键的键值分别为 0,1,2,3
( 键值存放在寄存器 (2中 ),当其中一个按键按下时,
进行相应的运算 。
P1口输入被加数,被减数,被乘数或被除数,以及运算结果的低 8位或商 。
P3口输入加数,减数,乘数或除数,,以及结果的高 8位或余数 。
键号存放在累加器 A中 。
程序流程图如图 3-6所示 。
参考程序如下:
START,MOV P1,#0FFH
MOV P3,#0FFH
MOV DPTR,#TABLE
CLR C
MOV A,R2
SUBB A,#04H
JNC ERROR
ADD A,#0-4H
CLR C
RL A ;正确的散转偏移号,键号 × 2
JMP @A+DPTR
TABLE,AJMP PRG0
AJMP PRG1
AJMP PRG2
AJMP PRG3
ERROR,( 错误处理 )
PRG0,MOV A,P1
ADD A,P3
MOV P1,A
CLR A
ADDC A,#00H ;进位位放入 A中
MOV P3,A
RET
PRG1,MOV A,P1
CLR C
SUBB A,P3
MOV P1,A
CLR A
RLC A ;借位放入 A中
MOV P3,A
RET
PRG2,MOV A,P1
MOV B,P3
MUL AB
MOV P1,A
MOV P3,B
RET
PRG3,MOV A,P1
MOV B,P3
DIV AB
MOV P1,A
MOV P3,B
RET
【 例 3-12】 已知内存单元有 16个二进制无符号数,
分别存放在 30H~ 3FH中,试求它们的累加和,并将其和数存放在 R4,R5中 。
编程说明:存放 16个二进制无符号数的首地址为
30H,此循环程序的循环次数为 16次,和数放在 R4、
R5中。程序流程如图 3-8。
参考程序如下:
START,MOV R0,#30H
MOV R2,#10H
MOV R4,#00H
MOV R5,#00H
LOOP,MOV A,R5
ADD A,@R0
MOV R5,A
MOV A,#00H
ADDC A,R4
MOV R4,A
INC R0
DJNZ R2,LOOP
END
【 例 3-13】 将内部数据存贮器 30H~ 4FH单元中的内容传送至外部数据存贮器 2000H开始的单元中 。
解:编程说明:
内部数据区首址,R0← 30H
外部数据区首址,DPTR← 2000H
循环次数,R2← 32H
程序流程如图 3-9所示 。
参考程序如下:
START,MOV R0,#30H
MOV DPTR,#2000H
MOV R2,#32H
LOOP,MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R2,LOOP
END
【 例 3-14】 试将内部数据存储器中连续存放的 N个数据由小到大进行排列 。
设:数据区首地址存于寄存器 R0中,数据个数 N
存于寄存器 R6中 。 程序流程如图 3-10所示 。
参考程序如下:
MOV 30H,R0
L1,DEC R6
MOV A,R6
MOV R3,A
MOV R2,A
MOV A,R0
MOV R1,A
INC R1
L2,MOV A,@R0
CLR C
SUBB A,@R1
JC L3
MOV A,@R0
XCH A,@R1
MOV @R0,A
L3,INC R1
DJNZ R2,L2
INC R0
DJNZ R3,L1
MOV R0,30H
END
3.3.8 查表程序设计
【 例 3-15】 利用查表的方法编写 Y= X2
(X=0,1,2… 9 )的程序 。
编程说明,设变量 X的值存放在内存 30H单元中,
变量 Y的值存入内存 31H单元 。 先用远查表指令 MOVC
A,@A+DPTR 编写程序 ( 参考程序 1) ;再用近查表指令 MOVC A,@A+PC 编写程序 ( 见参考程序 2) 。
参考程序 1:
ORG 1000H
START,MOV A,30H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV 31H,A
TABLE,DB 0,1,4,9,16
DB 25,36,49,64,81
END
参考程序 2:
ORG 1000H
START,MOV A,30H
ADD A,02H
MOVC A,@A+PC
MOV 31H,A
DB 0,1,4,9,16
DB 25,36,49,64,81
END
【 例 3-16】 将 1位十六进制数,转换成相应 ASCⅡ
码 。 用计算求解和查表求解,进行比较 。
( 1) 计算求解:
编程说明,设待转换的一位十六进制数存放在
40H 单元中,转换后的 ASCⅡ 码仍存放在 40H中 。
编程思路,十六进制数 0~ 9 的 ASCⅡ 为 41H~
46H.,当待转换的数 ≤9时,加 30H,既是其对应的
ASCⅡ 码;当待转换的数 >9时,加 37H。 程序流程如图 3-11所示 。
参考程序如下:
ORG 0100 H
MOV A,40 H
ANL A,# 0F H
CLR C
SUBB A,# 0AH
JC NEXT
ADD A,#0AH
ADD A,#37H
SJMP SAVE
NEXT,ADD A,#0AH
ADD A,#30H
SAVE,MOV 40H,A
END
( 2) 查表求解:
ORG 0100H
MOV A,40H
ANL A,#0FH
ADD A,02H
MOVC A,@A+PC
MOV 40H,A
DB ‘0’,‘1’,‘2’,‘3’,‘4’,‘5’
DB ‘6’,‘7’,‘8’,‘9’,‘A’,‘B’
DB ‘C’,‘D’,‘E’,‘F’
END
3.3.9 子程序设计
1,子程序的调用与返回
MCS-51单片机有两条子程序调用指令,ACALL
addr11,LCALL addr16;一条子程序返回指令 RET。
2,保存与恢复寄存器内容例如,SUB1,PUSH PSW
PUSH A
PUSH R6
∶ (此处省略了子程序的内容 )

POP R6
POP A
PUSH PSW
3,子程序的参数传递主程序在调用子程序时,经常需要传送一些参数,
子程序运行完后也经常将一些参数回送给主程序,这叫参数传递。
【 例 3-17 】 编程计算 c = a2 +b2。
编程说明:这个问题中,计算某数的平方可以用子程序来实现,两次调用该子程序,并求和便得到所需结果。设 a,b 分别存于内部 RAM 的 30H,31H单元,
结果 C存于内部 RAM的 40H单元。
参数传递:主程序中,将某数存放到累加器 A中,
作为子程序的入口参数;子程序中,将所求数的平方值存放在累加器 A中,作为出口参数(即主程序的返回值)。
子程序的入口参数,A中存放某数的值。
子程序的出口参数,A中存放所求数的平方。
子程序如下:
SQR,INC A
MOVC A,@A+PC ;查平方表
RET
TABLE,DB 0,1,4,9,16
DB 25,36,49,64,81
主程序流程图如图 3-12 所示。
主程序如下:
START,MOV A,30H
ACALL SQR ;调查表子程序
MOV R1,A ; a2暂存 R1中
MOV A,31H
ACALL SQR ;调查表子程序
ADD A,R1
MOV 40H,A
END
4,子程序的嵌套
3.4 MCS-51汇编语言实用程序设计
(略 )