第2章单片机的指令系统ppt.ppt
本章学习目标 :了解指令及指令系统常识 熟悉指令中常用符号 在理解的基础上牢记7种寻址方式 熟悉各类指令的功能及应用范围 能使用指令完成各种常规任务,第2章 单片机的指令系统,2.1.1指令系统概述,2.1 指令系统概述与寻址方式,1指令 单片机是靠软件和硬件结合起来完成控制功能的,软件的基础就是指令和指令系统。 指令是计算机设计人员预先设计好的用以完成某种操作的命令。 例如用计算机指令来完成10+20的加法运算,用机器代码表示如下: 01110100 00001010 ;把10送累加器A中 00100100 00010100 ;A加20,结果存A中,机器语言指令,用二进制编码表示的,能够被计算机直接识别和执行的语言称为机器语言。它不便于记忆、查错和修改。 用助记符、符号和数字来表示指令的程序语言,称为汇编语言。它与机器语言指令一一对应,便于理解和记忆。上面两条指令用汇编语言可表示为: MOV A, #10 ADD A, #20 查找附录A,可以得到这两条指令的十六进制机器代码如下: 74H 0AH 24H 14H,机器语言是计算机唯一能够识别和执行的语言,因而我们编写的汇编语言程序必须通过翻译将其转换为机器语言才能被计算机执行,这一翻译过程称为汇编。 汇编语言是一种面向机器的语言,它不能在不同类型的计算机上互相移植; 高级语言是独立于机器的,即用高级语言编写的程序可以方便地移植到不同的单片机上。针对单片机的主要有C(C51)语言和PLM语言, 本教材我们只学习汇编语言。因汇编语言编写程序时是面向机器的,结合单片机的硬件资源来学习汇编语言,对初学者来说是最合适不过的了。下面我们给出典型的汇编语言指令的书写格式:,标号: 操作码 操作数1,操作数2,操作数3;注释 NEXT: MOV A, R0 ;A(R0) 合法字符举例:LOOP,NEXT_1,START 非法字符举例:2SUM,S+L,ADD,DB,方括号内的字段可以省略,标号是一个名字,用来标明指令的地址,由16个字符组成,首字符必须是字母,后面可跟数字和字母字符,也可以是下划线,但系统保留字不能作标号,如操作码等。,MOV是操作码,它表示指令的性质和功能,此处其功能是将R0中的内容送到累加器A中,,A是数据传送的目的地,称为目的操作数,R0是数据的来源,称为源操作数,2指令系统 一台计算机的CPU所能执行的全部指令的集合称为这个CPU的指令系统。指令系统是开发和生产厂商定义的,如要使用其单片机,用户就必须了解和遵循这些指令标准,要掌握某种(类)单片机,指令系统的学习是必须的。 80C51共有111条指令: 其指令字节少,单字节指令49条,双字节指令45条,三字节指令17条; 指令执行时间短,单机器周期指令64条,双机器周期指令45条,4机器周期指令2条, 该指令系统还有极为丰富的位操作指令,充分体现了单片机面向控制的特点。,3指令系统中常用符号说明,对于一条汇编语言指令来说,有两个问题要解决: 一是要说明进行什么操作 二是要指出参与操作的数据的值是多少或者到何处取得,以及操作结果放到何处。 寻址方式就是寻找操作数的方法。 在计算机中寻址方式越多,操作数的寻找越容易,程序设计也就越方便。 51系列单片机共有7种寻址方式,分别为立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。 对于两操作数指令,源操作数和目的操作数都有寻址方式,我们下面提到的都是源操作数的寻址方式。,2.1.2 寻址方式,由操作码指出,由寻址方式决定,1立即数寻址 在指令中直接给出参与操作的数据,这种寻址方式称为立即数寻址。这一直接给出的数据称为立即数,立即数前要加上“#”符号,例如: MOV A,#0EH ;A0EH MOV DPTR,#2100H ;DPTR2100H,将8位的立即数0EH送到累加器A,将16位的立即数2100H送到数据指针寄存器DPTR,立即数的高8位21H装入DPH,低8位00H装入DPL。,2寄存器寻址,参与操作的数据由寄存器给出,这种寻址方式称为寄存器寻址。 由于寄存器在CPU的内部,所以采用该寻址方式可以获得较高的运算速度,可用于该寻址方式的寄存器有R0R7、DPTR、A、B。 如:MOV A,R1 ;A (R1) 该指令将R1内的数据传送到累加器A中,源操作数R1和目的操作数均采用了寄存器寻址。 再比如: INC DPTR ;DPTR(DPTR)+1,3直接寻址 在指令中直接给出操作数的地址的寻址方式称为直接寻址。 在该寻址方式中,操作数存放在片内数据存储器中,地址长度为8位。 这种寻址方式可以访问:内部数据RAM低128B(该空间还可以采用寄存器间接寻址)和特殊功能寄存器SFR(该空间只能采用直接寻址)。,例如:在片内RAM60H单元存放一个8位二进制数3CH,执行指令MOV A,60H后,结果为(A)=3CH。如图2-1所示。,4寄存器间接寻址 在指令中以指定寄存器的内容作为操作数地址的寻址方式称为寄存器间接寻址。 这种方式可用于访问内部RAM和外部数据存储器。 能够用于寄存器间接寻址方式的寄存器有:R0、R1、DPTR和SP。 在间接寻址寄存器前加“”表示间接寻址。例如: MOV A,R0 ;A(R0),假定R0中的内容为50H,50H单元内容为45H,图2-2给出了寄存器间接寻址方式的执行过程。,寄存器间接寻址的寻址范围: (1)片内128B的RAM,用R0,R1作间址寄存器,如MOV A,R0; (2)片外64KB的数据存储器,用DPTR作间址寄存器,如MOVX A,DPTR; (3)堆栈区域,用SP作间址寄存器,如PUSH ACC; (4)片外256B数据存储器,用R0,R1作间址寄存器,如MOVX A,R0;,5变址寻址 基址寄存器(DPTR或PC)的内容与变址寄存器(累加器A)的内容相加,其和形成16位地址作为操作数的地址的寻址方式称为变址寻址。 该类寻址方式用于程序存储器的访问,多用于查表程序。 例如: MOVC A,A+DPTR ;A (A)+(DPTR) 设(A)=12H,(DPTR)=02E3H,(02F5H)=1EH,则结果为(A)=1EH,执行情况见图2-3所示。,变址寻址指令只有3条,另外两条是: MOVC A,A+PC JMP A+DPTR,6相对寻址 相对寻址是以程序计数器PC的当前值(是指当前跳转指令的下一条指令的地址)为基准,加上指令中给出的相对偏移量rel以得到程序执行地址的寻址方式。 这种寻址方式的目的是修改PC的值,从而实现程序的转移。 转移的目的地址可参见如下表达式: 目的地址=转移指令地址+转移指令字节数+rel 值得注意的是,偏移量rel有正负之分,其取值范围是-128+127。,其中,操作码80H存放在3000H单元中,54H是设定的相对偏移量rel,存放在3001H单元。指令的执行过程如图2-4所示。,例如:有双字节相对转移指令,指令地址 操作码 操作数 指令 注释 3000H 80 54H SJMP rel ;PC (PC)+2+rel,7位寻址 位寻址是将8位二进制数中的某一位作为操作数,在指令中给出的是位地址,一般用bit表示。 例如: CLR P0 ;将P口的第位清零 位寻址的范围为:,片内RAM区的HF的个单元中的位, 如 MOV C,30H字节地址能被整除的SFR, 如 SETB P0,表寻址方式及寻址空间,2.2 数据传送指令(29条),2.2.1通用传送指令,通用传送指令的助记符为MOV(Move),格式如下: MOV , 此类指令的功能是把源操作数指定的数据传送到目的操作数(目的地址)所指定的存储单元中。MOV指令的传送关系如图2-5所示。,例1 设内部RAM中(50H)=40H,(40H)=10H,P1口作输入口,(P1)=0ABH,问程序执行后各存储器中的数据是什么? MOV R0,#50H ;立即数50H送R0中,(R0)=50H MOV A,R0 ;R0间接寻址,将50H单元内容送A,(A)=40H MOV R1,A ;A送R1,(R1)=40H MOV B,R1 ;R1间接寻址,将40H单元内容送B,(B)=10H MOV R1,P1 ;将P1内容送40H单元,(40H)=0ABH MOV P2,P1 ;将P1内容送P2 ,(P2)=0ABH执行结果: (R0)=50H,(A)=40H,(R1)=40H (B)=10H,(P1)=0ABH,(40H)=0ABH (P2)=0ABH,任何不符合格式要求的“指令”都是不合法的。,这类指令用于访问片外RAM或扩展的I/O口。1读写片外RAM指令MOVX (1)用DPTR进行间接寻址的指令读: MOVX A, DPTR ; A (DPTR)写: MOVX DPTR, A ; (DPTR) A DPTR为16位数据指针,该指令可以寻址外部RAM的64KB范围(0000H0FFFFH),地址的低8位由P0口输出,高8位由P2口输出,数据通过P0口输入/输出。,2.2.2 特殊传送指令,(2)用Ri进行间接寻址的指令 读:MOVX A, Ri ; (A)(Ri) 写:MOVX Ri, A ; (Ri) A 指令可寻址范围: 当片外RAM小于或等于256个单元,用Ri间接寻址进行数据传送时,8位地址线足够使用。 当片外RAM单元较多时,8位地址线不够用,此时低8位地址在R0或R1中,P0口分时作低8位地址线和数据线;高8位地址由P2口提供,因此P2口应预先设置。 若设计循环程序,则Ri被加到0或减到0时必须考虑对P2口高8位地址进位或借位的影响。,例2 把片外RAM的36H单元中的数据送到片外RAM的1200H单元。分析(36H)(1200H)程序如下: MOV R1,#36H MOVX A ,R1 MOV DPTR,#1200H MOVX DPTR, A下面的程序可以实现吗? MOV DPTR, #1200H MOV R1,#36H MOV DPTR,R1注意:片外RAM之间不能直接传送数据,必须经过累加器A,2.查表指令MOVC MOVC A,A+DPTR ;A(A)+(DPTR) MOVC A,A+PC ;A(A)+(PC) 这两条指令主要用于查表,可以完成从程序存储器中取得数据并送入累加器A的功能。 (1) 第一条指令以DPTR为基址寄存器,查表时DPTR用于存放表格的起始地址。表格起始地址可以设置在64KB程序存储器中的任何位置。 (2)第二条指令以PC为基址寄存器,因A为8位无符号数,故该指令的查找范围是从PC当前值开始的255个地址单元内。 若(DPTR)=3000H,(A)=60H,执行指令“MOVC A,A+DPTR”后,将程序存储器3060H单元的内容送A。,例3 已知累加器A中有一个09范围内的数,请用查表法编程求出该数的平方值。设平方表表头地址为1000H。方法1以DPTR为基址寄存器 MOV DPTR,#1000H ;表头地址 MOVC A,A+DPTR ;查表求出平方值送A若原(A)=3,查表后(A)=9。方法2以PC为基址寄存器 ORG 0FFBH 0FFBH ADD A,#data ;加修正量,此例data=02H 0FFDH MOVC A,A+PC ;查表 0FFEH SJMP $ ;暂停,1000H DB 01001H DB 11002H DB 4 1009H DB 81 END 修正量=表头地址PC当前值=1000H0FFEH=02H所以data=02H(SJMP指令2字节)。 查表指令和被查表格通常在同一页内(页内地址00H0FFH即0255),例如,若(R1)=16H,(A)=28H,执行“XCH A,R1”后,(A)=16H,(R1)=28H,3.数据交换指令 交换类指令完成的传送是双向的,是两个字节间或两个半字节间的双向交换。 特点是只能与累加器A进行交换。字节交换 XCH A,Rn ;(A)(Rn) XCH A,direct ;(A)(direct) XCH A,Ri ;(A)(Ri)功能:字节数据交换,实现3种寻址操作数内容与A中内容的互换。,半字节交换 XCHD A,Ri ;(A30)(Ri)30) SWAP A ;(A30)(A74) 例如,若(R1)=50H,(50H)=74H,(A)=26H。执行指令“XCHD A,R1”后,(A)=24H,(50)=76H。 再如,若(A)=38H,执行指令“SWAP A”后,(A)=83H。,4.堆栈操作指令(PUSH 、POP) 堆栈操作指令只有两条: 入栈指令用于保护片内某个单元的内容, 出栈指令用于恢复片内某个单元的内容。 通常入栈指令和出栈指令是成对出现的。入栈: PUSH direct ;SP(SP)+1,(SP) (direct)出栈: POP direct ;direct (SP),SP (SP)1 入栈操作:首先(SP)+1,然后写入数据;出栈操作:首先读出数据,然后(SP)1。,图2- 6 堆栈存入/取出数据的操作,如图2-6所示,在堆栈的原始状态下执行一条“PUSH ACC”后,堆栈的变化过程如图2-6(b);在堆栈的原始状态下执行一条“POP ACC”后,堆栈的变化过程如图2-6 (c),例4 设(60H)=X,(70H)=Y,试用堆栈指令实现60H和70H单元内容的互换。 MOV SP,#50H ;设栈底 PUSH 60H ;51H(60H),X压入51H单元 PUSH 70H ;52H(70H),Y压入52H单元 POP 60H ;60H(52H),Y弹出进入60H单元 POP 70H ;70H(51H),X弹出进入70H单元想一想 用数据交换指令如何实现60H和70H单元内容的互换?,2.3 算术运算指令(24条),算术运算指令可以完成加、减、乘、除四则运算以及加1、减1和二-十进制调整操作。 这类指令多与累加器A有关,A常作为目的操作数,即指令运算结果存放在A中。同时它也能充当源操作数。 这类指令大多影响标志位,因而分析指令运算结果和对标志位的影响是本小节的重点。具体影响见表2-3,表2-3 算术运算指令对标志位的影响,说明: 1 .“”表示对应的指令操作影响该标志位;“0”表示相应的指令操作对该标志位清0;“×”表示相应的指令操作不影响该标志。 2. 累加器加1(INC A)和减1(DEC A)指令仅影响P标志。,1.不带CY位的加法指令格式:ADD A,Rn ;A(A)+(Rn)ADD A,direct ;A(A)+(direct)ADD A,Ri ;A(A)+((Ri))ADD A,#data ;A(A)+ data功能: 把源操作数与A中内容相加后再送入A中。 在上述4条指令中,参与运算的操作数都是8位二进制数,且其中一个操作数必须是累加器A。,编程人员可以将参与运算的两个操作数视为无符号数(0255),也可以把它们看作是有符号数。若看作是有符号数,则通常采用补码形式(-128+127)。,2.3.1加法指令,计算机总是把操作数当作有符号数(补码形式)看待并影响PSW的相关标志位。影响情况如下: 进位/借位标志CY: 两数和的D7位有进位时,(CY)=1,否则,(CY)=0。 半进位/借位标志AC: 两数和的D3位有进位时,(AC)=1,否则,(AC)=0。 溢出标志OV: 两数和的D7,D6位只有一位有进位时,(OV)=1;否则,(OV)=0,即OV=C6C7。奇偶标志P: 当累加器A中“1”的个数为奇数时,(P)=1;为偶数时(P)=0。,例5 试分析80C51单片机执行下述指令后,累加器A和PSW各标志位的变化。 MOV A,#0A5H ADD A,#0CFH解: (A)=10100101B + Data=11001111B CY 01110100B C7 C6 AC(CY)=C7=1;(AC)=1;溢出标志(OV)=C7C6=10=1,有溢出;(P)=0。执行结果:(A)=74H。 若为无符号数运算, (CY)=1,表示结果超出(0255)范围。若为带符号数运算,因(-49)+(-91)=-140,超出了(-128+127)的范围,所以OV=1溢出。,2.带CY位加法指令带CY位加法指令常用于多字节加法运算,格式如下: ADDC A,Rn ;A(A)+(Rn)+(CY) ADDC A,direct ;A(A)+(direct)+(CY) ADDC A,Ri ;A(A)+((Ri))+(CY) ADDC A,#data ;A(A)+ data +(CY)功能:把源操作数与A中内容相加后再加上标志位CY的当前值,将和送入A中。 这组指令的操作影响PSW的CY、AC、OV和P标志。 假设当前(CY)=1,(A)=85H,(R0)=97H,执行指令“ADDC A,R0”后,则使(A)=1DH,(CY)=1,(AC)=0,(OV)=1,(P)=0。,3.加1指令格式: INC A ;A(A)+ 1 INC direct ;direct(direct)+ 1 INC Rn ;Rn(Rn)+ 1 INC Ri ;(Ri)((Ri))+ 1 功能: 把源操作数的内容加1,结果再送回原来的单元。 这些指令仅“INC A”影响奇偶标志P,其余指令都不影响标志位的状态。,4.十进制调整指令格式: DA A ;若AC=1或A3A09,则A(A)+06H ;若CY=1或A7A49,则A(A)+60H功能: 通常跟在BCD码加法运算之后,用来对累加器A中刚刚进行的两个BCD码的相加结果进行十进制调整。 使用该指令时应注意以下几点: 本指令使用时跟在ADD或ADDC指令之后。 不能用DA A指令对BCD码减法操作进行直接调整,如需调整可采用十进制补码相加后,再用DA指令调整。 本指令不影响溢出标志位OV 借助标志位可实现多位BCD码加法结果的调整。,例6 分析下面程序段运行后的结果。 MOV A,#78H ADD A,#93H DA A解:列竖式分析过程如下: (A)=01111000B + data=10010011B 1 00001011B + 00000110B 低四位9,加06H调整 1 00010001B + 01100000B CY=1,加60H调整 1 01110001B 结果为171 则(A)=71H,考虑进位/借位标志(CY)=1,操作结果为171。,2.3.2 减法指令,1.带CY位减法指令 与加法指令不同,减法运算中只有带CY位的减法指令,其格式如下: SUBB A,Rn ;A(A)-(Rn)-(CY) SUBB A,direct ;A(A)-(direct)-(CY) SUBB A,Ri ;A(A)-((Ri))-(CY) SUBB A,#data ;A(A)- data -(CY)功能: 把累加器A中内容减去指令指定的单元的内容,再减去标志位CY的值,将结果再送回累加器A中。 SUBB指令对PSW中标志位的影响类似于ADDC加法指令。,例7 已知(A)=78H,(CY)=1,问执行完“SUBB A,#0C5H”后A和各标志位的状态。解:列竖式为: (A)= 01111000B data= 11000101B 1 10110011B 1 减CY 1 10110010B 则(A)=0B2H,(OV)=C7C6=10=1,有溢出,(P)=0,(AC)=0。 不带借位的减法操作如何实现?,2减1指令格式: DEC A ;A(A)- 1 DEC direct ;direct(direct)- 1 DEC Rn ;Rn(Rn)- 1 DEC Ri ;(Ri)((Ri))- 1 DEC DPTR ;DPTR(DPTR)- 1功能: 把源操作数的内容减1,结果再送回原来的单元。 这组指令仅“DEC A”影响奇偶标志P,其余指令都不影响标志位的状态。,格式: MUL AB ;累加器A与B寄存器相乘功能: 将累加器A与寄存器B中的2个无符号8位二进制数相乘,乘积的低8位留在累加器A中,高8位存放在寄存器B中。运算结果将对OV、CY、P标志位产生影响: 当乘积大于0FFH,即255(B中内容不为0)时,溢出标志位(OV)=1;否则(OV)=0; 标志位CY总是被清0; P的状态由A中的内容决定。 例如:(A)=36H,(B)=03H,执行指令“MUL AB”之后,(A)=0A2H,(B)=00H,(CY)=0,(OV)=0,(P)=1。,2.3.3 乘法指令,2.3.4 除法指令,格式: DIV AB ;累加器A除以寄存器B功能:累加器A中的位无符号数除以寄存器B中的位无符号数,所得的商存在A中,余数存在B中。对标志位的影响: 对CY和P标志位的影响与乘法相同; 当除数为0时,除法没有意义,(OV)=1,否则(OV)=0。例如:(A)=0FBH(十进制是251),(B)=12H(十进制是18),执行指令“DIV AB”之后,(A)=0DH,(B)=11H,(OV)=0,(CY)=0。,2.4 逻辑运算与循环类指令(24条),逻辑运算指令可以完成与、或、异或、取反、清0操作; 循环指令是对累加器A进行循环移位操作,包括向左、向右以及带CY位的移位操作。,2.4.1 逻辑与运算指令,格式1: ANL direct,A ;direct(direct)A ANL direct,#data ;direct(direct)data功能: 源操作数与直接地址指示的单元内容相与,结果送入直接地址指示的单元。格式2: ANL A, #data ;A(A)data ANL A, direct ;A(A)(direct) ANL A, Rn ;A(A)(Rn) ANL A, Ri ;A(A)(Ri)功能: 源操作数与A相与,结果送入A中。 例如:(A)=8CH,(R1)=0ABH,执行指令“ANL A,R1”后,(A)=88H,(R1)=0ABH。,2.4.2 逻辑或运算指令,格式1: ORL direct,A;direct(direct)A ORL direct,#data;direct(direct)data 功能: 源操作数与直接地址指示的单元内容相或,结果送入直接地址指示的单元。格式2: ORL A,#data ;A(A)data ORL A,direct ;A(A)(direct) ORL A,Rn ;A(A)(Rn) ORL A,Ri ;A(A)(Ri)功能: 源操作数与A相或,结果送入A中。 例如:(A)=0C5H,(R2)=67H,执行指令“ORL A,R2”后,(A)=0E7H。,格式1: XRL direct,A ;direct(direct)A XRL direct,#data ;direct(direct)data功能: 源操作数与直接地址指示的单元内容相异或,结果送入直接地址指示的单元。格式2: XRL A,#data ;A(A)data XRL A,direct ;A(A)(direct) XRL A,Rn ;A(A)(Rn) XRL A,Ri ;A(A)(Ri)功能:源操作数与A相异或,结果送入A中。,2.4.3 逻辑异或运算指令,格式: CLR A ;A 0 CPL A ;A 功能: 分别对A中内容清0和取反,结果仍存入A中。 例如:(A)=7FH,执行指令“CLR A”和“CPL A”后,A中内容分别为00H和80H。,2.4.4 累加器清0和取反指令,逻辑运算指令除了可以进行逻辑运算外,还能完成一些特殊的操作。例如: 1清0 “CLR A”只能对A清0,若要对某一单元如60H单元清0可以有以下几种方法:方法1 MOV 60H,#00H方法2 MOV A,60H XRL A,A MOV 60H,A方法3 ANL 60H,#00H,2.4.5逻辑运算指令的典型应用,2.屏蔽 将某一存储单元的某几位清0,其它位保持不变,称为屏蔽。被屏蔽的位,原来的数值将被取消,被0取代。屏蔽通常用ANL操作实现。 例8 编程实现将P1口低4位的值存入30H单元,屏蔽高4位。 MOV A,P1 ANL A,#0FH MOV 30H,A3.置1 将某一存储单元的某几位变为高电平1,其它位保持不变。通常用ORL操作实现。,例9 编程实现将P1口低4位的值保持不变,而高4位置1。结果存入30H单元。 MOV A,P1 ORL A,#0F0H MOV 30H,A4.求反 CPL A只能对A的所有位取反,如果需要对某一寄存器的某些位取反,则通常是利用异或指令来实现。例10 编程实现将P1口的高4位取反,而低4位保持不变,结果存入40H单元。 MOV A,P1 XRL A,#0F0H MOV 40H,A,2.4.6累加器循环移位指令,格式: RL A ;累加器左环移 RLC A ;带CY的累加器左环移 RR A ;累加器右环移 RRC A ;带CY的累加器右环移每条指令的操作过程如图2-7 所示。,图2-7 移位操作示意图,累加器每左移一位相当于乘以2。同理,累加器右移一位相当于除以2,大家可以自己验证。例11 已知(A)=0ACH=10101100B,(CY)=0,问执行以下程序后(A)=?,(CY)=?。 RL A ;左移A01011001B RRC A ;带CY右移A00101100B,CY=1则(A)=2CH,(CY)=1说明: 1.所有对A操作的指令都对标志位P有影响。 2.逻辑运算指令不影响CY、OV、AC。 3“RLC A”和“RRC A”指令对CY和A都有影响。,2.4.7课题与实训3 流水灯及系统脱机运行,一实训目的 1进一步熟悉单片机I/O接口的线路连接。 2学习数据传送指令和移位指令的应用。 3学习单片机输出口的控制 4进一步熟悉仿真器的使用方法。 5学习程序固化及脱机运行的方法。 二课题要求 1用单片机的P1口控制8只LED灯,每次点亮两只,作P1.0 P1.1P1.2 P1.3P1.4 P1.5P1.6 P1.7P1.0 P1.1的循环闪烁,间隔0.2秒。 2将程序固化到一片AT89C51芯片中,连接线路,使其脱机工作。,三背景知识 通过单灯点亮程序,我们已经知道。只要保证每次从P1 口送出的数据中有两个保持低电平(就图2-8电路而言)就可以将相应的灯点亮。,四硬件电路,图2-8 流水灯电路,五软件设计 软件设计略,相信大家有了单灯点亮的基础,完全可以自己设计出来。设计有难度的同学可以参考3.4.4节的流水灯程序。六总结与提高 实现本实训的思路比较清楚,但程序的书写相对较长,其中重复性的功能较多,这些可以在后续知识的学习中进行优化改进。仍采用该实训电路,你能设计出效果更好的流水灯吗?试试看。,程序的顺序执行是由PC自动加1实现的,要改变程序的执行顺序,实现分支转向,应通过强迫改变PC值的方法来实现,这就是控制转移类指令的基本功能。 80C51的控制转移指令有无条件转移、条件转移及子程序调用与返回等。 2.5.1无条件转移 不规定条件的程序转移称之为无条件转移。这类指令共4条:,2.5 控制转移类指令(17条),1.长转移 LJMP addr16 ;PCaddr16 这是一条3字节指令,指令执行后能把16位地址(addr16)送PC,从而实现程序转移。因转移范围大,可达64KB,因此称之为“长转移”。 例如“LJMP 2600H”就表示程序要转移到2600H单元去。 在修改或调试程序时,常常要插入或删除部分指令或对当前指令所处的位置进行调整,因此,在实际编写程序时通常采用符号地址。如“LJMP NEXT”。,2.短转移 AJMP addr11;PC(PC)+2,PC100addr11 这是一条2字节指令,指令执行时,先将PC的内容加2(这时PC指向的是AJMP的下一条指令),然后把指令中的11位地址码传送到PC100,保持PC1511原来的内容不变。 由于转移的地址是11位(211=2K),故AJMP指令的转移范围是包含AJMP下一条指令在内的2K空间。 与LJMP指令类似,AJMP指令后面最好也用符号地址,但必须保证该符号所处的地址在2KB的寻址范围内。,3.相对转移 SJMP rel ;PC(PC)+2,PC(PC)+rel 这是一条2字节指令,其功能是先计算目的地址,并按计算得到的目的地址实现程序的相对转移。计算公式为: 目的地址=(PC)+2+rel 其中rel为相对偏移量,它本身是一个带符号的8位二进制数的补码形式,取值范围为-128+127(00H7FH对应0+127,80HFFH对应表示-128-1)。因此所能实现的转移是双向的: 如果rel为正数表示正向转移;如果rel为负数则表示反向转移。,例如: LOOP: MOV R1,60H SJMP NEXT ;rel0 NEXT: MOV A,#30H SJMP LOOP ;rel0 ,4.散转移 JMP A+DPTR ; PC(A)+(DPTR) 这是一条1字节转移指令,指令的目的地址由A的内容和DPTR内容之和来确定,即目的地址=(A)+(DPTR)。 例如:有一段程序如下: MOV DPTR,#TABLE JMP A+DPTR TABLE:AJMP NEXT0 AJMP NEXT1 AJMP NEXT2 AJMP NEXT3 当(A)=00H时,程序将转到NEXT0处执行;当(A)=02H时,程序将转到NEXT1处执行;其余类推。,条件转移就是说程序的转移是有条件的。执行条件转移指令时,如果指令中规定的条件满足,则进行程序转移,否则程序顺序执行。条件转移有如下形式: 1. 累加器判0转移 JZ rel;若(A) =0,则PC(PC)+rel JNZ rel ;若(A)0,则PC(PC)+rel 功能: 对累加器A的内容是否为0进行判断并转移。如图2-9所示。,