單片機(jī)RAM的用法
51單片機(jī)存儲(chǔ)區(qū)分配如下:
存儲(chǔ)區(qū) | 地址范圍 | 功能說明 |
內(nèi)部RAM (256Byte) | 00H-1FH | 內(nèi)部使用DATA區(qū),四個(gè)工作寄存器組(4*8=32Byte),用于內(nèi)部參數(shù)傳遞 |
20H-2FH1 | BDATA區(qū),DATA 區(qū)的16 個(gè)字節(jié)的可位尋址區(qū) | |
30H-7FH2 | 用戶可用非位尋址DATA區(qū),可在一個(gè)周期內(nèi)直接尋址 | |
80H-FFH | IDATA區(qū),用戶可用的內(nèi)部RAM 區(qū)的高128 個(gè)字節(jié),必須采用間接尋址 | |
80H-FFH3 | 可以進(jìn)行位尋址的特殊功能寄存器(SFR) | |
外部擴(kuò)展RAM (最大64KByte) | 00H-FFH | PDATA區(qū),外部存儲(chǔ)區(qū)的256 個(gè)字節(jié)通過P0 口的地址對(duì)其尋址,需要兩個(gè)指令周期 |
00H-FFFFH4 | XDATA區(qū)(外部存儲(chǔ)區(qū)),使用DPTR 尋址 | |
ROM (最大64KByte) | 00H-FFFFH | CODE區(qū)(程序存儲(chǔ)區(qū)),使用DPTR 尋址 |
1編程定義為: uchar bdata test;
我們一般可以這么用:
先做一個(gè)位定義:sbit test0 = test^0;
然后再程序中使用:if(test0)…else…;表示判斷test的第0bit位的值,然后執(zhí)行相應(yīng)程序。其它位的用法類似。
2編程定義為: uchar data test;
3編程定義為: uchar idata test;
如果你沒有完全弄懂一個(gè)MPU的SFR,那么只能說你沒有弄懂這個(gè)MPU了。所以這里不細(xì)說單片機(jī)的SFR,只提一點(diǎn),它的地址是和IDATA區(qū)重疊的,單片機(jī)內(nèi)部時(shí)通過區(qū)分所訪問的存儲(chǔ)區(qū)來(lái)解決地址重疊問題的,因?yàn)镮DATA 區(qū)只能通過間接尋址來(lái)訪問。在我們的實(shí)時(shí)性要求不那么高,或者DATA區(qū)不夠用的情況下我們就應(yīng)該啟用IDATA區(qū)。
4編程定義為:uchar
也可以這么使用:(需包含頭文件absacc.h)
A = XBYTE[0x8100]; //從地址8100H讀一個(gè)字節(jié)
B = *((char xdata *) 0x0000); // 從地址0000H讀一個(gè)字節(jié)
XBYTE[0x7500] = 0xf0; // 寫一個(gè)字節(jié)到7500H
51單片機(jī)的最后一個(gè)存儲(chǔ)空間為64K, 和CODE 區(qū)一樣采用16 位尋址,屬于外部數(shù)據(jù)存儲(chǔ)區(qū),即XDATA區(qū)。這個(gè)區(qū)通常包括一些RAM器件(如SRAM)或是一些需要通過總線接口的外圍器件(特權(quán)在以前的BLOG里多次談過這個(gè)擴(kuò)展RAM的問題,這里也不多涉及了)。對(duì)XDATA的讀寫操作需要至少兩個(gè)處理周期來(lái)裝入地址,而讀寫又需要兩個(gè)處理周期。
評(píng)論