51单片机基础剖析(基于C语言)
在编写应用程序时,定义一个变量,一个数组,或是说一个固定表格,到底存储在什么地方;当定义变量大小超过MCU的内存范围时怎么办;如何控制变量定义不超过存储范围;
以及如何定义变量才能使得变量访问速度最快,写出的程序运行效率最高。以下将一一解答。
1.六类存储类型 code data idata xdata pdata bdata
code:程序存储器,也即只读存储器,用来保存常量或是程序,采用16位地址线编码,可以是在片内,或是片外,大小被限制在64KB。
作用:定义常量,如八段数码表或是编程使用的常,在定义时加上code或明确指明定义的常量保存到code memory(只读。)比如:
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
此关键字的使用方法等同于const。
data:数据存储区,只能用于声明变量,不能用来声明函数,该区域位于片内,采用8位地址线编码,具有最快的存储速度,但是数量被限制在128byte或更少。
使用方法:unsigned char data fast_variable=0;
Idata:数据存储区,只能用于声明变量,不能用来声明函数。该区域位于片内,采用8位地址线编码,内存大小被限制在256byte或更少。该区域的低地址区与data区地址一致,高地址区域是52系列在51系列基础上扩展的并与特殊功能寄存器具有相同地址编码的区域。即:data memory是idata memory的一个子集。
xdata:只能用于声明变量,不能用来声明函数,该区域位于MCU外部,采用16位地址线进行编码,存储大小被限制在64KB以内。如:unsigned char xdata count=0;
pdata:只能用于声明变量,不能用来声明函数,该区域位于MCU外部,采用8位地址线进行编码。存储大小限制在256byte,是xdata memory的低256byte。为其子集。如:unsigned char pdata count=0;
bdata:只能用于声明变量,不能用来声明函数。该区域位于8051内部位数据地址。定义的量保存在内部位地址空间,可用位指令直接读写。使用方法:unsigned char bdata varab=0。
注:一般情况下,定义字符型变量时,在缺省unsigned的情况下,默认为无符号。但是本人在Keil uV3中遇到并非如此的案例。在缺省的情况下默认为有符号。要注意一下,或许不同的编译器规则不同。所以我们在写程序的时候,还是最好把unsigned signed加上。
2.函数的参数和局部变量的存储模式
C51 编译器允许采用三种存储器模式:SMALL,COMPACT 和LARGE。一个函数的存储器模式确定了函数的参数的局部变量在内存中的地址空间。处于SMALL模式下的函数参数和局部变量位于8051单片机内部RAM中,处于COMPACT和LARGE模式下的函数参数和局部变量则使用单片机外部RAM。在定义一个函数时可以明确指定该函数的存储器模式。方法是在形参表列的后面加上一存储模式。
示例如下:
#pragma large //此预编译必须放在所有头文前面
int func0(char x,y) small;
char func1(int x) large;
int func2(char x);
注:上面例子在第一行用了一个预编译命令#pragma,它的意思是告诉c51编译器在对程序进行编译时,按该预编译命令后面给出的编译控制指令LARGE进行编译,即本例程序编译时的默认存储模式为LARGE。随后定义了三个函数,第一个定义为SMALL存储模式,第二个函数定义为LARGE第三个函数未指定,在用C51进行编译时,只有最后一个函数按LARGE存储器模式处理,其它则分别按它们各自指定的存储器模式处理。
本例说明,C51编译器允许采用所谓的存储器混合模式,即允许在一个程序中将一些函数使用一种存储模式,而其它一些则按另一种存储器模式,采用存储器混合模式编程,可以充分利用8051系列单片机中有限的存储器空间,同时还可以加快程序的执行速度。
3.绝对地址访问(头文件为:absacc.h(相当重要))
#define CBYTE ((unsigned char volatile code *) 0)
#define DBYTE ((unsigned char volatile data *) 0)
#define PBYTE ((unsigned char volatile pdata *) 0)
#define XBYTE ((unsigned char volatile xdata *) 0)
功能:CBYTE寻址CODE区
DBYTE寻址DATA区
PBYTE寻址XDATA(低256)区
XBYTE寻址XDATA区
例:如下指令在对外部存储器区域访问地址0x1000
xvar=XBYTE[0x1000];
XBYTE[0x1000]=20;
#define CWORD ((unsigned int volatile code *) 0)
#define DWORD ((unsigned int volatile data *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)
功能:与前面的一个宏相似,只是它们指定的数据类型为unsigned int。
通
51单片机C语 相关文章:
- Proteus运行Keil编写的51单片机C语言步骤(11-30)
- 《世上只有妈妈好》51单片机C语言程序(11-26)
- 51单片机C语言编程中对单片机绝对地址访问的两种方法(11-26)
- 硬件仿真器会不会被淘汰(11-26)
- 51单片机C语言头文件及其使用(11-26)
- 51单片机的C语言延时的一些总结(11-25)