您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 单片机应用技术第三章
第三章单片机的指令系统3.1单片机的编程语言及格式3.2寻址方式3.3数据传送类指令3.4算术运算类指令3.5逻辑运算类指令3.6控制转移类指令3.7位操作指令下一页返回第三章单片机的指令系统实训三彩灯的控制本章小结上一页返回3.1单片机的编程语言及格式3.1.1单片机编程语言分类及特点单片机的编程语言有机器语言、汇编语言与高级语言三种。机器语言(MachineLanguage)是指直接用机器码编写程序、能够为计算机直接执行的机器级语言。机器码是一串由二进制代码“0”和“1”组成的二进制数据,执行速度快。但对于使用者来说,用机器语言编写程序非常繁琐,不易看懂和记忆,容易出错。机器语言一般只在简单的开发装置中使用。汇编语言(AssemblyLanguage)是指用指令助记符代替机器码的编程语言。程序结构简单,执行速度快,程序易优化,编译后占用存储空间小,能充分发挥单片机的硬件功能,是单片机应用系统开发中最常用的程序设计语言。下一页返回3.1单片机的编程语言及格式高级语言(High-LevelLanguage)是在汇编语言的基础上用高级语言来编写程序,例如FranklinC51、MBASIC51等,程序可读性强,通用性好,适用于不熟悉单片机指令系统的用户。大中型单片机系统的软件开发采用C语言的开发周期通常要比采用汇编语言短得多。高级语言编写程序的缺点是实时性不高,结构不紧凑,编译后占用存储空间比较大,这一点在存储器有限的单片机应用系统中没有优势。由上述三种编程语言的各自特点可以看出,如果应用系统的存储空间比较小,且对实时性的要求很高,则应选用汇编语言。如果系统的存储空间比较大,且对实时性的要求不是很高,则应选用高级语言。上一页下一页返回3.1单片机的编程语言及格式不论是汇编语言还是高级语言都要转化为机器语言才能为计算机所用。因此,机器语言程序又称为目标程序,而用汇编语言和高级语言编写的程序称为源程序。对于单片机的学习,掌握汇编语言是必不可少的,所以本书主要介绍汇编语言,对高级语言(C51)只做简单介绍。3.1.2汇编语言的指令格式指令是指挥计算机工作的命令,是计算机软件的基本组成单元。指令有机器指令和汇编语言指令两种。机器指令是用二进制数表示的能直接被计算机识别并执行的指令,由于二进制书写起来较长,通常用十六进制数表示。显然这种指令不便记忆和理解,书写时也容易出错。为了便于记忆和使用,常以指令的英文名称或缩写形式作为助记符来表示指令的上一页下一页返回3.1单片机的编程语言及格式功能(如用“MOV”表示传送,用“ADD”表示加法),这样的指令称为汇编语言指令。指令的表示形式称为指令格式。用MCS-5l汇编语言表示的指令格式如下:[标号:]操作码助记符[操作数1,操作数2,操作数3][;注释]例如:LOOP:ADDA,#50H;执行加法在指令格式中,方括号中的内容为可选项,不一定都有。各字段的意义如下:标号:表示该指令所在的地址。并不是每条指令都必须有标号,通常在程序分支、转移所需要的地方才加上一个标号。标号是以字母开始的,由1~8个字符(字母或数字)组成,标号不能使用汇编语言中已经定义过的符号名,如指令助记符、寄存器名、伪指令等。标号以“:”结尾。特别应注意的是,在一个程序中不允许重复定义标号,即同一程序内不能在两处及两处以上使用同一标号。上一页下一页返回3.1单片机的编程语言及格式操作码:表示该语句要执行的操作内容,是每条指令必有的部分。操作码用指令助记符表示。操作码后面至少留一个空格,使其与后面的操作数分隔。操作数:表示操作码的操作对象,常用符号(如寄存器、标号)、常量(如立即数、地址值等)来表示。操作码和操作数之间用若干空格分隔,而各操作数之间用逗号“,”分隔。指令的操作数可以有3个、2个、1个或没有(如空操作指令NOP)。操作数的个数因指令功能而异。例如:MOVA,#30H;传送指令,两个操作数,第1个为目的操作数,第2个为源操作数INCA;累加器加1指令,只有一个操作数RETI;中断返回指令,没有操作数上一页下一页返回3.1单片机的编程语言及格式注释:该字段可有可无,是用户为阅读程序方便而加的解释说明。注释段以“;”开始,不影响程序的执行。3.1.3指令的分类及符号含义MCS-51系列单片机具有十分丰富的指令系统,使用了42种操作码助记符来描述,共有33种操作功能。其中有的操作可以有多种寻址方式,这样就构成了111条指令。其分类如下:按功能分类:数据传送指令29条,算术运算指令24条,逻辑运算指令24条,控制转移指令17条,位操作指令17条。按指令字长分类:单字节指令49条,双字节指令46条,三字节指令16条。上一页下一页返回3.1单片机的编程语言及格式按执行时间分类:单机器周期指令64条,双机器周期指令45条,四机器周期指令2条。在分类介绍指令之前,我们先把描述指令的一些符号意义作一简单的介绍:Rn:当前选中的寄存器区的8个工作寄存器R0~R7;Ri:当前选中的寄存器区中可作间接寻址的2个工作寄存器R0、R1;direct:8位的内部数据存储器单元的地址,可以是内部RAM单元的地址及SFR的地址;#data:8位立即数,立即数前面必须加“#”;#data16:16位立即数;上一页下一页返回3.1单片机的编程语言及格式addrl6:16位目的地址,用于LCALL和LJMP指令中,范围是64KB程序存储器空间;addr11:11位目的地址,用于ACALL和AJMP指令中,目的地址必须与下一条指令的第一字节在同一个2KB程序存储器地址空间之内;rel:8位带符号偏移量,用于SJMP和所有条件转移指令中;DPTR:数据指针,可用作16位地址寄存器;bit:内部RAM或SFR中的直接寻址位;A:累加器;B:特殊功能寄存器,用于MUL和DIV指令中;上一页下一页返回3.1单片机的编程语言及格式CY:进位标志或进位位,是布尔处理机中的运算器。@:间接寄存器或基址寄存器的前缀,如@Ri。/:位操作数的前缀标志,在位操作指令中表示对该位操作数先求反再参与操作,但不影响该位操作数原值,如/bit;(×):×中的内容;((×)):×中内容作为地址单元中的内容;←:箭头左边的内容被箭头右边的内容所代替;↔:数据交换;$:当前指令的起始地址。上一页返回3.2寻址方式寻址方式是指CPU寻找操作数或操作数地址的方法。比如完成3+2=5简单运算,在计算机中加数和被加数存放在什么地方?CPU如何得到它们?运算结果存放在什么地方?这些就是所谓的寻址问题。实际上计算机执行程序的过程就是不断地寻找操作数并进行操作的过程。寻址方式越多,计算机指令功能越强,灵活性越大。寻址方式是计算机的重要性能指标之一,也是汇编程序设计中最基本的内容,应该深刻理解和熟练掌握。MCS-5l系列单片机共有7种寻址方式,分述如下。3.2.1立即寻址下一页返回3.2寻址方式在这种寻址方式中,操作数直接由指令给出,该操作数被称为立即数。一般立即数可以是8位二进制数,也可以是16位二进制数。立即数只能作为源操作数,不能作为目的操作数。使用时在立即数前面加“#”号标志。例如:MOVA,#5CH;机器码为745CHMOVDPTR,#1234H;机器码为901234H第—条指令是把8位立即数5CH送累加器A,指令执行示意图如图3-1所示。第二条指令是把16位立即数1234H送给数据指针DPTR。其中12H送给DPH,34H送给DPL。上一页下一页返回3.2寻址方式应注意目的操作数与源操作数的存储大小要匹配,源操作数的大小不能超过目的操作数的存储范围。例如:指令“MOVA,#2134H”是错误的;而指令“MOVDPTR,#20H”则等同于“MOVDPTR,#0020H”。在指令中,立即数可以是二进制、十六进制、十进制,缺省后缀为十进制。3.2.2直接寻址直接寻址是指操作数在指令给出的地址单元中。直接寻址的地址单元(直接地址)取值范围必须在00H~FFH之间。例:MOVA,40H;机器码为E540H上一页下一页返回3.2寻址方式指令功能是把直接地址40H单元的内容送累加器A,如图3-2所示。用直接寻址方式可访问的存储空间如下:1、内部RAM低128单元在指令中直接以单元地址形式给出,地址范围00H~7FH。2、特殊功能寄存器SFRSFR可以以单元地址给出,也可用寄存器符号形式给出(A、AB、DPTR除外)。如MOVA,PSW与MOVA,0D0H两条指令的作用是一样的,但使用前者更容易理解和阅读。3.2.3寄存器寻址上一页下一页返回3.2寻址方式寄存器寻址就是所需查找的操作数在寄存器中。这种寻址方式中所对应的寄存器号隐含在机器码中。寄存器寻址可以提高指令执行速度,缩短指令编码长度。例:MOVA,R4;机器码为0ECH(11101100B),其后三位代表寄存器号为4(100B)指令执行过程是将R4内容传送到累加器A中,如图3-3所示。这种寻址方式中的寄存器号是隐含在机器码中的,所以这条指令的机器码只需用一个字节就能表示操作码及操作数,其中高5位表示操作码,低3位表示操作数所在的寄存器号。寄存器寻址方式可以访问的存储空间为:上一页下一页返回3.2寻址方式1.四组工作寄存器R0~R7共32个工作寄存器,由程序状态字PSW中的RSl、RS0两位状态来进行当前寄存器组的选择;2.特殊功能寄存器A、AB、DPTR。注意:寄存器B只有在执行乘除指令时才是寄存器寻址方式。例如,在指令“MOVA,B”中机器码为E5F0H,“B”为直接寻址方式。它与“MOVA,0F0H”等同。在MCS-51指令系统中,累加器A有三种不同的表达方式,即A、ACC和E0H,分属不同的寻址方式,但指令的执行结果完全相同。例如:上一页下一页返回3.2寻址方式INCAINCACCINC0E0H这三条指令都是对累加器加1的指令,第一条指令机器码是04H,为寄存器寻址方式,第二、三条指令机器码为05E0H,为直接寻址方式,E0H为A的物理地址。虽然三条指令完成的功能完全相同,但使用第一条指令更加合适,因为它是单字节指令,其他两条为双字节指令。3.2.4寄存器间接寻址上一页下一页返回3.2寻址方式寄存器间接寻址就是所要查找的操作数位于以寄存器的内容为地址的单元中。这种寻址方式相当于两次寻址。寄存器间接寻址使用的寄存器为Ri或DPTR,并在寄存器名前面加“@”标志。和寄存器寻址相比,寄存器间接寻址时寄存器中存放的是操作数所在的地址,寄存器寻址时寄存器中存放的是操作数。寄存器间接寻址通过@Ri(只有@R0和@R1两种形式)可以访问内部RAM低128单元(地址范围00H~7FH)和片外RAM的256个存储单元,使用数据指针DPTR作为间址(@DPTR)可以访问外部RAM64KB空间。上一页下一页返回3.2寻址方式在执行入栈(PUSH)和出栈(POP)指令时,对堆栈区的数据访问默认采用堆栈指针SP作寄存器间接寻址。例如:设(R0)=40H,(40H)=55H,执行指令MOVA,@R0;机器码为0E6H(11100110B)该指令是把R0中内容40H作为地址,将40H中的内容传送到累加器A中,该指令执行过程如图3-4所示。上例中的指令也只需用一个字节机器码,其中高7位表示操作码,最低位表示寄存器号。注意:寄存器间接寻址方式不能用于对SFR的寻址。例如:MOVR0,#0F0HMOVA,@R0上一页下一页返回3.2寻址方式以上指令不能执行,因为0F0H为特殊功能寄存器B的物理地址,而对特殊功能寄存器(除DPTR外)只能直接寻址,不能间接寻址。3.2.5变址寻址(基址寄存器+变址寄存器间接寻址)这种寻址方式是以16位寄存器(数据指针DPTR或程序计数器指针PC)作为基址寄存器,以累加器A作为变址寄存器,并以两者内容相加形成新的16位地址作为操作数所在的地
本文标题:单片机应用技术第三章
链接地址:https://www.777doc.com/doc-3149052 .html