❶ 51單片機ram不夠用,怎麼優化程序
1.肯定的,嵌套越多,要壓棧保存的信息就越多,佔用的RAM就越多了,對51來說,最多就是CPU內256位元組的RAM。
2.是的。
3.沒用過這晶元……我用的最多的是AVR
4因為你定義了一個pagebuf[512],512位元組啊!51單片機的data撐死才256位元組(還沒算壓棧保存數據需要的RAM),所以編譯器自動將這個數組放在了XDATA中。
❷ 51單片機燒錄程序時提示程序末地址超過存儲容量怎麼解決小弟剛學單片機,求幫助,感激不盡。
你這種情況要分兩種,一種就是總程序已經大於4KB大小。這個只能換用更大存儲空間的片子。如果不是的話,就是第二種可能,你編程的時候地址空間沒有被充分利用,這個就是發生在你的一些跳轉,判斷語句上,這個你要檢查你的程序語句,是不是調的空間過大,以至於到最後程序計數器指針PC到了最後一個空間,你的程序還沒有執行完。要讓程序緊湊,不要在編程時空下太大空間,這樣存儲器空間利用率會很低的。
❸ 簡述51單片機的存儲器邏輯空間分布,並說明當存儲器地址發生重疊時應如何處
MCS-51單片機存儲器結構
1、 程序存儲器
MCS-51具有64kB程序存儲器定址空間,它是用於存放用戶程序、數據和表格等信息。對於內部無ROM的8031單片機,它的程序存儲器必須外接,空間地址為64kB,此時單片機的端必須接地。強制CPU從外部程序存儲器讀取程序。對於內部有ROM的8051等單片機,正常運行時,則需接高電平,使CPU先從內部的程序存儲中讀取程序,當PC值超過內部ROM的容量時,才會轉向外部的程序存儲器讀取程序。
8051片內有4kB的程序存儲單元,其地址為0000H—0FFFH,單片機啟動復位後,程序計數器的內容為0000H,所以系統將從0000H單元開始執行程序。但在程序存儲中有些特殊的單元,這在使用中應加以注意:
其中一組特殊是0000H—0002H單元,系統復位後,PC為0000H,單片機從0000H單元開始執行程序,如果程序不是從0000H單元開始,則應在這三個單元中存放一條無條件轉移指令,讓CPU直接去執行用戶指定的程序。
另一組特殊單元是0003H—002AH,這40個單元各有用途,它們被均勻地分為五段,它們的定義如下:
0003H—000AH 外部中斷0中斷地址區。
000BH—0012H 定時/計數器0中斷地址區。
0013H—001AH 外部中斷1中斷地址區。
001BH—0022H 定時/計數器1中斷地址區。
0023H—002AH 串列中斷地址區。
可見以上的40個單元是專門用於存放中斷處理程序的地址單元,中斷響應後,按中斷的類型,自動轉到各自的中斷區去執行程序。因此以上地址單元不能用於存放程序的其他內容,只能存放中斷服務程序。但是通常情況下,每段只有8個地址單元是不能存下完整的中斷服務程序的,因而一般也在中斷響應的地址區安放一條無條件轉移指令,指向程序存儲器的其它真正存放中斷服務程序的空間去執行,這樣中斷響應後,CPU讀到這條轉移指令,便轉向其他地方去繼續執行中斷服務程序。
2、 數據存儲器
數據存儲器也稱為隨機存取數據存儲器。MCS-51單片機的數據存儲器在物理上和邏輯上都分為兩個地址空間,一個是內部數據存儲區和一個外部數據存儲區。MCS-51內部RAM有128或256個位元組的用戶數據存儲(不同的型號有分別),它們是用於存放執行的中間結果和過程數據的。MCS-51的數據存儲器均可讀寫,部分單元還可以位定址。
8051內部RAM共有256個單元,這256個單元共分為兩部分。其一是地址從00H—7FH單元(共128個位元組)為用戶數據RAM。從80H—FFH地址單元(也是128個位元組)為特殊寄存器(SFR)單元。從圖1中可清楚地看出它們的結構分布。
在00H—1FH共32個單元中被均勻地分為四塊,每塊包含八個8位寄存器,均以R0—R7來命名,我們常稱這些寄存器為通用寄存器。這四塊中的寄存器都稱為R0—R7,那麼在程序中怎麼區分和使用它們呢?聰明的INTEL工程師們又安排了一個寄存器——程序狀態字寄存器(PSW)來管理它們,CPU只要定義這個寄存的PSW的第3和第4位(RS0和RS1),即可選中這四組通用寄存器。對應的編碼關系如圖2所示。
內部RAM的20H—2FH單元為位定址區,既可作為一般單元用位元組定址,也可對它們的位進行定址。位定址區共有16個位元組,128個位,位地址為00H—7FH。位地址分配如表1所示,CPU能直接定址這些位,執行例如置「1」、清「0」、求「反」、轉移,傳送和邏輯等操作。我們常稱MCS-51具有布爾處理功能,布爾處理的存儲空間指的就是這些為定址區。
❹ MCS-51 單片機的存儲器地址空間如何劃分各地址空間的地址范圍和容量如何
MCS-51 單片機的存儲器地址空間,講起來,要用幾頁.
簡單介紹如下:
MCS-51的存儲器有片內RAM、片外RAM 和 ROM 三個空間.
片內RAM:
地址范圍是00H到7FH (52系列延伸到FFH).
其中00H到1FH,共32位元組,分成四個工作寄存器區,每區有寄存器 R0~R7.
對此區域,可以使用 R0~R7 來操作,但是,當前只有一個區是可以這樣讀寫的.
對此區域,也可以使用位元組地址,來讀寫.
20H-2FH,共16位元組,是位定址區,共有128個「位」,位地址:00~7FH.
此區域,也可按照位元組定址,來讀寫.
30H-7FH,沒有什麼特色,只進行位元組定址.
80H-FFH,共有128個地址號碼,其中離散的分布著21個特殊功能寄存器,必須直接定址才能讀寫.
(52系列,在此范圍,還有128位元組的 RAM,必須間接定址才能讀寫).
對上述空間讀寫,需用MOV指令.
----
片外RAM:
片外RAM的地址范圍是0000H到FFFFH,容量即為64KB.
對片外RAM讀寫,需用MOVX指令.
----
ROM:
ROM的地址范圍是0000H到FFFFH,容量即為64KB.
其中0000~0FFFH,即4K,在片內,其它在片外.
(對於8031,這64K的ROM,都在片外.)
對ROM讀出,需用MOVC指令.
❺ 單片機 寄存器中定義變數過多 存儲空間不夠用怎麼辦
當然選寄存器多的呀,比如89C51是128個寄存器,而89C52就有256個可用了。你還不夠用的話,選STC12系列,除了256個內部寄存器外,還嵌入了1K的SRAM可用有的還有1K的flash,足夠你用了。