新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機RAM使用

        單片機RAM使用

        作者: 時間:2016-11-23 來源:網絡 收藏
        51單片機存儲區分配如下:
        存儲區地址范圍功能說明




        內部RAM
        (256Byte)
        00H-1FH內部使用DATA區,四個工作寄存器組(4*8=32Byte),用于內部參數傳遞
        20H-2FH1
        BDATA區,DATA 區的16 個字節的可位尋址區
        30H-7FH2用戶可用非位尋址DATA區,可在一個周期內直接尋址
        80H-FFHIDATA區,用戶可用的內部RAM 區的高128 個字節,必須采用間接尋址
        80H-FFH3可以進行位尋址的特殊功能寄存器(SFR)

        外部擴展RAM
        (最大64KByte)
        00H-FFHPDATA區,外部存儲區的256 個字節通過P0 口的地址對其尋址,需要兩個指令周期
        00H-FFFFH4XDATA區(外部存儲區),使用DPTR 尋址
        ROM
        (最大64KByte)
        00H-FFFFHCODE區(程序存儲區),使用DPTR 尋址

        對上表的一些說明:
        1編程定義為: uchar bdata test;
        所謂的可位尋址,如果你這么用:if(test^0)…else…;我的經驗告訴我編譯出來的程序會出錯的。
        我們一般可以這么用:
        先做一個位定義:sbit test0 = test^0;
        然后再程序中使用:if(test0)…else…;表示判斷test的第0bit位的值,然后執行相應程序。其它位的用法類似。
        2編程定義為: uchar data test;
        因為data區時直接存取存儲,也就是說它在編程的時候最快的RAM區,所以我們往往把使用最頻繁或者說對實時性要求高的數據都定義在data區(keil C中是可以設置優先存放RAM區的)。
        Data區包括了4個工作寄存器組(32Byte)、位尋址區(16Byte)、用戶data區(80Byte)。其實位尋址區也應該歸類到用戶可用data區中,所以一般用戶可以使用的直接尋址的RAM為96Byte。而實際上,一種比較極端的情況,因為單片機工作時只使用4組工作寄存器組中的一組,我們可編程的data區可以有120Byte(我在keilC下編譯測試的結果是,只有在不使用bdata的情況下才可以定義120Byte的data區數據)。
        3編程定義為: uchar idata test;
        如果你沒有完全弄懂一個MPU的SFR,那么只能說你沒有弄懂這個MPU了。所以這里不細說單片機的SFR,只提一點,它的地址是和IDATA區重疊的,單片機內部時通過區分所訪問的存儲區來解決地址重疊問題的,因為IDATA 區只能通過間接尋址來訪問。在我們的實時性要求不那么高,或者DATA區不夠用的情況下我們就應該啟用IDATA區。
        4編程定義為:uchar xdata LD _at_ 0x7f;
        也可以這么使用:(需包含頭文件absacc.h)
        A = XBYTE[0x8100]; //從地址8100H讀一個字節
        B = *((char xdata *) 0x0000); // 從地址0000H讀一個字節
        XBYTE[0x7500] = 0xf0; // 寫一個字節到7500H
        P2和P0口為16bit的地址總線接口,P0口為數據總線口,數據和地址時分時傳輸的。
        51單片機的最后一個存儲空間為64K, 和CODE 區一樣采用16 位尋址,屬于外部數據存儲區,即XDATA區。這個區通常包括一些RAM器件(如SRAM)或是一些需要通過總線接口的外圍器件(特權在以前的BLOG里多次談過這個擴展RAM的問題,這里也不多涉及了)。對XDATA的讀寫操作需要至少兩個處理周期來裝入地址,而讀寫又需要兩個處理周期。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 永定县| 修武县| 元阳县| 龙陵县| 理塘县| 梨树县| 宜宾市| 岚皋县| 江都市| 新昌县| 建阳市| 监利县| 垫江县| 九龙县| 班戈县| 巫溪县| 新密市| 漠河县| 和田市| 独山县| 龙州县| 延津县| 连城县| 吴桥县| 扎赉特旗| 渭源县| 苍梧县| 霍州市| 迭部县| 泰州市| 临洮县| 巴彦淖尔市| 天津市| 雷波县| 绥芬河市| 蒲江县| 石阡县| 六枝特区| 司法| 海门市| 沛县|