配色: 字号:
第2章 MCS-51系列单片机指令系统
2022-11-05 | 阅:  转:  |  分享 
  
单片机原理与应用(第3版)电子工业出版社第2章 MCS-51系列单片机指令系统 内容提要及学习要求1.MCS
-51系列单片机指令系统基础,汇编语言格式、常用符号,汇编语言对寄存器和标志位的影响,寻址方式等。2.为了读者以后能熟练掌握和使用
指令编程,本章把MCS-51系列单片机的111条指令按功能分为五大类:数据传送、算术运算、逻辑运算、控制转移和布尔指令。对这些指令
逐条分类讲解,并举例说明各条指令的使用方法。3.一台单片机,如果只有硬件,没有任何软件是不能工作的。配上了各种软件,单片机才能发挥
其运算和控制功能。单片机通过运行程序才能完成相应的任务,程序中最基础的部分是单片机的指令。在本章练习中给出了简单的程序,望大家能学
会用程序来指挥存储器、寄存器、安排I/O口,完成单片机的控制任务。2.1 单片机指令系统基础 2.
1.1 指令的概念1.机器码指令与汇编语言指令(1)机器码指令。(2)汇编语言指令。2.汇编语言指令格式指令格式是指令的书面表达
形式,汇编语言指令格式为:[标号:]操作码 [目的操作数,][源操作数][;注释]例如,LOOP:MOV A,#3AH ;A←
#3AH 3.指令系统 2.1 单片机指令系统基础 2.1.2 51单片机指令系统说明1.常用符
号在MCS-51汇编语言指令系统中,规定了一些对指令格式描述的常用符号。现将这些符号的标记和含义说明见教材。2.指令对标志位的影响
MCS-51指令系统中有些指令的执行结果要影响PSW中的标志位,现将影响标志位的指令示例如表2.1所示。2.1 单片机指令系统基
础 2.1.3 51单片机寻址方式1.立即寻址(#data)2.寄存器寻址(Rn)3.间接寻址(@
Ri/@DPTR)4.直接寻址 (1)内部数据存储器的128个字节单元(内部数据存储器地址00H~7FH)(2)位地址空间(有些书
把这种寻址方式单独作为一种寻址方式(3)特殊功能寄存器,特殊功能寄存器只能用直接寻址方式进行访问。5.基址加变址寻址(@A+PC/
@A+DPTR)(1)以程序计数器的值为基址(2)以数据指针DPTR为基址,以数据指针内容和累加器的内容相加形成地址6.相对寻址(
rel)7.特定寄存器寻址2.2 数据传送类指令 2.2.1 片内数据传送指令1.内部RAM数据传
送(1)一般数据传送指令。指令:MOV ;dest表示目的操作数字节,src为源操作数。功能:字节变
量传送。2.2 数据传送类指令 (1)一般数据传送指令。【例2.1】 内部数据传送指令练习。MOV
3EH,#3FH ;数@3FH传送入3EH地址单元中MOV 3DH,A ;A的内容传送入3DH单元中MOV 3B
H,@R1 ;@R1的内容作地址单元的内容送到3BH单元中 MOV 3CH,R4 ;寄存器R4的内容传送入3CH单元中
MOV 39H,3AH ;3AH单元内容送到39H单元中MOV A,3FH ;3FH单元的内容送到A寄存器中MOV
PSW,#08H ;定义工作寄存器区1, ;RS0=1、RS1=0,PSW为直接地址MOV 30H,#32H ;
立即数32H送到30H存储器地址单元中MOV R7,3FH ;3FH单元的内容送到指定的R7寄存器中MOV R0,#30
H ;立即数30H送到指定的R0寄存器中, ;下面R0的内容为30HMOV 40H,@R0 ;@R0间接寻址的3
0H单元的内容 ;送到直接地址40H单元中MOV @R0,#20H ;立即数20H送到30H单元中,因@R0的内容为3
0HMOV @R0,20H ;20H单元内容送到地址30H单元中, ;@R0的内容为30H 2.2 数据传送类指令
(1)一般数据传送指令。【例2.2】 设内部RAM30H单元内容为40H,40H单元的值为10H,P1
口作为输入口,其输入的数据为0CAH,试判断下列程序连续执行的结果。机器码 指 令 注
释7830H MOV R0,#30H ;数30H送到R0中E6H MOV A,@R0
;地址单元30H中的内容40H送到A中F9H MOV R1,A ;A的内容40H送到
寄存器R1中87F0H MOV B @R1 ;地址40H的内容10H送到B寄存器中A790H
MOV @R1,P1 ;P1口的内容0CAH送到地址40H中85A090H MOV P2,P1
;P1口锁存器内容0CAH送到P2中执行结果:(R0)=30H,(A)=(R1)=40H,(B)=10H, (40H)=0
CAH,(P2)=0CAH 2.2 数据传送类指令 2.栈操作指令【例2.3】 设堆栈指针SP的内
容为09H,数据指针DPTR的内容为0123H,试分析下列指令的执行结果:PUSH DPLPUSH DPH执行第一条指令:(S
P)+1=0AH→(SP);(DPL)=23H→(0AH)把23H压入堆栈0AH中。执行第二条指令:(SP)+1=0BH→(SP)
;(DPH)=01H→(0BH)把01H压入堆栈0BH中。执行结果为:(0AH)=23H,(0BH)=01H,(SP)=0BH堆栈
指针SP的内容为0BH。 2.2 数据传送类指令 2.栈操作指令【例2.4】 设(SP)=32H,
单片机内部RAM的31H,32H单元中的内容分别为23H,01H,试分析下列指令的执行结果:POP DPH ;((SP))=(3
2H)=01H→DPH/(SP)-1=31H→SPPOP DPL ;((SP)) =(31H)=23H→DPL/(SP)-1=3
0H→SP执行结果为(DPTR)=0123H,(SP)=30H。2.2 数据传送类指令 3.数据交换
指令【例2.5】 设R0寄存器内容为20H,累加器A的内容为3FH,内部RAM的20H单元内容为75H,若执行指令:XCH A
, @R0则结果为:(20H)=3FH,(A)=75H。【例2.6】 设R0内容为20H,累加器内容为36H,内部RAM的20
H单元内容为75H,若执行以下指令:XCHD A,@R0其结果为:(20H)=01110110B=76H2.2 数据传送类指令
2.2.2 片外数据传送指令1.外部RAM数据传送【例2.7】 设工作寄存器R0的内容为21H,
R1的内容为43H,(P2)=40H,外部RAM4043H单元内容为65H,执行下列指令:MOVX A,@R1 ;数65H送到A
中 ;(以R1寄存器间接寻址的4043H单元内容65H送到A中)MOVX @R0,A ;(21H)←数65H,数65H送到外
部RAM的4021H单元中结果为把65H送入累加器A和外部RAM的4021H单元中。【例2.8】 某单片机系统配有2KB的外部R
AM,试设计一程序把第250(0FAH)单元内容传送到04FFH单元。MOV P2, #00H ;确定地址00FAH
高8位MOV R0,#0FAH ;置地址指针,当数据高位是字母时前面加0标识MOVX A,@R0
;读片外数据存储器地址0FAH单元内容到AMOV DPTR,#04FFH ;置数据指针MOVX @DPTR,A
;将累计器中内容写入 ;片外数据存储器04FFH地址单元中 2.2 数据传送类指令 2.
查表指令MOVC A,@ A+PCMOVC A,@A+DPTR 功能:采用变址寻址的字节代码传送,执行读程序存储器操作。2.3
算术运算类指令 2.3.1 加法指令1.加法ADD【例2.9】 设A的内容为十六进制数98H,
R0的内容为十六进制数56H,地址单元56H的内容为十六进制数0B9H,不考虑上下指令的关系。ADD A,R0 ;9
8H+56H=0 EEH,结果A的内容为0EEH, ;进位Cy和AC都为0ADD A,@R0 ;98H+0B
9H=1 51H,结果A的内容为51H, ;进位Cy和AC都为1ADD A,56H ;98H+0B9H=1
51H,结果A的内容为51H, ;进位Cy和AC都为1ADD A,#5CH ;98H+5CH=0 F4H,结果
A的内容为0F4H, ;进位Cy为0,AC为12.3 算术运算类指令 2.3.1 加法指
令2.带进位加法ADDC【例2.10】 设(A)=0C3H,(R0)=0AAH,当(C)=1时,执行指令;ADDC A,R0
(A) 11000011 ;看成带符号数为-3DH(100H- ;0C3H),此为补码运算 (R0)10
101010 ;看成带符号数为-56H(-56H =00H- ;56H =0AAH)+ (C)
1 ;低位送来的进位为1或C的内容为1 1 01101110 ;规定带符号数的最高位不是数1,
;而是符号“负”结果为:(C)=1,(OV)=1,(A)=6EH或看成带符号数运算?3DH+(?56H)+1= ? 9
2H2.3 算术运算类指令 2.3.1 加法指令1.加法ADD【例2.11】 当把单片机中的数看
成是带符号数时,最高位可看成符号位,因而只有7位有效数字。单片机本来进行的是十六进制无符号数运算,但可根据标志位的变化处理成带符号
数运算。设累加器中有无符号数40H(64),执行指令:ADD A,#7FH,结果和数为191,大于127,产生溢出。0100 00
00+0111 1111=0 1011 1111 2.3 算术运算类指令 2.3.1 加法指令3.
加1指令INC INC A ;A的内容加1INC R1 ;R1的内容加1INC @
R1 ;R1的内容为地址单元的内容加1INC 32H ;内部RAM32H地址单元的内容加1【例2.1
2】 设(R0)=7EH,(7EH)=0FFH (7FH)=40H, 执行下列指令:INC @R0 ;0FFH+1=0
0H→(7EH)INC R0 ;7EH+1=7FH→(R0)INC @ R0 ;40H+1=41H→(7FH)结果为:
(R0)=7FH,(7EH)=00H,(7FH)=41H2.3 算术运算类指令 2.3.1 加法指
令4.指令 INC DPTR功能:把16位数据指针内容加1。执行16位无符号数加法,即先对数据指针的低8位DPL内容加1,当有溢
出时,再把DPH内容加1,不影响任何标志。这是唯一的16位寄存器加1指令。 2.3 算术运算类指令
2.3.2 十进制调整指令功能:对累加器A中的BCD码加法运算后的结果进行二-十进行调整。【例2.14】 设累加器A的内容为5
6H,它表示十进制数56的压缩的BCD码数,寄存器R3的内容为67H,表示十进制数67的压缩的BCD码数,进位标志为1,注:运算前
参入运算的是十进制数56和67,采用十六进制运算,执行下列指令:ADDC A,R3 ;56H+67H=0BEH,十
六进制运算DA A ;0BEH+66H=124H,其中A的内容为24,进位为1 2.3 算术运算类
指令 2.3.2 十进制调整指令【例2.15】 设累加器A中有十进制数30H(即30),因为单片机
中只有十六进制加法,所以把十进制数30看成十六进制数30H参入运算,执行下列指令:ADD A,#99HDA A执行情况如下:
00110000 30 BCD码 ;BCD(十进制数)+ 10011001 99 BCD码 ;99也为
十进制数 11001001 ;使用十六进制加法+ 01100000 60 H调整值
;修正值为60H 100101001 129 BCD码 ;得到十进制数29在A中,进位1在C中 结果为
(A)=29H,进位“1”丢失,相当于进行“30-1=29,从而实现了对累加器中的十进制数减1操作。 2.3 算术运算类指令
2.3.3 减法指令1.带借位减指令 SUBB A,功能:带借位减法,A=A- >-C【例2.16】 设(A)=0C9H,(R2)=54H,(C)=1,执行指令:SUBB A,R2 ;0C
9H-54H?1=74H结果为:(A)=74H,(C)=0,(OV)=1。2.减1指令 DEC 【例2.17】 设
(R0)=7FH,在内部RAM中:(7EH)=00H,(7FH)=40H,执行下列指令:DEC @ R0 ;(7FH
)-1=40H-1=3FH→(7FH)DEC R0 ;(R0)-1=7FH-1=7EH→(R0)DEC @ R
0 ;(7EH)-1=00H-1=0FFH→(7EH)DEC 7EH ;(7EH)-1=0FFH-1=0F
EH→(7EH)结果为:(R0)=7EH,(7EH)=0FEH,(7FH)=3FH,当最高位数据为字母时,前面加0作数据标识符,实
际这三个数还是指8位二进制数。2.3 算术运算类指令 2.3.4 乘法和除法指令1.乘法指令 M
UL AB功能:8位二进制数乘法。【例2.18】 设(A)=50H(80,为十进制数),(B)=0A0H(160),执行如下指令
: MUL AB结果为:(A)×(B)=3200H(十进制数为12800),(B)=32H,(A)=00H,(OV)=1,(C)
=0,B中存放结果的高8位,A中存放结果的低8位。2.除法指令 DIV AB功能:8位二进制数除法。【例2.19】 设(A)=
0FBH(251),(B)=12H(18),执行指令: DIV AB结果为:(A)=0DH(商为十进制数13),(B)=11H(
余数为17), (OV)=0,(C)=02.4 逻辑运算及移位指令 2.4.1 累加器的逻辑操作
指令1.清零指令:CLR A功能:累加器A内容清为0(每一位都置位0),不影响标志位。【例2.20】 设(A)=31H,执行指
令:CLR A结果为:(A)=00H2.取反指令:CPL A功能:累加器内容每一位取反,即原来是1变为0,原来是0变为1,不影
响标志位。【例2.21】 设(A)=5CH(0101 1100B),执行指令:CPL A结果为:(A)=0A3H(1010 0
011B) 2.4 逻辑运算及移位指令 3.左循环移位指令: RL A和指令:RLC A指令:
RL A功能:RL指令使累加器中的内容逐位向左循环移动一位,D7循环移入D0的位置,不影响标志位。【例2.22】 设(A)=0
C5H(11000101B),(C)=0若执行指令:RL A则(A)=8BH(10001011),(C)=0,标志位不受影响。若
执行指令:RLC A则(A)=8AH(10001010B),(C)=1 2.4 逻辑运算及移位指令
4.右循环移位指令:RR A和指令:RRC A功能:RR A指令使累加器中的数据位逐位右移一位,D0位右移入D7位。
RRC A指令使累加器中的数据位连同进位标志逐位右移一位,D0 移入C,C原状态移入D7,不影响其他标志。【例2.23
】 设(A)=0C5H(11000101B),(C)=0若执行指令:RR A则(A)=0E2H(11100010B),(C)=
0若执行指令:RRC A则(A)=62H(01100010B),(C)=12.4 逻辑运算及移位指令
【例2.24】 设有16位二进制数存放在8031单片机内部RAM的50H及51H单元中,要求将其算术左移一位(即原数各位均向
左移1位,最低位移入0)后仍存放在原单元。试编制相应的程序。(5672H=01010110 01110010→10101100 1
1100100=ACE4H) 2.4 逻辑运算及移位指令 程序如下:程序地址 机器码
汇编程序 4000 ORG 4000H4000 C3 BIHROL:CLR
C ;C清零4001 E551 MOV A,51H ;低8位左循环移一位4003
33 RLC A4004 F551 MOV 51H,A4006
E550 MOV A,50H,;高8位左循环移一位4008 33
RLC A4009 F550 MOV 50H,A400B
END2.4 逻辑运算及移位指令 2.4.2 逻辑运算指令1.逻辑与指令:ANL
【例2.25】 设累加器内容为0C3H,寄存器R0的内容为:0AAH,执行指令: ANL A,R0
(A) 11000011 ANL (R0)
10101010 (A) 10000010结果:(A)=82H。【例2.
26】 欲修改P1口输出内容(原内容为35H),使其高4位输出为0,低4位保持不变,可执行指令:ANL P1 #0FH,结果P1
口内容变为05H(屏蔽掉高4位“3”或0011,低4位保持“5”不变)。2.4 逻辑运算及移位指令
2.逻辑或指令 ORL功能:字节变量的逻辑或。【例2.27】 设(A)=0F0H,(R0)=0FH
执行指令:ORL A,R0结果:(A)=0FFH【例2.28】 试将累加器A中的低3位内容传送到P1口,并保持P1口高5位的数据
不变。ANL A,#07H ;屏蔽A中的高5位ANL P1,#0F8H ;保持P1口的
高5位ORL P1,A ;A中的低3位和P1口的高5位数据组合2.4 逻辑运算及移位指令3.逻辑
异或指令:XRL功能:字节变量的逻辑异或。【例2.29】 执行指令:XRL P1, #0011
0001B结果:P1.5、P1.4、P1.0的输出取反,其他位不变。【例2.30】 试分析下列程序执行结果。MOV A,#0F
FH ;(A)=0FFHANL P1,#00H ;P1口清零ORL P1,#55H ;P1口内容为55H
XRL P1,A ;P1口的内容为0AAH,P1口的所有位都被取反 2.5 控制转移指令2.5.1 无条件转移
指令(1)指令:LJMP addr16功能:长距离无条件转移指令。L表示英文长,JMP表示转移、跳转。【例2.31】 设PC当
前值为0123H,试分析执行在此地址处的指令LJMP3456H的过程。其执行过程是:在PC的当前地址0123H,开始到0125H的
连续3个单元存放指令的操作码和操作数,存放顺序是:程序地址0123H中放操作码(02)、程序地址0124H中放高字节(34H)、程
序地址0125H放低字节(56H)。指令执行时,将转移目的地址34H、56H分别装入PCH和PCL,即转移到程序地址(3456H)
处开始执行下一指令序列。2.5 控制转移指令(2)指令 AJMP addr11功能:在2K字节存储区域的转移,称为绝对转移。【
例2.32】 试分析下列转移指令是否正确。地 址 指 令389AH
AJMP 3ABCH 37FEH AJMP 3DEFH3456H
AJMP 3BCDH第一条:(PC)+2=389CH,与转移地址3ABCH的高5位均为00111B,它们在同一个2KB区域内,转
移正确。第二条:(PC)+2=3800H,与转移地址3DEFH的高5位均为00111,在同一个2KB内,转移正确。同理可以看出第三
条指令是不正确的。3458H高5位为00110,3BCD高5位为00111。【例2.33】 试确定指令AJMP 2A23H的机
器代码。将转移地址的a10~8(010)与00001拼装成操作码第1字节41H,转移地址的a7~0为第2字节23H,故该指令的机器
码为4123H。因目的地址为2A23H(0010 1010 0010 0011),本指令机器码为4123H(0100 0001 0
010 0011),注:画线部分为低11位目的地址。 2.5 控制转移指令(3)指令:SJMP rel功能:短距离无条件转移,
相对转移。【例2.34】 设PC现行地址为0101H,标号ADR代表地址0123,执行指令:SJMP ADR。结果为:程序转向
0123H单元,计算出相对偏移量的值为:rel=0123H?(0101H+2)=20H,将rel值填入指令码第2字节,该指令的机器
码为8020。【例2.35】 设rel=(0FEH)为补码表示的数,其实际值为-2,JADR代表任一地址,执行指令:JADR:S
JMP JADR机器码为80FE,即rel=JADR-(JADR+2)=(0FEH),结果:程序在原处无限循环。执行完这条指令后
本应执行下一条指令,但它向后跳动两个字节,实际上又回来执行这条指令。 2.5 控制转移指令(4)指令:JMP @A+DPTR功
能:间接转移。【例2.36】 设按键的值在累加器A中(键值为00H,01H,02H,…),要求按不同的按键时执行不同的程序,试编
制按键值处理的键盘处理程序,当键值为00H时,转移到KYE0、键值为01H时,转移到KYE1去处理程序等。程序为:MOV DPTR
,#DYEG ;散转表入口地址4100H送到DPTRMOV B,#03H ;LJMP指令长度是3字节,计算指令间隔
MUL AB ;扩展子程序地址表的间隔(00、01、02)→(00、03、06)JMP @A+DPTR
;跳转到相应程序入口地址(4100H、4103H、4106H) … ;省略的程序4100H 024320
  DYEG: LJMP KYE0 ;散转子程序入口地址4103H 024536     LJMP
KYE1 ;每条指令占据3个字节程序地址4106H 024632     LJMP KYE2 ;占据
4106H~4108H三个字节程序地址4009H … ;省略的程
序2.5 控制转移指令2.5.2 调用指令1.指令:LCALL addr16 功能:长距离调用,CALL有呼叫的意思。 【例2
.37】 设堆栈指针初始化为07H,程序地址指针PC当前值为2100H,子程序首地址为3456H,试分析如下指令的执行过程:LC
ALL 3456H获得返回地址PC+3=2103:把返回地址压入堆栈区08H和09H单元;PC指向子程序首址3456H处开始执行
。执行完成子程序后,回来执行地址2103H处的指令。执行该指令的结果为:(SP)=09H,(08H)=03H,(09H)=21H,
(PC)=3456H。2.5 控制转移指令2.指令:ACALL addr11功能:2KB存储区域内的绝对调用。3.指令RET和指
令RETI功能:RET为子程序返回指令。RETI为中断子程序返回指令。【例2.38】 设堆栈指针内容为0BH,内部RAM中的(0
AH)=23H,(0BH)=01H,执行指令:RET结果为:(SP)=09H,(PC)=0123H(返回主程序地址)。2.5 控
制转移指令4.空操作指令:NOP功能:不执行任何操作,仅使PC加1,继续执行下一条指令。除PC外,不影响其他寄存器和标志位。【例2
.39】 试设计程序,从P2.7输出持续时间为5个机器周期的低电平脉冲。因为简单的SETB/CLR指令序列可产生一个机器周期的脉
冲,故须加入4个额外的周期。其程序为:CLR P2.7 ;将P2.7清零,输出低电平NOP ;每个
空操作延时一个周期NOPNOPNOPSETB P2.7 ;将P2.7置1,高电平结束 2.5 控制转移指令2.5.3
条件转移指令1.判零转移指令指令:JZ rel指令:JNZ rel功能:JZ指令为判零转移。如果累加器A的每一位为0,则转
向指定的地址;否则顺序执行下一条指令。J表示“转移”,Z表示“0”,N表示“不”,即A为0转移。2.5 控制转移指令【例2.40
】 将外部RAM的一个数据块(首址为DATA1)传送到内部数据RAM(首址为DATA2),遇到传送的数据为零时停止。子程序:ST
ART:MOV R0,#DATA2 ;置内部RAM数据指针 MOV DPTR,#DATA1 ;
置外部RAM数据指针LOOP1:MOVX ?A,@DPTR ;将外部RAM单元内容送到A JZ
LOOP2 ;判传送数据是否为零, ;为零则转移到结束处 MOV @R0,A
;当传送数据不为零时, ;将数送内部RAM INC R0 ;修改内部
RAM地址指针 INC DPTR ;指向外部RAM下一数据地址 SJMP
LOOP1 ;继续传送 LOOP2:RET ;结束传送,返回主程序2.5 控
制转移指令2.比较转移指令:CJNE ,rel功能:比较两个字节变量的值,如果不相等,则转移。【例2
.41】 当P1口输入数据为55H时,程序继续执行下去,否则等待,直至P1口出现55H。程序为: MOV P1,
#0FFH MOV A,#55H WATT: CJNE A,P1,WATT …2.5 控制转
移指令3.循环转移指令:DJNZ ,rel功能:字节减1不等于零循环转移。【例2.42】 将8031内部RAM的
40H~4FH单元置初值为A0H~AFH。程序为:START:MOV R0,#40H ;R0赋值,指向数据单元
MOV R2,#10H ;R2赋值,为传送字节数,十六进制数 MOV A,#0A0H ;给A赋值LO
OP: MOV @ R0,A ;开始传送 INC R0 ;修改地址指针,准备传下一数地址
INC A ;修改传送数据值 DJNZ R2,LOOP ;如果未传送完,则继
续循环传送 RET ;当R2的值减为0时,则传送结束2.5 控制转移指令3.循环转移指令:
DJNZ ,rel功能:字节减1不等于零循环转移。【例2.42】 将8031内部RAM的40H~4FH单元置初值
为A0H~AFH。程序为:START:MOV R0,#40H ;R0赋值,指向数据单元 MOV R2,#10
H ;R2赋值,为传送字节数,十六进制数 MOV A,#0A0H ;给A赋值LOOP: MOV @ R
0,A ;开始传送 INC R0 ;修改地址指针,准备传下一数地址 INC
A ;修改传送数据值 DJNZ R2,LOOP ;如果未传送完,则继续循环传送
RET ;当R2的值减为0时,则传送结束2.6 布尔变量操作指令2.6.1 位传送指令指令:MOV
<目的位>,<源位>功能:把第二操作数指定的位变量的值送到第一操作数指定的位单元中。其中一个操作数必须是进位标志C,另一个可以是任
何直接寻址位。不影响任何其他寄存器和标志位,本操作指令只有两条,MOV C,bit和MOV bit,C【例2.43】 将位地
址30H的内容送到位地址20H中,这样的传送须通过进位标志C来进行,本处要求设法保留C的值。程序段为:MOV 10H, C
;暂存C的内容MOV C, 30H ;C←(30H)MOV 20H, C ;(20H)←C
MOV C, 10H ;恢复C的值2.6 布尔变量操作指令2.6.2 位状态控制指令1.指令:CLR bit和
CLR C功能:CLR将指定的位清0,它可对进位标志或任何直接寻址位进行操作,不影响其他标志位。2.指令: SETB bit和
SETB C功能:将指定的位置1,它对进位标志或任何直接寻址位进行操作,不影响其他标志位。【例2.44】 设P1口原来的数据为
00001111B,执行下列程序:CLR C ;C清0MOV P1.0,C ;P1.0位
清0SETB C ;C置位结果使P1的内容变为0000 1110B。 2.6 布尔变量操作指令3.指令:
CPL bit和CPL C功能:将指定的位取反,即位的内容原来为1则变为0,原来为0则变为1。它也能对进位标志或任何直接寻址位
进行操作,不影响其他标志位。【例2.45】 编程通过P1.0 端口线连续输出256个宽度为5个机器周期长的方波。每次循环占时5个
机器周期,输出电平也发生变化。其程序为: MOV R0,#00H ;置循环计数器初值,共256次循环 C
LR P1.0 ;P1.0清零LOOP: CPL P1.0 ;P1.0取反,并延时1个机器周期,
;形成方波 NOP ;空操作延时1个机器周期 NOP
;空操作延时1个机器周期 DJNZ R0,LOOP ;判断是否到循环256次, ;并延时
两个机器周期 2.6 布尔变量操作指令2.6.3 位逻辑操作指令1.指令: ANL C,<源位>功能:位变量逻辑与。【例2.
46】 当P1.0=1,ACC.7=1,且OV=0时,执行下列程序:MOV C,P1.0 ;C置1ANL
C,ACC.7 ;C值不变,仍为1ANL C,/OV ;C值还是为1结果使C置位。2.6 布尔变
量操作指令2.指令:ORL C,<源位>功能:位变量逻辑或。图2.4 例2.47的逻辑图【例2.47】 试用软件实现如图2.
4所示的P1端口P1.0~P1.3之间的逻辑运算。程序如下: MOV C,P1.1 ;(C)←(P1
.1) ORL C,P1.2 ;(C)←(P1.1)∨(P1.2) ANL
C,P1.0 ;(C)←[(P1.1)∨(P1.2)]∧(P1.0) MOV P1.3, C
;(P1.3)←(C)【例2.48】 设M,N,K都代表位地址,试编写程序完成M,N内容的异或操作,结果存于K,即K=·N
+M·,程序如下:MOV C, N ;C←NANL C, /M ;C←·NMOV K, C
;K←C(暂存K位中)MOV C, M ;C←MANL C, /N ;C←M∧ ORL C, K
;C←·N+M· MOV K, C ;K←C2.6 布尔变量操作指令2.指令:ORL C,<源位>
功能:位变量逻辑或。图2.4 例2.47的逻辑图【例2.47】 试用软件实现如图2.4所示的P1端口P1.0~P1.3之间的逻
辑运算。程序如下: MOV C,P1.1 ;(C)←(P1.1) ORL C
,P1.2 ;(C)←(P1.1)∨(P1.2) ANL C,P1.0 ;(C)←[(
P1.1)∨(P1.2)]∧(P1.0) MOV P1.3, C ;(P1.3)←(C)【例2.48】
设M,N,K都代表位地址,试编写程序完成M,N内容的异或操作,结果存于K,即K=·N+M·,程序如下:MOV C, N
;C←NANL C, /M ;C←·NMOV K, C ;K←C(暂存K位中)MOV C, M
;C←MANL C, /N ;C←M∧ ORL C, K ;C←·N+M· MOV
K, C ;K←C2.6 布尔变量操作指令2.6.4 位条件转移指令布尔条件转移指令有5条,分别对布尔变量C(PS
W中的进位标志)和直接寻址位进行测试,并根据其状态执行转移。1.判布尔累加器C的值转移指令:JC rel ;
C的内容为1转移 指令:JNC rel ;C的内容为0转移功能:JC判进位标志C的值为1转移;JNC判进位
标志为0转移(可理解为不为1转移),否则顺序执行下一条指令。程序转移的地址为当前PC值加2(本指令为2字节),再加上rel的值(r
el在指令码第2节中),不影响任何标志。位累加器C表示进位标志内容。其操作过程是:(PC)←(PC)+2,如果 C=1(或C=0)
,则(PC)←(PC)+rel。 2.6 布尔变量操作指令【例2.49】 比较内部RAM的30H和40H单元中的两个无符号数的
大小,将大数存入20H单元,小数存入21H单元,若两数相等则使内部RAM可寻址位75H置1。程序为:START: MOV A,30
H ;A←(30H) CJNE A,40H,LOOP1 ;(30H)=(40H)?不等则转移到LOOP
1 SETB 75H ;相等,使75H位置1 RET
;返回LOOP1: JC LOOP2 ;若(30H)小于(40H),则转移LOOP2 MOV 2
0H,A ;当(30H)大于(40H)时(20H)←(30H) MOV 21H,40H ;(2
1H)←(40H),(40H)中为较小数 RETLOOP2: MOV 20H,40H ;较大数(40H)存2
0H单元 MOV 21H,A ;较小数(30H)存21H单元 RET
;返回2.6 布尔变量操作指令2.判位变量转移指令【例2.50】 试判断累加器中数的正负,若为正数,存入20H单元;
若为负数则存入21H单元。程序1如下:START: JB ACC.7,LOOP ;累加器符号为1,转至LOOP
MOV 20H ,A ;否则为正数,存入20H单元 RET ;返回LOOP: MOV
21H,A ;负数存入21H单元 RET ;返回同一个问题可用不同的编程方法
完成任务,如程序2所示:START: MOV R0,A ;累加器的值送R0 ANL A,#8
0H ;保留符号位的值 JNZ LOOP1 ;符号位不为零,则为负数LOOP:
MOV 20H,R0 ;符号位为零,则为正数存20H SJMP LOOP2LOOP1:MOV 2
1H ,R0 ;存负数LOOP2:RET2.6 布尔变量操作指令【例2.51】 多字节无符号数减法,R0作为被减数地址指针,R1作为减数地址指针,R3记录字节数,从低位开始减,结果存于R0指示的地址中,当C=0,结果为正;C=1,结果为负(补码)。程序如下:START: CLR 07H ;设正负数标志 MOV A,R0 ;保存地址指针到R2 MOV R2,A MOV A,R3 ;保存字节数于R7 MOV R7,A CLR C ;先清借位标志CyLOP0: MOV A,@R0 ;相减 SUBB A,@R1 MOV @R0,A INC R0 ;指向下一字节 INC R1 DJNZ R7,LOP0 ;所有字节没减完转LOP0 JNC LOP1 ;减完则设置正负标志 SETB 07HLOP1: MOV A,R2 ;恢复首地址于R0 MOV R0,A RET2.7 指令部分学习方法小结 1.助记符号的记忆方法(1)表格列举法(2)英文还原法(3)功能模块记忆法2.指令的记忆方法(1)指令操作数的有关符号(2)指令图示记忆法(3)相似功能归类法(4)口诀记忆法。2.8 理实一体化教学 2.8.1 数据传送练习 2.8 理实一体化教学 2.8.1 数据传送练习 2.8 理实一体化教学 2.8.2 单片机发光二极管显示电路应用2.8 理实一体化教学 2.8.3 单片机数码管显示电路应用2.8 理实一体化教学 2.8.3 单片机数码管显示电路应用2.8 理实一体化教学 2.8.3 单片机数码管显示电路应用2.8 理实一体化教学 2.8.4 单片机按键输入和二极管输出电路应用本 章 小 结本章主要介绍了以下内容:1.本章介绍单片机的指令系统、寻址方式。51系列单片机有111条指令,这里分为数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令、位操作类指令,并逐条分类讲解,还通过举例说明各条指令的使用方法。2.本章还介绍了指令的有关规定,指令的格式和使用方法,指出了记忆指令的部分方法,用到了指令的编程方法。通过指令编程用到单片机各部分资源,完成单片机的实时控制任务,初步介绍了指令的使用方法。本章的目的是理解和记忆指令,并掌握指令的基本使用方法,使用指令编程是下一个阶段的重点。
献花(0)
+1
(本文系籽油荃面原创)