新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C51中訪問外部RAM的方法

        C51中訪問外部RAM的方法

        作者: 時間:2016-11-27 來源:網絡 收藏
        C51的P0,P2口做外部擴展時使用,其中XBYTE [0x0002],P2口對應于地址高位,P0口對應于地址低位。一般P2口用于控制信號,P0口作為數據通道。

        XBYTE定義的是外部地址,這樣才能和接到你的IO口上的器件通信
        在一般的讀寫外部RAM的程序中,經常看到這樣的句子:

        本文引用地址:http://www.104case.com/article/201611/322578.htm

        XBYTE[address]=data寫數據
        data=XBYTE[address]讀數據1
        外部總線由3組總線組成,數據 地址 控制,我們常常一般就叫他外部總線,既然是有3組不同的信號,那么他們是怎么協調工作的呢?一般情況CPU有特殊的外部數據

        訪問指令如你這里講51的MOVX指令(在C語言中他會編譯成這個指令)在執行這個指令的時候3組線是協調工作
        mov dptr,#1000h
        mov a,#55h
        movx @dptr,a
        上面3調語句的C語言可以表示如下
        #defineW_DATAXBYTE[0x1000]
        W_DATA=0X55;
        在使用外部總線的時候,數據 地址和控制信號是直接按照規定的時序輸出高低電平的,所以不用你管,當然你必須要滿足時序工作如何理解#define XBYTE ((unsigned char

        volatile xdata * ))
        8051 特有的內存型態
        code以 MOVC @A+DPTR 讀取的程序內存
        data可以直接存取的內部數據存儲器
        idata以 Mov @Rn 存取的內部數據存儲器
        bdata可以位尋址(Bit Addressable)的內部存儲器
        xdata以 MOVX @DPTR 存取的外部數據存儲器
        pdata以 MOVX @Rn 存取的外部數據存儲器
        特殊資料型態
        bit一般位(bit)變量
        sbit絕對尋址的位(bit)變量
        語法
        sbitmy_flag=location;(location 范圍從 0x00 ~ 0x7F)
        范例
        sbitEA =0xAF;
        或是配合 bdata 宣告的位(bit)變量
        charbdatamy_flags;
        sbitflag0 =my_flags ^ 0;
        (注意 sbit 前不可以加 static)
        sfr特殊功能緩存器(Special Function Register)
        語法
        sfrmy_sfr=location;(location 范圍從 0x80 ~ 0xFF)
        范例
        sfrP0=0x80;
        指定絕對地址的變量
        在單一模塊內可以使用下面的語法宣告
        [memory_space]typevariable_name_at_location
        范例
        pdatacharmy_pdata_at_0x80;
        如果該變量必須為多個模塊所使用(Global Variable)則以
        抽象指針(Abstract Pointer)的方式在標頭檔(Header File)定義較為方便。
        #definevariable_name*((data_type *)location)
        范例
        #definemy_pdata*((char pdata *)0x80)
        (注意 char 與 pdata 的順序)
        ABSACC.H 提供了下列方便的宏(Macro)定義。
        #define CBYTE ((unsigned char volatile code *) 0)
        #define DBYTE ((unsigned char volatile data *) 0)
        #define PBYTE ((unsigned char volatile pdata *) 0)
        #define XBYTE ((unsigned char volatile xdata *) 0)
        #define CWORD ((unsigned int volatile code *) 0)
        #define DWORD ((unsigned int volatile data *) 0)
        #define PWORD ((unsigned int volatile pdata *) 0)
        #define XWORD ((unsigned int volatile xdata *) 0)
        隱藏的初始化程序
        80C51 在電源重置后(Power On Reset)所執行的第一個程序模塊并不是使用者的主程序
        main(),而是一個隱藏在 KEIL-C51 標準鏈接庫中稱為 startup.a51 的程序模塊。
        startup.a51 的主要工作是把包含 idata、xdata、pdata 在內的內存區塊清除為 0,并
        且初始化遞歸指針。接著 startup.a51 被執行的仍然是一個隱藏在 KEIL-C51 標準鏈接庫
        中稱為 init.a51 的程序模塊。而 init.a51 的主要工作則是初始化具有非零初始值設定的
        變量。
        在完成上述的初始化程序之后,80C51 的控制權才會交給 main() 開始執行使用者的程序。
        #define XBYTE ((unsigned char volatile xdata *) 0)
        定義XBYTE 為 指向 xdata 地址空間unsigned char 數據類型的指針,指針值為0
        這樣,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)訪問外部RAM了

        其中,初始地址就是0x0000;

        百度知道:

        #define XBYTE((char*)0x20000L)XBYTE[0x8000]=0x41;這段程序是什么意思?#define XBYTE ((char*)0x20000L) 定義了XBYTE是個指向地址 0x20000L 的字符型指針(或者數組)變量XBYTE[0x8000]=0x41; 對數組XBYTE的第 0x8000個變量進行賦值,賦值為0x41。即對地址0x28000L的內存單元賦值為0x41。這說明你用的是帶外部數據總線的51芯片,外部的存儲器多半是RAM,RAM的容量至少有 0x8000(32k)字節-RAM的容量可能是64k字節?如果還有問題,可以發消息聯系補充1:L代表 long,這說明 0x20000L 是一個長整數。一般來說,8位單片機如51,整數用16位二進制表示,長整數用32位二進制表示。
        還有這樣用的:
        寫這樣的一個頭文件

        這樣的格式:
        類型 儲存空間 定義別名 關鍵字_at_ 寄存器的地址
        _at_這個關鍵字是絕對定義地址


        關鍵詞: C51外部RA

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宣武区| 遵义县| 锦屏县| 石景山区| 平罗县| 吉安县| 绥阳县| 蒙自县| 晋宁县| 渝中区| 望江县| 山东省| 玉环县| 白沙| 历史| 探索| 于田县| 高要市| 泌阳县| 芮城县| 凤山市| 郸城县| 马公市| 永丰县| 寻甸| 莲花县| 伊吾县| 启东市| 沾益县| 乌兰察布市| 唐海县| 响水县| 苍山县| 彭州市| 察雅县| 自贡市| 阳新县| 巴南区| 越西县| 鄢陵县| 湘潭县|