单片机中绝对地址的访问

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

}

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