C51语言定义的任何数据类型必须以一定的存储类型定位在MCS-51系列单片机的某一存储位置上,否则没有任何实际意义。
MCS-51单片机在物理上有3个存储区:程序存储区、内部数据存储区、外部数据存储区。
程序存储区是只读的,不能写,只能存放固定不变的数据。程序存储区可能在MCS-51系列单片机片内或者片外,或者内外都有,这由MCS-51系列单片机的硬件结构决定。
MCS-51单片机内部数据存储区是可读写的,MCS-51单片机最多可有256B的内部数据存储区,其中低128B可直接寻址,高128B(从0x80~0x FF)只能间接寻址,从20H开始的16个连续字节可以位寻址。因此,与其对应,内部数据区分成3个不同的存储类型:data、idata和bdata。
外部数据存储区也是可读写的,外部数据区必须通过数据指针加载地址来访问。C51编译器提供两种不同的存储类型xdata和pdata来访问外部数据。
每个变量可以指定存储类型,从而明确地分配到指定的存储区,对内部数据存储器的访问比对外部数据存储器的访问要快许多,因而应将频繁使用的变量放在内部数据存储器中,而把较少使用的变量放在外部数据存储器中。存储区及其介绍见表10-1。
表10-1 存储区及其介绍
下面分别对每种存储区的应用进行详细介绍。
1.DATA
DATA区的寻址速度最快,所以应该把经常使用的变量放在DATA区,但是DATA区的存储空间很小,除了包含定义的程序变量外,还包含了堆栈和通用寄存器组,因此声明变量要注意不要超出DATA区范围。DATA区声明中的存储类型标识符为data,通常指低128B的内部数据区存储的变量,可直接寻址。例如,可以定义变量:
Unsigned int data iTemp Value;
即在DATA区定义了一个无符号整型变量i Temp Value。
2.IDATA
IDATA区使用寄存器作为指针进行间接寻址,其声明变量应使用存储类型标识符idata,指内部的256字节存储区。例如,可以定义变量:
Unsigned char idata string[5];
即在IDATA区定义了一个包含5个元素的数组。
3.BDATA(www.daowen.com)
BDATA区实际就是DATA区中可以进行位寻址的区域,在这个区定义的变量就可以进行位寻址。位变量的声明对状态寄存器来说是十分有用的,因为它可能仅仅需要使用某一位,来表示状态而不是整个字节。BDATA区声明中的存储类型标识符为bdata。例如:
即定义一个变量iStatus,当iStatus的第5位为1时,就执行函数Fun_Proc。
注意:C51编译器不允许在BDATA区中声明float和double类型的变量。
4.PDATA、XDATA区
PDATA、XDATA属于外部数据存储区。外部数据存储区是通过数据指针加载地址进行间接访问的。PDATA和XDATA区声明变量使用标识符pdata和xdata,其中xdata可以指定外部数据区64KB的任何位置,而pdata仅能指定第1页或256B的外部数据区。例如:
float xdata foutPut Value;
unsigned char pdata cStatus;
由于对PDATA和XDATA寻址要使用汇编指令MOVX,因此需要两个处理周期。
外部地址段除了包含存储器地址外,还包含I/O器件的地址,这种情况可以通过使用C51语言提供的宏,访问这些地址。例如:
cStatus=XBUTE[0x7000]; //从7000地址读入一个字节
XBYTE[0x8000]=cStatus; //将cStatus值写入8000地址
注意:采用宏定义寻址,以及对PDATA和BIT段外的其他数据区寻址,必须包含头文件absacc.h。
5.程序存储区CODE
程序存储区的数据是不可变的,编译时需初始化程序区的对象。在程序存储区定义对象使用标识符code。例如:
char code array[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
idata、xdata、pdata等,都是C51语言相对于标准C语言的扩展关键字。C51语言的扩展关键字包含:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。