我們在學習傳統(tǒng)的MCS-51單片機的時候,一定學習過51單片機的存儲結(jié)構(gòu)。傳統(tǒng)的MCS-51存儲器有三個空間,分別是片內(nèi)RAM(內(nèi)部數(shù)據(jù)存儲器)、片外RAM(外部擴展的數(shù)據(jù)存儲器) 和 ROM(內(nèi)部或者外部程序存儲器)。按照具體數(shù)據(jù)的物理存儲空間來說,MCS-51單片機在有四個物理存儲空間,它們分別是:片內(nèi)程序存儲器(片內(nèi)ROM)、片外程序存儲器(片外ROM)、片內(nèi)數(shù)據(jù)存儲器(片內(nèi)RAM)、片外數(shù)據(jù)存儲器(片外RAM)。
1、片內(nèi)RAM空間上述的這四種物理存儲空間中,最早的8031單片機,只有數(shù)據(jù)存儲器即內(nèi)部RAM是標配的,其他都需要外擴,而到來的8051兼容機中,內(nèi)部的數(shù)據(jù)存儲器(RAM)和內(nèi)部的程序存儲器(ROM)都成了標配。只不過更加不同型號,RAM和ROM的大小有些許區(qū)別。那么,在那個存儲器貴如金的年代,為何還要將RAM作為標配?而且這個還是價格非常昂貴的靜態(tài)RAM。這是因為,哈佛結(jié)構(gòu)的計算機,存儲器是整個計算體系的核心,你可以發(fā)現(xiàn),51單片機外設相關的存儲器,它們都被編入數(shù)據(jù)存儲器(RAM)的地址。如圖1所示。
圖1 MCS-51單片機內(nèi)部256字節(jié)RAM存儲分布
由圖1中,我們可以發(fā)現(xiàn),MCS-51單片機的地址范圍是00H到7FH (52系列延伸到FFH),為8位地址,所以最大可尋址的范圍為256個單元地址。這些地址被分成4個功能區(qū):
地址00H~1FH,共32字節(jié),分成四個工作寄存器區(qū),每區(qū)有寄存器 R0~R7。此存儲區(qū)如果需要使用寄存器進行數(shù)據(jù)的存儲,則可以直接使用寄存器尋址。如“MOV A,R0”。
地址20H-2FH,共16字節(jié),是位尋址區(qū),共有128個“位”,位地址:00~7FH。此區(qū)域的變量,也可按照字節(jié)尋址,來讀寫。如,我們將20H地址的第0位(0或者1)移入程序狀態(tài)字(PSW)的進位標志位(C),則可以:“MOV C, 20H.0”。
地址30H-7FH,這個區(qū)域內(nèi)的內(nèi)存空間,主要是存放用戶編寫程序時產(chǎn)生的臨時數(shù)據(jù),這塊區(qū)域內(nèi)的尋址方式都為間接尋址,而且只能按照字節(jié)單位進行尋址。如果使用C語言要訪問內(nèi)部存儲區(qū),那么你所定義的指針只能指向這一片地址。
地址80H-FFH,此區(qū)域為特殊功能寄存器區(qū)(SFR),共有128個地址,其中離散的分布著21個特殊功能寄存器,必須直接尋址才能讀寫。另外,部分地址可以被8整除的特殊功能寄存器,也可以支持位尋址。(52系列,在此范圍,還有128字節(jié)的 RAM,必須間接尋址才能讀寫)。
注意,在51單片機的內(nèi)部RAM中進行編程的時候,必須使用MOV指令進片內(nèi)RAM的讀寫。
2、外部RAM擴展除了內(nèi)部RAM的這些存儲空間,MCS-51單片機也支持外部RAM的擴展。普通51單片機最大可以片外擴展64K字節(jié)空間的RAM,其地址范圍為0000H~FFFFFH,我們可以使用標準MCS-51單片機的P0口和P2口對RAM進行擴展。其擴展電路如圖2所示。
圖2 外部RAM擴展
片外RAM地址的最大范圍是0000H到FFFFH,即最大容量為64KB。對片外RAM讀寫,必須使用 MOVX 指令。對片外RAM采用間接尋址方式,R0、R1和DPTR都可以做為間接尋址寄存器,R0、R1是8位的寄存器,即R0、R1的尋址范圍最大為256個單元,而DPTR是16位地址指針,尋址范圍就可達到64KB。也就是說在尋址片外RAM時,尋址范圍超過了256B,就不能用R0、R1做為間接尋址寄存器,而必須用DPTR寄存器做為間接尋址寄存器。
3、片外ROM擴展除了RAM可以擴展之外,51單片機還支持外部程序存儲器的擴展,此時做外ROM擴展的時候,需要使用到PSEN引腳去做芯片的選通。PSEN(非)為外部程序存儲器讀選通信號,在讀外部ROM時PSEN(非)低電平有效,以實現(xiàn)外部ROM單元的讀操作,全拼為Program Store Enable。外部ROM的擴展電路如圖3所示。
圖3 MCS-51單片機外部ROM擴展
ROM的地址范圍是0000H到FFFFH,容量即為64KB,地址長度16位,作用是 存放程序及程序運行時所需的常數(shù)。其中4K地址(0000~0FFFH)的空間保留在了在片內(nèi),剩余的其它地址被用作片外ROM的地址,因此如果要擴展片外ROM,則其地址范圍最大為(0x1000~0xffff)。當引腳EA為高電平時,則尋址內(nèi)部ROM,當EA為低電平時,則尋址外部ROM。如果單片機想要讀取ROM中的數(shù)據(jù),必須使用 MOVC 指令。