51 單片機的 RAM 分為兩個部分,一塊是片內(nèi) RAM,一塊是片外 RAM。標準 51 的片內(nèi) RAM 地址 從 0x00H~0x7F 共 128 個字節(jié),而現(xiàn)在我們用的 51 系列的單片機都是帶擴展片內(nèi) RAM 的,即 RAM 是從 0x00~0xFF 共 256 個字節(jié)。片外 RAM 最大可以擴展到 0x0000~0xFFFF 共 64K 字 節(jié)。這里有一點大家要明白,片內(nèi) RAM 和片外 RAM 的地址不是連起來的,片內(nèi)是從 0x00 開始, 片外也是從 0x0000 開始的。還有一點,片內(nèi)和片外這兩個名詞來自于早期的 51 單片機,分別指在 芯片內(nèi)部和芯片外部,但現(xiàn)在幾乎所有的 51 單片機芯片內(nèi)部都是集成了片外 RAM 的,而真正的芯 片外擴展則很少用到了,雖然它還叫片外 RAM,但實際上它現(xiàn)在也是在單片機芯片內(nèi)部的.但是單片機的這 512 字節(jié)的 RAM在地位上并不都是平等的,而是分塊的,塊與塊之間在物理結(jié)構(gòu)和 用法上都是有區(qū)別的,因此我們在使用的時候,也要注意一些問題。
51單片機RAM分為四個區(qū)域
1.工作寄存器區(qū)(00H~1FH)
2.位尋址區(qū)(20H~2FH)
3.用戶RAM區(qū)(30H~7FH)
4.特殊功能寄存器(80H~FFH)
其中1.2.3處于RAM低128單元,4處于高128單元
也就是聲明變量時data與idata位置
而棧就是在用戶RAM區(qū)內(nèi)人為開辟的一段空間,用于存放數(shù)據(jù),而單片機也相應的為這段空間提供了硬件也就是SP寄存器。SP是一個8位寄存器用于存放棧頂位置。
51單片機的具體存儲器地址分配
數(shù)據(jù)存儲器(RAM)為 256 字節(jié), 地址范圍為00H~FFH, 分為兩大部分: 低 128 字節(jié)(00H~7FH)為真正的RAM區(qū); 高 128 字節(jié)(80H~FFH)為特殊功能寄存器區(qū)SFR。
程序存儲器(ROM)的內(nèi)部地址為 0000H~0FFFH, 共 4 KB; 外部地址為 1000H~FFFFH, 共 60 KB。 當程序計數(shù)器由內(nèi)部 0FFFH執(zhí)行到外部 1000H 時, 會自動跳轉(zhuǎn)。
一般分為數(shù)據(jù)存儲器RAM,程序存儲器ROM,內(nèi)存的具體地址都是規(guī)定好的,不需要我們劃分,只需要我們知道他們的具體地址就好了。MCS-51單片機內(nèi)部RAM讀操作時,被選中單元的數(shù)據(jù)經(jīng)數(shù)據(jù)線、輸入/輸出區(qū)處理后傳送給CPU;寫操作時,CPU將數(shù)據(jù)經(jīng)輸入/輸出區(qū)轉(zhuǎn)化、數(shù)據(jù)線存入被選中單元。由于受RAM的集成度限制。
大家可以看出來,data 是 idata 的一部分,pdata 是 xdata 的一部分。為什么還這樣去區(qū)分呢?因為 RAM 分塊的訪問方式主要和匯編指令有關(guān),因此這塊內(nèi)容大家了解一下即可,只需要記住如何訪問 速度更快就行了。 我們定義一個變量 a,可以這樣:unsigned char data a=0,而我們前邊定義變量時都沒有加 data 這個關(guān)鍵字,是因為在 Keil 默認設(shè)置下,data 是可以省略的,即什么都不加的時候變量就是定義到 data 區(qū)域中的。data 區(qū)域 RAM 的訪問在匯編語言中用的是直接尋址,執(zhí)行速度是最快的。如果你 定義成 idata,不僅僅可以訪問 data 區(qū)域,還可以訪問 0x80H~0xFF 的范圍,但加了 idata 關(guān)鍵字 后,訪問的時候 51 單片機用的是通用寄存器間接尋址,速度較 data會慢一些,而且我們平時大多 數(shù)情況下不太希望訪問到 0x80H~0xFF,因為這塊通常用于中斷與函數(shù)調(diào)用的堆棧,所以在絕大多 數(shù)情況下,我們使用內(nèi)部 RAM 的時候,只用 data 就可以了。 對于外部 RAM 來說,使用 pdata 定義的變量存到了外部 RAM 的 0x00~0xFF 的地址范圍內(nèi),這塊 地址的訪問和 idata 類似,都是用通用寄存器間接尋址,而如果你定義成 xdata,可以訪問的范圍更 廣泛,從 0 到 64K 的地址都可以訪問到,但是它需要使用 2 個字節(jié)寄存器DPTRH 和 DPTRL 來進 行間接尋址,速度是最慢的。
MCS-51單片機由許多RAM組合而成。CPU訪問存儲器時,一次只能訪問RAM中的某一片,片選控制區(qū)選中,地址譯碼器的輸出信號控制該片某個地址的寄存器與CPU接通;當片選線接入無效電平時,則該片與CPU之間處于斷開狀態(tài)。
一般情況下,我們是使用 data 區(qū)域,data 不夠用了,我們就用 xdata,如果希望程序執(zhí)行效率盡量 高一點,就使用 pdata 關(guān)鍵字來定義。其它型號有更大的 RAM 的 51 系列單片機,如果要使用更大 的 RAM,就必須得用 xdata 來訪問了。