c51语言中的位变量,C51—运算量(重点:特殊功能寄存器变量、位变量

本文详细介绍了C51编程中的LARGE模式,以及如何通过预定义宏、指针和扩展关键字_at_进行绝对地址访问。重点讨论了C51如何访问51单片机的code、data、pdata和xdata空间,包括CBYTE、DBYTE等宏定义的使用,以及通过指针和_at_定义变量在特定地址的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 int  uint;

void main()

{

uchar var1;

uint var2;

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_ (这个用的最多了~~~

20151023094425339.gif)

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

一般格式:

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

其中,存储类型为data、bdata、idata、pdata、xdata等C51能识别的数据类型,如果省略,则会按照存储模式规定的默认存储类型确定变量的存储区域(

20151023094422576.gif这里又用到上边的了);数据类型为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

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

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

20151023094422567.gif

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值