新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > C51—运算量(重点:特殊功能寄存器变量、位变量

C51—运算量(重点:特殊功能寄存器变量、位变量

作者: 时间:2016-11-25 来源:网络 收藏

3)LARGE模式

LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外RAM的64KB空间了,存储器类型为xdata。

例如:

#pragma small //变量的存储模式为SMALL

char k1; //存储类型为data

int xdata m1; //存储类型xdata

#pragma compact //变量的存储模式为COMPACT

char k2;

int xdata m2;

int func1(int x1,int y1) large //函数的存储模式为LARGE

{

return(x1+y1);

}

int func2(int x2,int y2) //编译的存储模式隐含为SMALL,没有指明模式,隐含SMALL

{

return(x2-y2);

}

4、绝对地址的访问(这里才是重点中的重点啊~~~)

在C51中,可以通过变量的形势访问51单片机的存储器,也可以通过绝对地址来访问存储器。三种方法:

1)使用C51运行库中预定义宏(就是调用#include"absacc.h")

C51编译器提供了一组宏定义来对51单片机的code、data、pdata和xdata空间进行绝对寻址!

规定只能以无符号数方式访问,定义了8个宏定义,其函数原型如下:

#define CBYTE((unsigned char volatile*)0x50000L) //CBYTE以字节形势对code区寻址

#define DBYTE((unsigned char volatile*)0x40000L)//data区

#define PBYTE((unsigned char volatile*)0x30000L) //pdata区

#define XBYTE((unsigned char volatile*)0x20000L) //xdata区

#define CWORD(unsigned int volatile*)0x50000L) //以字形式对code区寻址

#define DWORD(unsigned int volatile*)0x40000L)

#define PWORD(unsigned int volatile*)0x30000L)

#define XWORD(unsigned int volstile*)0x20000L)

例如:

#include"absacc.h"

#include"reg52.h"

typedef unsigned char uchar;

typedef unsigned intuint;

void main()

{

uchar var1;

uintvar2;

var1=XBYTE[0x0005]; //XBYTE[0x0005]访问片外RAM的0005字节单元

var2=XWORD[0x0002];//XWORD[0x0002]访问片外RAM的0002字单元

.

.

.

while(1);

}

2)通过指针访问

采用指针的访问的方法,可以在C51程序中对任意指定的存储器单元进行访问。

typedef unsigned char uchar;

typedef unsigned int uint;

void func()

{

uchar data var1;

uchar pdata *dp1; //定义一个指向pdata区的指针dp1

uint xdata *dp2; //定义一个指向xdata区的指针dp2,为uint型

uchar data*dp3; //定义一个指向data区的指针dp3,为char型

dp1=0x30; //dp1指针赋值,指向pdata区的30H单元

dp2=0x1000; //dp2指针赋值(uint型),指向xdata区的1000H单元

*dp1=0xff;//将数据0xff送到片外RAM30H单元

*dp2=0x1234; //将数据0x1234(由于是uint型,你懂得~~~),送到片外RAM1000H单元

dp3=&var1; //dp3指针指向data区的var1变量

*dp3=0x20;//给变量var1赋值0x20

}

3)使用C51扩展关键字 _at_ (这个用的最多了~~~

总算完了,我真的要累死了~~~~擦擦擦擦啊

一般格式:

[存储类型] 数据类型说明 变量名 _at_ 地址常量;

其中,存储类型为data、bdata、idata、pdata、xdata等C51能识别的数据类型,如果省略,则会按照存储模式规定的默认存储类型确定变量的存储区域(这里又用到上边的了);数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。

例如:

typedef unsigned char uchar;

typedef unsigned int uint;

data uchar x1 _at_ 0x40; //在data区中定义字节变量x1,地址为0x40H,这里是uchar

xdata uint x2 _at_ 0x2000; //在xdata区中定义字变量x2,它的地址为0x2000H,这里是uint

我感觉我真的不想再写了,累死了~~~擦

不过完工了,爽啊~~解脱



上一页 1 2 下一页

关键词: C51运算量特殊功能寄存器变量位变

评论


相关推荐

技术专区

关闭