一.使用C51运行库中预定义宏
C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了8个宏定义,其函数原型如下:
#define CBYTE((unsigned char volatile*)0x50000L)
#define DBYTE((unsigned char volatile*)0x40000L)
#define PBYTE((unsigned char volatile*)0x30000L)
#define XBYTE((unsigned char volatile*)0x20000L)
#define CWORD((unsigned int volatile*)0x50000L)
#define DWORD((unsigned int volatile*)0x40000L)
#define PWORD((unsigned int volatile*)0x30000L)
#define XWORD((unsigned int volatile*)0x20000L)
这些函数原型放在absacc.h文件中。使用时须用预处理命令把该头文件包含到文件中,形式为:#include <absacc.h>。
其中:CBYTE以字节形式对code区寻址,DBYTE以字节形式对data区寻址,PBYTE以字节形式对pdata区寻址,XBYTE以字节形式对xdata区寻址,CWORD以字形式对code区寻址,DWORD以字形式对data区寻址,PWORD以字形式对pdata区寻址,XWORD以字形式对xdata区寻址。
【例】绝对地址对存储单元的访问
#include <absacc.h> /*将绝对地址头文件包含在文件中*/
#include <reg52.h> /*将寄存器头文件包含在文件中*/
#define uchar unsigned char /*定义符号uchar为数据类型符unsigned char*/
#define uint unsigned int /*定义符号uint为数据类型符unsigned int*/
void main(void)
{ uchar var1;
uint var2;
var1=XBYTE[0x0005]; /*XBYTE[0x0005]访问片外RAM的0005字节单元*/
var2=XWORD[0x0002]; /*XWORD[0x0002]访问片外RAM的0002字单元*/
......
while(1);
}
在上面程序中,其中XBYTE[0x0005]就是以绝对地址方式访问的片外RAM 0005字节单元;XWORD[0x0002]就是以绝对地址方式访问的片外RAM 0002字单元。
二.通过指针访问
采用指针的方法,可以实现在C51程序中对任意指定的存储器单元进行访问。
【例】 通过指针实现绝对地址的访问。
#define uchar unsigned char /*定义符号uchar为数据类型符unsigned char*/
#define uint unsigned int /*定义符号uint为数据类型符unsigned int*/
void func(void)
{
uchar data var1;
uchar pdata *dp1; /*定义一个指向pdata区的指针dp1*/
uint xdata *dp2; /*定义一个指向xdata区的指针dp2*/
uchar data *dp3; /*定义一个指向data区的指针dp3*/
dp1=0x30; /*dp1指针赋值,指向pdata区的30H单元*/
dp2=0x1000; /*dp2指针赋值,指向xdata区的1000H单元*/
*dp1=0xff; /*将数据0xff送到片外RAM30H单元*/
*dp2=0x1234; /*将数据0x1234送到片外RAM1000H单元*/
dp3=&var1; /*dp3指针指向data区的var1变量*/
*dp3=0x20; /*给变量var1赋值0x20*/
}
三.使用C51扩展关键字_at_
使用_at_对指定的存储器空间的绝对地址进行访问,一般格式如下:
[存储器类型] 数据类型说明符 变量名 _at_ 地址常数;
其中,存储器类型为data、bdata、idata、pdata等C51能识别的数据类型,如省略则按存储模式规定的默认存储器类型确定变量的存储器区域;数据类型为C51支持的数据类型。地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。
【例】通过_at_实现绝对地址的访问。
#define uchar unsigned char /*定义符号uchar为数据类型符unsigned char*/
#define uint unsigned int /*定义符号uint为数据类型符unsigned int*/
void main(void)
{
data uchar x1 _at_ 0x40; /*在data区中定义字节变量x1,它的地址为40H*/
xdata uint x2 _at_ 0x2000; /*在xdata区中定义字变量x2,它的地址为2000H*/
x1=0xff;
x2=0x1234;
......
while(1);
}