新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > C51—運算量(重點:特殊功能寄存器變量、位變量

C51—運算量(重點:特殊功能寄存器變量、位變量

作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏

3)LARGE模式

LARGE模式稱為大編譯模式,在LARGE模式下,編譯時函數(shù)參數(shù)和變量被默認在片外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 //函數(shù)的存儲模式為LARGE

{

return(x1+y1);

}

int func2(int x2,int y2) //編譯的存儲模式隱含為SMALL,沒有指明模式,隱含SMALL

{

return(x2-y2);

}

4、絕對地址的訪問(這里才是重點中的重點啊~~~)

在C51中,可以通過變量的形勢訪問51單片機的存儲器,也可以通過絕對地址來訪問存儲器。三種方法:

1)使用C51運行庫中預定義宏(就是調(diào)用#include"absacc.h")

C51編譯器提供了一組宏定義來對51單片機的code、data、pdata和xdata空間進行絕對尋址!

規(guī)定只能以無符號數(shù)方式訪問,定義了8個宏定義,其函數(shù)原型如下:

#define CBYTE((unsigned char volatile*)0x50000L) //CBYTE以字節(jié)形勢對code區(qū)尋址

#define DBYTE((unsigned char volatile*)0x40000L)//data區(qū)

#define PBYTE((unsigned char volatile*)0x30000L) //pdata區(qū)

#define XBYTE((unsigned char volatile*)0x20000L) //xdata區(qū)

#define CWORD(unsigned int volatile*)0x50000L) //以字形式對code區(qū)尋址

#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字節(jié)單元

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區(qū)的指針dp1

uint xdata *dp2; //定義一個指向xdata區(qū)的指針dp2,為uint型

uchar data*dp3; //定義一個指向data區(qū)的指針dp3,為char型

dp1=0x30; //dp1指針賦值,指向pdata區(qū)的30H單元

dp2=0x1000; //dp2指針賦值(uint型),指向xdata區(qū)的1000H單元

*dp1=0xff;//將數(shù)據(jù)0xff送到片外RAM30H單元

*dp2=0x1234; //將數(shù)據(jù)0x1234(由于是uint型,你懂得~~~),送到片外RAM1000H單元

dp3=&var1; //dp3指針指向data區(qū)的var1變量

*dp3=0x20;//給變量var1賦值0x20

}

3)使用C51擴展關鍵字 _at_ (這個用的最多了~~~

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

一般格式:

[存儲類型] 數(shù)據(jù)類型說明 變量名 _at_ 地址常量;

其中,存儲類型為data、bdata、idata、pdata、xdata等C51能識別的數(shù)據(jù)類型,如果省略,則會按照存儲模式規(guī)定的默認存儲類型確定變量的存儲區(qū)域(這里又用到上邊的了);數(shù)據(jù)類型為C51支持的數(shù)據(jù)類型;地址常數(shù)用于指定變量的絕對地址,必須位于有效的存儲器空間之內(nèi);使用_at_定義的變量必須為全局變量。

例如:

typedef unsigned char uchar;

typedef unsigned int uint;

data uchar x1 _at_ 0x40; //在data區(qū)中定義字節(jié)變量x1,地址為0x40H,這里是uchar

xdata uint x2 _at_ 0x2000; //在xdata區(qū)中定義字變量x2,它的地址為0x2000H,這里是uint

我感覺我真的不想再寫了,累死了~~~擦

不過完工了,爽啊~~解脫



上一頁 1 2 下一頁

關鍵詞: C51運算量特殊功能寄存器變量位變

評論


相關推薦

技術專區(qū)

關閉