MCS-51单片机的指令系统PPT课件_第1页
MCS-51单片机的指令系统PPT课件_第2页
MCS-51单片机的指令系统PPT课件_第3页
MCS-51单片机的指令系统PPT课件_第4页
MCS-51单片机的指令系统PPT课件_第5页
已阅读5页,还剩196页未读 继续免费阅读

下载本文档

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

文档简介

.,第二章MCS-51单片机的指令系统和时序,本章内容:指令的格式;指令的功能;指令在执行时所包含的操作;指令的长度、执行时间。,.,本章目录:,2.0震荡器、时钟电路和CPU的时序2.1指令系统概述2.2寻址方式2.3数据传送指令2.4算逻运算和移位指令2.5控制转移和位操作指令2.6位操作指令2.7汇编语言的构成及伪指令,.,MCS-51内部有一个高增益反相放大器.在单片机引脚的XTAL1和XTAL2分别是此放大器的输入和输出端.与作为反馈元件的晶体一起构成了一个自激震荡器。如果使用外部震荡器信号,其外来的信号加在XTAL1的引脚上。,XTAL1,XTAL2,XTAL2XTAL1,NC,外时钟,使用外时钟时的电路连接,3.1.1震荡器、与时钟电路:,20P,20P,.,3.1.2MCS-51单片机的时序,关于时序的基本概念:时序:CPU执行指令时所需控制信号的时间顺序。时序图中时间参数的描述:时钟周期;机器周期;指令周期。,返回,.,时钟周期T:时序中最小的时间单位,由外接晶体或外输入时钟来决定。其值为石英振荡器频率fosc的倒数。例如:在单片机外接12MH的晶体,则单片机的系统时钟的频率为12M,时钟周期为1/12s.,T,.,机器周期:完成特定功能所需要的时间。机器周期由12个时钟周期构成,为了描述方便将其分6个状态(S1-S6),每个状态又分为P1和P2两拍。既:S1P1,S1P2,S2P1,S2P2,S3P1,S3P2S6P1,S6P2一种描述时序图时间参数的定标方法,T,S2,S6,S5,S4,S3,机器周期,P1,S1,P2,.,指令周期:既执行一条指令所需要的时间,它是时序图中最大的时间单位。在MCS-51系统中,不同的指令它所包含的机器周期数不同.它们分别是:1,单机器周期指令;2,双机器周期指令;3,四机器周期指令。,.,假设:我们使用一个12M的晶体震荡器,那么一个机器周期为:1/12s121=1s;两个机器周期为:1/12s122=2s;四个机器周期为:1/12s124=4s。可见指令的运算速度与它所包含的机器周期数有关.机器周期数越少,执行的速度就越快。(MCS-51单片机的指令系统除了乘、除法指令为四个机器周期外,其余都是单周期和双周期指令),.,指令的字节数:MCS-51单片机的指令系统有:单字节(占用1个ROM存储单元1个字节);双字节(占用2个ROM存储单元2个字节);三字节指令(占用3个ROM存储单元3个字节)。,返回,ROM,ROM,ROM,单字节指令,双字节指令,三字节指令,.,问题:,指令的字节数与指令执行的时间是什么关系?指令的字节数越多,其执行的时间就越长?指令的字节数越少,执行就越快?要回答此问题,只能从指令执行的时序中寻找答案,.,指令特点:在程序存储器ROM中仅占一个存储单元。在ALE第一次有效(S2P1)时,从ROM中读取指令的操作码,送入指令寄存器IR中并译码执行。在ALE第二次有效时,封锁PC加一,使第二次读数无效。,(一)单字节单周期指令的时序,机器周期,读操作码一,读操作无效,ALE,返回,S1,S2,S6,S5,S4,S3,.,【注意】:每一个机器周期出现两次ALE信号;ALE信号对应这从ROM中读指令。所以在一个机器周期中CPU可以完成两次取指操作;3.对于单字节单周期的指令,CPU通过译码后封死PC,取消第二次取指(实际上指令的后半部不做任何工作)。,.,指令特点:指令长度为两个字节,并存储在ROM相邻的两个单元中。要想完整的将这样的指令执行完,必须从ROM中读两次操作码。,OP2-2,OP2-1,n+1n,程序ROM,PC,(二)双字节单周期指令时序,返回,.,在ALE第一次有效时,CPU从ROM的n单元中取出指令的第一个字节OP2-1,并送入IR译码,通过译码CPU知道这是一条双字节指令,所以使PC加一,指向n+1单元;在ALE第二次有效时,从ROM的n+1单元取出指令的第二个字节OP2-2送入IR进行译码,并产生对应的操作,最后在S6P2时完成本条指令的运行。,S1,S2,S6,S5,S4,S3,机器周期,读操作码一,读操作码二,ALE,OP2-2,OP2-1,n+1n,程序ROM,PC,.,指令特点:单字节,却需要两个机器周期运行。如:INCDPTRDPTR为两个8位的寄存器,加一时,必须分两步完成.既第一步DPL加一,如果DPL加一有进位则还要进行第二步对DPH加一.参见教科书:502页附表。,(三)单字节双周期指令的时序,返回,.,在指令周期的第一个ALE时,将ROM中的操作码OP取出,经IR译码后得知为单字节双周期指令。所以一面执行该指令,同时封锁后面三次ALE有效时的PC+1,在第二个机器周期的S6P2时,完成操作。,S1,S2,S6,S5,S4,S3,机器周期1,读操作码,读无效,S1,S2,S6,S5,S4,S3,读无效,读无效,机器周期2,ALE,.,小结,在MCS-51的111条指令中,可以分为六种基本的时序:1,单字节单周期指令;4,双字节单周期指令;2,单字节双周期指令;5,双字节双周期指令;3,单字节四周期指令;6,三字节双周期指令.,返回,.,2.1MCS-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)特点:直接存储在程序存储器ROM中、被CPU直接识别、运行的指令形式,也称机器码。缺点:不便于人工阅读、记忆和调试修改。,2.1.2指令的三种表示形式,.,2,十六进制表示方式:它是对二进制形式的一种简化。00100100B24H00001000B08H在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。但是,这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的“机器码”后存入程序存储器并运行。,二进制表示的形式十六进制表示的形式,.,3,指令的“助记符”方式(“汇编格式”):00100100B24H00001000B08HADDA,#08H一种由英文单词或字母、数字来表征指令功能的形式。便于阅读、书写和交流;这种“汇编”格式的指令必须把它“翻译”为二进制形式“机器码”后才能为CPU所识别和执行;编程者首先使用汇编格式书写“汇编语言源程序”,然后借助于汇编程序将其“编译”为二进制机器码并送入到单片机ROM单元中并由CPU执行。,二进制表示形式十六进制表示汇编格式,返回,.,2.1.3指令的字节数,在指令系统中,因寻址方式不同,指令在程序存储器ROM中所占字节数也各不相同。分为单字节、双字节和三字节。单字节指令(49条):分无操作数、有操作数两种。无操作数:如INCDPTR10100011BINCA00000100B【特点】:操作数隐含在操作码中。含有操作数寄存器名称的单字节指令:如:MOVA,R011101000BMOVA,R111101001B【特点】:寄存器名以三位数代码的形式在指令的后三位。,.,双字节指令(46条):分两种情况:指令中含有一个操作数.例如:汇编格式:MOVA,#data机器码:01110100Bdata或:78H、#data,n,n+1,mova,#data,双字节指令在程序存储器的存放示意图,8位的操作数,.,指令中含有一个8位的操作数的地址。汇编格式:MOVA,direct机器码:E5H、direct如:MOVA,20H;将RAM20H中的数据送A,n,n+1,mova,direct,8位的RAM地址,.,三字节指令(16条):指令中的操作数为双字节。MOVDPTR,#data161001000B,data15-8,data7-0指令中分别包含1个字节的操作数和1个字节的操作数地址。MOVdirect,#data举例:MOV20H,#0FFH,MOVdptr,#data16,MOVdirect,#data,三字节指令在存储器中存放的方式示意图,.,指令的字节数与指令的运行时间,指令的字节多是否意味着指令周期就长?,从表中可见,指令的字节数与指令周期不是对等的关系,返回,.,2.1.4指令的分类,按照指令的功能,可将111条指令分为五大类1,数据传送类指令2,算术运算指令3,逻辑操作和循环移位指令4,控制转移类指令5,位操作指令,.,1,数据传送类指令:完成数据的传送。【特点】:有8位、16位两种传送指令;除了以累加器A为目标的传送对奇偶位PSW.P有影响外,其余的传送类指令对PSW无影响。,.,2,算术运算指令:用于操作数的加、减、乘除运算。【特点】:多数情况下:操作数之一在累加器A中,结果也保留在A中,运算结果要影响PSW(进位标志、奇偶和溢出标志等)。,.,3,逻辑操作和循环移位指令:操作数之间的逻辑加、与、取反和异或等操作。【特点】:多数情况下一个操作数在A中,结果也存于A。移位指令分为左移、右移和带进位和不带进位几种情况。逻辑类指令基本不影响PSW的内容。,.,4,控制转移类指令:无条件转移;条件转移;调用和返回。【特点】:通过修改程序指针PC的内容,使CPU发生转移,从而改变程序的流向。这也是唯一一种间接修改程序指针PC的指令。,.,5,位操作指令:位传送:类似于字节传送,对bit进行传送。位置位/复位:对某一位置一或清零。位运算:对某一位进行逻辑与、或、取反等。位控条件转移:对某一位的状态进行判断,满足条件转移。【特点】:按位操作。指令中所涉及到的地址皆为“位地址”。这类指令基本不影响PSW的内容。,继续,.,2.2寻址方式,在指令的操作数位置上,用于表征、寻找操作数的方法定义为“寻址方式”。正确的理解、掌握寻址方式,是学习、使用指令的关键。在MCS-51单片机中,共使用了七种寻址方式。,继续,.,1,寄存器寻址2,直接寻址3,立即数寻址4,寄存器间接寻址5,变址寻址;6,相对寻址;7,位寻址。,七种寻址方式,.,2.2.1寄存器寻址,指令中含有一个存有操作数的寄存器Rn(n=07)MOVA,Rn,返回,.,例如:MOVA,R7;将寄存器R7中的内容送累加器A中MOV20H,R0;将寄存器R0中的数据送内存20H单元【特点】:寄存器寻址方式的指令大多是单字节指令。寄存器的3位代码与操作码OP共同占用一个指令字节。以MOVA,R7为例,使用R7寄存器,所以rrr=111,既指令的机器码为:0EFH,11101rrr,操作码OP,寄存器代码111,E8HEFH,MOVA,R7,ROM的一个字节,.,2.2.2直接寻址,指令本身直接给出操作数在RAM中的地址。MOVA,direct其中:direct为8位的RAM地址如:MOVA,30H;将RAM30H单元数据送累加器A,.,如: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赋初值应当注意:在编译时,汇编程序要先将寄存器名字转换为直接地址,然后再翻译成机器码。,.,2,当直接地址时在工作寄存器区中时,可以使用两种寻址方式来访问(参见57页)。如: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立即寻址,指令中直接含有所需要的操作数data。MOVA,#datadata称为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(i=0、1)MOVA,RiCPU首先从Ri找到操作数地址,然后再从该地址中找到操作数x。,.,MOVR0,#30H;立即数送R0寄存器MOVA,R0;从RAM的30H单元取数送累加器A【注意】MOVA,R0和MOVA,R0指令的区别。,30H,R0,00H,累加器A,1,2,3,.,使用间接寻址时应注意的几个问题:,使用间址指令前,往往要事先为间址寄存器Ri赋初值;只能使用R0、R1作间址寄存器,即Ri(i=0、1)。,.,间址可访问片内RAM,也是访问片外RAM唯一的方式。对于片内RAM使用Ri寄存器,寻址范围00HFFH;MOVA,Ri访问内部RAM单元对片外RAM可以:使用Ri。寻址范围为00HFFH(256字节);使用DPTR做间址寄存器。寻址范围为0000HFFFFH(64K)。MOVXA,Ri;访问外RAM单元,范围256字节MOVXA,DPTR;访问外RAM单元,范围64K字节【注意】:Ri、DPTR应事先装入地址。,.,间址方式不能访问SFR单元。如下面的程序是错误的:MOVR1,#80HMOVA,R1因为80H为SFR的物理地址对于SFR只能采用直接寻址的方式访问。,.,MCS-51片内、片外数据存储器示意图,特殊功能寄存器SFR,通用数据存储器,80H7FH,00H,FFH,片内数据存储器片外数据存储器256B个字节64KB个字节,片外数据存储器RAM64KB,0000H,FFFFH,注意:1,访问片内RAM20H存储单元;MOVA,20H2,访问片外RAM存储单元;MOVR0,#20HMOVXA,R03,尽管片内与片外的RAM单元的00H-FFH地址相重叠但由于指令的不同不会发生地址混乱。,返回,.,2.2.5变址寻址,指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,其和作为操作数地址。如:MOVCA,A+PC;PC内容为基地址与A的内容相加得操作数地址,并将此操作数送AMOVCA,A+DPTR;DPTR内容为基地址与A的内容相加得操作数地址并将此操作数送A这是访问程序存储器ROM中数据的唯一的寻址方式。,.,变址寻址方式用于查表操作,而数据表是建立在程序存储器ROM中。【举例】:已知ROM中的0300H-0309H为09的平方表,试编程,求A中数据的平方(设A=02H)。MOVDPTR,#0300H;指针DPTR赋表头地址MOVCA,A+DPTR;从0302H单元取数4送A这里,DPTR提供平方表的基地址,A的内容为偏移量。,.,变址寻址示意图,02H,0300H,ALU,0302H,累加器A,DPTR,0300H(DPTR)+02H(A)0302H,MOVCA,A+DPTR,返回,0300H,ROM,平方表,.,2.2.6相对寻址,转移指令使用的一种寻址方式。MCS-51单片机的指令系统中,有两类转移指令:相对转移(2个或3个字节);绝对转移(3个字节)。在绝对转移指令中,指令直接给出转移的目标地址(2字节地址)如:LJMP0100H,(即0100HPC);而相对转移指令中给出一个转移地址的偏移量rel。在执行中将当前PC值与偏移量rel(补码)相加,形成实际转移的目标地址。SJMPrel如:SJMP03H执行的操作是:PC+03HPC即用rel修改PC值实现转移。,.,03H,2002H,ALU,2005H,累加器A,PC,2002H+03H2005H,操作码,偏移量,例如:SJMP03H(机器码80H、03H),2000H,2002H,当前PC值,LOOP,由于偏移量rel为带符号的8位补码,所以控制程序转移的范围为+127-128。,.,相对寻址使用中应注意的问题,与绝对寻址相比,相对寻址具有很好的“浮动性”,因此是编程人员普遍使用的一种寻址方式。使用时,要注意3点:CPU进行地址计算时,PC取值是执行本条转移指令后的地址值。以上面的例子说明:指令本身的首地址是2000H,执行完后变为2002H(因为本条转移指令长度为2)。即PC+2+relPC(PC=2005H)如果使用三字节的相对转移指令,则PC=PC+3+rel。,返回上一页,.,偏移量的计算:rel=目标地址-源地址-2(2字节相对转移指令)或:rel=目标地址-源地址-3(3字节相对转移指令)结果用补码的形式书写。为了减少计算量,汇编程序允许使用“符号地址”代替偏移量。如:SJMPloop1汇编程序在汇编时,自动计算rel,并将结果进行替换。如果转移地址超过相对寻址的范围(-127+128)时,在编译时系统会提示出错。这是编程者常见到问题。,.,绝对转移和相对转移的指令(部分),绝对转移:LJMPaddr16如:LJMP2000H;三个字节(OP、addH、addrL)LCALL2100H;子程序长调用相对转移:SJMPrel;无条件短转移DJNZRn,rel;Rn-1Rn,Rn0则转JZrel;A=0则转(二字节)JNZrel;A0则转(二字节)CJNEA,#data,rel;Adata转(三字节),返回,.,2.2.7位寻址,指令的形式同直接寻址相似,不同的是:指令中的地址是“位地址”(参见57页),而不是字节地址。MOVC,bit如:MOVC,20H;将为地址为20H中的内容送Cy中。类似的还有逻辑运算指令等。,.,作为嵌入式控制器,CPU更多的是处理“开关量”而不单纯是字节结构的数据。因此MCS-51在指令设计上刻意设计了大量的“布尔操作”即位操作,这为系统应用带来了很大的方便。,MCS-51单片机控制、检测系统,驱动器,电动机,外设1,外设2,状态信号,状态信号,控制信号,.,在MCS-51的硬件设计中,在片内RAM区中还专门开辟了一个“位寻址区”。布尔变量可以按位进行存储操作。除了RAM中的位寻址区外,大多SFR(地址能够被8整除的)都可以按位寻址,这对编程尤为重要。(参见59页),.,【举例】:SETB90H;将P1口的D0位置一为了增加程序的可读性,凡在SFR中的位地址都可以使用符号来替代。如本例中,完全可以使用下面的指令格式:SETBP1.0;将P0口的的D0位置一又如:SETBEA(SETB0AFH);开中断SETBTR0(SETB8CH);启动定时器这种指令在编译时,是要先将符号地址进行转换的。,继续,.,2.3数据传送指令,2.3.0传送指令的特点2.3.1内部数据传送类指令2.3.2外部数据传送类指令2.3.3堆栈操作指令2.3.4数据交换指令,继续,.,数据传送是编程中使用最多、最主要的操作。传送分为:单片机内部各单元之间的内部数据传送;单片机内部与外部之间的外部数据传送。在指令中,必须指定被传送数据的源地址和目标地址。在传送过程中,源地址的内容不被改变(COPY)。传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。,2.3.0传送指令的特点,.,【举例】:MOVA,R0;将R0寄存器中的数据送累加器A中(注意寻址方式),指令通式:MOV,返回,由右向左传送,.,2.3.1内部数据传送类指令,特点:指令的源操作数和目的操作数都在单片机内部。按照寻址方式进行分类:,1,立即寻址型传送指令,2,直接寻址型传送指令,3,寄存器寻址型传送指令,4,寄存器间址型传送指令,5,内部数据传送类指令的使用,继续,.,1,立即寻址型传送指令,【特点】:原操作数是立即数,处在指令的第二或第三字节,所以这类指令都是多字节指令,有如下4条。MOVA,#data;Adata(双字节指令)MOVRn,#data;Rndata(双字节指令)MOVRi,#data;(Ri)data(双字节指令)MOVdirect,#data;directdata(三字节指令)这类指令多用于程序的初始化。如:MOVR0,#20H;R0#20HMOVA,#00H;累加器A清零,.,立即寻址指令举例,已知: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、RAM的40h、41h和42h单元中的内容是什么。MOVA,R0;RAM40h单元内容11h送AMOVR1,A;A中的11h送RAM的41h单元MOV42H,R1;RAM的41h单元内容11h送RAM42h中,返回,.,5,内部数据传送类指令的使用,1,不能根据主观意愿去“创造”指令。例如:要将R0中的数据传送到R1中。如何使用指令去完成上面的操作?MOVR1,R0是否可以?回答是否定的!因为在MCS-51的指令系统中没有此条指令!只能使用:MOVA,R0或:MOV01h,00hMOVR1,A因此,必须从MCS-51的指令表中选择使用指令。,.,MCS-51内部数据传送类指令方式图,累加器A,direct直接寻址,Ri间址,Rn寄存器,Data立即数,返回上一次,.,2,以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P,而其余的指令对PSW均无影响。3,会正确地估计指令的字节。凡是包含有立即数、直接地址的指令,都应当在原有的基础上加1或2。【举例】: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单元地址由A和DPTR或PC内容相加获得。该指令称为“查表”指令。前者用DPTR作为基地址。使用前先将数据表的首地址送入DPTR中,累加器A的内容作为查表偏移量。两者相加得到表中数据地址并取出送A。后者是以程序计数器PC为基地址。由于PC的内容与该指令在ROM中的位置有关,并且PC的值是不能随便修改的,所以选择PC作基地址时,往往要通过累加器A进行“查表修正”。,.,举例:,已知累加器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作基址寄存器: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,通过A进行修正,.,使用MOVCA,A+PC指令的特点:程序与数据表在ROM中的位置是可以浮动的。只要MOVC指令与表之间的距离不变,则程序可以在ROM中的任意位置上“浮动”,程序具有可修改性;节省DPTR寄存器;与使用MOVCA,A+DPTR指令不同,使用前应当对A中的偏移量加以个“修正值”,修正值的大小为:MOVC指令与表头之间的字节数;,返回,.,设:单片机使用片外ROM,且要执行的是一条:movca,a+dptr指令.(设a+dptr=2000H),/PSENP2口MCS-51P0口ALE,D7D0CP,/CSA15A864KROMA7A0D0D7,A15-A8(PC),A7-A0,OP,A7-A0,常数,/Psen,P2口,P0口,访问外部程序存储器ROM的时序:,S1,S2,S6,S5,S4,S3,ALE,A15-A8(DPTR+A),返回前一次,74LS373,P0口输出低8位地址,P2口输出高8位地址,.,1,在S2P1时刻,P2口输出外部ROM的高八位地址A15-A8,P0口输出低八位地址A7-A0,这时地址是由程序计数器PC提供的ROM中的指令地址;2,在ALE的下降沿,P0口的数据(低八位地址)被锁存到74LS373中。3,在S3P2到S4P1期间,/psen变低电平时,外部程序ROM被选中,ROM输出端的三态门被打开,被选中单元中的指令movca,a+dptr送到P0口上,且在S4P2时指令经P0口送至CPU的IR中。,返回上一页,返回,.,4,CPU对指令译码后,在S4P2时进行常数地址计算并由P0、P2口输出(P0口输出低8位地址00H;P2口输出地址高八位20H)。5,在S5P2时,ALE将常数地址的低八位00H锁存;6,在S6P1时,/psen=0,外部ROM被再次选中打开,按照单片机所提供的16位地址,将外部ROM中的常数经P0口在S6P2时刻送入累加器A。,.,A15-A8(PC),A7-A0,OP,A7-A0,常数,/Psen,P2口,P0口,S1,S2,S6,S5,S4,S3,ALE,A15-A8(DPTR+A),取外部ROM中的指令,执行指令(取常数),MOVCA,A+DPTR指令执行的两个步骤,.,3,外部RAM的字节传送指令,实现外部RAM和累加器A之间的数据传送。只能使用寄存器间址的寻址方式。在MOVX指令模式下,单片机的P0、P2口做访问外部数据的地址和数据的总线。其中:P0口做低8位地址和数据的复用总线;P2口做高8位地址总线。MOVXA,Ri使用Ri寄存器间址寻址范围0255hMOVXRi,A在硬件电路中P2口不用。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,返回,.,设外部RAM2000H单元中有一个数x,且DPTR中已存有该数地址2000H.则CPU执行外部ROM中的指令:MOVXA,DPTR;将外RAM的x送A,/WR/RDP2口MCS-51P1口ALE,D7D0/CP,/WR/RDA15A8A7A064KRAMD0D7,S1,S2,S6,S5,S4,S3,S1,S2,S6,S5,S4,S3,ALE,Psen,A15-A8(PC),A15-A8(DPH),A7-A0,指令,A7-A0,数据,RD,P2口,P0口,选中外部RAM,读外部数据存储器RAM的指令时序,返回前一次,.,1,在S2P2时,ALE的第一个下降沿将P0口输出的外程序ROM的低八位地址锁存到74LS373锁存器中;2,在S3P2的Psen为低电平时,选中外ROM,并根据单片机P0、P2口输出的16位地址选中movx指令(单字节),通过P0口送至单片机内部IR中译码.经译码后产生下列的一系列操作;,.,3,CPU将DPTR中的高8位(20H)送P2口输出,低八位(00H)经P0口输出,节在S5P1时ALE第二次下降沿时,将P0口的低八位地址锁存;4,在第二个机器周期的S1-S3中单片机输出/RD信号(低电平),选中外部RAM,并根据单片机提供的2000H这16位地址中取出数据x.5,CPU在S2-S3期间,将外部RAM2000H单元送到P0口上的数据送入累加器A中.,上一页,.,上述过程可以分成两个指行的阶段:1,根据PC所指定的程序存储器的地址,将movx指令从片外ROM中取出;2,经译码后将DPTR提供的外数据存储器RAM中的数据地址取出数据,经P0口送累加器A.控制信号:在第一阶段CPU产生/Psen信号用来选通外部程序存储器ROM;在第二阶段CPU输出/RD信号(低电平),用来选通并读取外部数据存储器RAM的数据.【注意】:CPU在执行MOVX指令时的2个周期中的第2个机器周期缺少一个ALE波形。,.,访问外部存储器指令的特点:,使用MOVX或MOVC指令来访问外部存储器;此时,P0、P2作为地址和数据总线;执行MOVX指令访问RAM时,CPU产生/RD或/WR信号。因此,/RD、/WR应当与外RAM的读、写控制端连接;执行MOVC指令访问ROM时,CPU产生/psen信号来选通外ROM。因此,此信号应当与ROM的片选连接。,.,2.3.3堆栈操作指令,堆栈操作是一种特殊的保护数据的传送指令。堆栈:一个用来保存程序断点、数据的存储区域。在51单片机中,栈区可以使用片内RAM的任意位置,具体由指针SP来确定(系统上电时,SP=07h)。1,进栈操作:PUSHdirect;sp+1sp,(direct)(sp)2,出栈操作:POPdirect;(sp)(direct),sp-1sp,.,堆栈操作指令举例(一),产生延时的子程序delay。org0800hdelay:pushpswpush00hpush01hmovr0,#00hLoop1:movr1,#00hLoop2:djnzr1,loop2djnzr0,loop1pop01hpop00h思考题:为什么R0、R1的poppsw内容要进栈?ret,SP,.,堆栈操作指令举例(二),堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特殊的操作。【举例】:设片内RAM的30h单元存有x,40h单元存有y。试将两个单元内容互换。push30h;x进栈push40h;y进栈pop30h;y送30H单元pop40h;x送40H单元,SP=07h,40h,30h,继续,.,PUSH、POP指令使用的寻址方式为直接寻址,所以pusha是错误的,应当是pushacc或push0e0h,同理:pushr0也是错误的,应当为:push00h。进栈操作是堆栈向上“生长”的过程,即sp+1;出栈则相反。系统上电时,SP=07h。SP的值可以根据需要进行修改,在确定SP值时要考虑对栈区对数据区的影响,以避免两者冲突。如:在程序的初始化时加一条:MOVSP,#60H即将堆栈的起始位置上移到RAM的60H单元。,使用PUSH、POP指令要注意事项,.,2.3.4数据交换指令,为提供一种方便的累加器和寄存器/RAM之间的数据交换。避免了使用mov指令交换时的不便。格式:XCHa,Rn;aRnXCHa,direct;a(direct)XCHa,Ri;a(Ri)XCHDa,Ri;a30(Ri)30低四位交换举例:将R1和R2的内容交换。MOVA,R1;取数据送AXCHA,R0;与R0交换MOVR1,A;送回到R1,.,数据交换指令举例(一),举例:已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程互将两数相交换。movR1,#20h;指针赋初值movxa,R1;xaxcha,R1;交换a(20h),yamovxR1,a;y(20h)片外RAM,(y)x,20h,20h,累加器A,1,2,3,.,数据交换指令举例(二),已知RAM50h单元有一个09范围内的数,试编程将它变成相应的ASCII码。【解】:09的ASCII码是30h39h,两者相差30h。方法一:对50h单元的数据高四位组装一个30h。movr0,#50h;指针赋值mova,#30h;30hAxchda,r0;A30(r0)30,在A中组成ASCII码movr0,a;A中的ASCII送回50h单元,50h,00110101,A=30h,交换后A=35h,1,2,继续,.,2.4算逻运算和移位指令,功能:完成算术运算、逻辑运算和循环移位三大功能。特点:大多指令都要由累加器A来存放一个源操作数,并把操作结果放回累加器A中。,2.4.1:算术运算指令,2.4.2:逻辑运算指令,2.4.3:移位指令,继续,.,2.4.1:算术运算指令,不带进位的加法指令(ADD)1,加法指令:带进位的加法指令(ADC)加1指令(INC)(编程举例)2,减法指令:带进位的减法指令(SUBB)减1指令(DEC)3,十进制调整指令:(DAA)4,乘法和除法指令:(MULDIV),继续,.,加法指令(一):不带进位的加法指令,格式:ADDA,Rn;A+RnAADDA,direct;A+(direct)AADDA,Ri;A+(Ri)AADDA,#data;A+dataA【注意】:1,参加运算的数据都应当是8位的,结果也是8位并影响PSW。2,根据编程者的需要,8位数据可以是无符号数(0255),也可以是有符号数(-127+128)。3,不论编程者使用的数据是有符号数还是无符号数,CPU都将它们视为有符号数(补码)进行运算并影响PSW。,.,不带进位的加法指令举例(一),试分析执行下列指令后累加器A和PSW中各标志的变化。MOVA,#19HCy=0;ADDA,#66HAC=0OV=CPCS=025A=00011001BP=1+102data=01100110B127001111111B1,若两数都是无符号数,则因Cy=0无溢出,25+102=127。2,若两个数是有符号数,则因OV=0无溢出。,cy,000CPCSAC,.,不带进位的加法指令举例(二),试分析执行下列指令后累加器A和PSW中各标志的变化。MOVA,#5AHCy=0;ADDA,#6BHAC=0;OV=CPCS=190A=01011010BP=0+107data=01101011B197011000101BCPCSAC1,若两数是无符号数,因Cy=0无溢出:90+107=1972,若两数是有符号数,因OV=1,故有溢出,两个正数相加后变为负数,很明显结果是不正确的。,.,加法指令(二):带进位的加法指令,格式:ADDCA,Rn;A+Rn+CyAADDCA,direct;A+(direct)+CyAADDCA,Ri;A+(Ri)+CyAADDCA,#data;A+data+CyA【注意】:这里的Cy是指令执行前的Cy;对PSW的影响同ADD指令。,.,加1指令(修改指针专用),格式:INCA;累加器A加一INCRn;Rn+1RnINCdirect;内存单元数据加一INCRi;内存单元数据加一INCDPTR;dptr+1dptr【注意】:1,除了第一条对PSW的P有影响外,其余对PSW均无影响。2,由于上面的原因,INC指令不能作为一般的数据算术运算使用(为什么?),而常用于修改数据指针等控制、循环语句中使用。,返回本节目录,.,编程举例,已知M1、M2单元中存有两个16位无符号数X1、X2(低位在前)。试写出X1+X2,并将结果放入M1、M1+1单元(低8位在M1单元)。设两数之和不会超过16位(65535)。,M1,M1+1,M2,M2+1,返回本节目录,.,【解】:MOVR0,#M1;x1指针赋初值MOVR1,#M2;x2指针赋初值MOVA,R0;取x1低8位送AADDA,R1;x1与x2低8位相加(影响Cy位)MOVR0,a;低8位和送m1单元INCR0INCR1;修改指针MOVA,R0;取x1的高8位送AADDCA,R1;x1与x2的高8位和Cy相加MOVR0,A;结果送M1+1单元,.,减法指令(带进位的减法指令),在MCS-51单片机的指令系统中,只有:带进位的减法SUBB减一DEC两种指令。1减法指令:格式:SUBBA,Rn;ARnCyASUBBA,direct;A(direct)CyASUBBA,Ri;A(Ri)CyASUBBA,#data;AdataCyA,.,使用减法指令要注意的几个问题,1,在单片机内部,减法指令实际上是采用补码的加法实现的。但要判定减法结果编程者可以按二进制减法法则验证。2,无论相减两数是无符号数还是有符号数,减法操作总是按有符号数来处理、影响PSW中相关的标志(详见举例)。3,在MCS-51的指令系统中没有不带Cy的减法,所以在使用SUBB指令前必须使用一条清除Cy的指令:CLRC。,.,减法指令应用举例,试分析执行下列指令后累加器A和PSW中各标志的变化。CLRCMOVA,#52H01010010B=82SUBBA,#0B4H10110100B=-7682a=01010010-76data=10110100158110011110=-62H=-98手工计算CPCSAC101【分析】:CPU的计算得-98,很明显答案是错误的。原因是OV=1,既产生了溢出。所以,对于符号数的减法在运算后一定要检测OV=1?,返回本节目录,.,减一指令(修改指针专用),格式:D

温馨提示

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

评论

0/150

提交评论