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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/207514.html