單片機中絕對地址的訪問

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

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章