单片机八语言编程优秀课件.ppt
单片机八语言编程单片机八语言编程第1页,本讲稿共137页第章单片机编程语言第章单片机编程语言v3.1 单片机编程语言概述单片机编程语言概述v3.2 C51语言语言第2页,本讲稿共137页3.1 3.1 单片机编程语言概述单片机编程语言概述 v5151单片机的编程语言可以是单片机的编程语言可以是汇编语言汇编语言,也可以是,也可以是高级语言高级语言,如由,如由C C语语言演变而成的言演变而成的C51C51语言语言等。等。v汇编语言汇编语言产生的目标代码短,占用的存储空间小,执行速度快,能充分发产生的目标代码短,占用的存储空间小,执行速度快,能充分发挥单片机的硬件功能。但对于复杂的应用来讲使用汇编语言编程复杂,程序挥单片机的硬件功能。但对于复杂的应用来讲使用汇编语言编程复杂,程序的可读性和可移植性不强。的可读性和可移植性不强。v高级语言高级语言产生的目标代码长,占用的存储空间大,执行速度慢。但产生的目标代码长,占用的存储空间大,执行速度慢。但这是相对于汇编语言来讲的,其实这是相对于汇编语言来讲的,其实C C语言在大多数情况下的机器代码语言在大多数情况下的机器代码生成效率和汇编语言相当,但生成效率和汇编语言相当,但可读性可读性和和可移植性可移植性却远远超过汇编语言,却远远超过汇编语言,编程效率编程效率也大大高于汇编语言。也大大高于汇编语言。第3页,本讲稿共137页3.1 3.1 单片机编程语言概述单片机编程语言概述v如果应用系统的存储空间比较小,且对实时性的要求很高,则应选用如果应用系统的存储空间比较小,且对实时性的要求很高,则应选用汇汇编语言编程编语言编程。如果系统的存储空间比较大,且对实时性的要求不是很高,则。如果系统的存储空间比较大,且对实时性的要求不是很高,则C51C51语言语言是理想的编程语言。如果系统中有部分模块对实时性的要求是理想的编程语言。如果系统中有部分模块对实时性的要求很高,而其它模块对实时性的要求不是很高,则可以将两种语言结很高,而其它模块对实时性的要求不是很高,则可以将两种语言结合,程序的主体部分使用合,程序的主体部分使用C51C51编程,对实时性的要求高的模块用汇编编程,对实时性的要求高的模块用汇编语言编程,然后将语言编程,然后将汇编语言程序模块嵌入到汇编语言程序模块嵌入到C51C51语言程序当中语言程序当中。v无无论论是是高高级级语语言言还还是是汇汇编编语语言言写写的的源源程程序序都都必必须须转转换换成成目目标标程程序序(机机器器语语言言),单单片片机机才才能能执执行行。目目前前很很多多公公司司都都将将编编辑辑器器、汇汇编编器器、编编译译器器、连连接接/定定位位器器、符符号号转转换换程程序序做做成成了了软软件件包包,称称为为集集成成开开发发环环境境,如如Keil Keil uVisionuVision、Silicon Laboratories IDESilicon Laboratories IDE等。等。第4页,本讲稿共137页3.2 C51语言语言v早期的嵌入式系统的硬件的功能相对较弱,软件的规早期的嵌入式系统的硬件的功能相对较弱,软件的规模相对较小,一般不超过模相对较小,一般不超过8K。硬件工程师通常要同时。硬件工程师通常要同时进行软、硬件设计,所以一般采用汇编语言来进行程序进行软、硬件设计,所以一般采用汇编语言来进行程序设计。设计。v汇编程序的主要缺点是可读性和可维护性较差(特别汇编程序的主要缺点是可读性和可维护性较差(特别当程序没有很好的进行注释时),代码的可重用性也比当程序没有很好的进行注释时),代码的可重用性也比较低。较低。v目前的嵌入式系统硬件性能和软件的规模都有了很大目前的嵌入式系统硬件性能和软件的规模都有了很大的提高,一般采用的提高,一般采用C 语言语言进行嵌入式系统程序设计。进行嵌入式系统程序设计。第5页,本讲稿共137页v使用使用C语言有以下的优点:语言有以下的优点:C 语言具有语言具有结构化结构化和和模块化模块化特点,便于阅读和维护。特点,便于阅读和维护。C 语言语言可移植性好可移植性好,很多微控制器都支持,很多微控制器都支持C 编译器。功能化编译器。功能化的代码能够很方便的从一个工程移植到另一个工程,从而减的代码能够很方便的从一个工程移植到另一个工程,从而减少了开发时间。少了开发时间。C 语言编写的程序比汇编语言编写的程序更符合人们的思考语言编写的程序比汇编语言编写的程序更符合人们的思考习惯,开发者可以更专心的考虑算法,而不是考虑一些细节习惯,开发者可以更专心的考虑算法,而不是考虑一些细节问题。这样可以减少编程错误出现的机率,从而问题。这样可以减少编程错误出现的机率,从而提高开发效提高开发效率率,减少调试的时间。,减少调试的时间。C 语言和微控制器是语言和微控制器是相对独立的相对独立的,开发者不必知道处理器的,开发者不必知道处理器的具体内部结构和处理过程。当基于新型的微控制器开发程序具体内部结构和处理过程。当基于新型的微控制器开发程序时,可以很快上手,减少学习时间和程序开发时间。时,可以很快上手,减少学习时间和程序开发时间。第6页,本讲稿共137页v尽管尽管C语言有以上的优点,但这并不是说汇编语言过语言有以上的优点,但这并不是说汇编语言过时了。很多系统特别是实时嵌入式系统都是采用时了。很多系统特别是实时嵌入式系统都是采用C 和汇和汇编语言进行混合编程。对实时响应时间有很严格要求的编语言进行混合编程。对实时响应时间有很严格要求的应用系统,使用汇编语言成了开发者的唯一选择。应用系统,使用汇编语言成了开发者的唯一选择。vC51语言语言是一种专门为是一种专门为8051单片机设计的高级语言单片机设计的高级语言C编译器,支持符合编译器,支持符合ANSI标准的标准的C语言程序设计,同时针语言程序设计,同时针对对8051单片机的自身特点做了一些特殊扩展。单片机的自身特点做了一些特殊扩展。如果有如果有C/C+语言的基础,语言的基础,C51语言能够很快掌握!语言能够很快掌握!第7页,本讲稿共137页3.3.1标识符、关键字标识符、关键字v标识符标识符与与关键字关键字是是C语言的基本组成部分。语言的基本组成部分。v 标识符标识符C语言中的标识符(语言中的标识符(identifier)是由一个或多个字符组成的序列,标识符可以作为变量名、)是由一个或多个字符组成的序列,标识符可以作为变量名、函数名、数组名、类型名或文件名。函数名、数组名、类型名或文件名。标识符的第一个字符必须是字母或下划线,随后的字符必须是字母、数字或下划标识符的第一个字符必须是字母或下划线,随后的字符必须是字母、数字或下划线。线。不同的编译器定义的标识符的有效长度不完全相同,但不会少于不同的编译器定义的标识符的有效长度不完全相同,但不会少于8个字符。为个字符。为了程序移植方便,标识符的长度最好不超过了程序移植方便,标识符的长度最好不超过8个字符。个字符。v注意注意1:C语言区分字母的大小写,这和汇编语言是不同的。例如:语言区分字母的大小写,这和汇编语言是不同的。例如:var 和和Var 是两个不同的标识符。是两个不同的标识符。v注意注意2:C51编译器编译器6.0以上版本支持标识符的有效长度为以上版本支持标识符的有效长度为256,超过部分,超过部分 忽略。忽略。第8页,本讲稿共137页v 关键字关键字关键字(关键字(key word)是一种具有固定名称和特定含义的标识)是一种具有固定名称和特定含义的标识符,又称为保留字符,又称为保留字(reserved word)。这些标识符系统已经做。这些标识符系统已经做了定义,有特定的功能。用户自定义的标识符不能和关键字了定义,有特定的功能。用户自定义的标识符不能和关键字同名。同名。ANSI C语言定义了语言定义了32个关键字个关键字。第9页,本讲稿共137页ANSI C关键字关键字autodogotosignedunsignedbreakdoubleifsizeofvoidcaseelseintstaticvolatilecharenumlongstructwhileconstexternregisterswitchcontinuefloatreturntypedefdefaultforshortunion第10页,本讲稿共137页ANSI C关键字关键字v程序控制语句:程序控制语句:break case continue default do else for goto if return switch volatile whilev存储种类说明:存储种类说明:auto const extern register staticv数据类型说明:数据类型说明:char double enum float int long short signed struct typedef union unsigned voidv运算符:运算符:sizeof第11页,本讲稿共137页扩展关键字扩展关键字命令作用include读外部文件,用指向包含文件目录中的文件,用“”指向当前目录中的文件define定义预处理宏或常数undef撤销预处理宏或常数定义if条件编译判断,若表达式为真,则开始条件编译分支ifdef条件编译判断,若命名已经定义,则开始条件编译分支ifndef条件编译判断,若命名未定义,则开始条件编译分支elif如果此前的if、ifdef、ifndef或elif未发生,并且表达式为真,则开始条件编译else如果此前的if、ifdef、ifndef或elif未发生,则开始条件编译endif结束此前的if、ifdef、ifndef、elif或else开始的条件编译分支。error输出用户定义的出错消息分支line说明行号和可选的文件名,常用于出错消息中说明出错位置pragma说明编译命令,可以是命令行形式中的编译参数第12页,本讲稿共137页C51关键字关键字关键字用途说明_at_地址定位为变量进行存储器绝对空间地址定位alien函数特性声明用以声明与PL/M51兼容的函数bdata存储器类型声明可位寻址的8051内部数据存储器bit位变量声明声明位变量或位类型函数code存储器类型声明8051程序存储器空间compact存储器模式指定使用8051外部分页寻址数据存储空间data存储器类型声明直接寻址的8051内部数据存储器far存储器类型声明8051外部数据存储器idata存储器类型声明间接寻址的8051内部数据存储器interrupt中断函数声明定义中断服务函数(未完,见下页)第13页,本讲稿共137页C51关键字关键字large存储器模式指定使用8051外部数据存储空间pdata存储器类型声明分页寻址的8051外部数据存储器_priority_多任务优先声明规定RTX51或RTX51 Tiny的任务优先级reentrant可重入函数声明定义可重入函数sbit位变量声明声明可位寻址的特殊功能位sfr特殊功能寄存器声明声明8位的特殊功能寄存器sfr16特殊功能寄存器声明声明16位的特殊功能寄存器small存储器模式指定使用8051内部数据存储空间_task_任务声明定义实时多任务函数using寄存器组定义定义8051的工作寄存器组xdata存储器类型声明8051外部数据存储器第14页,本讲稿共137页v在在C51中中,还使用了,还使用了/*/和和/符号进行注释。符号进行注释。在在/*/符号中的所有字符均表示注释说明。符号中的所有字符均表示注释说明。在在/符号后的该行所有剩余文字均表示注释说明。符号后的该行所有剩余文字均表示注释说明。v注释的语句主要用来说明程序的功能,增加程序的可注释的语句主要用来说明程序的功能,增加程序的可阅读性和可维护性,注释不影响程序的功能,也不会在阅读性和可维护性,注释不影响程序的功能,也不会在编译后的程序中出现,即不影响运行文件的大小。编译后的程序中出现,即不影响运行文件的大小。第16页,本讲稿共137页3.3.2C语言的运算符语言的运算符符号意义说明+加法运算或表示正数-减法运算或表示负数*乘法运算/除法运算当2个整数相除时,结果为整数,小数部分舍去。%模运算(求余)参加运算的均应为整数。+自增操作数据值加1-自减操作数据值减1第17页,本讲稿共137页v例:设例:设x的初值为的初值为41.y=x+;结果:结果:x=5,y=4解释:解释:x+先使用先使用x的值,然后的值,然后x的值再自增。的值再自增。2.y=+x;结果:结果:y=5,x=5解释:解释:+xx的值先自增,然后再使用的值先自增,然后再使用x的值。的值。3.y=x-;结果:结果:y=4,x=3解释:解释:x-先使用先使用x的值,然后的值,然后x的值再自减。的值再自减。4.y=-x;结果:结果:y=3,x=3解释:解释:-xx的值先自减,然后再使用的值先自减,然后再使用x的值。的值。第18页,本讲稿共137页逻辑运算符逻辑运算符符号含义大于=大于等于=等于小于=小于等于!=不等于&逻辑与,二个操作数均为真时,其值为真,否则为假|逻辑或,二个操作数均为假时,其值为假,否则为真!逻辑非,一元运算符,操作数为真,其值为假,操作数为假,其值为真注意:等于运算符用两个等号表示。一个等号表示赋值操作。第19页,本讲稿共137页位运算符位运算符符号含义&按位与|按位或按位异或按位取反。一元运算符右移操作。右边移出的位舍去,左边移入的位对无符号数补0;对有符号数补符号位第20页,本讲稿共137页v例:例:unsigned char x=0 x55;unsigned char y=0 x37;unsigned char z;z=x&y;则则 z=0 x15z=x|y;则则 z=0 x77z=xy;则则 z=0 x62z=x;则则 z=0 xAAz=x1;则则 z=0 x2A第21页,本讲稿共137页v例:例:unsigned char x=0 x95;signed char y=0 x95;unsigned char z;z=x1;则则 z=0 x4Az=y1;则则 z=0 xCA第22页,本讲稿共137页赋值运算符赋值运算符v通常把通常把=称为赋值运算符。称为赋值运算符。它是二元运算符,它是二元运算符,左边必须是个变量或数组元素(称为左值)左边必须是个变量或数组元素(称为左值)右边是表达式(称为右值)。右边是表达式(称为右值)。当左值和右值的数据类型不一致时,数据会自动进行数据类当左值和右值的数据类型不一致时,数据会自动进行数据类型转换。型转换。v除了除了=之外,之外,C语言还提供了语言还提供了10种复合赋值运算符,它们的功能是对种复合赋值运算符,它们的功能是对左值和右值进行相关运算后,将运算结果赋给左值。复合赋值运算符如下左值和右值进行相关运算后,将运算结果赋给左值。复合赋值运算符如下所示:所示:+=-=*=/=%=&=!=v其中前其中前5种是算术运算,后种是算术运算,后5种是位操作位算。种是位操作位算。第23页,本讲稿共137页逗号运算符逗号运算符v逗号运算符的作用是把几个表达式串在一起,成为逗号表达式。逗号运算符的作用是把几个表达式串在一起,成为逗号表达式。格式如下:格式如下:表达式表达式1,表达式,表达式2,表达式,表达式nv注意:逗号运算符的运算顺序是从左至右,最右边表达式的值是注意:逗号运算符的运算顺序是从左至右,最右边表达式的值是整个逗号表达式的值。整个逗号表达式的值。v例如:例如:x=(y=5,z=y+3);v则该语句执行完成后则该语句执行完成后y=5,z=8,x=8。第24页,本讲稿共137页条件运算符条件运算符v条件运算符用条件运算符用?与与:来替代简单的来替代简单的if-else条件语句。该运算符是条件语句。该运算符是三元运算符。三元运算符。格式如下:格式如下:表达式表达式1?表达式?表达式2:表达式:表达式3v该运算符的功能是若表达式该运算符的功能是若表达式1为真,则执行表达式为真,则执行表达式2,否则执行表达式,否则执行表达式3。v例如:例如:z=ab?3:5;v由于由于ab的值为假,所以的值为假,所以z=5。第25页,本讲稿共137页强制类型转换运算符强制类型转换运算符v在在C语言程序的表达式或变量赋值运算中,有时会出现运算对象的数语言程序的表达式或变量赋值运算中,有时会出现运算对象的数据类型不一致的情况,据类型不一致的情况,C语言允许对参与操作的标准数据类型进行语言允许对参与操作的标准数据类型进行隐隐式转换式转换和和显示转换显示转换。v隐式转换由系统自动按以下优先级进行:隐式转换由系统自动按以下优先级进行:bit char int long floatsigned unsignedv其中,箭头方向仅表示数据类型级别的高低,转换时由低向高进其中,箭头方向仅表示数据类型级别的高低,转换时由低向高进行,而不是数据转换时的顺序。行,而不是数据转换时的顺序。v例如:例如:char变量和变量和long变量进行运算,变量进行运算,char变量无需先转换为变量无需先转换为int然后然后再转换成再转换成long,而是直接由,而是直接由char转换成转换成long。第26页,本讲稿共137页v某些时候需要按用户的需要进行某些数据类型转换,某些时候需要按用户的需要进行某些数据类型转换,可使用强制类型转换符进行可使用强制类型转换符进行显式转换显式转换。v强制转换符的功能是将表达式结果转换成指定的数据强制转换符的功能是将表达式结果转换成指定的数据类型,强制类型转换符的运算符号为()。类型,强制类型转换符的运算符号为()。格式为:格式为:(类型名)(表达式)(类型名)(表达式)v例如:例如:(int)(7.2/2)将将7.2/2的结果转换为整型,即的结果转换为整型,即3。第27页,本讲稿共137页sizeof运算符vC语言中可以用语言中可以用sizeof运算符计算数据类型变量以及表运算符计算数据类型变量以及表达式的字节数。达式的字节数。它的一般使用形式为:它的一般使用形式为:sizeof(表达式)或(表达式)或sizeof(数据类型)(数据类型)v注意:注意:sizeof是一种特殊的运算符,不是函数。实际是一种特殊的运算符,不是函数。实际上字节数的计算是在程序编译时完成的,而不是在程序上字节数的计算是在程序编译时完成的,而不是在程序执行的过程中才计算出来的。执行的过程中才计算出来的。第28页,本讲稿共137页其它运算符v*:指针运算符。作用是通过指针变量间接访问指指针运算符。作用是通过指针变量间接访问指针变量所指向的变量,对其进行数据存取操作。针变量所指向的变量,对其进行数据存取操作。v&:取地址运算符。作用是获取变量所占用的存储取地址运算符。作用是获取变量所占用的存储单元的地址。单元的地址。v :下标运算符。作用是用来获取数组的指定单元。下标运算符。作用是用来获取数组的指定单元。v-:指向结构成员运算符。作用是用结构变量的指指向结构成员运算符。作用是用结构变量的指针来访问结构中的成员变量。针来访问结构中的成员变量。v.:结构成员运算符,作用是用结构变量来访问结结构成员运算符,作用是用结构变量来访问结构中的成员变量。构中的成员变量。第29页,本讲稿共137页运算优先级运算优先级优先级符号含义运算对象个数结合方向1()圆括号自左向右 下标运算符-指向结构成员运算符.结构成员运算符2!逻辑非运算符单操作数自右向左按位取反操作符+自增运算符-自减运算符-负号运算符(类型)类型转换运算符*指针运算符&取地址运算符sizeof长度运算符第30页,本讲稿共137页优先级符号含义运算对象个数结合方向3*乘法运算符双操作符自左向右/除法运算符%求余运算符4+加法运算符双操作符自左向右-减法运算符5右移运算符6、=关系运算符双操作符自左向右7=等于运算符双操作符自左向右!=不等于运算符第31页,本讲稿共137页优先级符号含义运算对象个数结合方向8&按位与运算符双操作符自左向右9按位异或运算符双操作符自左向右10|按位或运算符双操作符自左向右11&逻辑与运算符双操作符自左向右12|逻辑或运算符双操作符自左向右13?:条件运算符三操作符自右向左14=、+=、-=、*=、/=、%=、=、&=、=、|=赋值运算符双操作符自左向右15,逗号运算符自左向右第32页,本讲稿共137页3.3.3数据类型数据类型vC语言中的数据根据是否允许数据值在程序执行过程语言中的数据根据是否允许数据值在程序执行过程中发生变化,分为中发生变化,分为常量常量和和变量变量。常量又称为标量,它的值在程序执行过程中不能改变。常量又称为标量,它的值在程序执行过程中不能改变。变量是一种在程序执行过程中,其值能不断变化的量。变量是一种在程序执行过程中,其值能不断变化的量。v使用一个变量前必须进行定义。使用一个变量前必须进行定义。在在C51中中变量定义的格式如下:变量定义的格式如下:存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名表;变量名表;第33页,本讲稿共137页基本数据类型基本数据类型vC语言的基本数据类型有语言的基本数据类型有char、int、short、long、float和和double。v对对C51编译器来说:编译器来说:short类型与类型与int类型相同类型相同double类型与类型与float类型相同。类型相同。第34页,本讲稿共137页存储区域存储区域v8051系列微处理器采用了系列微处理器采用了哈佛体系结构哈佛体系结构,即程序存储区和数据存储区是,即程序存储区和数据存储区是分离的。分离的。8051系列微处理器提供了三种不同类型的存储区域(系列微处理器提供了三种不同类型的存储区域(memory areas),),v 程序存储区(程序存储区(program memory)v内部数据存储区(内部数据存储区(internal data memory)v外部数据存储区(外部数据存储区(external data memory)v这三种存储区域均从地址这三种存储区域均从地址0开始编址,通过采用开始编址,通过采用不同的寻址指令不同的寻址指令来解决地来解决地址重叠的问题。址重叠的问题。第35页,本讲稿共137页第36页,本讲稿共137页程序存储区(程序存储区(program memory)v程序存储区,也称为程序存储区,也称为CODE 区,常用来存放可执行代区,常用来存放可执行代码。代码区的地址位数为码。代码区的地址位数为16 位,即寻址空间可达位,即寻址空间可达64K。v一般情况,程序存储区是只读的,除了保存可执行代一般情况,程序存储区是只读的,除了保存可执行代码,还可用于保存各种常量值,查找表等固定的数据结码,还可用于保存各种常量值,查找表等固定的数据结构。构。第37页,本讲稿共137页内部数据存储区(内部数据存储区(internal data memory)v内部数据存储区(内部数据存储区(internal data memory),共),共256个字节。这部分主个字节。这部分主要是作为程序的数据段。要是作为程序的数据段。该区域的前该区域的前128 字节,称为字节,称为DATA 区。该区可采用区。该区可采用直接寻址直接寻址方式来访问。方式来访问。DATA区也可通过用区也可通过用R0 和和R1存放要操作的数据存放要操作的数据地址,采用地址,采用间接寻址间接寻址来访问。来访问。该区域的后该区域的后128个字节,即从地址个字节,即从地址80H 开始的内部数据存储开始的内部数据存储区,用做特殊功能寄存器区区,用做特殊功能寄存器区(special function register memory),简称,简称SFR。这些特殊功能寄存器用来控制计时器,。这些特殊功能寄存器用来控制计时器,计数器,串行计数器,串行I/O,I/O端口和外设的工作。端口和外设的工作。只能直接寻址只能直接寻址v注意:特殊功能寄存器并未占用特殊功能寄存器区的所有地址单元,即特注意:特殊功能寄存器并未占用特殊功能寄存器区的所有地址单元,即特殊功能寄存器是离散分布。殊功能寄存器是离散分布。第38页,本讲稿共137页内部数据存储区的内部数据存储区的DATA区又可以细分为三个子段:区又可以细分为三个子段:第一个子段包含第一个子段包含四个寄存器组四个寄存器组,每个寄存器组包含,每个寄存器组包含8个寄存器,个寄存器,四个寄存器组共四个寄存器组共32 个字节。可在任何时候通过修改个字节。可在任何时候通过修改PSW 寄存器的寄存器的RS1 和和RS0两个位标志来选择四组寄存器的任意一组作为当前两个位标志来选择四组寄存器的任意一组作为当前工作寄存器组。工作寄存器组。第二个子段叫做第二个子段叫做位寻址段位寻址段BDATA,包括包括16 个字节,共个字节,共128 位,位,每一位都可单独寻址每一位都可单独寻址。这。这16 个字节也可像数据段中其它字节一样个字节也可像数据段中其它字节一样按按字节进行寻址字节进行寻址。第三个子段为第三个子段为一般的数据存储器一般的数据存储器,仅能按字节寻址,共,仅能按字节寻址,共80个字节。个字节。第39页,本讲稿共137页v说明:某些系列的单片机(如说明:某些系列的单片机(如8052)有额外的有额外的128 字字节的内部节的内部RAM,同样位于从同样位于从80H 开始的内部数据存储开始的内部数据存储地址空间中,称为地址空间中,称为IDATA区。区。IDATA 区的地址和区的地址和SFR的地址是的地址是重叠重叠的,必须使用的,必须使用不同的寻址方式不同的寻址方式的指令来解的指令来解决地址重叠问题。决地址重叠问题。SFR区只能通过直接寻址来访问,区只能通过直接寻址来访问,IDATA 区只能通过间接寻址来访问。区只能通过间接寻址来访问。第40页,本讲稿共137页外部数据存储区(外部数据存储区(external data memory)v外部数据存储区,也称为外部数据存储区,也称为XDATA 区。区。XDATA区和区和CODE 区一样也采用区一样也采用16 位地址寻址,即寻址空间可达位地址寻址,即寻址空间可达64KB。v该区通常包括一些该区通常包括一些通用数据存储器通用数据存储器或者一些需要通过或者一些需要通过总线接口访问的总线接口访问的外围器件外围器件。v访问外部数据区比访问内部数据区要慢,因为访问外访问外部数据区比访问内部数据区要慢,因为访问外部数据区时,必须先将要访问单元的部数据区时,必须先将要访问单元的16位地址装载到数位地址装载到数据指针寄存器据指针寄存器DPTR中,然后才能通过中,然后才能通过DPTR采用间接采用间接访问方式来访问该单元。访问方式来访问该单元。第41页,本讲稿共137页vC51使用两种修饰符来表示外部数据区:使用两种修饰符来表示外部数据区:xdata,pdataxdata 用来说明外部数据空间的所有用来说明外部数据空间的所有64KB的地址空间。的地址空间。pdata 用来指向外部数据空间中的大小为一页(用来指向外部数据空间中的大小为一页(256字节)字节)的数据存储空间。的数据存储空间。v注意:某些新型的注意:某些新型的8051芯片有更大的芯片有更大的XRAM(如(如16M的的XRAM),一般用),一般用far类型来描述这些区域。可以分别类型来描述这些区域。可以分别用用 far 和和const far 来访问位于扩充来访问位于扩充RAM空间中的变量和空间中的变量和扩充扩充ROM空间中的常量。空间中的常量。第42页,本讲稿共137页v注意:某些单片机芯片提供了注意:某些单片机芯片提供了片内的片内的XRAM空间空间,这,这种空间也使用和传统的外部数据空间相同的指令来访问。种空间也使用和传统的外部数据空间相同的指令来访问。这种这种XRAM空间,通常使用芯片专用的空间,通常使用芯片专用的SFR配置寄存器配置寄存器来使能,它和传统外部存储空间占用相同的地址空间。来使能,它和传统外部存储空间占用相同的地址空间。第43页,本讲稿共137页存储器类型存储器类型vC51编译器允许编译器允许8051微处理器使用各种类型的存储区微处理器使用各种类型的存储区域。可以在变量声明时使用存储器类型(域。可以在变量声明时使用存储器类型(memory types)来)来指定变量所希望占用的存储区域指定变量所希望占用的存储区域。v内部数据区的访问速度比外部数据区的访问速度高很内部数据区的访问速度比外部数据区的访问速度高很多。因而一般将经常使用的变量放在内部数据区,将大多。因而一般将经常使用的变量放在内部数据区,将大的或不常使用的变量放在外部数据区。的或不常使用的变量放在外部数据区。第44页,本讲稿共137页存储器类型存储区域大小对应的汇编语句描述code程序存储区64KBMOVC A,A+DPTR用来说明常量data直接寻址的内部数据存储区128BMOV XX,#ADDR访问速度快idata间接寻址的内部数据区256BMOV XX,Rn可访问整个内部数据区域bdata位寻址的内部数据存储区16B(128b)可使用位寻址或字节寻址来访问这一区域xdata外部数据存储或64KBMOVX A,DPTR使用DPTR来访问外部数据存储器far扩充的RAM和ROM使用用户定义的专用例程或特殊芯片指令扩展命令pdata分页的外部数据存储区256BMOVX A,Rn利用R0,R1来访问分页的外部数据存储器第45页,本讲稿共137页声明变量时可以说明变量的存储器类型,如下例所示:声明变量时可以说明变量的存储器类型,如下例所示:声明变量时可以说明变量的存储器类型,如下例所示:声明变量时可以说明变量的存储器类型,如下例所示:/内部数据区的字符型变量。内部数据区的字符型变量。char data var1;/在程序区中定义字串在程序区中定义字串char code text=ENTER PARAMETER:;/外部数据区的长度为外部数据区的长度为100的无符号长整形数组的无符号长整形数组unsigned long xdata array100;/内部数据区,间接寻址方式访问的浮点变量内部数据区,间接寻址方式访问的浮点变量float idata x,y,z;/外部数据区,分页存储区中的无符号整型变量外部数据区,分页存储区中的无符号整型变量unsigned int pdata dimension;/外部数据区,无符号字符类型的三维数组变量外部数据区,无符号字符类型的三维数组变量unsigned char xdata vector1044;/内部数据区,可位操作的字符变量内部数据区,可位操作的字符变量char bdata flags;说明:说明:声明变量时存声明变量时存储区修饰符和数据类型储区修饰符和数据类型修饰符的位置可以互换,修饰符的位置可以互换,即即char data x;和和 data char x;是完全是完全等效的。不过从兼等效的。不过从兼容性考虑,建议使容性考虑,建议使用前一种格式。用前一种格式。第46页,本讲稿共137页存储模式(存储模式(memory models)v如果在变量声明时未声明变量的存储器类型,则该变如果在变量声明时未声明变量的存储器类型,则该变量的存储器类型,由程序的量的存储器类型,由程序的存储模式存储模式来决定。来决定。小模式(小模式(small model)紧凑模式(紧凑模式(compact model)大模式(大模式(large model)v注意:除非应用在特殊的场合,否则注意:除非应用在特殊的场合,否则SMALL存储模存储模式可以提供最快和最有效的代码。式可以提供最快和最有效的代码。第47页,本讲稿共137页小模式(小模式(small model)v在小模式下,所有未声明存储器类型的变量,缺省驻在小模式下,所有未声明存储器类型的变量,缺省驻留在内部数据区,即这种方式和用留在内部数据区,即这种方式和用data进行显式说明一进行显式说明一样。样。v在这种存储模式下,变量的访问是最有效。但是所有在这种存储模式下,变量的访问是最有效。但是所有的数据对象(包括堆栈)都必须放在内部数据存储区中。的数据对象(包括堆栈)都必须放在内部数据存储区中。第48页,本讲稿共137页紧凑模式(紧凑模式(compact model)v在紧凑模式下,所有未声明存储器类型的变量,缺省驻留在在紧凑模式下,所有未声明存储器类型的变量,缺省驻留在外部数据区的外部数据区的一个页上一个页上,即这种方式和用,即这种方式和用pdata显示说明一样。显示说明一样。v该模式利用该模式利用R0和和R1寄存器来进行间接寻址(寄存器来进行间接寻址(R0,R1),此时最大可),此时最大可寻址寻址256字节的存储区域。这种方式的存取速度比小模式慢,但比大模式字节的存储区域。这种方式的存取速度比小模式慢,但比大模式快。快。v在紧凑模式下使用了超过在紧凑模式下使用了超过256字节的外部数据存储区,那么访问单元的高字节的外部数据存储区,那么访问单元的高8位地址(即页地址)必须由端口位地址(即页地址)必须由端口P2来输出。来输出。开发人员必须在链接时为开发人员必须在链接时为PDATA设置合适的开始地址设置合适的开始地址。第49页,本讲稿共137页大模式(大模式(large model)v在大模式下,所有未声明存储器类型的变量,缺省时在大模式下,所有未声明存储器类型的变量,缺省时驻留在外部数据存储区,即和用驻留在外部数据存储区,即和用xdata显示说明一样。显示说明一样。v此时最大可寻址此时最大可寻址64K字节的存储区域。此时使用数据字节的存储区域。此时使用数据指针寄存器(指针寄存器(DPTR)来进行间接寻址。使用这种寻址方)来进行间接寻址。使用这种寻址方式效率低,生成的代码比小模式或紧凑模式下生成的代式效率低,生成的代码比小模式或紧凑模式下生成的代码要长。码要长。第50页,本讲稿共137页动态存储分配动态存储分配v对大多数应用来说对大多数应用来说,应尽可能在编译的时候确定所需要的内存空间,但应尽可能在编译的时候确定所需要的内存空间,但是对于有些需要使用是对于有些需要使用动态结构动态结构,如,如树树和和链表链表的应用来说,这种方式就不再的应用来说,这种方式就不再适用了,这时必须要使用适用了,这时必须要使用动态存储分配动态存储分配。v动态存储分配的实现动态存储分配的实现:用户需要声明一个字节数组作为堆,数组的大小根据所需要用户需要声明一个字节数组作为堆,数组的大小根据所需要动态内存的大小来决定。该数组的存储器类型必须被声明为动态内存的大小来决定。该数组的存储器类型必须被声明为XDATA,因为库函数使用具体指针来进行内存寻址。,因为库函数使用具体指针来进行内存寻址。将指向堆首地址的指针和堆的大小传递给初始化函数将指向堆首地址的指针和堆的大小传递给初始化函数init_mempool,该函数将设置一些内部变量并对动态存储空,该函数将设置一些内部变量并对动态存储空间进行初始化。间进行初始化。初始化工作完成后就可在程序中调用初始化工作完成后就可在程序中调用malloc 和和free等等C语言语言动态分配函数。动态分配函数。第51页,本讲稿共137页vC51语言支持以下几种动态分配的函数:语言支持以下几种动态分配的函数:malloc:申请内存空间。调用时将所申请的内存空间的大小:申请内存空间。调用时将所申请的内存空间的大小传递给函数,函数返回一个内存空间指针。如果操作失败,传递给函数,函数返回一个内存空间指针。如果操作失败,返回的指针值为返回的指针值为NULL。calloc:计算并申请内存空间。调用时将所申请的变量数目:计算并申请内存空间。调用时将所申请的变量数目和变量所占用的大小传递给函数,函数返回一个内存空间指和变量所占用的大小传递给函数,函数返回一个内存空间指针。如果操作失败,返回的指针值为针。如果操作失败,返回的指针值为NULL。realloc:重新分配内存空间。调用时将一个已经申请的内存:重新分配内存空间。调用时将一个已经申请的内存指针和新的内存空间大小传递给函数,函数返回一个内存空指针和新的内存空间大小传递给函数,函数返回一个内存空间指针。如果操作失败,返回的指针值为