1、內部 RAM:共 256 個單元,用戶使用前 128 個單元,用于存放可讀寫數據,后 128 個單元被專用寄存器占用。
前 128 單元具體分為:
1.工作寄存器區:共 4 個組,每組為 8 個存儲單元,即
00H-07H,08H-0FH,10H-17H,18H-1FH,具體選擇哪一個由程序狀態字(PSW)中的 RS1 和 RS0 的組合決定(在此我就不展開了,呵呵……)
2.位尋址區:20H-2FH,共 16 個單元,每一位可以進行位尋址(16*8=128 個位地 址),就是每一個觸發位,就是 bit 可以尋址
3.便箋區:從 30H-7FH,共 80 個單元,用于存放用戶數據或作堆棧區使用。
4.從 80H-FFH 為專用寄存器占用,其中還離散的分布 SFR(21 個特殊功能寄存器)
2、256B
其中 00H~7FH
可分為 3 個區域:
00H~1FH 是通用寄存器區
20H~2FH 是位尋址區
30H~7FH 是用戶 RAM 區
80H~FFH 是特殊功能寄存器區
3、AT89S51 單片機的 ram,只有 128 字節,地址范圍:00H~7FH。
SFR 不是 RAM,是特殊功能寄存器,地址范圍:80H~FFH,SFR 在其中離散分布
著。
AT89S52 單片機的 ram,就有 256 字節,地址范圍:00H~FFH。 SFR,特殊功能寄存器,仍然在地址范圍:80H~FFH。 兩者的地址重疊了,區別方法如下:
對 80H~FFH 直接尋址,就是讀寫 SFR,特殊功能寄存器;對 80H~FFH 間接尋址,就是讀寫 RAM。
先說說這幾個詞是什么意思:
1,DATA,51 的內部 RAM,只有 128B(字節)大小,不管是最新的什么增強型 單片機;
2,XDATA,外部 RAM,只能使用 MOVX 尋址
3,CODE,代碼區,即是你的代碼的大小,AT89C51為 4K,C52 為 8K 等,增強
型的有更多的選擇。
然后說明一下,幾種 RAM的區別:
1,DATA,也是上面 1 提到的 DATA RAM,占 51 的 128B;
2,IDATA,大小也為 128B,與 DATA 構成 256 字節的內存(如 AT89C52)
3,PDATA,外部 RAM 的前 256B(就是一個頁的大小),是 XDATA 的一部分;
4,XDATA,外部 RAM
所以你的那個單片機的 1280B,其實組成為:
DATA :128B
IDATA:128B
XDATA:1024B
所以你的問題,“使用片內 RAM”打勾只是軟件仿真用的;你的 XDATA 用了 758B, 說明你特意用 XDATA 關鍵字定了這么大的內存,比如大數組或者內存模式時,使用了 lager 模式,那么編譯器會自動把超出的部分放到 XDATA 里,我猜你應該 是這里選擇了 lager 模式,不過你的內容這么大,也只能選擇 lager 模式。
以上為原創,如果想看更詳細的介紹,可以看以下鏈接:
單片機 C 語言 unsigned char code table[] code 是什么作用?
code 的作用是告訴單片機,我定義的數據要放在 ROM(程序存儲區)里面,寫 入后就不能再更改,其實是相當與匯編里面的尋址 MOVC(好像是),因為 C 語言 中沒辦法詳細描述存入的是 ROM 還是 RAM(寄存器),所以在軟件中添加了這一個語句起到代替匯編指令的作用,對應的還有 data 是存入 RAM 的意思。
程序可以簡單的分為 code(程序)區,和 data (數據)區,code 區在運行的時候是不可以更改的,data 區放全局變量和臨時變量,是要不斷的改變的,cpu 從 code 區讀取指令,對 data 區的數據進行運算處理,因此 code 區存儲在什么介質上并不重要,象以前的計算機程序存儲在卡片上,code 區也可以放在 rom 里面, 也可以放在 ram 里面,也可以放在 flash 里面(但是運行速度要慢很多,主要讀 flash 比讀 ram 要費時間),因此一般的做法是要將程序放到 flash 里面,然后 load到 ram 里面運行的;DATA 區就沒有什么選擇了,肯定要放在 RAM 里面,放到 rom 里面改動不了。
完整的pdf格式文檔51黑下載地址:
單片機關于RAM的作用 .pdf
(92.78 KB, 下載次數: 44)
2018-10-13 08:27 上傳
點擊文件名下載附件
單片機 下載積分: 黑幣 -5
|