STC89C52微控制器RAM模式
STC89C52 微控制器內變數、函式引數等資料在RAM中的儲存模式: small、compact、large
前邊介紹微控制器資源的時候,我們提到過 STC89C52 共有 512 位元組的 RAM,是用來儲存資料的,比如我們定義的變數都是直接存在 RAM 裡邊的。但是微控制器的這 512 位元組的 RAM在地位上並不都是平等的,而是分塊的,塊與塊之間在物理結構和用法上都是有區別的,因此我們在使用的時候,也要注意一些問題。
51 微控制器的 RAM 分為兩個部分,一塊是片內 RAM,一塊是片外 RAM。標準 51 的片內 RAM 地址從 0x00H~0x7F 共 128 個位元組,而現在我們用的 51 系列的微控制器都是帶擴充套件片內 RAM 的,即 RAM 是從 0x00~0xFF 共 256 個位元組。片外 RAM 最大可以擴充套件到 0x0000~0xFFFF 共 64K 位元組。這裡有一點大家要明白,片內 RAM 和片外 RAM 的地址不是連起來的,片內是從 0x00 開始,片外也是從 0x0000 開始的。還有一點,片內和片外這兩個名詞來自於早期的 51 微控制器,分別指在晶片內部和晶片外部,但現在幾乎所有的 51 微控制器晶片內部都是集成了片外 RAM 的,而真正的晶片外擴充套件則很少用到了,雖然它還叫片外 RAM,但實際上它現在也是在微控制器晶片內部的,我們的 STC89C52 就是這樣。以下是幾個 Keil C51 語言中的關鍵字,代表了 RAM 不同區域的劃分,大家先記一下。
data:片內 RAM 從 0x00~0x7F
idata:片內 RAM 從 0x00~0xFF
pdata:片外 RAM 從 0x00~0xFF
xdata:片外 RAM 從 0x0000~0xFFFF
大家可以看出來,data 是 idata 的一部分,pdata 是 xdata 的一部分。為什麼還這樣去區分呢?因為 RAM 分塊的訪問方式主要和彙編指令有關,因此這塊內容大家瞭解一下即可,只需要記住如何訪問速度更快就行了。
我們定義一個變數 a,可以這樣:unsigned char data a=0,而我們前邊定義變數時都沒有加 data 這個關鍵字,是因為在 Keil 預設設定下,data 是可以省略的,即什麼都不加的時候變數就是定義到 data 區域中的。data 區域 RAM 的訪問在組合語言中用的是直接定址,執行速度是最快的。如果你定義成 idata,不僅僅可以訪問 data 區域,還可以訪問 0x80H~0xFF 的範圍,但加了 idata 關鍵字後,訪問的時候 51 微控制器用的是通用暫存器間接定址,速度較 data會慢一些,而且我們平時大多數情況下不太希望訪問到 0x80H~0xFF,因為這塊通常用於中斷與函式呼叫的堆疊,所以在絕大多數情況下,我們使用內部 RAM 的時候,只用 data 就可以了。
對於外部 RAM 來說,使用 pdata 定義的變數存到了外部 RAM 的 0x00~0xFF 的地址範圍內,這塊地址的訪問和 idata 類似,都是用通用暫存器間接定址,而如果你定義成 xdata,可以訪問的範圍更廣泛,從 0 到 64K 的地址都可以訪問到,但是它需要使用 2 個位元組暫存器DPTRH 和 DPTRL 來進行間接定址,速度是最慢