第2章-51单片机的指令系统和C语言

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第二章51单片机的指令系统和C语言汇编语言和C语言是51单片机软件开发中最常用的语言,而指令系统又是汇编语言开发的基础,通常来说C语言会用于较复杂的大型程序编写,汇编语言则用于对效率要求很高的场合,尤其是底层函数的编写。2.151单片机的寻址2.251单片机的指令2.351单片机的伪指令和汇编程序设计2.451单片机的C语言2.5C51语言程序设计技巧2.151单片机的寻址指令的汇编语言格式使用助记符来表示一条指令,其基本格式为:操作码+操作数。在51单片机指令系统中常用的助记符:•Rn:当前使用的工作寄存器R0~R7。/•Ri:当前使用的工作寄存器中可以用作间址寄存器的两个R0、R1。•direct:8位内部存储器地址,可以是RAM或者是特殊寄存器。•#data:8位立即数。•#data16:16位立即数。•addr16:16位目的地址。•addr11:11位目的地址。•rel:8位偏移量,可以带符号。•bit:位地址。•@:间址寄存器前缀,例如@Ri。•/:位操作数前缀,表示对该位操作数进行取反操作。•(x):寄存器或存储单元x的内容。•((x)):以寄存器或存储单元x的内容作为地址的存储单元的内容。•→:数据传送方式。2.1.1助记符和寻址基础2.151单片机的寻址•立即寻址:立即寻址是直接给出操作数的寻址方式,操作码后面的内容就是操作数,由于这些操作数立即传送或者赋值,所以被称为立即数。•直接寻址:直接给出操作数所在存储器地址的方式被称为直接寻址,操作数的地址可以是内部数据存储器的用户区、特殊功能寄存器或者位地址空间。•寄存器寻址:寄存器寻址和直接寻址类似,只是将数据存放在寄存器中,然后直接给出寄存器的地址,这些寄存器可以是R0~R7、A、B、DPTR,其中A、B可以联合起来作为一个16位的寄存器参与寻址;当使用位操作指令时候还可以使用CY。•寄存器间接寻址:将操作数所在的存储器地址放在一个寄存器中,然后对这个寄存器寻址,这就是寄存器间接寻址,寄存器间接寻址方式可以访问内部数据存储器和外部数据存储器。•变址间接寻址:变址间接寻址是将基址寄存器内部数据加上变址寄存器内部数据的结果作为操作数的存放地址。•相对寻址:相对寻址方式是以PC的内容作为基础地址,加上指令中给定的偏移量,所得到的结果为转移地址,其中偏移量是8位带符号数,范围在+127~-128之间,一般用于程序的跳转,只能寻址程序寄存器。•寻址空间范围:寻址空间是指寻址指令能使用的存储器地址范围,表2.1给出了常用的寻址方式的寻址空间范围。2.1.2寻址方式2.251单片机的指令2.2.1数据传送指令•MOV指令:MOV是将数据存储器或者寄存器中的源操作数内容送入目的操作数的指令。•MOVC指令:MOVC和MOV指令类似,但是只能用于访问程序存储器,一般用于查表操作,使用间址变址寻址。•MOVX指令:MOVX指令也和MOV指令类似,但是用于访问外部数据存储器,可以使用R0~R7和DPTR间接寻址。•XCH指令:XCH指令用于完成累加器和源操作数之间的数据交换,所有的目的操作数必须是累加器A,源操作数则可以是寄存器寻址、直接寻址和寄存器间接寻址。•XCHD指令:XCHD是一个半字节交换指令,和XCH类似,但是交换的只是源操作数和目的操作数的低半字节,它们的高半字节保持不变。•PUSH指令:PUSH用于将操作数压入堆栈,其操作数必须为直接寻址,例2.11给出了PUSH指令的应用方法。•POP指令:POP用于把数据从堆栈中弹出到指定的内部数据存储器或者特殊功能寄存器。2.251单片机的指令•ADD和ADDC指令:ADD和ADDC是加法指令,其中ADD是不带进位的加法运算指令,两个相加的数中目的操作数存放到累加器中,原数据可以采用立即寻址、寄存器寻址、寄存器间接寻址或者直接寻址方式。•SUBB指令:SUBB是带借位的减法,其用法和ADDC完全类似,也会影响PSW的对应标志位。•MUL和DIV指令:MUL是乘法指令,目的操作数为累加器A,源操作数为B寄存器,使用寄存器寻址,相乘之后的结果低字节存放到累加器A中,高字节存放到B寄存器中。执行MUL指令之后CY一定为零,若高字节为零则OV被清除,否则OV被置位。•INC和DEC指令:INC是自加1指令,可以使指定单元内容加1,加法按照无符号二进制数进行,其执行结果不影响PSW中各个标志,寻址方式可以是直接寻址、寄存器寻址、寄存器间接寻址。DEC和INC类似,可以使指定单元内容减1,执行结果不影响相关标志位。2.2.2算术指令2.251单片机的指令•ANL指令:逻辑与指令是在所给出的操作数之间进行的以位为单位的与操作,将结果存放在目的操作数中,常常用于将字节数据指定的位清零。•ORL指令:逻辑或指令是在所给出的操作数之间进行的以位为单位的逻辑或操作,结果存放在目的操作数中,常常用于将字节数据的指定位置位。•XRL指令:逻辑异或指令是在所给出的操作数之间进行的以位为单位的逻辑异或操作,结果存放在目的操作数中,常常用于将字节数据的指定位取反。•LR和CPL指令:清零指令CLR将累加器A数据清零,取反指令CPL将累加器A数据取反,这两条指令只能对累加器A使用。•移位操作指令:51系列单片机的移位指令包括循环左移指令RL、循环右移指令RR、带进位的循环左移指令RLC和带进位的循环右移指令RRC。这些指令的操作数都必须是累加器A。•SWAP指令:半字节操作指令SWAP用于将累加器A高半字节数据和低半字节数据交换。2.2.3逻辑操作指令2.251单片机的指令•位传送指令:位传送指令仍然是MOV,但是其目的操作数和源操作数必须分别是位地址和CY标志位,需要注意的是位地址和位地址之间不能直接传送数据,必须利用CY作为中间媒介。•位变量修改指令:位变量修改指令包括清除位指令CLR和置位位指令SETB,这两条指令可以对一个位地址或者进位标志CY操作,例2.24给出了这两条指令的应用方法。•位逻辑运算指令:位变量之间的逻辑运算包括逻辑与运算指令、逻辑或运算指令和逻辑非运算指令,这些指令使用进位标志C作为目的操作数,使用一个位地址作为源操作数。2.2.4位操作指令2.251单片机的指令•无条件转移指令:无条件转移指令包括短转移指令AJMP、长转移指令LJMP、相对转移指令SJMP和散转指令JMP,这些指令不需要任何条件,直接根据操作数修改PC内容,均不影响PSW相关标志位。•条件转移指令:条件转移指令根据某些条件决定是否修改PC的数值,当条件不满足时,继续执行PC下面的指令,当条件满足时候跳转到指定指令起始位置。条件转移指令包括零条件转移指令JNZ、JN,比较转移指令CJNE和减1非零转移指令DJNZ。•子程序转移指令:子程序转移指令包括短调用指令ACALL,长调用指令LCALL和返回指令RET、RETI。这些指令用于从主程序进入和返回子程序,子程序是指具有某种功能的公用程序段。子程序转移指令和普通转移指令的最大区别是在调用前者必须把当前PC数值压入堆栈保存,退出前者时必须从堆栈中将PC值恢复。•控制转移指令:位控制转移指令包括JC,JNC,JB,JNB,JBC共5条指令,均是条件跳转指令,使用进位标志CY或者位地址作为判断地址。•空操作指令:空操作指令NOP将PC值加1,让程序继续执行,占用一个机器周期,常常用于等待操作。2.2.5控制转移指令2.351单片机的伪指令和汇编程序设计•ORG伪指令:ORG伪指令用于定义程序或者数据块的起始存放地址,其一般使用格式是“ORG16位地址”,在一个程序中可以多次使用ORG定义不同程序段的起始地址。•DB伪指令:DB伪指令用于将以系列数据字节存放到从标号开始的连续字节单元中,数据字节使用逗号分离,可以是十六进制数,十进制数或者是字符。•DW伪指令:DW伪指令和DB类似,将系列数据按照双字节格式存放到从标号开始的连续双字节单单元中,低位地址单元存放低位数据字节,高位地址单元存放高位数据字节,每双字节之间使用逗号隔开。•EQU伪指令:EQU伪指令用于给一个表达式的值或者字符串赋予标号,这个标号可以用作程序地址、数据地址或者立即数。通常的使用格式是“标号EQU表达式”,标号必须是没有使用过的,表达式可以是8位或者16位数据,EQU可以使用“=”代替。•DATA伪指令:DATA伪指令用于给8位内部数据存储器地址单元赋予一个标号,这个标号不是唯一的,同一个地址单元可以拥有多个标号。•XDATA、BIT和END伪指令:XDATA伪指令用于给一个8位外部数据存储器单元赋予一个标号,其使用方法和DATA伪指令相同。BIT伪指令用于给可以位寻址的存储器单元起一个名字,使用方法和DATA伪指令相同。END伪指令用于标志程序的结束,编译器对程序的编译到END结束。2.3.1伪指令2.451单片机的C语言2.4.1C51语言的数据类型、运算符和表达式数据类型名称长度值域基本类型位型bit1bit0,1字符型unsignedchar,char1byte0~255,.128~127整型unsignedint,int2bytes0~65525,.32768~32767长整型unsignedlong,long4bytes0~4294967295,.2147483648~2147482647浮点型float4bytes±1.176E.38E~±3.40+38(6位数字)双精度浮点型double8bytes±1.176E.38E~±3.40+38(10位数字)构造类型数组、结构体、共用体、枚举指针类型2~3bytes存储空间,最大64K2.451单片机的C语言2.4.1C51语言的数据类型、运算符和表达式•常量和变量:常量在程序执行过程中值不能发生变化,变量在程序执行过程中值可以改变;常量通常用#define关键字来定义,而变量通常用变量名来表示,一个起始字符为字符或者下划线,随后字符必须是字母、数字或者下划线的字符组合,变量在使用之前必须先定义。•C51语言的存储器和寄存器变量定义:数据存储空间关键字、C51的存储模式•C51语言的算术运算、赋值、逻辑运算以及关系运算:算术运算符、赋值中的自动类型转化•C51语言的位操作:位逻辑运算包括位与、位或、位异或、位取反。•C51语言的自增减、复合和逗号运算:C51语言的自增减运算分别是使变量的值增加或者减少1,相当于“变量=变量+1”或者“变量=变量–1”操作,其应用形式是“变量++”、“++变量”、“变量--”和“--变量”。2.451单片机的C语言2.4.2C51语言的结构•顺序结构:顺序结构是最简单和基本的程序结构,程序从程序空间的低地址位向高地址位执行。•选择结构:如果条件为“真”时执行某些语句,如果条件为“假”时执行另外一些语句。选择语句可以分为单分支结构以及多分支结构,多分支结构又包括串行多分支结构和并行多分支结构。常用的选择语句有if语句、switch语句,其中if语句有if…else、if和elseif三种形式。•循环结构:循环语句用于处理需要重复执行的代码块,在某个条件为“真”的时候,重复执行某些相同的代码块。•break、continue和goto语句:在循环语句执行过程中,如果需要在满足循环判定条件的情况下跳出代码块,可以使用break、continue语句,如果要从任意地方跳到代码的某个地方,可以使用goto语句。2.451单片机的C语言2.4.3C51语言的函数•函数的定义、参数和返回值:函数按照定义形式可以分为无参数函数和有参数函数。函数的值是在函数执行完成之后通过return语句返回给调用函数语句的一个值,返回值的类型和函数的类型相同,函数的返回值只能通过return语句返回。•函数的调用:一般而言,函数调用有使用函数名调用、函数结果参与运算以及函数结果作为另外一个函数的实际参数三种调用方式,需要注意的是函数在被调用之前必须首先被声明。•局部变量和全局变量:局部变量是在某个函数中存在的变量,也可以成为内部变量,它只在该函数内部有效。全局变量是在整个源文件中都

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功