《单片机》课件第3章_第1页
《单片机》课件第3章_第2页
《单片机》课件第3章_第3页
《单片机》课件第3章_第4页
《单片机》课件第3章_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

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

文档简介

3.1指令系统的基本概念

单片机所有指令的集合称为该单片机的指令系统,不同种类的单片机具有不同的指令系统,本书主要介绍目前最流行的MCS-51单片机的指令系统及其应用。3.1.1指令的基本格式MCS-51单片机指令主要由标号、操作码、操作数和注释组成。比如,LOOP: MOV R0, #20H ;将数据20H送到寄存器R0标号 操作码 操作数 注释下面我们来了解一下各组成部分的功能特点。(1)LOOP(标号):指明该指令在ROM的起始存储地址。①标号可有可无,一般起转移指令的标志作用。②由不超过8位的数字和英文字母组成,第一字符必须为英文字母,同时,不能与指令系统中的规定字符和符号相冲突,如R0、MOV等。③后面必须跟冒号(:)。(2)MOV(操作码):指明执行什么性质和类型的操作。不同的操作码具有不同的操作功能,比如MOV执行的是数据传送的操作,而ADD执行的是加法的操作。(3)R0,#20H(操作数):指明操作数的本身或者是操作数所在的地址。①操作数分为目的操作数R0和源操作数(#20H)。源操作数存放的是参加操作的原始数据或地址,目的操作数存放的是参加操作的另外一个原始数据或地址,操作结束后,结果存放于目的操作数。②源操作数可以是数据(#20H),也可以是存放数据的地址(20H)或寄存器(R0)。③目的操作数只能是存放数据的地址或寄存器。④操作数个数可以是0个(如NOP)、1个(如INCA)、2个(如MOVA,#40H)、也可以是3个(如CJNEA,#40H,LOOP),各个操作数之间要用逗号(,)隔开。(4)注释:指明该指令或程序段的功能。①注释可有可无,但必要的程序注释有助于提高程序的可读性,方便程序的修改。常常会发生这样的事,时间久了,自己写的程序自己也看不懂了,建议养成加注释的习惯。②在注释前面必须加“;”。3.1.2MCS-51指令系统中的常用符号说明在介绍指令前,先把指令中使用的一些代表符号作简单说明:Rn——当前选中的寄存器区中的8个工作寄存器R0~R7(n=0~7)。Ri——当前选中的寄存器区中的2个工作寄存器R0、R1(i=0、1)。direct——8位的内部数据存储器单元中的地址。#data——包含在指令中的8位常数。#data16——包含在指令中的16位常数。addr16——16位目的地址。addr11——11位目的地址。rel——8位带符号的偏移字节,简称偏移量,范围为+127~-128。DPTR——数据指针,可用作16位地址寄存器。bit——内部RAM或专用寄存器中的直接寻址位。A——累加器。B——专用寄存器,在执行乘法和除法前用于存放乘数和除数。执行后存放乘法的高8位结果和除法的余数。C——进位标志,可以作为进位位或布尔处理机中的位累加器。@——间址寄存器或基址寄存器的前缀,如@Ri、@A+DPTR。/——位操作数的前缀,表示对该位操作数取反,如/bit。(×)——片内RAM的直接地址中的内容。(Rn)——由某寄存器间接寻址的单元中的内容。←——箭头左边的内容被箭头右边的内容所代替。说明:这些符号只是为了起说明指示的作用,在具体写指令的时候,必须用实际含义的内容来替代。如direct,在写指令的时候,可以用20H之类的地址码来代替。3.1.3MCS-51指令系统的分类MCS-51指令系统共集成了111条指令,按照不同标准的分类如下。(1)按指令长度来分类,可分为①单字节指令:在ROM中所占有的空间为一个存储单元。②双字节指令:在ROM中所占有的空间为两个存储单元。③三字节指令:在ROM中所占有的空间为三个存储单元。(2)按指令执行所需的时间来分类,可分为①单周期指令:执行该指令需要一个机器周期时间(如fosc=12MHz,T机=1μs)。②双周期指令:执行该指令需要两个机器周期时间。③四周期指令:执行该指令需要四个机器周期时间。(3)按指令的功能分类,如表3-1所示。

表3-1指令分类表类别数目功能数据传送类29条执行内外RAM、ROM之间的数据传送算术运算类24条执行数据的加减乘除运算逻辑运算类24条执行与、或、非、异或等逻辑操作位操作类12条执行位的传送和逻辑操作控制转移类22条执行无条件和有条件的转移、调用和返回操作3.1.4寻址方式

所谓寻址方式,就是寻找操作数(一般是指源操作数)地址的方式,在用汇编语言编程时,数据的存放、传送、运算都要通过指令来完成。编程者必须自始至终都十分清楚操作数的位置,以及如何将它们传送到适当的寄存器去参与运算。每一种计算机都具有多种寻址方式。寻址方式的多少是反映指令系统优劣的主要指标之一。MCS-51单片机指令系统有7种寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。(1)立即寻址——指将操作数直接写在指令中,例如:MOV A,#12H;将立即数12H送入累加器A中,12H→A,如图3-1所示。MOV 30H,#31H;将立即数31H送入内RAM30H单元中,31H→30H。说明:①操作数前有立即数符号“#”,则该操作数为立即寻址。②目的操作数不能采用立即寻址方式。图3-1立即数寻址示意图图3-1立即数寻址示意图说明:直接寻址的范围为片内RAM低128B和特殊功能寄存器。(2)直接寻址——将存放操作数的内存单元的地址直接写在指令中,例如:MOV A, 12H;将内RAM12H单元内容送累加器A中,(12H)→A,如图3-2所示。MOV30H, P0;将P0口的内容送入内RAM30H单元中,P0→30H。

图3-2直接寻址示意图(3)寄存器寻址——将存放操作数的寄存器直接写在指令中,例如:MOVR0,A;将送累加器A中的内容送入寄存器R0中,A→R0,如图3-3所示。说明:规定的寄存器包括8个工作寄存器R0~R7、累加器A、数据指针DPTR、堆栈指针SP及其他特殊功能寄存器。①INCA;寄存器寻址方式,INCACC;直接寻址方式。②INCR0;寄存器寻址方式,INC00H;直接寻址方式。

图3-3寄存器寻址示意图(4)寄存器间接寻址——指将存放操作数的内存单元的地址放在寄存器中,指令中只给出该寄存器。形象地说,甲要找乙,可不知道乙的地址,但丙知道乙的地址,甲也知道丙的地址,所以甲先找到丙,从丙那里得到乙的地址,最后找到乙。例如:已知R0寄存器的内容是3AH,则指令为MOVA, @R0;将以R0中内容(即3AH)为地址的单元中的数据送到A中,(R0)→A,如图3-4所示。图3-4寄存器间接寻址示意图(5)变址寻址——将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。DPTR或PC是基址寄存器,累加器A是变址寄存器。该类寻址方式主要用于查表操作。例如:如图3-5所示,已知A=02H,DPTR=0300H,则指令MOVCA,@A+DPTR的功能将累加器A和基址寄存器DPTR的内容相加(图中①),结果作为操作数存放的地址(图中②),再将该地址中的内容取出来送到累加器A中(图中③),执行后,累加器A为ROM0302H单元地址中的内容。图3-5变址寻址示意图说明:①变址寻址是专门针对程序存储器的寻址方式。②MCS-51指令系统中,只有下面3条指令采用这种寻址方式:MOVC A, @A+DPTRMOVC A, @A+PCJMP @A+DPTR(6)相对寻址——程序计数器PC的当前内容与指令中的操作数相加,其结果作为跳转指令的转移地址,该类寻址方式主要用于跳转指令。程序转移目标地址=当前PC值+相对偏移量rel+转移指令字节数相对偏移量rel是一个8位有符号数,范围为:-128~+127。例如,2000H:SJMP54H;执行指令后,程序目标地址=2000H+54H+02H=2056H,也就是说,程序跳转到2056H单元去执行了,如图3-6所示。说明:从上面读者也许发现相对寻址计算太复杂,但在实际应用中,不需要这样来计算,而直接用目标地址的标号来代替偏移量rel就可以了,因为编译软件会自动帮你算出相对偏移量,这样比较方便。如:LOOP:... ...

SJMPLOOP;跳转到LOOP处执行,如目标出界,指令改成LJMP图3-6相对寻址示意图(7)位寻址——指按位进行的寻址操作。例如:SETB3DH;将内部RAM位寻址区中的3DH位置1,如图3-7所示。图3-7中的27H代表的是字节地址,3DH是位地址,对于这点大家一定要区分清楚,如:MOV C, 01H;这里的01H代表的是位地址,因为C是位累加器MOV A, 01H;这里的01H代表的是字节地址,因为A是字节累加器说明:对于位地址,有以下几种表示方法;①直接使用位地址的表示方法,如 MOV C, 05H。②使用位名称的表示方法,如 MOV C, RS1。③单元地址加位的表示方法,如 MOV C, PSW.4或MOVC,D0H.4。图3-7位寻址示意图3.2.1数据传送类指令

在MCS-51单片机系在MCS-51指令系统中,数据传送类指令是运用最频繁的一类指令。由于单片机的逻辑空间分为内部RAM、外部RAM和ROM,数据的传送也都是在这3者之间进行,传送路径如图3-8所示。列中,8031、8032内部没有程序存储器,8051/8751/AT89C51内部有4K的程序存储器,8052/8752/AT89C52内部有8K的程序存储器。图3-8MCS-51单片机片数据传送图从图3-8中可知:(1)片内RAM的单元数据可以相互传送,用MOV指令。(2)外部RAM只能与累加器A进行数据传送,外部RAM送内RAM或者内RAM送外部RAM必须经过累加器A,用MOVX指令。(3)从ROM只能读取数据,并且只能到A,如果要将ROM数据送内RAM或者外部RAM,也必须经过累加器A。1.内RAM数据传送指令(1)以累加器A为目的字节的传送指令(4条)MOVA,Rn ;Rn→A,n=0~7,如MOVA,R2MOVA,@Ri ;(Ri)→A,i=0、1,如MOVA,@R1MOVA,direct ;(direct)→A,如MOVA,30HMOVA,#data ;data, 如MOVA,#20H这4条指令不影响其他标志位,只影响P标志位。【例3-1】已知(23H)=50H,(50H)=45H,R0=23H,指出每条指令执行后相应单元内容的变化。MOVA,50H ;(50)→A,A=45H。MOVA,@R0 ;(R0)→A,A=50H。MOVA,R0 ;R0→A,

A=23H。MOVA,#52H ;52H→A,

A=52H。(2)以工作寄存器Rn为目的字节的传送指令(3条)这3条指令不影响任何标志位。MOV Rn,A ;A→Rn,n=0~7,如MOVR2, AMOV Rn,direct ;(direct)→Rn,n=0~7,如MOVR2,30HMOV Rn,#data ;data→Rn,n=0~7,如MOVR2,#30H【例3-2】将R3中的内容送R2。解:MOV A, R3 ;R3→AMOV R2, A ;A→R2很多初学者常写出MOV R2, R3的错误指令,所以在这里必须强调,在书写指令时,必须按照规定的指令格式写,不能凭自己的想象编造,否则单片机无法执行。同时,大家可以记住,在同一条指令中,不可能同时出现两个Rn或@Ri。【例3-3】已知A=34H,(40H)=52H,指出每条指令执行后相应单元内容的变化。MOVR0,A ;A→R0,R0=34HMOVR3,40H ;(40H)→R3,R3=52HMOVR4,#40H ;40H→R4,R4=40H(3)以直接地址为目的字节的传送指令(5条)MOVdirect,A ;A→direct,如MOV30H,AMOVdirect,Rn ;Rn→direct,n=0~7,如MOV30H,R2MOVdirect,@Ri ;(Ri)→direct,i=0、1,如MOV30H,@R1MOVdirect,#data ;data→direct,如MOV30H,#40HMOVdirect,direct1 ;(direct1)→direct,如MOV30H,40H这5条指令不影响标志位。【例3-4】已知A=60H,R0=38H,(38H)=83H,(40H)=7FH,指出每条指令执行后相应单元内容的变化。MOV41H,A ;A→41H,(41H)=60HMOV41H,@R0 ;(R0)→41H,(41H)=83HMOV41H,R0 ;R0→41H,(41H)=38HMOV41H,40H ;(40H)→41H,(41H)=7FHMOV41H,#0F8H ;F8H→41H,(41H)=F8H最后结果:(41H)=F8H。(4)以寄存器间接寻址为目的字节传送指令(3条)MOV@Ri,A ;A→(Ri),i=0、1,如MOV@R1,AMOV@Ri,direct ;(direct)→(Ri),i=0、1,如MOV@R1,30HMOV@Ri,#data ;data→(Ri),i=0、1,如MOV@R1,#30H这3条指令不影响标志位。【例3-5】已知A=30H,R1=50H,(50H)=70H,(60H)=09H,指出每条指令执行后相应单元内容的变化。MOV@R1,A ;A→(R1), (50H)=30H。MOV@R1,#60H ;60H→(R1), (50H)=60H。 MOV@R1,60H ;(60H)→(R1), (50H)=09H。最后结果:(50H)=09H。(5)交换指令(6条)①字节交换指令XCHA,Rn ;A←→Rn,n=0~7,如XCHA,R1XCHA,@Ri ;A←→(Ri),i=0、1,如XCHA,@R0XCHA,direct ;A←→(direct), 如XCHA,40H上述指令的功能是将目标操作数和源操作数的内容互换。②半字节交换指令XCHDA,@Ri;A3~0←→(Ri)3~0,高4位不变。i=0、1,如XCHDA,@R0③累加器高低4位互换指令SWAPA;A7~4←→A3~0这5条指令只影响P标志位。

【例3-6】已知(20H)=54H,(21H)=32H,A=01H,指出每条指令执行后相应单元内容的变化并写出最后结果。XCH A, 20H ;A←→(20H), A=54H,(20H)=01HMOV R1, #21H ;21H→R1,R1=21HXCHD A, @R1 ;A3~0←→(R1)3~0,A=52H,(21H)=34HSWAP A ;A7~4←→A3~0,A=25HXCH A, 20H ;A←→(20H),A=01H,(20H)=25H最后结果:A=01H,(20H)=25H,(21H)=34H。2.16位数据传送指令(1条)在MCS-51指令系统中,只有一条16位数据传送指令:MOV DPTR, #data16 ;data16→DPTR,如MOVDPTR, #3000H这条指令不影响标志位。说明:(1)该指令的功能是将16位立即数送入DPTR,其中DPH存放高8位,DPL存放低8位,也就是说,指令MOVDPTR,#5678H可以用下面两条指令来代替:MOVDPH,#56HMOVDPL,#78H(2)DPTR一般用作16位间接寻址,如果是MOVX指令,则寻片外RAM地址,如果是MOVC指令,则寻ROM地址。3.片外RAM传送指令(4条)MOVX A, @Ri ;(Ri)→A,i=0、1MOVX A, @DPTR ;(DPTR)→AMOVX @Ri, A ;A→(Ri),i=0、1MOVX @DATR, A ;A→(DPTR)说明:(1)对外部RAM的访问必须通过累加器A。(2)对外部RAM的访问必须采用寄存器间接寻址方式,寻址寄存器有两种。①8位寄存器R0、R1,寻址范围为片外RAM低8位地址空间(00H~FFH),其高8位地址由P2口状态确定。②16位寄存器DPTR,寻址范围为片外RAM64K地址空间(0000H~FFFFH)。(3)外RAM高8位地址由P2口送出,低8位地址由P0口送出,8位数据也由P0口分时传送。在执行读外RAM时,信号有效,为低电平。在执行写外RAM时,信号有效,为低电平。(4)由于MCS-51扩展I/O地址与外RAM地址是统一编址的,所以访问外RAM的指令也作为扩展I/O的输入/输出指令。比如,已知某外部I/O端口地址为7FF7H,则对此I/O的读写操作为:MOV DPTR,#7FF7H;赋端口地址MOVX A,@DPTR;输入操作(读)MOVX @DPTR,A;输出操作(写)【例3-7】要求编写指令序列,实现以下功能:①将片外RAM2000H单元内容传送到片内RAM20H单元中。②将片外RAM2120H单元内容送到片外RAM3210H单元中。解:①MOV DPTR, #2000HMOVX A, @DPTRMOV 20H, A②MOV DPTR, #2120HMOVX A, @DPTRMOV DPTR, #3210HMOVX @DPTR, A4.ROM指令(查表指令)(2条)我们知道,ROM中存放的是程序代码,一般不需要人为去读,但有时候,在程序中也包含某些重要数据(也称表格),如显示字型码、常数等。这些数据在程序运行过程中需要被读出来,参与程序的处理过程。比如要实现函数,x为输入量,是0~10的整数,如果采用编程方法实现这个函数的运算,则比较复杂。我们可以利用其他工具先算出Y(0)~Y(10)的值,把它依次存放在ROM中,然后根据x的值去找出Y(x)的值,这种方法就称为查表,也是2条读ROM指令的主要功能。MOVC A,@A+DPTR ;(A+DPTR)→AMOVC A,@A+PC ;PC+1→PC,(A+PC)→A说明:(1)这两条指令的寻址方式都为变址寻址方式,都是单字节指令,都只影响标志位P。(2)MOVCA,@A+DPTR的寻址以DPTR为基址,可以寻址整个64KB的ROM空间。(3)MOVCA,@A+PC的寻址以当前指令的PC值为基址寄存器,其寻址范围为该指令后256B的ROM空间。(4)在实际应用中,MOVCA,@A+DPTR寻址范围广,不用修正A值,比较方便,采用较多。【例3-8】在单片机应用系统中,常用LED数码管显示数码,但显示数字(≤9)与显示数字编码并不相同,需要将显示数字转换为显示字型(段)码,通常是用查表的方法。现要求将30H中的显示数字转换为显示字型(段)码并存入30H。已知共阴字段码表首址为TAB。解:编程如下。CHANG: MOV DPTR,#TAB ;置共阴字段码表首址

MOV A,30H ;读显示数字

MOVC A,@A+DPTR ;查表,转换为显示字段码

MOV 30H,A ;存显示字段码

RET TAB: DB3FH,06H,5BH,4FH,66H ;0~4共阴字段码表

DB6DH,7DH,07H,7FH,6FH ;5~9共阴字段码表5.堆栈操作指令PUSH direct;SP+1→SP,(direct)→SP;如PUSH20HPOP direct;(SP)→direct,SP-1→SP;如POP30H说明:(1)入栈操作过程。先将堆栈指针SP的内容加1,指向堆栈顶的一个空单元;然后将指令指定的直接寻址单元中的数据送到该空单元中。假如PUSH30H,(30H)=2BH,SP=0FH,则其操作过程如图3-9所示。图3-9指令PUSH操作示意图(2)出栈操作过程。先将SP所指单元(栈顶地址)中的数据弹出,送到指定的内RAM单元;然后SP-1→SP,SP仍指向栈顶地址。以POP30H,SP=0FH,则其出栈操作过程如图3-10所示。图3-10指令POP操作示意图(3)后面所跟的操作数只能是直接地址,如PUSHR0,PUSHA都是错误的,应该为PUSH00H(设RS1=RS0=0),PUSHACC。【例3-9】将片内RAM30H单元与40H单元中的内容互换。解:方法1(直接地址传送法):MOV 31H,30HMOV 30H,40HMOV 40H,31HSJMP $方法2(间接地址传送法):MOV R0,#40HMOV R1,#30HMOV A,@R0MOV B,@R1MOV @R1,AMOV @R0,BSJMP $3.2.2算术运算类指令算术运算类指令共24条,这类指令基本都会影响标志位Cy、OV、AC、P。1.加法指令(1)不带进位位Cy加法指令(4条)ADDA,Rn ;A+Rn→A,(n=0~7) 有进位,Cy=1,无进位,Cy=0ADDA,@Ri ;A+(Ri)→A,(i=0、1) 有进位,Cy=1,无进位,Cy=0ADDA,direct ;A+(direct)→A 有进位,Cy=1,无进位,Cy=0ADDA,#data ;A+data→A 有进位,Cy=1,无进位,Cy=0ADD指令是8位数加法指令,其一个加数在累加器A中,另外一个加数由不同寻址方式得到,相加结果再送回A。运算结果会影响标志位。【例3-10】已知累加器A的内容为E7H,(30H)=97H,则指出执行指令ADDA,30H后的结果和各标志位的状态。解:

11100111B+10010111B1(Cy)01111110B执行后,A=7EH,Cy=1,AC=0,P=0,OV=1。(2)带进位位Cy加法指令(4条)ADDCA,Rn ;A+Rn+Cy→A,(n=0~7) 有进位,Cy=1,无进位,Cy=0ADDCA,@Ri ;A+(Ri)+Cy→A,(i=0、1) 有进位,Cy=1,无进位,Cy=0ADDCA,direct ;A+(direct)→A 有进位,Cy=1,无进位,Cy=0ADDCA,#data ;A+data+Cy→A 有进位,Cy=1,无进位,Cy=0ADDC与ADD指令的区别就是相加时再加上Cy,其余功能一样。【例3-11】已知累加器A的内容为A7H,R0=30H,(30H)=5BH,Cy=1,则指出执行指令ADDA,@R0后的结果和各标志位的状态。解:10100111B01011011B+1Cy1(Cy)00000011B执行后,A=03H,Cy=1,AC=1,P=1,OV=0。2.减法指令(4条)SUBBA,Rn; A-Rn-Cy→A,(n=0~7) 有借位,Cy=1,无进位,Cy=0SUBBA,@Ri; A-(Ri)-Cy→A,(i=0、1) 有借位,Cy=1,无进位,Cy=0SUBBA,direct; A-(direct)-Cy→A 有借位,Cy=1,无进位,Cy=0SUBBA,#data; A-data-Cy→A 有借位,Cy=1,无进位,Cy=0注意:减法指令都是带进位位减法,若要执行不带进位位减法,可先将进位位清零,再执行减法操作。【例3-12】已知累加器A=A7H,R0=58H,Cy=0,则指出执行指令SUBBA,@R0后的结果和各标志位的状态。解:10100111B01011000B+0Cy0(Cy)01001111B执行后,A=4FH,Cy=0,AC=1,P=1,OV=1。说明:(1)当加、减法运算结果的最高位有进位或有借位时,Cy=1,否则Cy=0。(2)当加、减法运算时,低4位向高4位有进位或者借位时,AC=1,否则AC=0。(3)在加、减法过程中,D6和D7未同时产生进位或者借位时,OV=1,否则OV=0。(4)当运算结果A中“1”的个数为奇数时,P=1,否则P=0。(5)在加、减法指令中,其目的操作数只能是累加器A。【例3-13】编写计算12A4H+0FE7H的程序,将结果存入内部RAM41H和40H单元,40H存低8位,41H存高8位。解:单片机指令系统中只提供了8位的加减法运算指令,两个16位数(双字节)相加可分为两步进行,第一步先对低8位相加,第二步再对高8位相加。高8位低8位

12A4H ①A4H+E7H=8BH进位1

+0FE7H ②12H+0FH+1=22H 228BH

进位11 ②①加法指令 ADDC ADD程序如下:PLUS: MOV A,#0A4H ;被加数低8位→AADD A,#0E7H ;加数低8位E7H与之相加,A=8BH,Cy=1MOV 40H,A ;A→(40H),存低8位结果MOV A,#12H ;被加数高8位→AADDC A,#0FH ;加数高8位+A+CY,A=22HMOV 41H,A ;存高8位运算结果RET3.加1减1指令(9条)(1)加1指令INCA ;A+1→AINCRn ;Rn+1→Rn,n=0~7INC@Ri ;(Ri)+1→(Ri),i=0、1INCdirect ;(direct)+1→directINCDPTR ;DPTR+1→DPTR(2)减1指令DECA ;A-1→ADECRn ;Rn-1→Rn,n=0~7DEC@Ri ;(Ri)-1→(Ri),i=0、1DECdirect ;(direct)-1→direct说明:①加1、减1指令在涉及A时,会影响P标志位,其他情况不会影响任何标志位。②无16位减1指令,即无DECDPTR指令,使用时请意。【例3-14】已知A=00H,R0=50H,(50H)=0FFH,指出每条指令执行后相应单元内容的变化。DEC A ;A-1→A,A=0FFHINC @R0 ;(R0)+1→(R0),(50H)=00HINC R0 ;R0+1→R0,R0=51HDEC 50H ;(50H)-1→50H,(50H)=0FFH4.乘、除法指令(2条)(1)乘法指令MULAB;A×B→BA说明:①将累加器A的内容与寄存器B的内容相乘,乘积的低8位存放在累加器A中,高8位存放于寄存器B中。②如果乘积超过0FFH,则溢出标志OV置“1”,否则清“0”。进位标志Cy总是被清“0”。(2)除法指令DIVAB;(A÷B)商→A,余数→B说明:①将累加器A中的内容除以寄存器B中的8位无符号整数,所得商的整数部分存放在累加器A中,余数存放在寄存器B中,进位标志Cy和溢出标志OV清“0”。②若原来B(除数)中的内容为0,则执行该指令后A与B中的内容不确定,并将溢出标志OV置“1”,在任何情况下,进位标志Cy总是被清“0”。【例3-15】已知A=50H,R0=0A0H,(50H)=34H,指出每条指令执行后相应单元内容的变化。MOV B,R0 ;R0→B,B=0A0HMUL AB ;A×B→BA,50H×0A0H=3200H,则B=32H,A=00HMOV A,50H ;(50H)→A;A=34HDIV AB ;(A/B)商→A,余数→B;(34H)/(32H),商A=01H,余数B=02H5.BCD码调整指令DAA说明:(1)这条指令对累加器A参与BCD码加法运算所获得的8位结果进行十进制调整,使累加器A中的内容调整为二位压缩型BCD码的数。调整方法可以参见1.3.2节(常用编码)。(2)使用时必须注意,它只能跟在加法指令之后,不能对减法指令的结果进行调整,且其结果不影响溢出标志位,但会影响Cy位。【例3-16】已知A=【65】BCD,B=【78】BCD,C=0,指出执行下列语句后的结果。ADD A,BDA A解:执行过程:【01100101】BCDA(65)+【01111000】BCDB(78)【11011101】BCD;满足BCD码加法运算的(3)、(4)修正条件,进行加6修正+011001101【01000011】BCDS(143)执行后:A=【43】BCD,C=1。3.2.3逻辑运算及移位指令逻辑运算类指令共24条,包括与、或、非、异或、清零、取反及移位等操作指令。这些指令涉及累加器A时,影响奇偶标志位P,但对Cy(除带进位移位指令外)、AC、OV位均无影响。1.“与”操作指令(6条)ANLA,Rn ;A∧Rn→A, 如ANLA,R1ANLA,@Ri ;A∧(Ri)→A, 如ANLA,@R1ANLA,#data ;A∧data→A, 如ANLA,#43HANLA,direct ;A∧(direct)→A, 如ANLA,50HANLdirect,A ;(direct)∧A→direct, 如ANL12H,AANLdirect,#data ;(direct)∧data→direct, 如ANL34H,#28H说明:(1)这组指令中的前4条指令是将A中的内容和指定单元中的内容或立即数按“位”进行逻辑“与”操作,结果存在A中。仅影响P标志。(2)后2条指令是将直接地址单元内容与A或立即数按“位”进行逻辑“与”操作,结果存在该地址单元中,若直接地址为P0~P3端口时,则该指令是对端口进行“读—修改—写”操作。【例3-17】已知A=8CH,R0=9AH,指出执行指令ANLA,R0后的结果。解:10001100B∧ 10011010B10001000B执行结果:A=88H,R0中的内容不变,仍为9AH。2.“或”操作指令(6条)ORLA,Rn ;A∨Rn→A, 如ORLA,R4ORLA,@Ri ;A∨(Ri)→A, 如ORLA,@R1ORLA,#data ;A∨data→A, 如ORLA,#45HORLA,direct ;A∨(direct)→A, 如ORLA,43HORLdirect,A ;(direct)∨A→direct, 如ORL34H,AORLdirect,#data ;(direct)∨data→direct, 如ORL76H,#45说明:(1)这组指令中的前4条指令是将A中的内容和指定单元中的内容或立即数按“位”进行逻辑“或”操作,结果存在A中。仅影响P标志。(2)后2条指令是将直接地址单元内容与A或立即数按“位”进行逻辑“或”操作,结果存在该地址单元中,若直接地址为P0~P3端口时,则该指令是对端口进行“读—修改—写”操作。【例3-18】已知41H和40H单元中分别存放了一个非压缩BCD码,要求编写程序将其合并压缩,41H中的BCD码为高位,并存放到40H中,示意图如图3-11所示。图3-11示意图解:

MOV A, 41HSWAP AORL 40H, A3.“异或”操作指令(6条)XRLA,Rn ;A⊕Rn→A, 如XRLA,R4XRLA,@Ri ;A⊕(Ri)→A, 如XRLA,@R1XRLA,#data ;A⊕data→A, 如XRLA,#45HXRLA,direct ;A⊕(direct)→A, 如XRLA,43HXRLdirect,A ;(direct)⊕A→direct, 如XRL34H,AXRLdirect,#data ;(direct)⊕data→direct,如XRL76H,#45说明:(1)这组指令中的前4条指令是将A中的内容和指定单元中的内容或立即数按“位”进行逻辑“异或”操作,结果存在A中。仅影响P标志。(2)后2条指令是将直接地址单元内容与A或立即数按“位”进行逻辑“异或”操作,结果存在该地址单元中,若直接地址为P0~P3端口时,则该指令是对端口进行“读—修改—写”操作。【例3-19】已知A=9CH,指出执行指令XRLA,#9CH后的结果。解:

10011100B⊕ 10011100B00000000B执行后:A=00H,可见两个相同的数异或,其结果为0。4.清零和取反指令(2条)CLRA ;0→ACPLA ;→A只影响P标志位。5.循环移位指令循环左移:RLA带Cy循环左移:RLCA循环右移:RRA带Cy循环右移:RRCA循环移位示意图如图3-12所示。说明:(1)“RLA”和“RLCA”指令的相同之处在于两者都是使A中的内容左移一位,而且两者的不同点在于“RLCA”将Cy连同A中的内容一起循环左移,A7的内容进入Cy,原来Cy内容进入A0,但不对其他标志位产生影响。(2)“RRA”和“RRCA”指令的异同点类似于“RLA”和“RLCA”,仅是A中的数据移位方向向右。(3)当A中最高位不为“1”时,可以采用“RLA”指令对A中的内容做乘2运算。(4)当A中最高位为“1”时,采用“RLCA”指令对A中的内容做乘2运算,只是在乘前必须将Cy位清零,此时的数据实际是包括Cy内的“9”位数据。(5)当A中最低位不为“1”时,可采用“RRA”指令对A中的内容做除以2运算。(6)当A中最高低位为“1”时,采用“RRCA”指令对A中的内容做除以2运算,只是在运算前必须将Cy位清零,Cy相当于小数位。【例3-20】已知R1=12H,R2=93H,R3=34H,R4=25H,Cy=1,指出执行下列指令后的结果。MOV A, R1 ;A=12H RL A ;A=24H(乘2的结果,没有超过低8位)MOV R1, A ;R1=24HMOV PSW, #00H ;Cy=0MOV A, R2 ;A=93HRLC A ;A=26H,Cy=1(乘2的结果,低8位在A,高位在Cy)MOV R2, A ;R2=26HMOV A, R3 ;A=34HRR A ;A=17H(除以2的结果,可以整除,商在A)MOV R3, A ;R3=17HMOV PSW, #00H ;Cy=0MOV A, R4 ;A=25HRRC A ;A=12H,Cy=1(除以2的结果,商在A,余数在Cy)MOV R4, A ;R4=12H【例3-21】编程实现16位数的算术左移。设16位数一次存放在内RAM22H21H单元中,高位在前。解:算术左移是将操作数整体左移一位,最低位补充0,相当于完成16位数的乘2操作,如图3-13所示。图3-1316位数算术左移示意图程序如下:CLR C ;清Cy位MOV A, 21H ;取操作数低8位RLC A ;低8位带Cy左移一位MOV 21H, A ;回存MOV A, 22H ;指向操作数高8位RLC A ;高8位带Cy左移一位MOV 22H, A ;回存3.2.4位操作类指令在MCS-51的硬件结构中,有一个位处理器(布尔处理器)和一套位变量处理的指令子集。在进行位操作时,Cy位为位累加器。位存储器是片内RAM字节地址20H~2FH单元中连续的128个位(位地址位00H~7FH)和特殊功能寄存器中字节地址能被8整除的那部分SFR,这些SFR都具有可寻址位。位操作指令包括位变量的传送、修改或逻辑操作。1.位传送指令(2条)MOVC,bit;(bit)→Cy 如MOVC,12HMOVbit,C;Cy→bit 如MOV24H.1,C

2.位修正指令(6条)(1)清零指令CLRC ;0→CCLRbit ;0→bit(2)取反指令CPLC ;→CCPLbit ;()→bit(3)置1指令SETBC ;1→CSETBbit ;1→bit3.位逻辑运算指令(4条)(1)位逻辑“与”运算指令ANLC,bit ;C∧(bit)→C,如ANLC,14HANLC,/bit ;C∧(/bit)→C,如ANLC,/21H(2)逻辑“或”指令ORLC,bit ;C∨(bit)→C,如ORLC,45HORLC,/bit ;C∨(/bit)→C,如ORLC,/27H说明:斜杠“/”表示用这个位的值取反,然后再与Cy进行运算,但并不改变这个位的本身。【例3-22】设X、Y、Z分别代表一个位地址,试编程实现Z=X⊕Y。解:程序如下:MOV C,XANL C,/Y; C=X∧/YMOV Z,CMOV C,YANL C,/X; C=/X∧YORL C,Z; C=X∧/Y+/X∧YMOV Z,C在应用位指令的时候,一定要分清字节地址和位地址的区别。3.2.5控制转移类指令在编写程序的过程中,有时候需要改变程序的执行流程,即不一定要程序一行接一行地执行,而是要跳过一些程序继续往下执行,或者跳回已执行过的程序,重新执行这些程序。要实现这些跳转,需要用到控制转移类指令,这些指令通过修改程序计数器PC的值来实现这一操作。1.条件转移指令(1)长转移指令LJMPaddr16;addr15~0→PC(2)短转移指令AJMPaddr11 ;PC+2→PC,addr10~0→PC10~0,PC15~11不变(3)相对转移指令SJMPrel;PC+2→PC,PC+rel→PC(4)间接转移指令JMP@A+DPTR ;A+DPTR→PC对于指令中操作码后面的操作地址,在实际编程中一般采用标号来代替,通过编译软件,会自动生成绝对转移地址或者偏移地址。如:NEXT:

MOVA, #02H

......

LJMPNEXT;(AJMPNEXT,SJMPNEXT)说明:(1)LJMP指令和AJMP指令的区别有以下两点。①它们的转移范围不一样,LJMP可以转移64KB的范围,而AJMP的转移范围为2KB,当不知道转移范围时,建议采用LJMP指令。②它们最终生成的代码长度不一样,LJMP指令是三字节指令,而AJMP是二字节指令。一般情况下,建议大家使用LJMP。(2)SJMP指令的转移范围只有256B,指令代码后的偏移地址量(rel)用补码形式表示,其范围为-128~+127,若rel≤7FH,则程序往下转移,若rel≥80H,则程序向上转移。按上面的示例,SJMPNEXT这条指令可以放在NEXT的上面,也可以是下面,但是,一定要在-128~+127范围内。(3)当转移目标超出转移范围时,编译程序往往会有“TARGETOUTOFRANGE”(目标出界)这样的错误提示。(4)JMP@A+DPTR指令的目标地址是由累加器A中的8位无符号数和数据指针DPTR中的16位数相加形成的。这条指令的特点是转移地址可以在程序运行过程中加以改变。例如,当DPTR的值确定时,根据A的不同的值可控制程序转向不同的程序段,因此也称为散转指令。键盘处理是散转指令的典型应用之一。下面通过一个例子来说明。【例3-23】设有一个键盘,共有5个键,其功能分别如表3-2所示。要求编写键盘处理程序,其中键值由另外的键值程序获得,存放在累加器A中。表3-2键名与功能表键名键值处理该键的子程序名切换00HSWITCH移位01HSHIFT加102HINCREASE减103HDECREASE清零04HCLEAR解:程序如下:MOV DPTR, #TAB ;将散转表的首地址给DPTRCLR ARLC A ;将A值乘2JMP @A+DPTRTAB: AJMP SWITCH ;散转表开始,TAB+0 AJMP SHIFT ;TAB+2 AJMP INCREASE ;TAB+4 AJMP DECREASE ;TAB+6 AJMP CLEAR ;TAB+8SWITCH: …… ;实现切换功能的程序段SHIFT: …… ;实现移位功能的程序段INCREASE: …… ;实现加1功能的程序段DECREASE: …… ;实现减1功能的程序段CLEAR: …… ;实现清零功能的程序段……由于散转表中采用AJMP指令,每条转移指令相差2个字节单元,所以在开始的时候,A要乘以2,否则,不能转到相对应的功能程序。请大家考虑一下,如果用LJMP来替代AJMP,那么开始的时候,A值怎么处理?2.条件转移指令(13条)条件转移指令是指指令在满足条件时才转移,当条件满足时,程序转移到由PC当前值与指令给出的相对地址偏移量相加后得到的地址处执行;当条件不满足时,程序则顺序执行下一条指令。该指令分为判A转移、判C转移、判bit转移、减一非零转移和比较转移指令。(1)判A转移指令①A=0转移指令: JZrel;PC+2→PC, 若A=0,则PC+rel→PC,转移 若A≠0,则程序顺序执行②A≠0转移指令: JNZrel;PC+2→PC,若A≠0,则PC+rel→PC,转移 若A=0,则程序顺序执行在实际书写例子时,常用如下形式:JZ NEXT【例3-24】试编程实现:R1中的内容不断加1,加到FFH,则不断减1,减到0,则不断加1,不断循环。解:程序如下:GINC: INC R1 ;R1+1→R1 MOV A, R1 ;R1→A CPL A ;将A取反,只有当A=FFH时,取反A=0 JNZ GINC ;A≠0,即R1≠FFH,继续不断加1GDEC: DEC R1 ;A=0,即R1=FFH,继续不断减1 MOV A, R1 ;R1→A JZ GINC ;A减至0,则转移到加1 SJMP GDEC ;未减到0,继续减1【例3-25】将外部RAM的一个数据块(首地址为1000H)传送到内部RAM的一个数据区(首地址为30H),遇到传送的数据为0时停止。解:程序如下:

MOV R1, #30H ;赋首地址

MOV DPTR, #1000HLOOP1: MOVX A@DPTR ;取数

JZ LOOP2 ;若A=0,停止退出MOV @R1, A ;A≠0,存数INC R1 INC DPTR ;修改R1和DPTR,准备取下一个数

SJMP LOOP1 ;重复取数LOOP2: RET(2)判C转移指令①C=1转移指令:JC rel ;PC+2→PC, 若Cy=1,则PC+rel→PC,转移 若Cy=0,则程序顺序执行②C=0转移指令: JNCrel ;PC+2→PC, 若Cy=0,则PC+rel→PC,转移 若Cy=1,则程序顺序执行(3)判bit转移指令①(bit)=1转移指令: JBbit,rel ;PC+3→PC, 若(bit)=1,则PC+rel→PC,转移 若(bit)=0,则程序顺序执行②(bit)=0转移指令: JNBbit,rel ;PC+3→PC, 若(bit)=0,则PC+rel→PC,转移 若(bit)=1,则程序顺序执行③(bit)=1转移并清零指令: JBCbit,rel ; PC+3→PC, 若(bit)=1,则PC+rel→PC,转移,且0→(bit) 若(bit)=0,则程序顺序执行(4)减1非0转移指令DJNZ Rn,rel ;PC+2→PC,Rn-1→Rn,若Rn=0,则程序顺序执行 若Rn≠0,则PC+rel→PC,转移DJNZ direct,rel;PC+3→PC,(direct)-1→direct,若(direct)=0,则程序顺序执行 若(direct)≠0,PC+rel→PC,转移该指令常用来控制循环次数,不影响标志位。【例3-27】试编程,将片内RAM30H~40H单元内容清零。解:程序如下:QL: MOV R1, #30H ;初始化,置首地址和数据长度

MOV R2, #11H ;循环次数

CLR A ;A=0CLOOP: MOV @R1, A ;清零

INC R1 ;修改R1,即修改地址

DJNZ R2, CLOOP ;判清零次数是否到,没到则继续循环

SJMP $ ;原地等待(5)比较转移指令CJNE A,direct,rel ;PC+3→PC, 若A=(direct),则程序顺序执行 若A≠(direct),则PC+rel→PC,转移 且若A≥(direct),则Cy=0;若A<(direct),则Cy=1CJNE A,#data,rel ;PC+3→PC, 若A=data,则程序顺序执行 若A≠data,则PC+rel→PC,转移 且若A≥data,则Cy=0;若A<data,则Cy=1CJNE Rn,#data,rel ;PC+3→PC, 若Rn=data,则程序顺序执行 若Rn≠data,则PC+rel→PC,转移 且若Rn≥data,则Cy=0,若Rn<data,则Cy=1CJNE @Ri,#data,rel ;PC+3→PC, 若(Ri)=data,则程序顺序执行 若(Ri)≠data,则PC+rel→PC,转移 且若(Ri)≥data,则Cy=0;若(Ri)<data,则Cy=1对于这4条指令,除了需要掌握比较转移功能外,还要注意影响标志位Cy位的功能,根据Cy位的状态可以判别两个比较数的大小。【例3-28】设有一个温度控制器,如果温度高于35℃,则打开风扇;如果温度低于35℃,则打开加热器;如果温度等于35℃

温馨提示

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

评论

0/150

提交评论