一.使用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);
}