单片机学习资料2.ppt
- 文档编号:18772921
- 上传时间:2023-11-07
- 格式:PPT
- 页数:120
- 大小:539.50KB
单片机学习资料2.ppt
《单片机学习资料2.ppt》由会员分享,可在线阅读,更多相关《单片机学习资料2.ppt(120页珍藏版)》请在冰点文库上搜索。
第二章:
MCS-51单片机指令系统,2.1概述,2.2寻址方式,2.3数据传送指令,2.4算逻运算和移位指令,2.5控制转移和位操作指令,2.1:
MCS-51指令系统的概述,MCS-51共有111条指令,指令的长度和执行时间因不同的指令而各不相同。
2.1.1指令格式2.1.2指令的三种表示形式2.1.3指令的字节数2.1.4指令的分类,继续,2.1.1指令格式:
指令格式:
既指令的结构形式。
操作码,操作数或操作数地址,由操作码和操作数(或操作数地址)构成指令的结构。
举例:
MOVA,#0FFHADDA,R0,返回,指令的表示形式是识别指令的标志。
1,二进制的表示形式:
(以“累加器的内容+08H”为例)00100100B操作码OP(加法)00001000B操作数DATA(08H)特点:
能被CPU直接识别、运行的形式。
也称机器码、汇编语言的目标代码。
缺点:
不便于阅读、记忆和调试修改。
2.1.2指令的三种表示形式:
2,十六进制表示方式:
它是对二进制形式的一种简化。
00100100B24H00001000B08H在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。
但是,这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的“机器码”后存入程序存储器并运行。
二进制表示的形式十六进制表示的形式,3,指令的“助记符”方式(也称“汇编格式”):
00100100B24H00001000B08HADDA,#08H1,这是一种由英文单词或字母、数字来表征指令功能的形式。
是一种便于阅读、书写和交流的表示形式。
2,这种“汇编”格式的指令必须把它“翻译”为二进制形式“机器码”后才能为CPU所识别和执行。
3,三种不同的表示方法适用于不同的场合。
本章内容都以汇编的形式介绍指令系统。
二进制表示形式十六进制表示汇编格式,返回,2.1.3指令的字节数,在MCS-51单片机的指令系统中,因指令操作码和操作数的不同,指令(在存储器中)长度也各不相同。
分为单字节、双字节和三字节。
单字节指令(49条):
分无操作数、有操作数两种。
无操作数:
如INCDPTR10100011BINCA00000100B【特点】:
操作数隐含在操作码中。
含有操作数寄存器名称的单字节指令:
如:
MOVA,R011101000BMOVA,R111101001B【特点】:
寄存器名以三位数代码的形式在指令的后三位。
双字节指令(46条):
指令的操作码和操作数各占一个字节。
如:
MOVA,#data01110100Bdata很明显:
8位的操作数本身占据一个字节。
n,n+1,mova,#data,双字节指令在程序存储器的存放示意图,三字节指令(16条):
指令中的操作数为双字节。
如:
MOVDPTR,#data161001000B,data15-8,data7-0或者:
指令中分别包含1个字节的操作数和1个字节的操作数地址。
如:
MOVdirect,#data举例:
MOV20H,#0FFH,MOVdptr,#data16,MOVdirect,#data,三字节指令在存储器中存放的方式示意图,指令的字节数与指令的运行时间,指令的字节多是否意味着指令周期就长?
从表中可见,指令的字节数与指令周期不是对等的关系,返回,2.1.4指令的分类,MCS-51单片机的指令如果按功能划分可以分为五类:
1,数据传送类指令:
完成数据在单片机内部之间的传送。
分为8位数和16位两种。
除了奇偶位外,指令的执行对PSW无影响。
2,算术运算指令:
用于操作数之间的加、减、乘除运算。
【特点】:
多数情况下:
操作数之一在累加器A中,结果也保留在A中,运算结果要影响PSW(进位标志、奇偶和溢出标志等)。
3,逻辑操作和循环移位指令:
操作数之间的逻辑加、逻辑与、取反和异或等操作。
多数情况下一个操作数在A中,结果也存于A。
移位指令分为左移、右移和带进位和不带进位几种情况。
与算术类指令相比逻辑类指令基本不影响PSW的内容。
4,控制转移类指令:
条件转移、无条件转移,调用和返回。
【特点】:
通过修改程序指针PC的内容,使CPU转到另一处执行,从而改变程序的流向。
5,位操作指令:
位传送、位置位、位运算和位控制转移等操作。
【特点】:
按位操作而不是按字节的操作。
位控转移的判断不是检测某一个字节而是对某一个位进行检测并决定是否进行程序转移。
这类指令基本不影响PSW的内容。
返回,2.2寻址方式,在指令的操作数位置上,用于表征、寻找操作数的方式定义为“寻址方式”。
正确的理解、掌握寻址方式,是学习、使用指令的关键。
在MCS-51单片机中,共使用了七种寻址方式。
它们分别是:
1,寄存器寻址5,变址寻址;2,直接寻址6,相对寻址;3,立即数寻址7,位寻址。
4,寄存器间接寻址,继续,2.2.1寄存器寻址,当所需要的操作数在内部某一个寄存器Rn中时,将此寄存器名Rn直接写在指令的操作数的位置上。
如:
MOVA,R7;将寄存器R7中的内容送累加器A中。
MOV20H,R0;将寄存器R0中的数据送内存20H单元INCR1;将寄存器R1中的内容加一ADDA,R3;A的内容与寄存器R3的内容相加送A寄存器寻址方式的指令大多是单字节指令。
指令本身并不带有操数,而是含有存放操作数的寄存器的3位代码。
以MOVA,Rn为例,使用R7寄存器,所以rrr=111,既指令的机器码为:
0EFH,11101rrr,操作码,寄存器代码,返回,E8HEFH,MOVA,Rn,2.2.2直接寻址,指令本身含有操作数的8位或16位地址。
既指令直接给出了操作数的地址。
如:
MOVA,30H;将RAM30H单元内容送累加器这里30H是操作数在RAM中的地址。
很明显,直接寻址的指令长度是两个或三个字节。
n,n+1,30H,累加器A,直接寻址示意图,使用直接寻址应注意的三个问题:
1,指令助记符中direct是用16进制数表示的操作数地址。
当地址恰好在SFR区域时,指令也可以用寄存器名来表示。
如:
MOVA,80H可以写成MOVA,P0后者用SFR中寄存器的名字取代它的物理地址80H。
很明显,后者更容易阅读和交流,所以我们提倡使用SFR中寄存器名称来代替直接地址。
如:
MOVA,SBUF;串口数据缓冲器数据送AMOVIE,#00H;初始化中断允许寄存器MOVTH1,#0FEH;为定时器1赋初值尽管使用SFR的寄存器名称来取代直接地址,可以带来程序的可读性,但是在汇编时,仍要将寄存器名字转换为直接地址。
2,当直接地址时在工作寄存器区中时,可以使用两种寻址方式来访问。
如:
MOVA,00H;将RAM中00H单元数据送累加器AMOVA,R0;将工作寄存器R0的内容送累加器A这里使用了不同的寻址方式,其指令的结构也不相同。
前者是:
11100101(0E5H)、00000000(00H)双字节。
后者的机器码是:
11101000(0E8H)单字节;在物理结构上,R0与RAM的00H单元恰好是同一单元,所以不同的指令而执行结果是一样的。
类似的还有累加器A:
INCA寄存器寻址方式(单字节);INCACC直接寻址方式(双字节);INC0E0H直接寻址方式(双字节)。
3,在指令系统中:
字节地址与位地址是完全不同的概念。
前者用direct表示,而后者用bit表示,但在指令中都是用16进制表示的数。
如:
MOVA,20H;将RAM的20H单元内容送AMOVC,20H;将位寻址区中的位地址为20H位内容送PSW中的Cy中。
片内RAM(20H-2FH)中的位寻址区结构图,2FH,20H,字节地址,返回,24H,位地址,返回前一次,2.2.3立即寻址,指令本身直接含有所需要的8位或16位的操作数。
将此数称为“立即数”(使用#标明)。
如:
MOVA,#30H;将(8位)立即数送累加器AMOVDPTR,#2000H;16位立即数送DPTR积存器【注意】:
MOVA,#30HMOVA,30H两者的区别。
立即数寻址的指令长度为2或3个字节。
n,n+1,ROM,累加器A,MOVA,#30H指令执行流程,ROM,DPTR,MOVDPTR,#2000H指令的存储和执行,返回,2.2.4寄存器间接寻址,指令中含有保存操作数地址的寄存器Ri。
MOVA,Ri(i=0、1)CPU首先根据指令中寄存器名Ri找到操作数地址,然后再从该地址中找到操作数x。
如:
MOVR0,#30H;立即数送R0寄存器MOVA,R0;从RAM的H单元取数送累加器A【注意】MOVA,R0和MOVA,R0指令的区别。
30H,R0,00H,累加器A,1,2,3,使用寄存器间址指令时应注意的三个问题:
1,间址寄存器Ri只能使用R0、R1寄存器(i=0、1)。
2,间址方式不仅用于片内RAM,同样也适用于片外RAM。
对于片内RAM使用Ri寄存器,寻址范围为00HFFH。
对于片外RAM,可以使用Ri,也可以使用DPTR做间址寄存器。
两者区别在于后者寻址范围为0000HFFFFH,两者都可以RAM和ROM。
3,间址方式的指令不能访问SFR中的单元。
如下面的程序是错误的:
MOVR1,#80HMOVA,R1(因为80H为SFR的物理地址),MCS-51片内、片外数据存储器示意图,特殊功能寄存器SFR,通用数据存储器,80H7FH,00H,FFH,片内数据存储器片外数据存储器256B个字节64KB个字节,片外数据存储器64KB,0000H,FFFFH,注意:
1,访问片内RAM20H存储单元;MOVA,20H2,访问片外RAM存储单元;MOVR0,#20HMOVXA,R03,尽管片内与片外的RAM单元的00H-FFH地址相重叠但由于指令的不同不会发生地址混乱。
返回,2.2.5变址寻址,指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,其和作为操作数地址。
如:
MOVXA,A+PC;PC内容与A的内容相加得操作数地址并将此操作数送AMOVXA,A+DPTR;DPTR内容与A的内容相加得操作数地址并将此操作数送A使用变址指令时,要事先分别为A、DPTR赋值,以便获得操作数得地址。
变址指令只适用于对ROM存储器得访问,如查表等。
【举例】:
已知ROM中0302H单元有一个数x,现要把它送到累加器A中,试编程。
MOVDPTR,#0300H;立即数送DPTRMOVA,#02H;立即数送累加器AMOVCA,A+DPTR;从ROM的00302单元取数送A,变址寻址示意图,02H,0300H,ALU,0302H,累加器A,DPTR,0300H+02H0302H,MOVCA,A+DPTR,返回,2.2.6相对寻址,转移指令中使用的一种寻址方式。
MCS-51单片机的指令系统中,有两类转移指令:
相对转移(2个或3个字节)绝对转移(3个字节)。
在绝对转移指令中,指令直接给出转移的目标地址(2字节地址),执行时将目标地址直接送给PC,从而控制程序转移;而相对转移指令在执行中是将PC值与指令中的8位偏移量进行相加,形成指令要转移的目标地址。
SJMPrel由指令中有一个8位偏移量rel为带符号位的补码,所以控制程序转移的范围为+127-128。
54H,2002H,ALU,2056H,累加器A,PC,2002H+54H2056H,操作码,偏移量,例如:
SJMP54H;(80H、54H),2000H,2002H,(LOOP1),相对寻址使用中应注意的问题,与绝对寻址相比,相对寻址具有很好的“浮动性”,因此是编程人员普遍使用的一种寻址方式。
使用时,要注意3点:
1,CPU进行地址计算时,PC取值是执行本指令后的地址值。
以上面的例子说明:
指令本身的首地址是2000H,执行完后变为2002H(既下一条指令的首地址)。
如果使用三字节的相对转移指令,则PC=PC+3。
返回上一页,2,偏移量的计算:
rel=目标地址-源地址-2(2字节指令)或:
rel=目标地址-源地址-3(3字节指令)结果用补码的形式书写。
为了减少计算偏移量的计算,汇编程序允许使用“符号地址”的方式代替偏移量。
如:
SJMPloop1汇编程序在翻译时,自动计算并将结果替换符号地址。
3,如果转移地址的范围超过相对寻址的范围(如:
-127+128)时,就要采用别的方式法,否则在编译时,提示出错。
返回,2.2.7位寻址,在位寻址指令(位操作指令)中使用的位地址。
在一般的情况下,系统的数据都是按字节(8位)来存放、处理。
单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。
这些开关量信号以bit-“位”的形式进行各种运算、处理和存储的。
MCS-51单片机控制、检测系统,驱动器,电动机,外设1,外设2,状态信号,状态信号,控制信号,在MCS-51单片机的硬件设计上充分考虑了这种“布尔”变量的处理,不仅在指令系统中设计了“位操作”指令,而且在片内RAM区中还专门开辟了一个“位寻址区”。
这样,布尔变量可以向字节数据一样进行存储、寻址。
除了位寻址区外,RAM中的大多SFR都可以按位寻址,换句话,SFR除了有自己的字节地址外,在寄存器内的每一位还有其位地址。
【举例】:
SETB20H;将位地址为20H的位置一SETB90H;将P1口的d0位置一同字节寻址中的直接寻址一样,为了增加程序的可读性,凡在SFR中的位地址都可以使用符号地址来替代。
如第二例中,完全可以使用下面的指令格式:
MOVP1.0;将P0口的d0位置一类似还有:
MOVC,ACC.7;将累加器中的d7位送PSW的cy这种指令在汇编程序进行翻译时,还是要先将符号地址转换为真正的位地址。
返回,2.3数据传送指令,2.3.0传送指令的特点2.3.1内部数据传送类指令2.3.2外部数据传送类指令2.3.3堆栈操作指令2.3.4数据交换指令,继续,数据传送是编程中使用最多、最主要的操作。
它的功能是将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。
在传送类指令中,必须指定被传送数据的源地址和目标地址。
在传送过程中,源地址的内容不被改变。
传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。
【举例】:
MOVA,R0;将R0寄存器中的数据送累加器A中(注意寻址方式),指令通式:
MOV,2.3.0传送指令的特点,返回,2.3.1内部数据传送类指令,特点:
指令的源操作数和目的操作数都在单片机内部。
1,立即寻址型传送指令,2,直接寻址型传送指令,3,寄存器寻址型传送指令,4,寄存器间址型传送指令,5,内部数据传送类指令的使用,继续,1,立即寻址型传送指令,【特点】:
原操作数字节是立即数,处在指令的第二或第三字节,所以这类指令都是多字节指令。
这类指令有如下4条。
MOVA,#data;Adata(双字节指令)MOVRn,#data;Rndata(双字节指令)MOVRi,#data;(Ri)data(双字节指令)MOVdirect,#data;directdata(三字节指令)这类指令多用于程序的初始化。
如:
MOVR0,#20HMOVA,#00H,立即寻址指令举例,已知:
R0=20H,试问单片机执行如下指令后,累加器A、R7、20H和21H单元中的内容是什么。
MOVA,#18H;立即数18H送累加器AMOVR7,#28H;立即数28H送寄存器R7MOVR0,#38H;立即数38H送内存20H单元MOV21H,#48H;立即数48H送内存21H单元,返回,2,直接寻址型传送指令,【特点】:
指令中至少含有一个源操作数或目的操作数的地址。
很明显,这也是2个或3个字节的指令格式,其中直接地址在第2或第3个字节上。
这类指令有如下5条:
MOVA,directMOVdirect,AMOVRn,directMOVRi,directMOVdirect2,direct1【注意】:
direct为内部寄存器、RAM和SFR的地址,换句话说:
direct适用于片内所有的地址(寄存器、SFR和RAM)。
直接寻址指令举例,MOVA,30H;内存RAM30h单元数据送AMOV50H,A;A中内容送RAM的50h单元MOVR6,31H;RAM的30h内容送R6寄存器MOVRi,30H;RAM30h内容送Ri指定的RAM单元MOVP1,32H;RAM32h内容送P1口(p1:
符号地址)MOV90H,32H;(同上,试比较两种表示方法),返回,3,寄存器寻址型传送指令,指令中含有存放操作数的寄存器名Rn其中(n0,1,2,3,4,5,6,7)。
共有如下三条:
MOVA,RnMOVRn,AMOVdirect,Rn,返回,4,寄存器间接寻址型传送指令,指令特点:
指令中Ri中存放的不是操作数本身,而是操作数在RAM中的地址(i=0、1)。
格式如下:
MOVA,RiMOVRi,AMOVdirect,Ri【注意】;Ri中存放操作数的地址是有所选择的,只有非SFR的RAM单元才能使用这种寻址方式。
寄存器间接寻址指令举例,已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。
试问,下面的指令执行后,累加器A、40h、41h和42h单元中的内容是什么。
MOVA,R0;RAM40h单元内容11h送AMOVR1,A;A中的11h送RAM的41h单元MOV42H,R1;RAM的41h单元内容11h送RAM42h中,返回,5,内部数据传送类指令的使用,1,在使用传送指令时,可以根据实际情况选用恰当寻址方式。
上面给出的各种类型的传送指令是INTEL公司在设计MCS-51的硬件时就已经确定下来。
编程人员只能像查字典一样去查找、使用。
不能根据主观意愿去“创造”指令。
例如:
要将R0中的数据传送到R1中。
如何使用指令去完成上面的操作?
movr1,r0是否可以?
回答是否定的!
因为在MCS-51的指令系统中没有此条指令!
只能使用:
1,mova,r0或:
2,mov01h,00hmovr1,a因此,必须从MCS-51的指令表中选择使用指令。
MCS-51内部数据传送类指令方式图,累加器A,direct直接寻址,Ri间址,Rn寄存器,Data立即数,返回上一次,2,以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P,而其余的指令对PSW均无影响。
3,要会正确地估计指令的字节。
凡是指令中包含有立即数、直接地址的指令,都应当在原有的基础上加1。
【举例】:
mova,Ri()个字节mova,direct()个字节movdirect,data()个字节movdirect2,direct1()个字节,4,对于同一问题可以有不同的编程方法。
使用不同的方法虽然都可以实现题目的要求,但从指令长度、运行时间和可阅读性上等综合因素考虑,不同的方法就有合理和不合理、优化和繁杂之分。
所以,在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。
5,注意给程序进行正确的注释,这对于阅读、编写和修改程序都是非常重要的。
下面就是一些注释的例子:
MOVA,30H;(30h)AMOVA,R0;R0AMOV40H,30H;(30h)40hMOVA,Ri;(Ri)A,内部传送类指令举例,试编出把30h和40h单元内容进行交换。
MOVA,30H;(30h)AMOV30H,40H;(40h)30hMOV40H,A;A40h,累加器A,30H,40H,返回,2.3.2外部数据传送类指令,1,16位数传送指令,2,外部ROM的字节传送,3,外部RAM的字节传送指令,继续,1,16位数传送指令,MCS-51指令系统中唯一的一条16位数据传送类指令。
MOVDPTR,#data16DPTR是单片机内部SFR中的两个寄存器DPH、DPL组合而成。
其中DPH为高八位,DPL为低八位。
DPTR是一个专门用于访问外部存储器的间址寄存器。
寻址能力为64K(065535)。
返回,2,外部ROM的字节传送指令,这类指令有两条,都属于变址寻址指令。
MOVCA,A+DPTR;A(A+DPTR)MOVCA,A+PC;PCPC+1,A(A+PC)该指令也称为“查表”指令。
在ROM中建立一个数据表,可以使用DPTR、PC作为数据表格的基地址。
在第一条指令中:
用DPTR作为基地址。
使用前,先将数据表的首地址送入DPTR中,累加器A作为偏移量。
由两者数据相加得到待查的表中数据地址并取出。
第二条指令是以程序计数器PC为基地址。
由于PC的内容与该指令在ROM中的位置有关,所以一旦该指令在程序中的位置确定,其PC的值也就确定。
外部ROM的字节传送指令举例,已知累加器A中存有09范围内的数,试用查表指令编写出查找出该数平方的程序。
1,采用DPTR作基址寄存器:
设平方表的首地址为2000h,累加器A中的内容恰好是查表的偏移量。
首先将表的起始地址2000h送入DPTR中。
MOVDPTR,#2000H;指针赋值MOVCA,A+DPTR;平方值送A,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,2,采用PC作基址寄存器:
与DPTR不同,使用PC作为基地址时,必须对累加器A的数据进行修正,以保证a+pc恰好找到待查的平方值地址。
ORG1FFBH1FFBH74dataADDA,#data;data=02h1FFDH83HMOVCA,A+PC;PC=1FFE1FFEH80FEHSJMP$2000H00HDB0;平房表首址2001H01HDB12002H04HDB42003H09HDB92004H10HDB162005H19HDB25:
2009H51HDB81ENDdata为MOVC指令首地址与表头地址之间的单元数。
2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,1FFFh,1FFEh,1FFDh,1FFCh,1FFBh,返回,3,外部RAM的字节传送指令,实现外部RAM和累加器A之间的数据传送。
只有寄存器间接寻址的指令。
MOVXA,Ri使用Ri寄存器间址寻址范围0255hMOVXRi,A在硬件电路中P0口输出8位地址数据。
MOVXA,DPTR使用DPTR间址,寻址范围065535hMOVXDPTR,A在硬件电路中,使用P0口输出低8位,P2口输出高8位外部RAM地址。
外部RAM的字节传送指令举例,已知外部RAM的88H单元有一个数x,试编程将x送外部RAM的1818H单元。
【解】:
外部RAM中的数据是不能直接传送的,因此必须使用两次MOVX指令完成此操作。
ORG2000HMOVR0,#88H;为8位指针赋值MOVDPTR,#1818H;为16位指针赋值MOVXA,R0;取x到累加器AMOVXDPTR,A;x送RAM的1818h单元SJMP$;停机END,返回,2.3.3堆栈操作指令,堆栈操作是一种特殊的数据传送指令。
堆栈:
一个用来保存程序断点、数据的特殊的存储区域。
在MCS-51单片机中,栈区是占用片内RAM的存储空间,具体栈位置由指针SP来确定(系统上电时,SP=07h)。
1,进栈操作:
pushdirect;sp+1sp,(direct)(sp)2,出栈操作:
popdirect;(sp)(direct),sp-1sp【注意】:
寻址方式为直接寻址,所以pusha是错误的,应当是pushacc或push0e0h,同理:
pushr0也是错误的。
进栈是堆栈向上“生长”的过程,即sp+1;出栈则相反。
系统上电时,sp=07h。
SP的值可以根据需要进行修改,以适应具体编程的需要。
在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。
堆栈操
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 学习 资料