Transcript Document

第3章 单片机汇编程序设计
第3章
单片机汇编程序设计
3.1 MCS-51系列单片机汇编指令格式及标识
指令是使计算机完成基本操作的命令。一种计算机
能够执行的全部指令的集合,称为这种计算机的指令系
统。单片机的指令系统与微型计算机的指令系统不同,
MCS-51系列单片机指令系统共有:
111条指令;42种指令助记符。
49条1字节指令;
45条2字节指令;
17条3字节指令。
64条为1机器周期指令;
45条为2机器周期指令;
2条为4机器周期指令(乘、除法)。
这些指令在存储空间和运算速度上,效率都比较高。
第3章 单片机汇编程序设计
MCS-51系列单片机指令系统功能强、
指令短、执行快。
从功能上可分成五大类:
 1、数据传送指令;
 2、算术运算指令;
 3、逻辑操作指令;
 4、控制转移指令;
 5、位操作指令。
第3章 单片机汇编程序设计
3.1.1 指令格式
[标号:] 操作码助记符 [目的操作数][,源操作数] [;注释]
(1)操作码助记符表明指令的功能,不同的指令有不同的指
令助记符,它一般用说明其功能的英文单词的缩写形式表示。
(2)操作数用于给指令的操作提供数据、数据的地址或指令
的地址,操作数往往用相应的寻址方式指明。MCS-51单片机
指令系统的指令按操作数的多少可分为无操作数、单操作数、
双操作数和三操作数四种情况。
(3)标号是该指令的符号地址,后面须带冒号。它主要为转
移指令提供转移的目的地址。
(4)注释是对该指令的解释,前面须带分号。它们是编程
者根据需要加上去的,用于对指令进行说明,对于指令本身
功能而言是可以不要的。
第3章 单片机汇编程序设计
3.1.2 指令中用到的标识符
为便于后面的学习,在这里先对指令中用到的一些符号的约
定意义作以下说明:
(1)Ri和Rn:表示当前工作寄存器区中的工作寄存器。
i取0或1,表示R0或R1。n取0~7,表示R0~R7。
(2)#data:表示包含在指令中的8位立即数。
(3)#data16:表示包含在指令中的16位立即数。
(4)rel:以补码形式表示的8位相对偏移量,范围为-128~+127,
主要用在相对寻址的指令中。
(5)addr16和addr11:分别表示16位直接地址和11位直接地址。
(6)direct:表示直接寻址的地址。
(7)bit:表示可位寻址的直接位地址。
(8)(X):表示X单元中的内容。
(9)((X)):表示以X单元的内容为地址的存储器单元内容,即(X)
作地址,该地址单元的内容用((X))表示。
(10)/ 和→符号:“/”表示对该位操作数取反,但不影响该位的
原值。“→”表示操作流程,将箭尾一方的内容送入箭头所指一方的
单元中去。
第3章 单片机汇编程序设计
3.2 MCS-51系列单片机寻址方式
MCS-51单片机的寻址方式按操作数的类型,可分为:
 ①数的寻址;
 ②指令寻址。
①数的寻址有:
常数寻址(立即寻址);
寄存器数寻址(寄存器寻址);
存储器数寻址:
直接寻址方式;
寄存器间接寻址方式;
变址寻址方式。
位寻址。
②指令的寻址有:
绝对寻址;
相对寻址。
第3章 单片机汇编程序设计
3.2.1 常数寻址(立即寻址)
操作数是常数,使用时直接出现在指令中,紧跟在
操作码的后面,作为指令的一部分。与操作码一起存放
在程序存储器中,可以立即得到并执行,不需要经过别
的途径去寻找。常数又称为立即数,故又称为立即寻址。
在汇编指令中,立即数前面以“#”符号作前缀。在程序
中通常用于给寄存器或存储器单元赋初值,例如:
MOV A,#20H
其功能是把立即数20H送给累加器A,其中源操作数
20H就是立即数。指令执行后累加器A中的内容为20H。
第3章 单片机汇编程序设计
3.2.2 寄存器数寻址(寄存器寻址)
操作数在寄存器中,使用时在指令中直接提供寄存器的
名称,这种寻址方式称为寄存器寻址。在MCS-51系统中,这
种寻址方式针对的寄存器只能是R0~R7 8个通用寄存器和部
分特殊功能寄存器(如累加器A、寄存器B、数据指针DPTR
等)中的数据,对于其它的特殊功能寄存器中的内容的寻址
方式不属于它。在汇编指令中,寄存器寻址在指令中直接提
供寄存器的名称,如R0、R1、A、DPTR等。例如:
MOV A,R0
其功能是把R0寄存器中的数送给累加器A,在指令中,
源操作数R0为寄存器寻址,传送的对象为R0中的数据。如指
令执行前R0中的内容为20H,则指令执行后累加器A中的内
容为20H。
第3章 单片机汇编程序设计
3.2.3 存储器数寻址
存储器数寻址针对的数据是存放在存储器
单元中,对于存储器单元的内容通过提供存储
器单元地址使用。
根据存储器单元地址的提供方式,存储器
数的寻址方式有:
 1、直接寻址;
 2、寄存器间接寻址;
 3、变址寻址。
第3章 单片机汇编程序设计
1.直接寻址
直接寻址是指数据在存储器单元中,在指令中直接提供存储器单元
的地址。在MCS-51系统中,这种寻址方式针对的是片内数据存储器和
特殊功能寄存器。在汇编指令中,指令中直接以地址数的形式提供存储
器单元的地址。例如:
MOV A,20H
其功能是把片内数据存储器20H单元的内容送给累加器A。如指令
执行前片内数据存储器20H单元的内容为30H,则指令执行后累加器A
的内容为30H。指令中20H是地址数,它是片内数据存储单元的地址。
在MCS-51中,数据前面不加“#”是存储单元地址而不是常数,常数前
面要加符号“#”。
对于特殊功能寄存器,在指令中使用时往往通过特殊功能寄存器
的名称使用,而特殊功能寄存器名称实际上是特殊功能寄存器单元的
符号地址,因此它们是直接寻址。例如:
MOV A,P0
其功能是把P0口的内容送给累加器A。P0是特殊功能寄存器P0口
的符号地址,该指令在翻译成机器码时,P0就转换成直接地址80H。
第3章 单片机汇编程序设计
2.寄存器间接寻址
寄存器间接寻址是指数据存放在存储单元中,而存储单元地址存
放在寄存器中,在指令中通过提供存放存储单元地址的寄存器来使用
对应的存储单元。形式为:@寄存器名。
例如:MOV A,@R1
该指令的功能是将以工作寄存器R1中的内容为地址的片内RAM单
元的数据传送到累加器A中去。指令的源操作数是寄存器间接寻址。
若R1中的内容为
80H,片内RAM地址为
80H的单元中的内容为
20H,则执行该指令后,
累加器A的内容为20H。
R1 80H
80H
A
20H
20H
在MCS-51单片机中,寄存器间接寻址用到的
寄存器只能是通用寄存器R0、R1和数据指针寄存
器DPTR,它能访问的数据是片内数据存储器和片
外数据存储器。其中,片内数据存储器只能用R0
和R1作指针间接访问;片外数据存储器,低端的
256字节单元,既可以用两位十六进制地址以R0或
R1作指针间接访问,也可用四位十六进制地址以
DPTR作指针间接访问,而高端的字节单元则只能
以DPTR作指针间接访问。对于片内RAM和片外
RAM的低端256字节都可以用R0和R1作指针访问,
它们之间用指令来区别。片内RAM访问用MOV指
令,片外RAM访问用MOVX指令。
第3章 单片机汇编程序设计
3.变址寻址
变址寻址是指操作数的地址由基址寄存器的地址加上变址寄存器
的地址得到。在MCS-51系统中,它是以数据指针寄存器DPTR或程序
计数器PC为基址,累加器A为变址,两者相加得存储单元的地址,所
访问的存储器为程序存储器。
例如:MOVC A,@A+DPTR
DPTR
2000H
+
A
05H
A
30H
2005H
30H
其功能是将数据指针
寄存器DPTR的内容和累加
器A中的内容相加作为程序
存储器的地址,从对应的
单元中取出内容送累加器A
中。指令中,源操作数的
寻址方式为变址寻址,设
指令执行前数据指针寄存
器DPTR的值为2000H,累
加器A的值为05H,程序存
储器2005H单元的内容为
30H,则指令执行后,累
加器A中的内容为30H。示
意图如左图所示。
第3章 单片机汇编程序设计
3.2.4 位寻址
位寻址是指操作数是二进制位的寻址方式。在MCS-51
单片机中有一个独立的位处理器,有多条位处理指令,能够
进行各种位运算。在MCS-51系统中,位处理的操作对象是
各种可位寻址位。对于它们的访问是通过提供相应的位地址
来处理。
指令给出位地址。一位数据在存储器位寻址区。
(1)内部RAM低128单元中的位寻址区:
位地址为00H~07FH共128位(字节地址为20H~2FH);
(2)内部RAM高128单元中的专用寄存器的可寻址位:
SFR中11个有位地址寄存器中的83位。
第3章 单片机汇编程序设计
在MCS-51系统中,位地址的表示可以用以下几
种方式:
1.直接使用位地址(00H~07FH+83位)。
例如:PSW的位6可表示为0D6H(位地址)。
2.字节地址带位号。
例如:PSW的位6可表示为0D0H.6;
20H.3表示20H单元的3位。
3.特殊功能寄存器名带位号。
例如: PSW的位6可表示为PSW.6 ;
P0.1表示P0口的1位。
4.位符号地址。
例如: PSW的位6可表示为AC;
TR0是定时/计数器T0的启动位。
第3章 单片机汇编程序设计
例: MOV C,40H
;CY(位地址40H)
设指令执行前 CY=1,位地址40H存储器单元
如图,执行指令后,CY= ?
0
位寻址区
29H
28H
01100010
11010110
第3章 单片机汇编程序设计
3.2.5 指令寻址
一、绝对寻址
绝对寻址是在指令的操作数中直接提供目的位置的
地址或地址的一部分。
在MCS-51系统中:
长转移和长调用提供目的位置的16位地址;
绝对转移和绝对调用提供目的位置的16位地址的低11位。
它们都为绝对寻址。
第3章 单片机汇编程序设计
二、相对寻址
相对寻址是以当前程序计数器PC值加上指令中给出的偏移量
rel得到目的位置的地址。在MCS-51系统中,相对转移指令的操作
数属于相对寻址。
在使用相对寻址时要注意以下两点:
(1)当前PC值是指转移指令执行时的PC值,它等于转移指令
的地址加上转移指令的字节数。实际上是转移指令的下一条指令的
地址。例如:若转移指令的地址为2010H,转移指令的长度为2字
节,则转移指令执行时的PC值为2012H。
(2)偏移量rel是8位有符号数,以补码表示,它的取值范围为
-128~+127。当为负值时,向前转移,当为正数时向后转移。
相对寻址的目的地址为:
--(前)
目的地址=转移指令的地址+转移指令的字节数+rel
=当前PC+rel
PC
+(后)
第3章 单片机汇编程序设计
3.3 MCS-51系列单片机指令系统
3.3.1 数据传送指令
数据传送指令有29条,是指令系统中
数量最多、使用也最频繁的一类指令。
这类指令可分为三组:
 普通传送指令;
 数据交换指令;
 堆栈操作指令。
第3章 单片机汇编程序设计
一、普通传送指令
普通传送指令以助记符MOV为基础。分成片内
数据存储器传送指令、片外数据存储器传送指令和
程序存储器传送指令。
1.片内数据存储器传送指令MOV
指令格式:MOV 目的操作数,源操作数
其中:源操作数可以为A、Rn、@Ri、direct、
#data,目的操作数可以为A、Rn、@Ri、direct,
组合起来总共16条。
第3章 单片机汇编程序设计
按目的操作数的寻址方式划分为五组:
(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)以直接地址direct为目的操作数
MOV direct,A
;(direct)←A
MOV direct,Rn
;(direct)←Rn
MOV direct,direct
;(direct)←(direct)
MOV direct,@Ri
;(direct)←(Ri)
MOV direct,#data
;(direct)← #data
第3章 单片机汇编程序设计
(4)以间接地址@Ri为目的操作数
MOV @Ri,A
;(Ri)←A
MOV @Ri,direct
;(Ri)←(direct)
MOV @Ri,#data
;(Ri)← #data
(5)以DPTR为目的操作数
MOV DPTR,#data16 ;DPTR← #data16
注意:
源操作数和目的操作数中的Rn和@Ri不能相互配
对。如不允许有“MOV Rn,Rn”,“MOV @Ri,
Rn”这样的指令,在MOV指令中,不允许在一条指令
中同时出现工作寄存器,无论它是寄存器寻址还是寄
存器间接寻址。
例:顺序执行下列指令序列,求每一步执行结果。
MOV
MOV
MOV
MOV
MOV
A,#30H
4FH,A
R0,#20H
@R0,4FH
21H,20H
;A=30H
;(4FH)=30H
;R0=20H
;(20H)=30H
;(21H)=30H
练习题:用两种寻址方式实现,将片内RAM
60H单元的数据传送给累加器A。
解: MOV A,#60H(×) MOV R0,60H
MOV A,@R0 (×)
解: MOV A,60H (√)
结果A=32H
MOV R0,#60H(√)
MOV A,@R0
地址
内容
…
32H
58H
…
60H
32H
说 明:
第3章 单片机汇编程序设计
1、一条指令中不能同时出现两个工作寄存器。
非法指令: MOV R1,R2
MOV R2,@R0
2、间址寄存器只能使用 R0、R1。
非法指令: MOV A,@R2
3、 SFR区只能直接寻址,不能用寄存器间接寻址。
非法指令: MOV R0,#80H
MOV A,@R0
4、指令表(P287):关注表中指令字节数和机器周期数
只有指令表中的指令才有对应指令代码,计算机
才能执行。编程时,不能随意创造发明指令。
第3章 单片机汇编程序设计
2.片外数据存储器传送指令MOVX
在MCS-51系统中只能通过累加器A与片外数据存储器进行数据
传送,访问时,只能通过@Ri和@DPTR以间接寻址方式进行。
MOVX指令共有四条:
①DPTR作16位数据指针,寻址64KB片外RAM空间:
MOVX A,@DPTR
;A←(DPTR)
(读)
MOVX @DPTR,A
;(DPTR)←A
(写)
② Ri作8位数据指针,寻址256B片外RAM空间(页内寻址):
MOVX
A,@Ri
;A←(P2Ri)
(读)
MOVX
@Ri,A
;(P2Ri)←A
(写)
其中前两条指令通过DPTR间接寻址,可以对整个64KB片外数
据存储器访问。后两条指令通过@Ri间接寻址,只能对片外数据存储
器的低端的256字节访问,访问时将低8位地址放于Ri中。
第3章 单片机汇编程序设计
例:实现片外数据存储器数据传送(2000H) →(2100H)。
MOV
MOVX
MOV
MOVX
DPTR→
DPTR→
DPTR,#2000H
A,@DPTR
DPTR,#2100H
@DPTR,A
片外 RAM
地址
内容
2000H
X
…
2100H
X
;DPTR=2000H
;A=X
;DPTR=2100H
;(2100H)=X
片外数据存储器不能直接寻址。
下列为非法指令:
MOVX A,2000H
MOVX 2100H,2000H
思考题:为什么对DPTR的数据传送使用内部传送指令?
习题:将片外RAM 0000H单元的数据传送到片内RAM的60H单元。
第3章 单片机汇编程序设计
3.程序存储器传送指令MOVC
程序存储器传送指令只有两条,一条用DPTR基址变址寻址。
一条用PC基址变址寻址。这两条指令通常用于访问表格数据,因
此以称为查表指令。
① DPTR为基址寄存器:
MOVC
A,@A+DPTR ;A(A+DPTR) (读)
查表范围为 64KB 程序存储器任意空间,
称为远程查表指令。
② PC为基址寄存器:
MOVC
A,@A+PC
;A(A+PC) (读)
常数表只能在查表指令后256B范围内,
称为近程查表指令。
特点: MOVC A,@A+DPTR指令可访问整个ROM的64KB空间,表格可放在ROM
的任何位置,与MOVC指令无必然的关系。
MOVC A,@A+PC指令优点:不改变PC的状态,根据A的内容取表格常数。
缺点:(1)表格只能存放在查表指令以下的256个单元内。
(2)当表格首地址与本指令间有其它指令时,须用调整偏移量,调整量为下
一条指令的起始地址到表格首址之间的字节数。
第3章 单片机汇编程序设计
例如:查表指令MOVC A,@A+PC所在的地址为2000H,表格的起始
单元地址为2035H,表格的第4个元素(位移量为03H)的内容为45H,
则查表指令的处理过程如下:
MOV A,#03H;表格元素相对于表首的位移量送累加器A
ADD A,#34H;当前程序计数器PC相对于表首的差值加到累加器A中
MOVC A,@A+PC;查表,查得第4个元素内容45H送累加器A
注意:查表指令的长度为1个字节,当前程序计数器PC的值应为
查表指令的地址加1。
PC→
地址
内容
2000H
MOVC
2001H
…
…
…
2035H
表格
2036H
…
2037H
45H
第3章 单片机汇编程序设计
【例3-1】写出完成下列功能的程序段。
(1)将R0的内容送R6中程序为:
MOV A,R0
MOV R6,A
(2)将片内RAM 30H单元的内容送片外60H单元中程序为:
MOV A,30H
MOV R0,#60H
MOVX @R0,A
(3)将片处RAM 1000H单元的内容送片内20H单元中程序为:
MOV DPTR,#1000H
MOV A,@DPTR
MOV 20H,A
(4)将ROM 2000H单元的内容送片内RAM的30H单元中程序为:
MOV A,#0
MOV DPTR,#2000H
MOVC A,@A+DPTR
MOV 30H,A
第3章 单片机汇编程序设计
二、数据交换指令
普通传送指令实现将源操作数的数据传送到目
的操作数,指令执行后源操作数不变,数据传送是
单向的。数据交换指令数据作双向传送,传送后,
前一个操作数原来的内容传送到后一个操作数中,
后一个操作数原来的内容传送到前一个操作数中。
数据交换指令要求第一个操作数须为累加器A,
共有5条。
XCH A,Rn
;A←→Rn
XCH A ,direct ;A←→(direct)
XCH A,@Ri
;A←→(Ri)
XCHD A,@Ri
;A0~3←→(Ri)0~3
SWAP A
;A0~3←→A4~7
【例3-2】若R0的内容为30H,片内RAM 30H单元的
内容为23H,累加器A的内容为45H,则执行
XCH A,@R0
指令后片内RAM 30H单元的内容为45H,累加器A
中的内容为23H。
若执行SWAP A指令,则累加器A的内容为54H。
例:设A=29H,执行指令 XCH A,2AH后,
A= ?
29H
38H ,(2AH)= ?
片内 RAM
XCH 60H,61H;
不对!!
←对吗?
地址
20H
…
2AH
2BH
习题:将片内RAM60H单元与61H单元的数据交换。
内容
38H
29H
35H
例:将片内RAM 2AH和2BH单元中的ASCII码转换成压缩式
BCD码存入20H单元。
单字节 BCD
0000 千位
0000 百位
0000 十位
0000 个位
MOV A,#0
压缩式BCD 码
千位 百位
十位 个位
A
00000000
片内 RAM
地址
内容
2BH
35H
2AH
38H
…
20H
58H
00H
MOV R0,#2AH
@R0
00111000
38H
MOV R1,#2BH
@R1
00110101
35H
00110000
30H
00110000
30H
XCHD A,@R1
A
00000101
05H @R1
SWAP A
XCHD A,@R0
A
01010000
50H
A
01011000
58H @R0
20H
01011000
58H
XCH A,20H
习题:交换片内RAM 40H单元和 41H单元的低半字节。
第3章 单片机汇编程序设计
三、堆栈操作指令
堆栈是在片内RAM中按“先进后出,后进先出”原则设置的
专用存储区。数据的进栈和出栈由指针SP统一管理。在MCS-51
系统中,堆栈操作指令有两条:
PUSH direct ;SP←(SP+1),(SP)←(direct)
POP direct ;(direct)←(SP),(SP)←(SP-1)
其中PUSH指令入栈,POP指令出栈。操作时以字节为单位。
入栈时SP指针先加1,再入栈。出栈时内容先出栈,SP指针再减1。
用堆栈保存数据时,先入栈的内容后出栈;后入栈的内容先出栈。
【例3-3】若入栈保存时入栈的顺序为:
PUSH A
PUSH B
则出栈的顺序为:
POP B
POP A
第3章 单片机汇编程序设计
入栈指令:PUSH direct ;SP←SP+1,(SP)←(direct)
出栈指令:POP direct ;(direct)←(SP),SP←SP-1
“先加后压” “先弹后减”
例:设 A=02H,B=56H,执行下列指令后,
56H 。
SP= ?
30H ,A= ?
02H ,B= ?
SBR:MOV SP,#30H ;设栈底
PUSH A
PUSH B
MOV A,#00H
MOV B,#01H
…
POP B
POP A
00H
A
02H
A
02H
A 00H
01H
BB 56H
56H
片内 RAM
×
34H ×
×
33H ×
56H
SP→ 32H 56H
SP→
×
×
02H
SP→ 31H 02H
×
×
SP→ 30H ×
第3章 单片机汇编程序设计
练习:
说明程序执行过程中,SP的内容及堆栈中内
容的改变过程。
程序如下:
MOV SP,#30H ;SP=30H
;A=20H
MOV A,#20H
;B=30H
MOV B,#30H
;SP=31H (31H)=20H
PUSH A
;SP=32H (32H)=30H
PUSH B
……
……
;A=30H SP=31H
POP A
;B=20H SP=30H
POP B
第3章 单片机汇编程序设计
习题:找出指令错误并改正:
1.MOV A,#1000H ;A←1000H(A装1个字节数)
2.MOVX A,1000H ;A←(1000H)片外RAM(DPTR、Ri)
3.MOVC A,1000H ;A←(1000H)片外ROM(DPTR、PC)
4.MOVX 60H,A
;片外RAM(60H)←A(应为MOV)
5.MOV R0,60H ;片内RAM:(61H)←(60H)
MOV
6. XCH
61H,@R0
R1,R2
(片内RAM可直接寻址)
;R1 R2(必须有A参加)
7. MOVX DPTR,#2000H
;DPTR←2000H(应为MOV)
8. MOVX 60H,@DPTR
;片内RAM←片外RAM
(必须有A参加)
第3章 单片机汇编程序设计
3.3.2 算术运算指令
一.加法指令
1.一般的加法指令ADD
ADD A,Rn
;A←A + Rn
ADD A,direct
;A←A +(direct)
ADD A,@Ri
;A←A +(Ri)
ADD A,#data
;A←A + #data
2.带进位加指令ADDC
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
3.加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
其中,ADD
和ADDC指令在
执行时要影响CY、
AC、OV和P标
志位。而INC指
令除了INC A要
影响P标志位外,
对其它标志位都
没有影响。
在MCS-51单片
机中,常用ADD
和ADDC配合使
用实现多字节加
法运算。
第3章 单片机汇编程序设计
【例3-4】试把存放在R1R2和R3R4中的两个16
位数相加,结果存于R5R6中。
处理时,R2和R4用一般的加法指令ADD,结
果放于R6中,R1和R3用带进位的加法指令ADDC,
结果放于R5中,程序如下:
MOV A,R2
ADD A,R4
C
MOV R6,A
R1 R2
MOV A,R1
R3 R4
+
ADDC A,R3
ADDC ADD
MOV R5,A
C
R5
R6
第3章 单片机汇编程序设计
二.减法指令
1.带借位减法指令SUBB
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
2.减1指令DEC
DEC A
;A←A - 1
DEC Rn
;Rn←Rn - 1
DEC direct
;direct←(direct)- 1
DEC @Ri
;(Ri)←(Ri)- 1
第3章 单片机汇编程序设计
在MCS-51单片机中,只提供了一种带借位的
减法指令,没有提供一般的减法指令,一般的减法
操作可以通过先对CY标志清零,然后再执行带借
位的减法来实现。其中,SUBB指令在执行时要影
响CY、AC、OV和P标志位。而DEC指令除了DEC
A要影响P标志位外,对其它标志位都没有影响。
【例3-5】求R3←R2 - R1。
程序为:
MOV A,R2
CLR
C
SUBB A,R1
MOV R3,A
第3章 单片机汇编程序设计
3.乘法指令MUL
在MCS-51单片机中,乘法指令只有一条:
MUL AB
该指令执行时将对存放于累加器A中的无符号被
乘数和放于B寄存器中的无符号乘数相乘,积的高字
节存于B寄存器中,低字节存于累加器A中。
指令执行后将影响CY和OV标志,CY复位,对
于OV:当积大于255时(即B中不为0),OV为1;
否则,OV为0。
第3章 单片机汇编程序设计
4.除法指令DIV
在MCS-51单片机中,除法指令也只有一条:
DIV AB
该指令执行时将用存放在累加器A中的无符号被
除数与存放在B寄存器中的无符号除数相除,除得的
结果,商的存于累加器A中,余数存于B寄存器中。
指令执行后将影响CY和OV标志,一般情况CY和
OV都清0,只有当B寄存器中的除数为0时,CY和OV
才被置1。
第3章 单片机汇编程序设计
5.十进制调整指令
在MCS-51单片机中,十进制调整指令只有一条:
DA A
它只能用在ADD或ADDC指令后面,用来对两个二位
的压缩的BCD码数通过用ADD或ADDC指令相加后存于累
加器A中的结果进行调整,使得它得到正确的十进制结果。
通过该指令可实现两位十进制BCD码数的加法运算。
它的调整过程为:
(1)若累加器A的低四位为十六进制的A~F或辅助进
位标志AC为1,则累加器A中的内容作加06H调整。
(2)若累加器A的高四位为十六进制的A~F或进位标
志CY为1,则累加器A中的内容作加60H调整。
第3章 单片机汇编程序设计
例如:求BCD码48+69=?117
0100 1000 B
+ 0110 1001 B
1011 0001 B
+ 0110 0110 B
加6修正
1 0001 0111 B
①低4位向高4位进位,表明低位和大于9,需加6修正;
②高位由于获得进位而出现非法码,因此也需要加6修正。
修正后,结果为117,正确。
思考:BCD码减法,如何修正?(求减数对9A的补码)
9A的原码为1 110 0110 B=66H。
第3章 单片机汇编程序设计
【例3-6】在R3中有十进制数67,在R2中有
十进制数85,用十进制运算,运算的结果放于
R5中。
程序为:
(R3)=67=0110 0111 B
MOV A,R3 ;(R3)=67
(R2)=85=1000 0101 B +
(A)=1110 1100 B=ECH
ADD A,R2 ;(R2)=85,(A)=0ECH
DA A
;(A) =52H
ECH=1110 1100B
MOV R5,A ;(R5)=52H
0110 0110B +
程序中DA指令对ADD指令运算出来的放于
1 0101 0010B
累加器A中的结果进行调整,调整后,累加器A
1=(C) 52H=(A)
中的内容为52H,CY为1,则结果为152,最后
放于R5中的内容为52H(十进制数52)。
跳过或进入6个无效编码区,结果就会出错。
第3章 单片机汇编程序设计
3.3.3 逻辑操作指令
一.逻辑与指令ANL
ANL A,Rn
ANL A,direct
ANL A,@Ri
ANL A,#data
ANL direct,A
ANL direct,#data
二.逻辑或指令ORL
ORL A,Rn
ORL A,direct
ORL A,@Ri
ORL A,#data
ORL direct,A
ORL direct,#data
;A←A  Rn
;A←A  (direct)
;A←A  ((Ri))
; A←A  data
;(direct)←(direct) A
;(direct)←(direct) data
;A←A  Rn
;A←A (direct)
;A←A  ((Ri))
;A←A  data
;(direct)←(direct) A
;(direct)←(direct) data
第3章 单片机汇编程序设计
三.逻辑异或指令XRL
XRL A,Rn
;A← A  Rn
XRL A,direct
;A← A  (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,其余位不变;逻辑异或用于实
现指定位取反,其余位不变。
【例3-7】写出完成下列功能的指令段。
1.对累加器A中的1、3、5位清0,其余位不变
ANL A,#11010101B
2.对累加器A中的2、4、6位置1,其余位不变
ORL A,#01010100B
3.对累加器A中的0、1位取反,其余位不变
XRL A,#00000011B
第3章 单片机汇编程序设计
四.清零和求反指令
1.清零指令:CLR A ;A← 0
2.求反指令:CPL A ;A← Ā
在MCS-51系统中,只能对累加器A中的内容进行
清零和求反,如要对其它的寄存器或存储单元进行清零
和求反,则须放在累加器A进行,运算后再放回原位置。
【例3-8】写出对R0寄存器内容求反的程序段。
程序为:
MOV A,R0
CPL A
MOV R0,A
第3章 单片机汇编程序设计
五.循环移位指令
MCS-51系统有四条对累加器A的循环移位指令,
前两条只在累加器A中进行循环移位,后两条还要带进
位标志CY进行循环移位。每一次移一位。分别如下:
1)8位循环指令:
RL A ;A循环左移一位
RR A
A
;A循环右移一位
A
2)9位循环指令:
RLC A ;带CY循环左移一位
C
A
RRC A ;带CY循环右移一位
C
A
【例3-9】若累加器A中的内容为10001011B,CY=0,则执
行RLC A指令后累加器A中的内容为00010110,CY=1。
用9位循环指令实现多字节移位:
例:编程将寄存器 R6R5中的双字节数X左移一位。
CLR
MOV
RLC
MOV
MOV
RLC
MOV
C
A,R5
A
R5,A
A,R6
A
R6,A
;CY=0,设 R6=55H,R5=0AAH
;R6=01010101B,R5=10101010B,CY=0
;R5=01010100B,CY=1
;R6=01010101B,R5=01010100B,CY=1
CY
0
R6
CY
1
R5
;R6=10101011B,R5=01010100B,CY=0
思考题:如何将寄存器R6R5中的双字节数X右移一位。
第3章 单片机汇编程序设计
3.3.4 控制转移指令
共有17条,包括:
 无条件转移指令;
 条件转移指令;
 子程序调用及返回指令。
一、无条件转移指令
无条件转移指令是指当执行该指令后,
程序将无条件地转移到指令指定的地方去。
无条件转移指令包括长转移指令、绝对转
移指令、相对转移指令和间接转移指令。
第3章 单片机汇编程序设计
一、无条件转移指令
指令:LJMP,AJMP,SJMP,JMP——4条
LJMP addr16
长跳转指令
——可在64KB范围内跳转
AJMP addr11
绝对跳转指令
——可在指令所在的2KB范围内跳转
SJMP rel
相对跳转指令
——可在当前PC-128与+127范围内跳转
JMP @A+DPTR
间接长跳转指令
——可在以DPTR为基址+A为偏移量之
和所指向的64KB程序范围内跳转
第3章 单片机汇编程序设计
1.长转移指令LJMP
指令格式:LJMP addr16 ;PC←addr16
指令后面带目的位置的16位地址,执行时直
接将该16位地址送给程序指针PC,程序无条件
地转到16位目标地址指明的位置去。指令中提供
的是16位目标地址,所以可以转移到64KB程序
存储器的任意位置,故得名为“长转移”。该指
令不影响标志位,使用方便。
缺点是:执行时间长,字节数多。
第3章 单片机汇编程序设计
2.绝对转移指令
指令格式:AJMP addr11
;PC10~0 ← addr11
AJMP指令后带的是目的位置的低11位直接地址,执行时,先将
程序指针PC的值加2(该指令长度为2字节),然后把指令中的11位地
址addr11送给程序指针PC的低11位,而程序指针的高5位不变,执行
后转移到PC指针指向的新位置。
由于11位地址addr11的范围是00000000000~11111111111,即
2KB范围,而目的地址的高5位不变,所以程序转移的位置只能是和当
前PC位置(AJMP指令地址加2)在同一2KB范围内。转移可以向前也
可以向后,指令执行后不影响状态标志位。
【例3-10】若AJMP指令地址为3000H。AJMP后面带的11位地址
addr11为123H,则执行指令AJMP addr11后转移的目的位置是多少?
AJMP指令的PC值加2
=3000H+2=3002H=00110 000 00000010B
指令中的addr11=123H=001 00100011B
转移的目的地址为 00110 001 00100011B=3123H
第3章 单片机汇编程序设计
3.相对转移指令
指令格式:SJMP rel
;PC ← PC+2+rel
SJMP指令后面的操作数rel是8位带符号补码数,
执行时,先将程序指针PC的值加2(该指令长度为2
字节),然后再将程序指针PC的值与指令中的位移量
rel相加得转移的目的地址。即:
转移的目的地址= SJMP指令所在地址+2+rel
因为8位补码的取值范围为-128~+127,所以该指
令的转移范围是:
相对PC当前值向前128字节,向后127字节。
--(前)
PC
+(后)
第3章 单片机汇编程序设计
注意:在单片机程序设计中,通常用到一条SJMP指令:
SJMP $
该指令的功能是在自己本身上循环,进入等待状态。其
中符号 $ 表示转移到本身,它的机器码为80 FEH。在程序
设计中,程序的最后一条指令通常用它,使程序不再向后执
行以避免执行后面的内容而出错。
例:求原地踏步指令的指令代码:
HERE:SJMP HERE(或SJMP $)
相对偏移量=[2000H-(2000H+2)]补=FEH,
rel=FEH 求出指令代码为:80 FEH
第3章 单片机汇编程序设计
【例3-11】在2100H单元有SJMP指令,
若rel = 5AH(正数),则转移目的地址为215CH(向后转);
若rel = F0H(负数),则转移目的地址为20F2H(向前转)。
用汇编语言编程时,指令中的相对地址rel往往用目的位置的
标号(符号地址)表示。机器汇编时,能自动算出相对地址值;
但手工汇编时,需自己计算相对地址值rel。rel的计算方法如下:
rel = 目的地址-(SJMP指令地址+2)
如目的地址等于2013H,SJMP指令的地址为2000H,则相对
地址rel为11H。
问题思考:
(1)由偏移量rel计算目的地址;
(2)由目的地址计算偏移量rel。
例:计算转移指令的目的地址。
(1) 835AH SJMP 35H
解: rel=35H=0011 0101B 为正数,因此程序向后转移。
目的地址=(PC)+rel =(835AH+02H)+[35H]补=8391H
(2) 835AH SJMP 0E7H
解: rel=0E7H=1110 0111B 为负数,因此程序向前转移。
目的地址=835AH+02H+[0E7H]补 = 835CH-19H=8343H
例:计算转移指令的相对偏移量 rel,并判断是否超出转移范围?
指令地址
源程序
2130H
SJMP
NEXT
…
2150H
NEXT:MOV
A,R2
相对偏移量rel=2150H-(2130H+2)
=001EH=+30D(未超出转移范围)
rel=1EH
求出指令机器码:80 1EH
第3章 单片机汇编程序设计
习题:计算程序中转移指令的相对偏移量rel,
并判断是否超出转移范围。
地址
源程序
2130H
LOOP: …
…
21B0H
SJMP LOOP
相对偏移量=[2130H –(21B0H+2)]补=(-130)补
rel已超出转移范围(-126D~+129D)。
第3章 单片机汇编程序设计
4.间接转移指令
指令格式:JMP @A+DPTR
;PC ← A+DPTR
它MCS-51系统中唯一一条间接转移指令,转移的目的地址是
由数据指针DPTR的内容与累加器A中的内容相加得到,指令执行后
不会改变DPTR及A中原来的内容。数据指针DPTR的内容一般为基
址,累加器A的内容为相对偏移量,在64 KB范围内无条件转移。
该指令的特点是转移地址可以在程序运行中加以改变。DPTR
一般为确定值,根据累加器A的值来实现转移到不同的分支。在使
用时往往与一个转移指令表一起来实现多分支转移。
【例3-12】下面的程序能根据累加器A的值0、2、4、6转移
到相应的TAB0~TA6分支去执行。
MOV DPTR,#TABLE ;表首地址送DPTR
JMP @A+DPTR
;根据A值转移
TABLE:AJMP TAB0
;当(A)=0时转TAB0执行
AJMP TAB2
;当(A)=2时转TAB2执行
AJMP TAB4
;当(A)=4时转TAB4执行
AJMP TAB6
;当(A)=6时转TAB6执行
第3章 单片机汇编程序设计
二、条件转移指令
条件转移指令是指当条件满足时,程序转移到指
定位置,条件不满足时,程序将继续顺次执行。在
MCS-51系统中,条件转移指令有三种:累加器A判零
条件转移指令、比较转移指令、减1不为零转移指令。
1.累加器A判零条件转移指令
判0指令:JZ rel
;若A=0,则PC←PC+2+rel,否则,PC←PC+2
判非0指令:JNZ rel
;若A0,则PC←PC+2+rel,否则,PC←PC+2
第3章 单片机汇编程序设计
【例3-13】把片外RAM的30H单元开始的数据块传送
到片内RAM的40H开始的位置,直到出现零为止。
片内、片外数据传送以累加器A过渡。每次传送一个
字节,通过循环处理,直到处理到传送的内容为0结束。
程序如下:
MOV R0,#30H
MOV R1,#40H
LOOP: MOVX A,@R0
MOV @R1,A
INC
R1
INC
R0
JNZ
LOOP
SJMP $
第3章 单片机汇编程序设计
2.比较转移指令
比较转移指令用于对两个数作比较,并根据比较情况进
行转移,比较转移指令有四条:
CJNE A,#data,rel
;若A=data,则PC←PC+3,不转移,继续执行
若A>data,则C=0,PC←PC+3+rel,转移
若A<data,则C=1,PC←PC+3+rel,转移
CJNE Rn,#data,rel
;若(Rn)=data,则PC←PC+3,不转移,继续执行
若(Rn)>data,则C=0,PC←PC+3+rel,转移
若(Rn)<data,则C=1,PC←PC+3+rel,转移
CJNE @Ri,#data,rel
;若((Ri))=data,则PC←PC+3,不转移,继续执行
若((Ri))>data,则C=0,PC←PC+3+rel,转移
若((Ri))<data,则C=1,PC←PC+3+rel,转移
CJNE A,direct,rel
;若A=(direct),则PC←PC+3,不转移,继续执行
若A>(direct),则C=0,PC←PC+3+rel,转移
若A<(direct),则C=1,PC←PC+3+rel,转移
第3章 单片机汇编程序设计
3.减1不为零转移指令
这种指令是先减1后判断,若不为零则转移。
指令有两条:
DJNZ Rn,rel
(2字节指令,2周期指令)
;先Rn中的内容减1,
再判断Rn中的内容是否等于零,
若不为零,则转移。
DJNZ direct,rel ( 3字节指令,2周期指令)
;先(direct)中的内容减1,
再判断(direct)中的内容是否等于零,若不为
零,则转移。
第3章 单片机汇编程序设计
在MCS-51系统中,通常用DJNZ指令来构造
循环结构,实现重复处理。
循环结构包括
初始化
循环体
控制变量的修改
循环次数的控制
循环控制方法:
 计数控制;
 特征标志控制。
第3章 单片机汇编程序设计
例:利用DJNZ指令设计循环延时程序,已知fosc=12MHz。
T=12/12MHz=1µs
1) 单循环延时:
DELAY:
MOV R7,#10
;1T
DJNZ R7,$
;2T
△t=2×1µs×10+1×1µs=21µs
2) 双重循环延时:
DELAY:
MOV R7,#0AH ;1T
DL:
MOV R6,#64H ;1T
DJNZ R6,$
;2T
DJNZ R7,DL
;2T
△t=(2µs×100+2+1)×10+1=2031µs
第3章 单片机汇编程序设计
3) 三重循环延时:
DELAY:MOV
R7,#10
DL2: MOV
R6,#200
DL1: MOV
R5,#250
DJNZ
R5,$
DJNZ
R6,DL1
DJNZ
R7,DL2
△t=(((2us×250+2+1)
×200)+2+1)
×10+1
= 1006031µs
≈1秒
N
N
Y
Y
N
Y
第3章 单片机汇编程序设计
例:设单片机的晶振频率为6MHz,编写一段延时程序约100ms
的子程序。
Delay: MOV R7,#64H 1T;设循环计数器初值(100次)
LOOP: MOV R6,#0FAH 1T ;循环250次(250×4=1ms)
DJNZ R6,$
2T ;循环控制
DJNZ R7,LOOP 2T
RET
2T
T=12/6 MHz=2µs
t=2µs+100×(2µs+1ms+2×2µs)+4µs
=100.606 ms
习题:当循环计数器初值为0,循环次数有多少?
第3章 单片机汇编程序设计
【例3-14】统计片内RAM中30H单元开始的20个
数据中0个数,放于R7中。
用R2作循环变量,最开始置初值为20;作R7作计
数器,最开始置初值为0;用R0作指针访问片内RAM
单元,最开始置初值为30H;用DJNZ指令对R2减1转
移进行循环控制,在循环体中用指针R0依次取出片内
RAM中的数据,判断,如为0,则R7中的内容加1。
程序:
MOV R0,#30H
MOV R2,#20
MOV R7,#0
LOOP: MOV A,@R0
CJNE A,#0,NEXT
INC R7
NEXT: INC R0
DJNZ R2,LOOP
第3章 单片机汇编程序设计
三、子程序调用及返回指令
这类指令有四条。两条子程序调用指令,两条返回指令。
1.长调用指令
指令格式:LCALL addr16
执行过程: (PC)←(PC)+ 3
(SP)←(SP)+ 1
(SP)←(PC)7~0
(SP)←(SP)+ 1
(SP)←(PC)15~8
(PC)← addr16
该指令执行时,先将当前的PC(指令的PC加指令的字节
数3)值压入堆栈保存,入栈时先低字节,后高字节。然后转
移到指令中addr16所指定的地方执行。由于后面带16位地址,
因而可以转移到程序存储空间的任一位置(64KB)。
第3章 单片机汇编程序设计
2.绝对调用指令
指令格式:ACALL addr11
执行过程: (PC)←(PC)+ 2
(SP)←(SP)+ 1
(SP)←(PC)7~0
(SP)←(SP)+ 1
(SP)←(PC)15~8
(PC)10~0 ← addr11
该指令执行过程与LCALL指令类似,只是该指令与
AJMP一样只能实现2KB范围内转移,执行的最后是将指
令中的addr11送给PC指针的低11位。
对于LCALL和ACALL两条子程序调用指令,在汇编
程序中,指令后面通常带转移位置的标号,用LCALL指
令调用,转移位置可以是程序存储空间的任一位置,用
ACALL指令调用,转移位置与ACALL指令的下一条指令
必须在同一个2KB内,即它们的高5位地址相同。
第3章 单片机汇编程序设计
3.子程序返回指令
指令格式:RET
执行过程: (PC)15~8 ← ((SP))
(SP)←(SP)-1
(PC)7~0 ← ((SP))
(SP)←(SP)- 1
执行时将子程序调用指令压入堆栈的地址出栈,第一次出
栈的内容送PC的高8位,第二次出栈的内容送PC的低8位。执
行完后,程序转移到新的PC位置执行指令。由于子程序调用指
令执行时压入的内容是调用指令的下一条指令的地址,因而
RET指令执行后,程序将返回到调用指令的下一条指令执行。
该指令通常放于子程序的最后一条指令位置,用于实现返
回到主程序。另外,在MCS-51程序设计中,也常用RET指令
来实现程序转移,处理时先将转移位置的地址用两条PUSH指
令入栈,低字节在前,高字节在后,然后执行RET指令,执行
后程序转移到相应的位置去执行。
第3章 单片机汇编程序设计
4.中断返回指令
指令格式:RETI
执行过程: (PC)15~8 ← ((SP))
(SP)←(SP)-1
(PC)7~0 ← ((SP))
(SP)←(SP)- 1
该指令的执行过程与RET基本相同,只是RETI在
执行后,在转移之前将先清除中断的优先级触发器。
该指令用于中断服务子程序后面,作为中断服务子程
序的最后一条指令,它的功能是返回主程序中断的断
点位置,继续执行断点位置后面的指令。
在MCS-51系统中,中断都是硬件中断,没有软
件中断调用指令,硬件中断时,由一条长转移指令使
程序转移到中断服务程序的入口位置,在转移之前,
由硬件将当前的断点地址压入堆栈保存,以便于以后
通过中断返回指令返回到断点位置后继续执行。
例:设计节日灯,通过P1.0~P1.7
控制8个发光二极管,先亮1灯,
隔1秒闪烁10次,然后左移1位闪
10次,如此循环。
分析:流程图,程序如下:
MAIN: MOV A,#01H ;P1.0先亮
LOOP1:MOV
R2,#10
LOOP2:MOV
P1,A
ACALL DELAY
MOV
P1,#00H
ACALL DELAY
DJNZ
R2,LOOP2
RL
A
AJMP
LOOP1
DELAY:1秒延时子程序(略)
RET
MCS-51
P1.0
P1.1
…
…
P1.6
P1.7
N
Y
第3章 单片机汇编程序设计
3.3.5 位操作指令
在MCS-51系统中,有17条位处理指令,可以
实现位传送、位逻辑运算、位控制转移等操作。
一.位传送指令
位传送指令有两条,用于实现位运算器C与一
般位之间的相互传送。
MOV C,bit
;C←(bit)
MOV bit,C
;(bit)←C
指令在使用时必须有位运算器C参与,不能直
接实现两位之间的传送。如果进行两位之间的传送,
可以通过位运算器C来传送。
【例3-15】把片内RAM中位寻址区的20H位的
内容传送到30H位。
程序:MOV C,20H
MOV 30H,C
第3章 单片机汇编程序设计
二.位逻辑操作指令
位逻辑操作指令包括位清0、置1、取反、位与
和位或,总共10位指令。
1.位清0
CLR C
;C←0
CLR bit
;(bit)←0
2.位置1
SETB C
;C←1
SETB bit
;(bit)←1
3.位取反
CPL C
;C←
CPL bit
;(bit)←(bit)
4.位与
ANL C,bit ;C←C∧(bit)
ANL C,/bit ;C←C∧(/bit)
5.位或
ORL C,bit ;C←C∨(bit)
ORL C,/bit ;C←C∨(/bit)
第3章 单片机汇编程序设计
利用位逻辑运算指令可以实现各种各样的逻辑功能。
【例3-16】利用位逻辑运算指令编程实现下面硬件逻辑
电路的功能。
P1.0
P1.1
程序:
与
或
P1.2
与
P1.3
P1.4
或
P1.5
MOV C,P1.0
ANL C,P1.1
CPL C
ORL C,/P1.2
MOV 0F0H,C
MOV C,P1.3
ORL C,P1.4
ANL C,0F0H
CPL C
MOV P1.5,C
第3章 单片机汇编程序设计
三.位转移指令
位转移指令有以C为条件的位转移指令和以
bit为条件的位转移指令,共5条。
1.以C条件的位转移指令
JC rel
;若C=1,则转移,PC←PC+2+rel;
否则程序继续执行
JNC rel
;若C=0,则转移,PC←PC+2+rel;
否则程序继续执行
第3章 单片机汇编程序设计
2.以bit为条件的位转移指令
JB bit,rel
; 若(bit)=1,则转移,PC←PC+3+rel;否则程序继续执行
JNB bit,rel
; 若(bit)=0,则转移,PC←PC+3+rel;否则程序继续执行
JBC bit,rel
; 若(bit)=1,则转移,PC←PC+3+rel,且(bit)←0;
否则程序继续执行
利用位转移指令可进行各种测试。
第3章 单片机汇编程序设计
【例3-17】从片外RAM中30H
单元开始有100个数据,统计当中
正数、0和负数的个数,分别放于
R5、R6、R7中。
设用R2作计数器,用DJNZ
指令对R2减1转移进行循环控制,
在循环体外设置R0指针,指向片
外RAM 30H单元,对R5、R6、
R7清零,在循环体中用指针R0依
次取出片外RAM中的100个数据,
判断:
如大于0,则R5中的内容加1;
如等于0,则R6中的内容加1;
如小于0,则R7中的内容加1。
程序:
MOV R2,#100
MOV R0,#30H
MOV R5,#0
MOV R6,#0
MOV R7,#0
LOOP:MOVX A,@R0
CJNE A,#0,NEXT1
INC
R6
SJMP NEXT3
NEXT1:CLR C
SUBB A,#0
JNC NEXT2
INC
R5
SJMP NEXT3
NEXT2:INC
R7
NEXT3:INC
R0
DJNZ R2,LOOP
SJMP $
第3章 单片机汇编程序设计
四.空操作指令
NOP
;PC ← PC+1
这是一条单字节指令。执行时,不作任何
操作(即空操作),仅将程序计数器PC的内容
加1,使CPU指向下一条指令继续执行程序。它
要占用一个机器周期,常用来产生时间延迟,构
造延时程序。
第3章 单片机汇编程序设计
扩展I/O口:MCS-51单片机将I/O看作外RAM的一个特殊单
元,与片外RAM统一编址,提供16位寻址能力,寻址范围也是
64KB,但需要注意的是,为区别于外RAM地址,扩展I/O口一
般用高端地址。
访问I/O口指令使用说明:
1、可以按口寻址,进行字节操作;
如:MOV Pm,A
可以按口线寻址,进行位操作。
如:MOV Pm.n,C
2、没有专门的输入/输出指令,均使用MOV传送指令来完成:
输入:用MOV指令把各口线的引脚状态读入;
输出:用MOV指令把输出数据写入各口线电路的锁存器。
3、在进行引脚数据输入操作之前,必须先向电路中的锁存器写
入“1”,使FET截止,以避免锁存器为“0”状态时对引脚读
入的干扰。
第3章 单片机汇编程序设计
3.4 MCS-51系列单片机汇编程序常用伪指令
伪指令是放在汇编语言源程序中用于指示汇编程序
如何对源程序进行汇编的指令,它不同于指令系统中的
指令,指令系统中的指令在汇编程序汇编时能够产生相
应的指令代码,而伪指令在汇编程序汇编时不会产生代
码,只是对汇编过程进行相应的控制和说明。
伪指令通常在汇编语言源程序中用于定义数据、分
配存储空间、控制程序的输入输出等。MCS-51汇编语
言源程序相对于一般的微型计算机汇编语言源程序结构
简单,伪指令数目少,常用的伪指令只有几条。
第3章 单片机汇编程序设计
1.ORG伪指令
格式:ORG 地址(十六进制表示)
这条伪指令放于一段源程序或数据的前面,汇编时
用于指明程序或数据从程序存储空间什么位置开始存放。
ORG伪指令后的地址是程序或数据的起始地址。
【例3-18】 ORG 1000H
START:MOV A,#7FH
·
·
·
指明后面的程序从程序存储器的1000H单元开始存放。
第3章 单片机汇编程序设计
2.DB伪指令
格式:[标号:] DB 项或项表
DB伪指令用于定义字节数据,可
以定义一个字节,也可定义多个字节,
字义多个字节时,两两之间用逗号间隔,
定义的多个字节在存储器中是连续存放
的。定义的字节可以是一般常数,也可
以为字符,还可以是字符串,字符和字
符串以引号括起来,字符数据在存储器
中以ASCII码形式存放。
在定义时前面可以带标号,定义的
标号在程序中是起始单元的地址。
【例3-19】 ORG 3000H
TAB1: DB 12H,34H
DB '5','A','abc'
汇编后,各个数据在存储单元中的
存放情况如右:
3000H
3001H
3002H
3003H
3004H
3005H
3006H
12H
34H
35H
41H
61H
62H
63H
第3章 单片机汇编程序设计
3.DW伪指令
格式:[标号:] DW 项或项表
这条指令与DB相似,但用于定义字
数据。项或项表指所定义的一个字在存
储器中占两个字节。汇编时,机器自动
按低字节在前,高字节在后,即低字节
存放在低地址单元,高字节存放在高地
址单元。
【例3-20】 ORG 3000H
TAB2:DW 1234H,5678H
汇编后,各个数据在存储单元中的
存放情况如右:
3000H
3001H
3002H
3003H
34H
12H
78H
56H
第3章 单片机汇编程序设计
4.DS伪指令
格式:[标号:] DS 数值表达式
该伪指令用在存储器中保留一定数量
的字节单元。保留存贮空间主要为以后存
放数据。保留的字节单元数由表达式的值
决定。
【例3-21】
ORG 3000H
TAB1: DB 12H,34H
DS 4H
DB '5'
汇编后,存储单元中的分配情况如右:
3000H 12H
3001H 34H
3002H -3003H -3004H -3005H -3006H 35H
第3章 单片机汇编程序设计
5.EQU伪指令
格式:符号 EQU 项
该伪指令的功能是将指令中的项的值赋予EQU前
面的符号。项可以是常数、地址标号或表达式。以后可
以通过使用该符号使用相应的项。
【例3-22】
TAB1 EQU 1000H
TAB2 EQU 2000H
汇编后TAB1、TAB2分别等于1000H、2000H。程
序后面使用1000H、2000H的地方就可以用符号TAB1、
TAB2替换。
用EQU伪指令对某标号赋值后,该符号的值在整
个程序中不能再改变。
第3章 单片机汇编程序设计
6.bit伪指令
格式:符号 bit 位地址
bit该伪指令用于给位地址赋予符号,经
赋值后可用该符号代替bit后面的位地址。
【例3-23】
PLG bit F0
AI
bit P1.0
定义后,在程序中位地址F0、P1.0就可
以通过FLG和AI来使用。
第3章 单片机汇编程序设计
7.END伪指令
格式:END
该指令放于程序最后位置,用于指明汇
编语言源程序的结束位置,当汇编程序汇编
到END伪指令时,汇编结束。END后面的指
令,汇编程序都不予处理。一个源程序只能
有一个END命令,否则就有一部分指令不能
被汇编。
第3章 单片机汇编程序设计
3.5
MCS-51系列单片机汇编程序设计
汇编语言程序的结构:
1、程序设计的基本步骤
一般步骤为:
(1)分析题意,明确要求;
(2)建立思路,确定算法;
(3)编制框图,绘出流程;
(4)编写程序,上机调试。
显然,算法和流程是至关重要的。程序结构有
简单顺序、分支、循环和子程序等几种基本形式。
第3章 单片机汇编程序设计
2、画流程图
画流程图是指用各种图形、符号、指向线等来说明程序
设计的过程。国际通用的图形和符号说明如下:
椭圆框:起止框,在程序的开始和结束时使用。
矩形框:处理框,表示要进行的各种操作。
菱形框:判断框,表示条件判断,以决定程序的流向。
指向线:流程线,表示程序执行的流向。
圆 圈:连接符,表示不同页之间的流程连接。
各种几何图形符号如下图所示。
第3章 单片机汇编程序设计
3.5.1 运算程序
【例3-24】多字节无符号数加法。
设从片内RAM30H单元和40H单元有两个16字
节数,把它们相加,结果放于30H单元开始的位置
处(设结果不溢出)。
处理过程:用R0作指针指向30H单元,用R1作
指针指向40H单元,用R2为循环变量,初值为16,
在循环体中用ADDC指令把R0指针指向的单元与R1
指针指向的单元相加,加得的结果放回R0指向的单
元,改变R0、R1指针指向下一个单元,循环16次,
在第一次循环前应先将CY清零。
第3章 单片机汇编程序设计
开始
程序:
#30R0
#40HR1
#16R2
@R0+@R1@R0
R0+1R0
R1+1R1
R2-1R2
R2=0?
是
结束
否
ORG
MOV
MOV
MOV
CLR
LOOP:MOV
ADDC
MOV
INC
INC
DJNZ
END
1000H
R0,#30H
R1,#40H
R2,#16
C
A,@R0
A,@R1
@R0,A
R0
R1
R2,LOOP
第3章 单片机汇编程序设计
【例3-26】两字节无符号数乘法。
设被乘数的高字节放在R7中,低字节放于R6中;乘数的高
字节放于R5中,低字节放于R4中。乘得的积有4个字节,按由低
字节到高字节的次序存于片内RAM中以ADDR为首址的区域中。
由于MCS-51单片机只有一条单字节无符号数乘法指令MUL,
而且要求参加运算的两个字节须放于累加器A和B寄存器中,而乘
得的结果高字节放于B寄存器中,低字节放于累加器A中。因而两
字节乘法须用四次乘法指令来实现,即R6R4、R7R4、R6R5
和R7R5,设R6R4的结果为B1A1,R7R4结果为B2A1,
R6R5的结果为B3A3,R7R5的结果为B4A4,乘得的结果须按
下面的关系加起来。

+ B4
C4
B2
B3
A4
C3
R7
R5
B1
A2
A3
R6
R4
A1
C2
C1
第3章 单片机汇编程序设计
即乘积的最低字节C1只由A1这部分得到,乘积的第二字节C2
由B1、A2和A3相加得到,乘积的第三字节C3由B2、B3、A4以及
C2部分的进位相加得到,乘积的第四字节C4由B4和低字节的进位
相加得到。由于在计算机内部不能同时实现多个数相加,因而我们
用累加的方法来计算C2、C3和C4部分,用R3寄存器来累加C2部
分,用R2寄存器来累加C3部分,用R1寄存器来累加C4部分,另外
用R0作指针来依次存放C1、C2、C3、C4入存储器。程序如下:
ORG
MOV
MUL1: MOV
MOV
MUL
MOV
MOV
MUL2:MOV
MOV
MUL
ADD
MOV
0100H
R0,#ADDR
A,R6
B,R4
AB
;R6R4
@R0,A ;结果的低字节直接存入积的第一字节单元
R3,B
;结果的高字节存入R3中暂存起来
A,R7
B,R4
AB
;R7R4
A,R3
;结果的低字节与R3相加后,再存入R3中
R3,A
MOV A,B
ADDC A,#00
MOV R2,A
MUL3: MOV A,R6
MOV B,R5
MUL AB
ADD A,R3
INC R0
MOV @R0,A
MOV A,R2
ADDC A,B
MOV R2,A
MOV A,#00
ADDC A,#00
MOV R1,A
MUL4: MOV A,R7
MOV B,R5
MUL AB
ADD A,R2
INC R0
MOV @R0,A
MOV A,B
ADDC A,R1
INC
R0
MOV @R0,A
END
;结果的高字节加上进位位后存入R2中暂存起来
;R6R5,结果的低字节与R3相加存入积的第二字节单元
;结果的高字节加R2再加进位位后,再存入R2中
;相加的进位位存入R1中
;R7R5,结果的低字节与R2相加存入积的第三字节单元
;结果的高字节加R1再加进位位后存入积的第四字节单元
第3章 单片机汇编程序设计
【例3-27】多字节求补运算。
设在片内RAM 30H单元开
始有一个8字节数据,对该数据
求补,结果放回原位置。
在MCS-51系统中没有求补
指令,只有通过取反未位加1得
到。而当未位加1时,可能向高
字节产生进位。因而在处理时,
最低字节采用取反加1,其余字
节采用取反加进位,通过循环来
实现。
程序:
ORG 0100H
MOV R2,#08H
MOV R0,#30H
MOV A,@R0
CPL A
ADD A,#01
MOV @R0,A
DEC R2
LOOP:INC R0
MOV A,@R0
CPL A
ADDC A,#00
MOV @R0,A
DJNZ R2,LOOP
END
第3章 单片机汇编程序设计
3.5.2 数据的拼拆和转换。
【例3-28】设在30H和31H单元中各有一个8位数据:
(30H)=x7x6x5x4x3x2x1x0 (31H)=y7y6y5y4y3y2y1y0
现在要从30H单元中取出低5位,并从31H单元中取出低3位完
成拼装,拼装结果送40H单元保存,并且规定:
(40H)=y2y1y0x4x3x2x1x0
利用逻辑指令ANL、ORL、RL等来完成数据的拼拆,处理过
程:将30H单元的内容高3位屏蔽;31H单元内容的高5位屏蔽,高
低四位交换,左移一位;然后与30H单元的内容相或,拼装后放到
40H单元。
程序如下:
ORG
0100H
MOV
A,30H
ANL
A,#00011111B
MOV
30H,A
MOV
A,31H
ANL
A,#00000111B
SWAP A
RL
A
ORL
A,30H
MOV
40H,A
END
第3章 单片机汇编程序设计
【例3-29】设片内RAM的20H单
元的内容为:
(20H)=x7x6x5x4x3x2x1x0
把该单元内容反序后放回20H
单元,即为:
(20H)=x0x1x2x3x4x5x6x7
可以通过先把原内容带进位位
右移一位,低位移入CF中,然后左
移一位,CF中的内容移入,通过8
次处理即可,由于8次过程相同,可
以通过循环完成,移位过程当中必
须通过累加器来处理。设20H单元
原来的内容先通过R3暂存,结果先
通过R4暂存,R2作循环变量。
程序如下:
ORG 0200H
MOV R3,20H
MOV R4,#0
MOV R2,#8
LOOP: MOV A,R3
RRC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
DJNZ R2,LOOP
MOV 20H,R4
END
另外,由于片内RAM的20H单元在位寻址区,
这一问题还可以通过位处理方式来实现。
第3章 单片机汇编程序设计
【例3-30】一位十六进制数转换成ASC1I码。
一位十六进制数有十六个符号0~9、A、B、C、D、E、F。
其中,0~9的ASCII码为30H~39H,A~F的ASCII码为41H~46H,
转换时,只要判断十六进制数是在0~9之间还是在A~F之间,如
在0~9之间,加30H,如在A~F之间,加37H,就可得到ASCII码。
设十六进制数放于R2中,转换的结果放于R2中。
程序如下:
ORG 0200H
MOV A,R2
CLR C
SUBB A,#0AH;减去0AH,判断在0~9之间,还是在A~F之间
MOV A,R2
JC
ADD30 ;如在0~9之间,直接加30H
ADD A,#07H ;如在A~F之间,先加07H,再加30H
ADD30:ADD A,#30H
MOV R2,A
END
例:以查表方法把累加器A中的十六进制
数转换为ASCII码,并送回累加器中。
程序如下:
指令地址
2000
2001
2002
源程序
ORG 2000H
HBA:INC A
MOVC A,@A+PC
RET
十六进制与ASCII码对应
十六进制
ASCII码
30H
0
1
31H
...
...
E
F
DB
DB
DB
30H
31H
32H
DB
DB
45H
46H
……
2011
2012
46H
外部ROM
PC
2003
2004
2005
45H
PC
2000H INC A
2001H MOVC
2002H RET
2003H 30H
2004H 31H
2005H 32H
...
2012H
46H
...
第3章 单片机汇编程序设计
小结:
1、对有规律可循的运算:
(1)找规律写算法,编程序;
(2)利用查表指令编程序。
2、对无规律可循的:
只能利用查表指令编程序,别无它法。
第3章 单片机汇编程序设计
【例3-31】一位十六进制数转换8段式数码管显示码。
一位十六进制数0~9、A、B、C、D、E、F的8段式数码管的共阴极显
示码为3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、67H、
77H、7CH、39H、5EH、79H、71H。由于数与显示码没有规律,不能通
过运算得到,只能通过查表方式得到。
设数放在R2中,查得的显示码也放于R2中,用
MOVC A,@A+DPTR查表。
程序如下:
ORG 0200H
CONVERT: MOV DPTR,#TAB
;DPTR指向表首址
MOV A,R2
;转换的数放于A
MOVC A,@A+DPTR
;查表指令转换
MOV R2,A
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,67H,77H,7CH,39H,5EH,79H,71H
;共阴极显示码表
在这个例子中,编码是一个字节,只通过一次查表指令就可实现转换,
如编码是两个字节,则需要用两次查表指令才能查得编码,第一次取得低
位,第二次取得高位。
第3章 单片机汇编程序设计
【例3-32】在一温度控制系统中,温度0~100C每一个温度值都已经通过温度
传感器测得一个两字节的标准电压值。现在R2中给出一个0~100C的温度值,取
得它的标准电压值放于R3、R4中,低字节放在R3中,高字节放在R4中。
通过用MOVC A,@A+DPTR查表,两个字节分两次取得,由DPTR指向表
首,由放于R2中的温度值得到所查的电压值相对于表首位置的位移量放于累加器
A中,由于每一个电压值为两个字节,位移量须用R2中的温度值乘以2得到。第
一次取得低字节,第二次位移量加1后查表取得高字节,分别放于R3、R4中。
程序如下:
ORG
0300H
CHECK: MOV
DPTR,#TAB
;指向表首
MOV A,R2
;温度值送A
RL
A
;乘2得位移量
MOV R1,A
;位移量暂存于R1中
MOVC A,@A+DPTR
MOV R3,A
;第一次查得内容送R3
MOV A,R1
;取出暂存的位移量送A
INC
A
;指向高字节
MOVC A,@A+DPTR
MOV R4,A
;第二次查得内容送R4
RET
TAB:
DW 0056H,0059H,0067H,0076H……;电压值表
0℃
1℃
2℃
3℃ ……
例:查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中,
要求查表求Y,存入片内RAM 21H单元。
内部RAM
...
方法1:
20H X(变量)
21H Y(结果)
...
X
Y
A
A
程序: ORG 1000H
SQU: MOV DPTR,#3000H ;确定表首地址(基地址)
MOV A,20H
;取 X(变量:偏移量)
MOVC A,@A+DPTR ;查表求Y=X2
PC
MOV 21H,A
;保存Y(结果)
RET
;子程序结束
…
;其它程序段
DPTR
ORG 3000H
;常数表格首地址
TAB: DB 00,01,04,09,… ,225
;平方表
END
外部ROM
1000H
90H
00H
30H
...
3000H
3001H
00
01
...
225
...
例:查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中,
要求查表求Y,存入片内RAM 21H单元。
外部ROM
内部RAM
方法2:
...
20H X(变量)
21H Y(结果)
...
指令地址
1000H
1002H
1004H
1005H
1007H
1008H
100BH
SQU:
TAB:
源程序
ORG 1000H
MOV A,20H
ADD A,#3
MOVC A,@A+PC
MOV 21H,A
RET
DB 00,01,04 …
DB 09,… ,225
X A
Y A
PC
1000H
E5H
20H
...
PC
1008H
1009H
00
01
...
;程序起始地址
225
;取X
...
;修正偏移量
;查表求Y=X2 (PC=1005H)
;存结果
;子程序结束
;平方表
思考题:当0≤X≤255时,如何用查表法编程求Y=X2。
第3章 单片机汇编程序设计
远程和近程查表指令比较:
特点:
1、MOVC A,@A+DPTR
指令可访问整个ROM的64KB空间,表格可放在
ROM的任何位置,与MOVC指令无必然的关系。
2、MOVC A,@A+PC
优点:不改变PC的状态,根据A的内容取表格常数。
缺点:
(1)表格只能存放在查表指令以下的256个单元内。
(2)当表格首地址与本指令间有其它指令时,须用
调整偏移量,调整量为下一条指令的起始地址到表格
首址之间的字节数。
第3章 单片机汇编程序设计
3.5.3 多分支转移(散转)程序
一、用多分支转移指令:用多分支转移指令JMP @A+DPTR
实现多分支转移程序。
利用查地址表法:按分支号转移
【例3-33】现有128路分支,分支号分别为0~127,
要求根据R2中的分支信息转向各个分支的程序。即当
(R2)=0,转向OPR0;
(R2)=1,转向OPR1;
…
(R2)=127,转向OPR127。
[例]有BR0、BR1、BR2和BR3共4个分支程序段,各
分支程序段的功能依次是从内部RAM256B范围取
数、从外部RAM低256B范围取数、从外部
RAM4KB范围取数和从外部RAM64KB范围取数。
并假定R0中存放取数地址低8位地址,R1中存
放高8位地址,R3中存放分支序号值。
假定以BRTAB作差值表首地址,
BR0_BRTAB ~ BR3_BRTAB为差值。
分析:差值表=分支入口地址-该表首址
程序:
MOV
A,R3
MOV
DPTR,#BRTAB
MOVC A,@A+DPTR
JMP
@A+DPTR
BRTAB: DB
BR0_BRTAB
DB
BR1_BRTAB
DB
BR2_BRTAB
DB
BR3_BRTAB
入口地址:
3010H BR0:
MOV
SJMP
3020H BR1: MOVX
SJMP
3040H BR2: MOV
ANL
ANL
ORL
MOVX
SJMP
3060H BR3: MOV
MOV
MOVX
BRE: SJMP
A,@R0
BRE
A,@R0
BRE
A,R1
A,#0FH
P2,#0F0H
P2,A
A,@R0
BRE
DPL,R0
DPH,R1
A,@DPTR
$
;分支转移值送A(如R3=2)
;差值表首址(BRTAB=3000H)
;查表[A+DPTR=3002H,(A)=40H ]
;转移(A+DPTR=3040H)
;差值表(=10H)
(=20H)
(=40H)
首址
(=60H) DPTR 3000H 10H
;从内部RAM取数
;从外部RAM256B取数
3001H
3002H
3003H
20H
40H
60H
;从外部RAM4KB取数
;高位地址取低4位
;清P2口低4位
;发高位地址
;从外部RAM64KB取数
差值表=分支入口地址-该表首址
二、用查转移指令表法:用分支转移指令AJMP与LJMP
对AJMP指令应将分支序号乘以2, 转移范围为2KB;
对LJMP指令应将分支序号乘以3, 转移范围为64KB。
先用无条件转移指令(“AJMP”或“LJMP”)按顺序构
造一个转移指令表,执行转移指令表中的第n条指令,就可以
转移到第n个分支,将转移指令表的首地址装入DPTR中,将
R2中的分支信息装入累加器A形成变址值。然后执行多分支转
移指令JMP @A+DPTR实现转移。
程序清单如下:
MOV A,R2
RL
A
;分支信息乘2
MOV DPTR,#TAB ;DPTR指向转移指令表首址
JMP @A+DPTR
;转向形成的散转地址
TAB:AJMP OPR0
;转移指令表
AJMP OPR1
…
AJMP OPR127
转移指令表中的转移指令是由AJMP指令构成。
AJMP指令的转移范围不超出2KB字节空间,如各分支
程序比较长,在2KB范围内无法全部存放,应改为LJMP
(指令长度为3字节)。
程序如下:
ORG 0200H
MOV DPTR,#TAB ;DPTR指向转移指令表首址
MOV A,R2
;分支信息放累加器A中
MOV B,#3
MUL AB
;分支信息乘3
XCH A,B
ADD A,DPH
;高字节调整到DPH中
MOV DPH,A
XCH A,B
JMP @A+DPTR
;转向形成的散转地址
TAB:LJMP OPR0
;转移指令表
LJMP OPR1
LJMP OPR2
…
LJMP OPR127
第3章 单片机汇编程序设计
如分支数大于128个,那么由分支信息得到的变址
值大于一个字节,这时应将高字节调整到DPH中去。
ORG 0200H
MOV DPTR,#TAB
MOV A,R2
RL A
JNC NEXT
INC DPH
NEXT: JMP @A+DPTR
TAB: LJMP OPR0
LJMP OPR1
LJMP OPR2
…
LJMP OPR127
;DPTR指向转移指令表首址
;分支信息放累加器A中
;分支信息乘2
;高字节调整到DPH中
;转向形成的散转地址
;转移指令表
转移指令表中的转移指令是由LJMP指令构成。
键功能
读数据
键值 处理程序
01
DS
02
XS
03
CR
[例]假定键盘上有3个操作键,功能说明如下表:
…
写数据
MOV
DPTR,#3000H ;3000H为基址 插 入
;进位位C清“0”
CLR
C
RLC
A
;A带进位位循环左移
JMP
@A+DPTR
;转操作键处理程序
首址
3000H
DPTR 3000H
3001H
3001H
3002H AJMP DS
;转读数据程序
3002H
3003H
3003H
3004H AJMP XS
;转写数据程序
3004H
3005H
3005H
3006H AJMP CR
;转插入程序
3006H
…
3007H
AJMP
DS
AJMP
XS
AJMP
CR
第3章 单片机汇编程序设计
三、采用RET指令实现多分支程序
利用堆栈操作法:使用RET指令
用RET指令实现多分支程序的方法
是:先把各个分支的目的地址按顺序组
织成一张地址表,在程序中用分支信息
去查表,取得对应分支的目的地址,按
先低字节,后高字节的顺序压入堆栈,
然后执行RET指令,执行后则转到对应
的目的位置。
设分支号已存入A。把分支程序入口地址存放在表中。
MTJS:MOV SP,#30H
MOV DPTR,#TAB
;取分支入口地址表首地址
CLR C
;分支号×2
如:DPTR=3000H
RLC A
A=2
MOV R2,A
MOVC A,@A+DPTR ;取分支地址低位
PUSH A
;入栈保存
A
ROM
内部RAM
MOV A,R2
低位地址
3004H ★★
★★ 31H
INC A
3005H ※※
※※ 32H
高位地址
MOVC A,@A+DPTR ;取分支地址高位
PUSH A
;入栈保存
RET
;分支地址→PC,转移
TAB: DW addr0
;分支程序入口地址表
PC ※※ ★★
DW addr1
…
addr0: …
; 程序段0 …
addr1: …
;程序段1 …
addr1: …
;程序段2 …
※※ ★★
【例3-34】用RET指令实现根据R2中的分支信息转到各个分支程序的多分
支转移程序。
设各分支的目的地址分别为addr0、addr1、addr2、…、addr127。
程序如下:
MOV DPTR,#TAB3 ;DPTR指向目的地址表
MOV A,R2
;分支信息放累加器A中
RL
A
;分支信息乘2
JNC
NEXT
INC
DPH
;高字节调整到DPH中
NEXT: MOV R3,A
;变址放于R3中暂存
MOVC A,@A+DPTR ;取目的地址低8位
PUSH ACC
;低8位地址入栈
MOV A,R3
;取出R3中变址到累加器A
INC
A
;加1得到目的地址高8位单元的变址
MOVC A,@A+DPTR ;取转向地址高8位
PUSH ACC
;高8位地址入栈
RET
;转向目的地址
TAB3: DW
addr0
;目的地址表
DW addr1
…
DW addr127
上述程序执行后,将根据R2中的分支信息转移到对应的分支程序。
第3章 单片机汇编程序设计
应用控制流程设计
控制流程设计的基本方法:
在单片机的控制系统中,为了实现
系统的自动控制,必须将控制现场的信
息输入到单片机,经过计算机的处理以
后以被控对象能够接受的形式输出到执
行机构,实现对现场的控制。
第3章 单片机汇编程序设计
例:电机的简单起停控制。其框图如下页图 a 所示。
(1)分析:简单的电机起动停止控制,其控制的示意图及
I/O分配如图 b 所示。
输入信号:启动按钮SB1、停止按钮SB2;
输出信号:继电器KA。
假定:按下按钮,相应的接口信号为低电平(P1.1=0)时:
若程序使 P1.3=1,即KA = 1时,则电机启动。
SB1
启动
SB2
停止
第3章 单片机汇编程序设计
(2)按照上述控制思路,流
程图如右图所示。
ORG
STR:MOV
WT1:JB
SETB
WT2:JB
CLR
SJMP
END
1000H
P1,#00000110B
P1.1,WT1
;启动?
P1.3
;电机启
P1.2,WT2
;停止?
P1.3
;电机停
WT1
例:某机床动力头,其行程如图a所示,SQ1、SQ2为左、右行程开关。
要求:(1)每次按SB1启动,工作3个来回后停止,等待下次启动;
(2)每次按SB2按钮,在完成当前进给后,停在初始位SQ1处,
等待下次启动。
R0=0
分析:
①硬件原理图,
如图b所示,
其中:
输入信号:
启动按钮P1.0;
停止P1.1;
左右行程开关
P1.2、P1.3。
输出信号:
前进LED灯P1.7;
后退LED灯P1.6。
②控制流程:
如图c。
前进
LED亮
左限位
右限位
启动
停止
后退LED
前进LED
后退
LED亮
第3章 单片机汇编程序设计
WT1:
R0=0
③汇编程序:
LOOP:
WT2:
WT3:
MAIN:MOV
MOV
WT1: JB
LOOP:SETB
WT2:JB
CLR
LCALL
SETB
INC
WT3: JB
CLR
JNB
CJNE
MOV
AJMP
R0,#00H
P1,#0FH
P1.0,WT1
P1.7
P1.3,WT2
P1.7
DIR ;延时
P1.6
R0
P1.2,WT3
P1.6
P1.1,WT1
R0,#3,LOOP
R0,#00H
WT1
DIR为延时子程序。
第3章 单片机汇编程序设计
例:试编制十字路口交通灯控制程序,
控制时序如下:
绿灯闪烁3次
绿灯闪烁
分析:在仿真实验板上,采用双色灯模拟交通灯,并通过反相驱动芯
片74LS240带动,发光控制如下图:
当P1口的某个引脚为低电平时,发
光二极管变亮,当P1口的某个引脚
为高电平时,发光二极管熄灭。
西
北
南
东
1) 硬件接线如图,分配如下:
HL1:P1.0、P1.4
HL2:P1.1、P1.5
HL3:P1.2、P1.6
HL4:P1.3、P1.7
可以通过向P1口写入一个8位
二进制数来改变每个管脚的电
平状态,而向P1口写入数据可
以通过相应指令来实现。
绿
灯
HL1
北
HL2
西
HL3
东
HL4
南
红
灯
P1.1、P1.2
(绿灯)
(红灯)
(1) 硬件接线如图,分配如下:
绿灯闪烁
HL1:P1.0、P1.4(北)
P1.5、P1.6
HL2:P1.1,P1.5(西)
HL3:P1.2,P1.6(东)
P1.4、P1.7
HL4:P1.3,P1.7(南)
P1.0、P1.3
(2)控制程序:
绿灯闪烁
ORG
1000H
START:
MOV
R0,#0
MOV
R1,#0
MOV
P1,#01101001B
;东西绿灯,南北红灯
ACALL DL5S
SS1:
MOV
P1,#01101111B
;南北红灯
ACALL DL1S
MOV
P1,#69H(69H=01101001B) ;东西绿灯闪
ACALL DL1S
INC
R0
CJNE
R0,#03H,SS1
MOV
P1,#10010110B
;南北绿灯,东西红灯
ACALL DL5S
SS2: MOV
ACALL
MOV
ACALL
INC
CJNE
SJMP
DL5S: MOV
DL2: MOV
DL1: MOV
DJNZ
DJNZ
DJNZ
RET
DL1S: (略)
RET
END
P1,#10011111B
;东西红灯
DL1S
P1,#96H(96H=10010110B) ;南北绿灯闪
DL1S
R0
R0,#03H,SS2
START
R7,#50
;5秒延时
R6,#200
R5,#250
R5,$
R6,DL1
R7,DL2
;1秒延时
第3章 单片机汇编程序设计
本章小结
1、基本概念:寄存器寻址、寄存器间接寻址、直接寻址、位寻址、
基寄存器加变址寄存器间接寻址。
2、数据传送指令、算术运算指令、逻缉运算指令、位操作指令、
控制转移指令。
重点:寻址方式和指令系统,简单程序阅读。
难点:寻址方式,控制转移指令中相对地址计算,堆栈操作,以
及简单汇编程序阅读。
3、程序设计基本概念:
(1)标号、操作码、操作数、注解;
(2)伪指令:ORG、DB、DW、EQU;
(3)程序状态字PSW。
4、简单程序设计、循环程序设计、分支程序设计、查表程序设计、
应用程序设计。
重点:汇编程序结构、控制流程设计,汇编程序阅读、设计,应
用程序设计。
难点:汇编程序结构、控制流程,应用程序设计。
第3章 单片机汇编程序设计
常用程序结构:顺序结构、分支结构、循环结构
(1)顺序程序:直线程序或简单程序
单重分支
(2)分支程序
多次使用条件转移指令
多重分支
地址表法
按分支号转移 转移指令表法
通过堆栈操作
(3)循环程序:
构成:初始化、循环体、控制变量的修改、循环次数的控制。
延时;
记数控制
控制
特征标志控制
第3章 单片机汇编程序设计
Have a Break