《单片机原理与应用技术》课件第3章_第1页
《单片机原理与应用技术》课件第3章_第2页
《单片机原理与应用技术》课件第3章_第3页
《单片机原理与应用技术》课件第3章_第4页
《单片机原理与应用技术》课件第3章_第5页
已阅读5页,还剩176页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章MCS-51单片机指令系统及程序设计3.1单片机指令基础

3.2寻址方式

3.3指令系统

3.4汇编语言程序设计基础

3.5程序设计

3.6习题

实训三单片机输入/输出口的设计与使用

3.1单片机指令基础

3.1.1指令格式

指令的表示方法称为指令格式。MCS-51单片机汇编语言指令的基本格式由以下几个部分组成:

[标号:]操作码[操作数][;注释]

3.1.2指令分类

MCS-51系列单片机指令系统共有111条指令。指令有功能、时间、空间三种属性。

(1)按指令所占用存储空间的长度分类,指令可分为三类:

①单字节指令:共49条;

②双字节指令:共45条;

③三字节指令:共17条。

(2)按指令执行时间分类,指令可分为三类:

①单机器周期指令:共64条;

②双机器周期指令:共45条;

③四机器周期指令:共2条,即乘法和除法指令。

指令执行时间和指令长度是两个完全不同的概念,前者表示执行一条指令所用的时间;后者表示存放一条指令在ROM中所占的存储空间,两者不能混淆。

(3)按指令功能分类,指令可分为数据传送类、算术运算类、逻辑运算类、位操作类和控制转移类指令等五大类。3.1.3指令系统中的符号约定

指令的一个重要组成部分是操作数,为了表示指令中各种类型的操作数,MCS-51单片机指令系统采用了如下符号约定:

(1) Rn:n=0~7,表示当前工作寄存器区的8个工作寄存器R0~R7。

(2) Ri:i=0,1,表示当前工作寄存器区的两个工作寄存器R0和R1,i只能取值0或1。

(3) direct:表示8位内部数据存储单元的地址。当取值在00H~7H时,表示内部数据RAM;当取值在80H~0FFH时,表示特殊功能寄存器。

(4) #:立即数符号,在指令系统中的数据和地址均用十六进制数表示,为便于区别,用“#”号表示数据(立即数)。“#”号是立即数的标记,凡数据前有“#”,代表该十六制数为立即数,凡立即数必须在前面标记“#”。

(5) addr11:11位目的地址,用于ACALL和AJMP指令,可在下条指令地址所在的同一2 KBROM范围内调用或转移。

(6) ddr16:16位目的地址,用于ACALL和AJMP指令,能在64 KBROM范围内任意值调用或转移。

(7) rel:带符号的8位偏移地址,用于SJMP和条件转移指令,其范围是相对于下一条指令第1字节地址的-128~+127个字节。Rel≤7FH,属于0~+127B,程序向下转移;rel≥80H(补码),属于-128B~0,则程序向上转移。

(8) bit:位地址,代表片内RAM中的可寻址位00H~7FH及SFR中可寻址位。当取值为00H~7FH时,表示内部数据RAM20H~2FH单元中的每一位地址。

(9) @:间接寻址符,表示其后的寄存器的值为操作数的地址。@Ri表示寄存器Ri(i=0或1)中存放的是操作数的地址。如果该地址是内部数据存储区中的地址,其取值范围为00H~7FH;如果该地址是外部数据存储区中的地址,其取值范围为00H~0FFH。当Ri的值在00H~7FH之间时,它表示的既可能是内部数据存储空间中的地址,也可能是外部数据存储空间中的地址,需要通过指令操作码来区分。

@DPTR:表示DPTR中存放的是操作数的地址,该地址位于外部数据存储空间,其取值范围为0000H~0FFFFH。

(10) $:本指令的起始地址。

3.2寻址方式

1.立即寻址

立即寻址是直接给出操作数本身。操作数以指令字节的形式存放于程序存储器中。操作数前加立即数符“#”。如果立即数的最高位为A~F,字符前加前导“0”,以便区别于标号。

2.直接寻址

直接寻址是以地址形式给出操作数的直接地址。直接寻址范围为内RAM128B和特殊功能寄存器。

例如:设内部RAM3AH单元的内容是48H。

MOVA,3AH ;将内RAM3AH单元中的数据传至A中

执行过程如图3-1所示。图3-1直接寻址示意图

3.寄存器寻址

寄存器寻址的操作数存放在规定的寄存器中,可直接以寄存器的名字表示操作数地址,即寄存器中的内容为操作数。寻址可用的寄存器有:工作寄存器R0~R7、累加器A、通用寄存器B、数据指针DPTR和位累加器CY。这些被寻址寄存器中的内容就是操作数。

例如:

MOV A,R0 ;将R0中的数据传送到A中

设R0中的内容为50H,执行后A中的值为50H,执行过程如图3-2所示。图3-2寄存器寻址示意图

4.寄存器间接寻址

间接寻址是指指令中操作数部分所指定的寄存器中存放的是操作数的地址,即根据操作数地址的地址寻找操作数。

间接寻址用间址符“@”作为前缀。MCS-51指令系统中,可作为间接寻址的寄存器有R0和R1、数据指针DPTR和堆栈指针SP(堆栈操作时,不用间接寻址符“@”)。

例如:

MOVA,@R0 ;将R0中内容作为地址的存储单元中的数据传送至A中

设R0=50H,内部RAM50H中的值8AH,执行结果是累加器A中的值为8AH,该指令的执行过程如图3-3所示。图3-3寄存器间接寻址示意图

5.变址寻址

变址寻址是指以程序计数器PC或数据指针DPTR作为基址寄存器,以累加器A作为变址寄存器,变址存放在累加器中,两者内容相加后形成16位操作数的地址,即

操作数地址 = 基址 + 变址

这种方式用于读ROM中数据操作,不能访问数据存储器。

6.相对寻址

相对寻址一般用于相对转移指令,相对寻址以程序计数器PC的当前值为基地址与指令中给定的相对偏移量rel相加得到程序转移地址,即

程序转移目的地址 = 当前PC值 + 相对偏移量rel

rel是一个带符号的8位二进制数,用补码表示,其范围为-128B~+127B。

7.位寻址

MCS-51具有位处理功能,可以对数据位进行操作。位寻址是对内RAM和特殊功能寄存器中的可寻址位进行操作的寻址方式,这种寻址方式属于直接寻址方式,因此与直接寻址方式执行过程基本相同,但参与操作的数据是1位而不是8位,使用时需注意。

综上所述,MCS-51寻址方式与相应的寻址范围如表3-1所示。表3-1寻址方式与相应的存储器空间 3.3指令系统

3.3.1数据传送类指令

单片机系统一个重要的工作是完成各部件间的信息交换,所以数据传送是最基本最重要的操作之一。MCS-51指令系统中,各类数据传送指令共有29条,是指令系统中运用最频繁的一类指令。这类指令一般不影响标志位,但当执行结果改变累加器A的值时,会影响奇偶标志位P。

数据传送类指令的格式为

MOV[目的字节],[源字节]

1.内RAM数据传送指令

(1)以累加器A为目的字节传送指令(4条),将源操作数送到累加器A中,其源操作数寻址方式有立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。

MOV A,Rn ;Rn→A,n=0~7

MOVA,@Ri ;(Ri)→A,i=0,1

MOVA,direct ;(direct)→A

MOV A,#data ;data→A

【例3-1】

若R0=40H,(30H) =60H,(40H) =50H,将指令执行结果写在注释区。

解:MOVA,R0 ;A=40H

MOVA,@R0 ;A=50H

MOVA,30H ;A=60H

MOVA,#30H ;A=30H

(2)以工作寄存器Rn为目的字节的传送指令(3条)。

MOVRn,A ;A→Rn,n=0~7

MOVRn,direct ;(direct)→Rn,n=0~7

MOVRn,#data ;data→Rn,n=0~7

【例3-2】若A=70H,(30H)=60H,将执行下列指令后的结果写在注释区。

解:

MOVR1,A ;R1=70H

MOV R3,30H ;R3=60H

MOV R3,#30H ;R3=30H

工作寄存器之间没有直接传送的指令,若要传送,需要通过一个中间寄存器作缓冲。

【例3-3】

试将R1中的数据传送到R2。

解:

MOVA,R1 ;R1→A

MOV R2,A ;A→R2

(3)以直接地址为目的字节的传送指令(5条)。

MOVdirect,A ;A→(direct)

MOVdirect,Rn ;Rn→(direct),n

=0~7

MOVdirect,@Ri ;(Ri)→(direct),i =0,1

MOVdirect1, direct2 ;(direct2)→(direct1)

MOVdirect,#data ;data→(direct)

【例3-4】

若A = 70H,R1 = 30H,(30H) = 60H,(4EH) = 7FH,将执行下列指令后的结果写在注释区。

解:

MOV4FH,A ;(4FH)=70H

MOV 4FH,R1 ;(4FH)=30H

MOV 4FH,@R1 ;(4FH)=60H

MOV 4FH,4EH ;(4FH)=7FH

MOV 4FH,#4EH ;(4FH)=4EH

(4)以寄存器地址为目的字节的传送指令(3条)。

MOV@RiA ;A→(Ri),i=0,1

MOV@Ri,direct ;(direct)→(Ri),i=0,1

MOV@Ri,#data ;data→(Ri),i=0,1

【例3-5】

若A = 70H,R1 = 30H,(30H) =60H,(40H) =50H,将执行下列指令后的结果写在注释区。

解:

MOV@R1,A ;(30H)=70H

MOV@R1,40H ;(30H)=50H

MOV @R1,#40H ;(30H)=40H

【例3-6】

设内RAM(30H)=60H,分析以下程序连续运行的结果。

解:

MOV60H,#30H ;(60H)=30H

MOVR0,#60H ;R0=60H

MOVA,@R0 ;A=(R0)=

(60H)=30H

MOVR1,A ;R1=30H

MOV40H,@R1 ;(40H)=(R1)=(30H)=60H

MOV60H,30H ;(60H)=(30H) =60H

运行结果是:A=30H,R0=60H,R1=30H,(60H) =60H,(30H) =60H。

【例3-7】

设内RAM(30) =60H,(60H) = 10H,P1口作为输入口,其输入的数据为CAH,执行下列程序后结果如何?

解:

MOV R0,#30H ;R0=30H

MOV A,@R0 ;A=(R0)=(30H)=60H

MOV R1,A ;R1=60H

MOVB,@R1 ;B=(R1)=(60H)=10H

MOV @R1,P1 ;(R1)=(60H)=CAH

MOV P2,@R1 ;P2=CAH

执行结果:R0=30H,A=60H,R1=60H,B=10H,(60H)

=CAH,P2=CAH。3.3.2算术运算类指令

1.加法指令

1)不带进位的加法指令(4条)

ADDA,Rn ;A+Rn→A,有进位,CY=1;无进位;CY=0

ADDA,@Ri ;A+(Ri)→A

ADDA,direct ;A+(direct)→A

ADDA,#data ;A+data→A

ADD指令是8位二进制数加法运算,其中一个加数总是存在累加器A中,而另一个加数可由不同寻址方式得到,相加结果再送回A中,运算结果将对PSW相关位产生影响。

【例3-13】

设A=82H,R0=40H,(40H)=7DH,(30H)=ABH,CY=1。将分别执行下列指令后的结果写在注释区。

解:ADDA,R0 ;A=C2H,无进位,CY=0

ADDA,@R0 ;A=FFH,无进位,CY=0

ADDA,30H ;A=2DH,有进位,CY=1

ADDA,#30H ;A=B2H,无进位,CY=0

2)带进位加法指令(4条)

ADDCA,Rn ;A+Rn+CY→A

ADDCA,@Ri ;A+(Ri)+CY→A

ADDCA,direct ;A+(direct)+CY→A

ADDCA,#data ;A+data+CY→A

ADDC指令功能与ADD指令的区别是相加时再加上CY,其余功能相同。

【例3-14】

已知A=82H,R0=40H,(40)=7DH,(30H)=ABH,CY=1。将分别执行下列指令后的结果写在注释区。

解:ADDCA,R0 ;A=C3H,CY=0

ADDCA,@R0 ;A=00H,CY=1

ADDCA,30H ;A=2EH,CY=1

ADDCA,#30H ;A=B3H,CY=0

2.减法指令(4条)

SUBBA,Rn ;A-Rn-CY→A

SUBBA,@Ri ;A-(Ri)-CY→A

SUBBA,direct ;A-(direct)-CY→A

SUBBA,#data ;A-data-CY →A

SUBB减法指令的功能是将A中的数据减去源操作数所指示的数据及进位位CY,不够减时向高位借位后再减,差存入A中。运算结果将对PSW相关位产生影响。

在MCS-51指令系统中,减法必须带进位位,没有不带进位的减法。若要进行不带进位位的减法,可先将进位位清零,再执行减法指令。

【例3-15】

设A=82H,R0=40H,(40H)=81H,(30H)=82H,CY=1。将分别执行下列指令后的结果写在注释区。

解:SUBBA,R0 ;A=41H,CY=0

SUBBA,@R0 ;A=00H,CY=0

SUBBA,30H ;A=FFH,CY=1

SUBBA,#30H ;A=51H,CY=0加减运算对PSW中的状态标志位影响如下:

(1)当加法运算结果的最高位有进位,或减法运算的最高位有借位时,进位位CY置位,否则CY清零。

(2)当加法算时低4位向高4位有进位,或减法运算时低4位向高4位有借位时,辅助进位位AC置位,否则清零。

(3)在加减法运算过程中,位6和位7未同时产生进位或借位时,溢出标志位OV置位,否则清零。溢出标志OV=1,说明运算结果产生溢出(即大于 +127或小于-128)。溢出主要用于带符号数运算。

(4)当运算结果A中各位“1”的个数为奇数时,奇偶标志P位置,否则清零。

【例3-16】

有两个2字节数,分别存在31H30H和33H32H中(高位在前),试编写其加法程序,运算结果存入32H31H30H单元中。

解:加数和被加数是16位二进制数,不能用一条指令完成,需按下列步骤完成计算:首先将两数的低8位相加,结果存入30单元中,若有进位,保存在CY中;然后再将两数的高8位连同CY相加,结果存入31H单元中;最后把CY存入32H单元中,问题在于CY是1位存储单元,32H时8位存储单元,不可以直接传送,必须把CY变为等量的8位数,才能存入8位存储单元中。

程序如下:

MOV A,30H ;

ADD A,32H ;

MOV 30H,A ;

MOV A,31H ;

ADDC A,33H ;

MOV 31H,A ;

MOV A,#00H ;

ADDC A,#00H ;把CY变为等量的8位数

MOV 32H,A ;存进位

【例3-17】

被减数存在R3、R2中(高位在前),减数存在R1、R0中,试编写其减法程序,差值存入R1、R0中,借位存入R2中。

解:在MCS-51指令系统中,减法必须带CY。本题在低8位相减时,不需要减CY,可先将CY清0。程序如下:

ADD A,#00H ;CY=0

MOV A,R2 ;

SUBB A,R0 ;低8位减

MOV R0,A ;

MOV A,R3 ;

SUBB A,R1 ;高8位连同CY相减

MOV R1,A ;存差高8位

MOV A,#00H ;

ADDC A,#00H ;把CY变为等量的8位数

MOV R2,A ;存借位

3.加1减1指令

1)加1指令(5条)

INC A ;A+1→A

INC Rn ;Rn+1→Rn

INC @Ri ;(Ri)+1→(Ri)

INC direct ;(direct)+1→(direct)

INC DPTR ;DPTR+1→DPTR

加1指令的功能是将指定单元的数据加1再送回该单元。

【例3-18】设A=FFH,R0=40H,(40H)=FFH,(30H)=82H,DPTR=FFFFH,CY=0,将分别执行下列指令后的结果写在注释区。

解:INC A ;A=0,有进位,不影响标志位,CY=0(不变)

INC R0 ;R0=41H

INC @R0 ;(40H)=00H

INC 30H ;(30H)=83H

INC DPTR ;DPTR=0000H

2)减1指令(4条)

DEC A ;A-1→A

DEC Rn ;Rn-1→Rn

DEC @Ri ;(Ri)-1→(Ri)

DEC direct ;(direct)-1→(direct)

减1指令的功能是将指定单元的数据减1再送回该单元。加1减1指令涉及A时,会影响P,但不影响其他标志位。

【例3-19】

设A=00H,R0=40H,(40H)=00H,(30H)=ABH,CY=1,将分别执行下列指令后的结果写在注释区。

解:DEC A ;A=FFH,有借位,不影响标志位,CY=1(不变)

DEC R0 ;R0=3FH

DEC @R0 ;(40H)=FFH

DEC 30H ;(30H)=AAH

4.BCD码调整指令

MCS-51有一条专用于BCD码加法结果调整指令。

DA A

这条指令的功能是对加法运算结果进行BCD码调整,主要用于BCD码加法运算。BCD码按二进制数运算法则加减以后,有可能出错,需进行调整。进行加法运算时,两个压缩型BCD码按二进制相加,结果存入累加器A中后,只需在加法指令后紧跟一条DAA指令,即可实现BCD码调整,但对BCD码的减法运算不能用此指令来调整。

【例3-20】

已知两个BCD码分别存放在31H30和33H32H中,试编程求其和并存入R4R3R2。

解:程序如下:

MOV A,30H ;

ADD A,32H ;低位相加

DA A ;低位和BCD调整

MOV R2,A ;

MOV A,31H ;

ADDC A,33H ;

DA A

MOV R3,A

MOV A,#00H ;

ADDC A,#00H ;把进位存入A

MOV R4,A

5.乘除法指令

1)乘法指令(1条)

MUL AB ;A

×

B→BA

这条指令功能是实现两个8位无符号数的乘法操作。两个无符号数分别存放在A和B中,乘积为16位,积的低8位存于A中,积的高8位存于B中。如果积大于255(即积的高8位寄存器B不等于0),则OV置1,否则OV清零,而该指令执行后,CY总是清零。奇偶标志位P的值依据累加器A中“1”的个数决定。

【例3-21】

已知两个乘数分别存放31H和30H,(30H)=4EH,(31H)=50H,试编程求其积,并存入33H32H。

【例3-23】

编程把20H中的二进制数转换为3位BCD码,百位数放在20H,十位、个位数放在21H中。

解:先将要转换的二进制数除以100,商数即为百位数,余数部分再除以10,商数和余数分别为十位数和个位数,在通过SWAP、ADD指令组合成一个压缩的BCD数,十位数放在21H中的高4位,个位数放在21H中的低4位,百位数放在20H中的低4位。

编程如下:表3-3MCS-51算术运算类指令3.3.3逻辑运算及移位指令

逻辑运算类指令共24条,包括与、或、异或、清0、取反及移位等操作指令。这些指令涉及A时,影响奇偶标志P,但对CY(除带CY移位)、AC、OV无影响。

1.逻辑“与”运算指令(6条)

逻辑“与”运算指令共6条,前四条的功能是将A中的数据与源操作数所指出的数据按位进行“与”运算,运算结果送入A中,指令执行后影响奇偶标志位P;后两条指令是将直接地址单元中的数据与源操作数所指出的数据按位进行“与”运算,运算结果送入直接地址单元中。逻辑“与”运算也称逻辑乘,运算规则是有0出0,全1出1。

【例3-24】

设A=5BH,R0=46H,(46H)=58H,(32H)=ABH,将分别执行下列指令后的结果写在注释区。

解:程序如下:

2.逻辑“或”运算指令(6条)

逻辑“或”运算指令共6条,前四条的功能是将A中的数据与源操作数所指出的数据按位进行“或”运算,运算结果送入A中,指令执行后影响奇偶标志位P;后两条指令是将直接地址单元中的数据与源操作数所指出的数据按位进行“或”运算,运算结果送入直接地址单元中。逻辑“或”运算也称逻辑加,运算规则是有1出1,全0出0。

【例3-25】

设A=1BH,R0=46H,(46H)=58H,(32H)=ABH,将分别执行下列指令后的结果写在注释区。

解:程序如下:逻辑“或”指令是单字节二进制数逻辑指令,任意逻辑量(1或0)和1相或结果为1;和0相或,结果不变。利用这一特点,逻辑或指令常用来使字节中的某些位置1或保留某些位。若要求对8位二进制数的某位置1,则用“1”和该位相“或”;若要求保留某位原值,则用“0”和该位相“或”。

若(P1)=E8H=11101000B,要求高5位保留,低3位置1,则执行指令:

ORL P1,#07H ;

指令结果位:(P1)=EFH=11101111B。

【例3-26】

有两个1位非压缩的BCD数,分别存在21H和20H中,试将其合并压缩到20H单元。

解:程序如下:逻辑“异或”运算指令共6条,前四条的功能是将A中的数据与源操作数所指出的数据按位进行“异或”运算,运算结果送入A中,指令执行后影响奇偶标志位P;后两条指令是将直接地址单元中的数据与源操作数所指出的数据按位进行“异或”运算,运算结果送入直接地址单元中。逻辑“异或”运算规则是相同出0,不同出1。

任意逻辑量(1或0)和1相异或结果取反;和0相异或,结果不变。利用这一特点,逻辑异或指令常用来使字节中的某些位取反而其余位不变。

【例3-27】

设A=1BH,R0=46H,(46H)=58H,(32H)=ABH,将分别执行下列指令后的结果写在注释区。

4.清零和取反指令

CLR A ;0→A CPL A ;A中各位取反→A第一条指令的功能是将A内容清0;后一条指令功能是将A内容各位取反后送回A中。

【例3-28】

设A=10010110B,求分别执行下列指令后A中的数值。

CLR A ;A=0

CPL A ;A=01101001B

5.循环移位指令(4条)

RL A ;循环左移

RLC A ;带CY循环左移(相当于乘以2的操作)

RR A ;循环右移

RRC A ;带CY循环右移(相当于除以2的操作)

【例3-29】

设A=10010110B,CY=1,将分别执行下列指令后的结果写在注释区。

解:RL A ;A=00101101B,CY=1

RLC A ;A=00101101B,CY=1

RR A ;A=01001011B,CY=1(不变)

RRC A ;A=11001011B,CY=0(刷新)

逻辑运算类指令汇总见表3-4。图3-4循环移位指令表3-4MCS-51逻辑运算类指令

【例3-30】某已知数存在R4中,试将其乘2存入R3中,将其除以2存入R2中。

解:程序如下:

3.3.4位操作类指令

位操作又称为布尔变量操作。MCS-51中有一个布尔处理器,它是一个一位处理器,有自己的累加器(借用进位位CY),有自己的存储器(即位寻址区,20H~2FH单元中位地址位00H~7FH中的各位)。布尔操作指令包括位变量的传送、修改和逻辑操作等。

1.位传送指令(2条)

MOV C,bit ;(bit)→CY

MOV bit,C ;CY→(bit)

指令中C即进位位CY的助记符,bit为内RAM20H~2FH中的128个可寻址位和特殊功能寄存器中的可寻址位。

【例3-31】

将位存储单元24H.4中的内容传送到位存储单元24H.0。

解:MOV C,24H.4 ;(24H.4)→C

MOV 24H.0,C ;C→(24H.0)

或写成:

MOV C,24H ;位地址24H=24H.4

MOV 20H,C ;20H=24H.0表3-5MCS-51位操作类指令3.3.5控制转移类指令

控制转移类指令包括无条件转移指令、条件转移指令、调用和返回指令。这类指令通过修改PC的内容来控制程序的执行过程,可极大提高程序的效率。这类指令(除比较转移指令)一般不影响标志位。

1.无条件转移指令

无条件转移指令(共3条)根据其转移范围可分为长转移、短转移、相对转移和间接转移四种指令。

1)长转移指令

LJMP addr16 ;addr16→PC,转移范围为64 KB

这条指令为三节字指令,是16地址的无条件转移指令,可以转移到64 KB程序存储器的任意位置。

2)短转移指令

AJMP addr11 ;PC+2→PC,PC15~11不变

这条指令为双字节指令(比LJMP指令的机器码少一个字节),是11位地址的无条件转移指令。转移范围为PC + 2后的同一2 KB区域(即高5位地址相同)。AJMP指令执行的步骤是:产生当前PC。PC + 2→PC,前一个PC是指令执行前的地址,后一个PC是指令执行后的PC(成为当前PC),PC+2是因为该指令为双节字指令。

形成转移目标地址。当前PC的高5位和指令中的11位地址构成转移目标地址,即PC=PC15~11a10~a0。

3)相对转移指令

SJMP rel ;PC+ 2→PC,PC+rel→PC

这条指令是双字节指令,转移范围为当前PC+127B~-128B。指令执行的步骤是:产生当前PC。PC+2→PC,PC+2是因为该指令是双字节指令。

形成转移目标地址。PC+rel→PC,rel称为相对偏移量,是一个带符号的8位二进制数,用补码表示,其范围为-128~+127。

4)间接转移指令

JMP @A+DPTR ;A+DPTR→PC

这条指令为一字节无条件转移指令,属变址寻址。转移目标地址由累加器A的内容和数据指针DPTR内容之和来决定,两者都是无符号数。一般是以DPTR的内容是基址,而由A的值来决定具体的转移地址。这条指令的特点是转移地址可以在程序运行中加以改变。

2.条件转移指令

条件转移指令(共13条)根据判断条件可分为判C转移,判bit转移,判A转移,减1非0转移和比较转移指令。满足条件,则转移,不满足条件,则程序顺序执行。

3.调用和返回指令

在一个程序中经常会遇到反复多次执行某程序段的情况,如果重复书写这个程序段,会使程序变得冗长而杂乱。对此,可把重复的程序编写为一个子程序,在主程序中调用子程序。这样,不仅减少了编程的工作量,而且缩短了程序的总长度。另外,子程序还增加了程序的可移植性,一些常用的运算程序写成子程序形式,可以被随时引用、参考,为广大单片机用户提供了方便。

调用子程序的程序称为主程序,主程序和子程序间的调用关系如图3-5所示。图3-5子程序及其嵌套

调用指令根据其调用子程序所在范围可分为长调用和短调用两种,其特点类似于长调用指令和短调用指令。

1)长调用指令

LCALL addr16 ;长调用

LCALL指令执行步骤:

(1)生成当前PC:PC+3→PC,LCALL是3字节指令。

(2)断口地址保存到堆栈中,先压低字节入栈。

(3)形成转移目标地址:addr16→PC。

2)短调用指令

ACALL addr11 ;短调用

ACALL指令执行步骤:

(1)生成当前PC:PC+2→PC,LCALL是2字节指令。

(2)断口地址保存到堆栈中,先压低字节入栈。

(3)形成转移目标地址:addr11→PC(更新低11位,高5位不变)。

【例3-36】

设(SP)=6FH,子程序标号为SUB2,首地址为7B16H,LCALL指令首地址为10FAH,求执行下列指令后相关的单元地址。

解:

23DFH:LCALL SUB2 ;

23E2H:… ;

结果为(SP)=71H,(70H)=E2H,(71H)=23H,(PC)=7B16H。表3-6MCS-51控制转移类指令

4.空操作指令

NOP ;

NOP指令的功能仅使PC加1,然后继续执行下条指令,无任何其他操作。NOP为单周期指令,占用一个机器周期,常用于延时或等待。

3.4汇编语言程序设计基础

3.4.1汇编语言及其语句结构

计算机能识别的是用二进制(0和1)表示的指令,称为机器语言(机器码),如汇编语言指令:MOV A,#200 ;其机器代码为74C8H。

机器代码虽然能被计算机直接识别,但在书写、记忆上都很困难,用它来编写程序很不方便。为了解决这一问题,人们用一些规定的英文字符(即助记符)来代替机器码,以使程序易读易懂。用助记符书写的指令系统就是计算机的汇编语言,每一条指令就是汇编语言的一条命令语句。

一条汇编语言的语句最多包括四部分:标号、操作码、操作数和注释,其结构为

标号:操作码[目的操作数],[源操作数] ;注释3.4.2伪指令

1.起始伪指令ORG

格式:ORG 16位地址

功能:规定ORG下面的目标程序的起始地址。

2.结束伪指令 END

格式:END

功能:汇编语言源程序的结束标志。在END以后所写的指令,汇编程序不再处理。一个源程序只能有一个END指令,且只能放在所有指令的最后。

3.等值伪指令EQU

格式:字符名称 EQU 数据或汇编符号

功能:将一个数据或特定的汇编符号赋予规定的字符名称。

4.数据地址赋值伪指令DATA

格式:字符名称 DATA 表达式

功能:将数据地址或代码地址赋予规定的字符名称。

DATA与RQU的功能有些相似,区别为EQU定义的符号必须先定义后使用,而DATA可以先使用后定义。

5.定义字节伪指令DB

格式:DB 8位二进制数表

功能:从指定的地址单元开始,定义若干个8位内存单元的数据,数据与数据之间用“,”分割。

6.定义字伪指令DW

格式:DW16位二进制数表

功能:从指定的地址单元开始,定义若干个16位数据。因为16位数须占用两个字节,所以高8位先存入,低8位后存入。不足16位者,用0填充。

7.定义位地址指令BIT

格式:字符名称BIT位地址

功能:将位地址赋予所规定的字符名称。3.4.3汇编

汇编又可分为手工汇编和计算机汇编两种。

1.手工汇编

手工汇编是由汇编者对照指令表,分别查出源程序每条指令的机器代码,然后用这些指令代码以字节为单位从源程序的起始地址依次排列,形成目标程序。

在汇编过程中,若碰到与后面程序有关的地址标号或变量,则暂时将这些单元空出,继续往后汇编,最后再根据后面的汇编结果,将这些空出的单元填好。

【例3-37】用手工对下段程序进行汇编。3.4.4程序设计的基本方法

1.分析问题确定算法或解决思路

首先,要对需要解决的问题进行分析,明确题目的任务,弄清现有条件和目标要求,然后确定设计方法。对于同一个问题,一般有多种不同的解决方案,应通过认真比较,从中挑选最佳方案。这是程序设计的基础。

2.画流程图

流程图又称为程序框图,它是用各种图形、符号、指向线等来说明程序的执行过程。它能充分表达程序的设计思路,可帮助设计程序、阅读程序和查找程序中的错误。美国国家标准化协会ANSI规定定了一些常用的流程图符号,已为世界各国程序工作者普遍使用,具体见表3-7。表3-7流程图符号表

3.编写源程序

根据流程图中各个部分的功能,设计出一条一条的指令来实现其功能,也就写出了具体的程序。所编写的源程序应简单明了,层次分明。

4.汇编和调试

对已编好的程序,先进行汇编。在汇编过程中,还可能会出现一些错误,计算机会提示,汇编需要对源程序中的错误进行修改,直到没有错误为止,最终生成机器码程序。汇编工作完成后,就可以上机调试运行。一般先输入给定的数据,运行程序,检查运行结果是否正确,若发现错误,则通过分析对源程序进行修改,再汇编、调试,直到获得正确的调试结果为止。 3.5程序设计

3.5.1顺序程序设计

顺序程序是指按指令的排列顺序依次执行的程序,也称为简单程序或直线程序。

顺序结构是程序结构中较简单的一种,其特点是按指令的排列顺序一条一条地执行,直到全部指令执行完毕为止。顺序程序是构成复杂程序的基础。

【例3-38】

拆分程序,将R7中的压缩BCD码(即一个字节中存放两个BCD码)拆分为分离的BCD码(即一个字节中存放1个BCD码,在低半个字节),并分别存放于R4、R3中。

解:源程序如下:

【例3-39】求补码:已知一个16位的二进制负数存放在R1、R0中,求其补码,并将结果存在R3、R2中。

解:最高位是符号位,负数最高位是1,二进制负数的求补的方法是“按位取反,末位加1”,符号位不变。利用CPL指令实现求反;加1时,则应从低8位先加1,高8位再加上低位的进位。注意,这里不能用INC指令,因为INC指令不影响标志位。

程序如下:3.5.2分支程序设计

1.单分支选择结构程序设计

通常用条件转移指令形成单分支结构。一般根据运算结果的状态标志,用条件判断跳转指令来选择并转移,即二选一。

【例3-40】

将ASCII码转换为十六进制数。设ASCII码存放在累加器A中,转换结果存放在B中。

解:由ASCII码表可知,30H~39H为0~9的ASCII码,41H~46H为A~F的ASCII码。将ASCII码减30H(0~9)或37H(A~F)就可获得对应的十六进制数。程序如下:

2.多分支选择结构程序设计

当程序的判断部分有两个以上出口流向时,为多分支选择结构程序。

【例3-41】

两个无符号数比较(两分支)。内部RAM的30H单元和40H单元各存放一个8位无符号数,请比较这两个数的大小,将大的数存入50H中。

分析:本题是典型的两分支程序,根据两个无符号数的比较结果(判断条件),程序可以选择两个流向中的某一个。比较两个无符号数常用的方法是将两个数相减X - Y,然后判断借位位的状态,若CY=0,无借位,X≥Y;若CY=1,有借位,X<Y。大数存入Z(50H)中。

解:编程如下:

【例3-42】

使用红外线温度测量系统测量人体的体温,当有发热现象时,给出报警。把这个实际应用问题以数学方法描述,即以分段函数来实现:

【例3-44】

两个带符号数X、Y分别存于NN1和NN2单元,试比较它们的大小,较大者存入MAX单元;若两数相等,则任意存入一个。

解:两个带符号数的比较可先进行两数相减,然后利用相减结果的正负和溢出标志结合起来判断:

X–Y> 0,若OV=0,则X > Y;若OV=1,则X < Y。

X–Y< 0,若OV=0,则X < Y;若OV=1,则X > Y。

编程如下:3.5.3循环程序设计

在许多实际应用中,往往需要多次反复执行某一部分相同的操作,只是参与操作的操作数不相同,这时可以采用循环程序结构。循环结构常用于求和、统计、寻找、排序、延时、求平均值等程序。循环结构可以缩短程序,减少程序占用的内存空间。循环结构一般包括以下几个部分:

(1)循环初值。

(2)循环体。

(3)循环修改。

(4)循环控制。

上四部分可以用两种组织形式,可以先处理数据后判断,也可以先判断后处理数据。复杂问题还需要多重循环结构。

【例3-45】

四字节无符号数加法程序设计。设两个四字节无符号数分别存放在以D1和D2为首地址的内RAM连续单元中,低字节在前。设计程序求两数的和,和放在被加数(D1为首地址)的单元中。

解:编程如下:

【例3-47】

设在内RAM40H开始的存储区有若干个字符和数字,已知最后一个字符为“$”(并且只有惟一一个“$”)。编程统计这些字符和数字的个数,将统计结果存入30H单元。

解:程序如下:3.5.4子程序设计

在实际的程序设计中,常常将那些需多次应用的、完成相同操作的程序段从整个程序中独立出来,单独编写一个程序段,需要时通过指令进行调用,这个程序段称为子程序。

采用子程序能使整个程序结构简单,缩短程序的长度,减少占用的程序存储空间,调用程序称为主程序或调用程序。

子程序设计原则和方法:子程序是一种能完成某一特定任务的程序段,其资源要为所有调用程序所共享。因此,子程序在结构上应具有独立性和通用性。

编写子程序时应注意:

(1)子程序的第一条指令的地址称为子程序的入口地址,该指令必须有标号。

(2)主程序调用子程序,是通过主程序或调用程序中的调用指令来实现的。一般用长调用指令LCALLaddr16和CALLaddr11来完成。

(3)子程序中用到堆栈,堆栈通常用来保护断点和现场。

(4)子程序的最后一条指令必须是RET返回指令,功能是将堆栈中断点地址弹出送入PC指针中,实现返回主程序。

(5)参数传递可以通过累加器、寄存器和堆栈进行。

【例3-50】编写一个通用子程序,实现N个单字节无符号数加法。N小于100H调用该子程序完成将内部RAM30H~5FH中存放的单字节无符号数求和,结果存入60H61H(高位在前)。

解:本题中需要传递的参数有三种:参与运算的字节无符号数个数N,用R2传递;参与运算的数据,在内部RAM单元中,以R0为指针寄存器,间接寻址传递;运算结果,共两个,用R1间接寻址传递。

子程序如下:3.5.5查表程序设计

MCS-51单片机系统中,查表程序是一种常用的程序,利用它能避免进行复杂的运算或转换过程,它可以完成数据计算、转换、补偿等各种功能,具有程序简单、执行速度快等优点。在MCS-51系统中,数据表格是存放在程序存储器ROM中,而不是存放在RAM中,编程时,可以通过DB伪指令将表格的内容存入ROM中。用于查表的指令有两条:

MOVC A,@A+DPTR

MOVC A,@A+PC当用DPTR作基址寄存器时,查表的步骤分三步:

(1)基址值(表格首地址)→DPTR;

(2)变址值(表中要查的项与首地址之间所间隔字节数)→A;

(3)执行MOVCA,@A+DPTR。

当用PC作基址寄存器时,由于PC本身是一个程序计数器,与指令的存放地址有关,所以查表时其操作有所不同。也可分为三步:

(1)变址值(表中要查的项与首地址之间所间隔字节数)→A;

(2)偏移量(查表指令下一条指令首地址到表格首地址之间所间隔字节数)+A→A;

(3)执行MOVCA,@A+PC。

【例3-51】

在MCS-51应用系统中,常用LED数码显示数码,但显示数与显示数编码并不相同,需要将显示数转换为显示字段码,通常是用查表的方法。现要求将30H中的显示数字(≤9)转换为显示字段码并存入30H中,已知共阴极字段码表的首地址为TABD。

解:编程如下:

【例3-52】

将1位十六进制数转换为ASCII码。设1位十六进制数存放在50H的低4位,转换后的ASCII码仍然送回到50H中。

解:以前的例题中已经介绍了将ASCII码转换为十六进制数的程序。本例是其逆转换,采用的是查表的方法来实现十六进制数转换为ASCII码。程序如下:另外,十六进制转换为ASCII码还可以根据十六进制数与ASCII码间的关系,用计算的方法进行求解。

【例3-53】

用查表程序求0~40之间整数的立方。已知该整数存放在内部RAM30H中,查得的立方数存内部RAM30H(高8位)31H中。

解:编程如下:3.5.6散转程序设计

【例3-54】单片机四则运算系统。在单片机系统中设置+、-、×、÷四个运算命令键,它们的键号分别是0、1、2、3。当其中一个键按下去时,进行相应的运算。操作数由P1口和P3口输入,运算结果仍由P1口和P3口输出。具体如下:P1口输入被加数、被减数、被乘数和被除数,输出运算结果的低8位或商;P3口输入加数、减数、乘数和除数,输出进位(借位)位、运算结果的高8位或余数。键盘号已存放在30H中。

解:程序如下:3.5.7数据查找程序设计

1.关键字查找程序

关键字查找也称为数据检索。如果要查找的表是无序的,查找只能从第一项开始逐项顺序查找,判断所取得数据是否与关键字相同。

【例3-55】从100个无序数据表中查找关键字55H。

解:由于表的数据是没有规律的,是无序数据,所以只能从表头开始顺序查找,直到找到与关键字相同的数据后结束查找。参考程序如下:

2.数据极值查找程序

数据极值查找就是在数据区中查找出最大或最小值。极值查找操作的主要工作是比较大小,从这些数据中找出最大或最小值,并存于某一单元中。

【例3-56】

在内部RAM中存放20个数据,找出最大值并存放于首地址中,设R1中存放首地址,R3中存放字节数。

解:要从一批数据中查找最大值,就是要将一批数据做大小比较,假设首地址中的数据就是最大值,然后与取出其后的数据逐一比较,比首地址中的数据大则替换首地址中的内容,否则保持其内容不变,参考程序如下: 3.6习题

1.填空题

(1)对程序存储器ROM的读操作,只能使用()指令。

(2) MOVPSW,#10H是将工作寄存器设置为第()组。

(3) ORLA,#0F0H是将A的高4位置(),而低4位()。

(4)在寄存器间接寻址中,寄存器中的内容是()。

2.简述MCS-51指令系统按指令长度、指令执行时间、指令功能分类概况。说明Rn与Ri有什么区别,n与i值的范围各是多少,@Ri表示什么,30H与#30H有什么区别。

3.什么是寻址方式?MCS-51指令系统有几种寻址方式?访问内部RAM时可采用哪些寻址方式?试述各种寻址方式所能访问的存储空间。

4.指出下列指令中源操作数的寻址方式。

(1) MOV R0,#30H;

(2) MOVA,30H;

(3) MOV A,@R0;

(4) MOV @R0,A;

(5) MOVCA,@A+DPTR;

(6) CJNE A,#00H,30H;

(7) MOV C,30H;

(8) MULAB;

(9) MOVDPTR,#1234H;

(10) POPAcc。

5.设R0=11H,(11H)=22H,(33H)=44H,B=55H,将分别执行下列指令后的结果写在注释区。

(1) MOVA,R0;

(2) MOV A,@R0;

(3) MOV A,33H;

(4) MOVA,#33H;

(5) MOV R3,B;

(6) MOV 40H,33H。

6.设A=11H,R0=33H,B=44H,(11H)=22H,(22H)=66H,(33H)=44H,将分别执行下列指令后的结果写在注释区。

(1) MOVA,R0;

(2) MOVB,#55H;

(3) MOV40H,@R0;

(4) MOV11H,22H;

(5) MOVR3,11H;

(6) MOV@R0,22H。

7.按下列要求传送数据:

(1)将R0中的数据传送到30H中。

(2)将R0中的数据传送到R7中。

(3)将40H中的数据传送到R2中。

(4)将立即数40H传送到R5中。

(5)将立即数40H传送到以R1中内容为地址的存储单元中。

(6)将40H中的数据传送到以R1中内容为地址的存储单元中。

(7)将R6中的数据传送到以R1中内容为地址的存储单元中。

(8)将R6中的数据传送到以R2中内容为地址的存储单元中。

8.已知(30H)=11H,(11H)=22H,(40H)=33H,求下列程序依次连续运行后A、R0、30H、40H、50H、60H单元中的内容。

(1) MOV50H,30H;

(2) MOVR0,#40H;

(3) MOVA,11H;

(4) MOV60H,@R0;

(5) MOV@R0,A;

(6) MOV30H,R0。

9.设A=11H,(44H)=22H,R0=33H,求下列程序依次执行后有关单元中的内容。

(1) MOVA,R0;

(2) MOVR0,#44H;

(3) MOV33H,@R0;

(4) MOV@R0,A;

(5) MOVA,R0;

(6) MOVX @R0,A。

10.按要求传送数据。

(1)内RAM50H单元数据送外RAM50H单元;设内RAM(50H)=11H。

(2)外RAM50H单元中数据送R0;设外RAM(50H)=22H。

(3)外RAM2000H单元中数据送内RAM50H单元;设外RAM(2000H)=33H。

(4)外RAM2000H单元中数据送外RAM3000H单元;设外RAM(2000H)=33H。

(5) ROM4000H单元中数据送P1口;设ROM(4000H)=44H。

11.试将30H、R7、B、A、PSW、DPTR中的数据依次压入堆栈。并指出每次堆栈操作后,SP=?(SP)=?设原SP=60H,当前工作寄存器区为0区,(30H)=11H,R7=22H,B=33H,A=44H,PSW=55H,DPTR=6677H。

12.已知条件同上题堆栈操作的结果,试将堆栈中数据依次弹出存入DPH、DPL、A、B、PSW、30H、R7,求DPTR、A、B、PSW、30H、R7中的内容和当前工作寄存器区编号。

13.说明下列指令的功能,指出执行后R0的结果。

(1) MOV R0,#72H;

(2) XCH A,R0 ;

(3) SWAPA ;

(4) XCH A,R0。

14.设A=96H,R0=47H,(47H)=CBH,(69H)=34H,(95H)=96H,CY=1,求分别执行下列指令后A和CY中的数据。

(1) ADD A,R0;

(2) ADD A,@R0;

(3) ADDC A,69H;

(4) ADDC A,#69H;

(5) SUBB A,R0;

(6) SUBB A,@R0;

(7) SUBB A,95H;

(8) SUBB A,#95H。

15.有两个2字节数,分别存在R7R6和R5R4中(高位在前),编写加法程序,运算结果存入R7R6R5中。

16.被减数存在31H30H中(高位在前),减数存在33H32H中,编写减法程序,差值存入31H30H单元,借位存入32H单元。

17.已知两乘数分别存在R1和R0中,编程求其积,并存入R3、R2中。

18.已知被除数和除数分别存在31H和30H中,编程求其商,商存入33H,余数存入32H中。

19.设A=B7H,R0=5EH,(5EH)=D9H,(23H)=C1H,将分别执行下列指令后的结果写在注释区。

(1) ANL A,R0;

(2) ANL A,@R0;

(3) ANL A,#D6H;

(4) ORL A,23H;

(5) ORL 23H,A;

(6) ORL 23H,#23H。

20.设A=FFH,R0=00H,(00H)=FFH,DPTR=FFFFH,CY=0,位地址(00H)=1,将分别执行下列指令后的结果写在注释区。

(1) DEC A;

(2) DEC R0;

(3) INC @R0;

(4) INC DPTR;

(5) CPL 00H;

(6) SETB00H;

(7) ANL C,/00H;

(8) ORL C,00H。

21.已知一压缩BCD码存在30H中,试将其拆分为两个字节,分别存在31H32H中(高位在前)。

22.设A=5AH,R1=30H,(30H)=E0H,CY=1。写出下列指令执行后A中的内容以及对CY、P的影响(每条指令都以题中给定的原始数据来参加操作)。

(1) XCHA,R1;

(2) XCHDA,@R1;

(3) SWAPA;

(4) ADDA,#30H;

(5) ADDCA,30H;

(6) SUBBA,30H;

(7) RLA;

(8) CPL A;

(9) ANLA,30H;

(10) ORL A,@R1。

29.试编程将外RAM1000H~1050H单元内容清0。

30.试编写程序,将外部RAM2000H~20FFH数据块传送到3000H~30FFH区域中去。

31.设在内部数据存储器中存放有20个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论