討論有關(guān)單片機(jī)內(nèi)存的問題
由于單片機(jī)的內(nèi)存比較小,在以前的型號如AT89c51內(nèi)存只有128byte,按照目前的電子市場飛速的發(fā)展,這么點(diǎn)點(diǎn)的內(nèi)存只夠做一個(gè)簡單的電子系統(tǒng),若是大一點(diǎn)的就遠(yuǎn)遠(yuǎn)不夠用了,這樣要么就要外擴(kuò)一個(gè)靜態(tài)RAM,要么就要選擇一個(gè)內(nèi)存比較大一點(diǎn)的單片機(jī),比如:AT89S52 [256byte] SST89E564 [1K]等等。這樣在使用KEIL軟件的時(shí)候是如何適用超過128byte字節(jié)的RAM呢?很多人都有這樣的疑問【當(dāng)初我搞的也不是很明白】。
本文引用地址:http://m.butianyuan.cn/article/201611/317163.htm在網(wǎng)上也看到了很多人都有這樣的想法:
① 超過變量128后必須使用compact模式編譯
實(shí)際的情況是只要內(nèi)存占用量不超過256.0【前提是:單片機(jī)的內(nèi)存必須要大于128byte,對于at89c51來說想達(dá)到256也達(dá)不到啊,本身就不夠用】 就可以用 small 模式編譯。要是單片機(jī)提供的內(nèi)存更大的話,那也可以在small模式編譯的。
② 128以上的某些地址為特殊寄存器使用,不能給程序用
這樣的想法也是不對的,單片機(jī)與 PC 機(jī)不同,51 單片機(jī)不使用線性編址,特殊寄存器與 RAM 使用重復(fù)的地址。但訪問時(shí)采用不同的指令,所以并不會占用 RAM 空間。
下面我用匯編和C語言進(jìn)行解釋一下上面紅色字的意思:【很多人都能說出這樣的道理,但是很少有人舉出實(shí)際的例子供大家參考和分析,下面我會在匯編和C語言做出實(shí)際的語句,來和大家一起分析一下】
首先先給P0口賦值0x55;
P0DATA080H
MOV A , #55H;
MOVP0 ,A; ;因?yàn)閜0口特殊功能寄存器的地址是0x80
若是往0x80地址存儲數(shù)據(jù)0xAA。則需要執(zhí)行以下語句
MOV RO ,#80H
MOV @R0 , #0AAH
參照上面的語句就能知道同樣都是0x80地址卻有著不一樣的效果.
下面在寫一下C語言的語句
sfr P0 = 0x80;
unsigned char idatai_at_0x80;
voidmain(void)
{
//P0口賦值0x55;
P0 = 0x55;
//0x80地址存儲數(shù)據(jù)0xAA
i = 0xAA;
}
根據(jù)上面總結(jié)出來的,看完所有的代碼我想對大家應(yīng)該有所幫助吧?仔細(xì)看看我上面的代碼或我的說明,我想這個(gè)時(shí)候你應(yīng)該對單片機(jī)的內(nèi)存有個(gè)進(jìn)一步的了解了。對你以后開發(fā)單片機(jī)應(yīng)該會有所幫助的。如果你對此有所疑問,或者我的說法有錯(cuò)誤,請您給我留言,我們共同交流,由于時(shí)間的關(guān)系,以前整理的資料好多都丟了,今天在此作了一個(gè)簡單的整理并發(fā)上來,希望對看我的blog的人用……看過的人希望您能留下寶貴的意見或留言,謝謝!?。?/p>
評論