新聞中心

        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運算量特殊功能寄存器變量位變

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 六安市| 永登县| 锦州市| 浮梁县| 横峰县| 林芝县| 隆尧县| 琼海市| 阿坝| 安庆市| 邵东县| 屏山县| 平昌县| 靖边县| 沁水县| 北票市| 阿荣旗| 壶关县| 乐亭县| 灵寿县| 开远市| 田东县| 长兴县| 莱芜市| 桃园市| 黄平县| 固镇县| 日喀则市| 开封县| 青铜峡市| 招远市| 莫力| 绩溪县| 双桥区| 巴里| 南阳市| 鄂州市| 屯门区| 景宁| 台湾省| 攀枝花市|