- 51系列單片機開發寶典
- 趙建領等編著
- 2885字
- 2019-01-01 04:33:46
2.4 存儲器結構
存儲器是單片機的3大部件之一,主要用來存儲信息(即數據和程序)。存儲器按配置方法分為主存和外存。“主存”又稱為“內存”,用于存放當前執行的數據和程序;“外存”用于存放暫不執行的數據和程序。目前單片機主要配置內存。
存儲器結構分為獨立的兩部分:數據存儲器(RAM)和程序存儲器(ROM)。8051單片機的存儲器可分為4個存儲空間:片內程序存儲器(片內ROM)、片外程序存儲器(片外ROM)、片內數據存儲器(片內RAM)、片外數據存儲器(片外RAM)。
這4類存儲器與其對應的地址關系,如表2.2所示。
表2.2 RS1、RS0與寄存器R0~R7間的對應關系
8051單片機片內有4KB的程序存儲器和256B的數據存儲器,還可以片外擴展至64KB程序存儲器和64KB數據存儲器。關于這部分內容將在系統擴展部分介紹。
2.4.1 程序存儲器
程序存儲器設計人員編寫的程序就存放在單片機的程序存儲器中,也稱為“只讀程序存儲器”(ROM)。程序和數據一樣,都是由機器碼組成的代碼串,只是程序代碼存放于程序存儲器中。
51系列單片機具有64KB程序存儲器尋址空間,這64KB的地址空間是統一編址的,沒有采用片內、片外分區的方式。區分片內、片外是由引腳上的電平來指示的。
◆ ,即接高電平時,CPU從片內的程序存儲中讀取程序,當PC值超過片內ROM的容量時,才會轉向外部的程序存儲器讀取程序。
◆ ,即接低電平時,CPU從片外的程序存儲中讀取程序,并輸出
選通信號。
◆ 對于內部無ROM的8031單片機,其ROM只能外接,必須使。
程序存儲器由16位的程序計數器(PC)指示當前地址。片內ROM的地址為0000H~0FFFH。單片機啟動復位后,程序計數器(PC)的內容為0000H,系統將從0000H單元開始執行程序。
在程序存儲器中的0003H~0032H,共48B被保留專用于中斷處理程序,稱為中斷矢量區,系統必須跳過這一區域。
◆ 0000H~0002H單元:系統復位后,PC為0000H,單片機從0000H單元開始執行程序,如果程序不從0000H單元開始執行,則應在這三個單元中存放一條無條件轉移指令,讓系統跳過這一區域,直接去執行用戶指定的程序。
◆ 0003H~002AH:這40個單元各有用途,被均勻地分為6段,其定義如表2.3所示。
表2.3 中斷入口地址
以上地址單元是專門用于存放中斷處理程序的。中斷響應后,按中斷的類型自動轉到各自的中斷區去執行程序。這些地址單元不能用于存放程序的其他內容,只能存放中斷服務程序。通常情冴下,每段只有8個地址單元不能保存完整的中斷服務程序,因而一般在中斷響應的地址區,存放一條無條件轉移指令,指向程序存儲器的真正存放中斷服務程序的空間。這樣中斷響應后,CPU讀到這條轉移指令,便轉向真正存放中斷服務程序的空間,繼續執行中斷服務程序。
2.4.2 數據存儲器
數據存儲器也稱為“隨機存取數據存儲器”。51系列單片機的數據存儲器在物理邏輯上分為兩個地址空間,即片內數據存儲區和片外數據存儲區。片內RAM有256B的用戶數據存儲區域(不同型號有所區別),是用于存放執行的中間結果和過程數據的51系列單片機的。數據存儲器均可讀/寫,部分單元還可以位尋址,其結構示意圖如圖2.5所示。

圖2.5 數據存儲器結構示意圖
51系列單片機內部RAM共有256個單元(不同型號有所區別),這256個單元按其功能分為兩部分。
1.低128B片內RAM
低128B片內RAM,地址空間為00H~7FH單元,為用戶數據RAM,可以存放運算結果和標志位等。該區域按其功能還可分為如下3個區域。
00HH~1 FHH:工作寄存器區,開辟了4組工作寄存器,每組R0~R7,在前面寄存器一節進行過詳細介紹。
20HH~2 FHH:位尋址區,共16B,128位。布爾處理的存儲空間就是位尋址區,既可作為一般單元用字節尋址,也可以進行位尋址。該區域除了作為一般RAM進行讀/寫外,還可進行執行置“1”、清“0”、求反、轉移、傳送和邏輯等位操作。位尋址區地址表如表2.4所示。
表2.4 位尋址區位地址表
30H~7FH:字節尋址區,共80B,用戶使用的一般RAM,可在此區域開辟堆棧。
2.高128B片內RAM
高128B片內RAM:地址空間為80H~FFH地址單元,為特殊功能寄存器(SFR)區。8051內部有21個特殊寄存器,AT89S52有32個特殊寄存器,如表2.5所示。
表2.5 特殊功能寄存器(SFR)
說明:
帶*號的特殊功能寄存器都是可以位尋址的寄存器。
特殊功能寄存器分散在30H~7FH片內RAM區,其中有部分地址單元未定義,不能使用。訪問特殊功能寄存器使用直接尋址方式,其中有一部分(表中帶*號)特殊功能寄存器也可以采用位尋址,其特征是地址能被8整除。訪問這些寄存器中的各位時,在位尋址指令中,可以用“寄存器名.位”、“字節地址.位”、“位地址”、“位名稱”等來表示。例如“B.5”表示寄存器B的第5位。可位尋址的特殊功能寄存器及其位地址如表2.6所示。
表2.6 可位尋址的特殊功能寄存器及其位地址
2.4.3 存儲器擴展
51系列單片機為了滿足不同應用的需要,除了設置內部存儲器外,還可以根據需要進行外部存儲器擴展。外部存儲器擴展時,采用P0和P2作為16位地址總線的低8位和高8位,另外,P0口還分時復用為8位數據總線。
1.外部程序存儲器擴展
與普通的8051單片機不同,AT89S52內部設有8KB的可擦寫Flash存儲器。這個程序存儲器可從外部擴展至56KB,這時需要將單片機的引腳接高電平。在外部擴展程序存儲器情冴下,程序可以首先從片內的程序存儲器開始順序執行,訪問時CPU會自動轉向外部程序存儲器。
當CPU訪問外部程序存儲器的時候,程序存儲器指針(PC)的低8位地址由P0口輸出,PC的高8位地址由P2口輸出。P2口和P0口共同組成16位地址總線。外部程序存儲器中的指令代碼由P0口輸入,即P0口是低8位地址線和8位數據線的分時復用。
為了保證在訪問外部程序存儲器期間,16位的地址碼不變,并且能正確地從P0口讀入程序代碼,應該將P0口輸出的低8位地址在ALE信號的控制下存入地址鎖存器,這樣便可以將P0口空出來讀取8位的程序代碼。
如果引腳接低電平,則CPU直接從片外程序存儲器的0000H地址開始執行,而不管片內8KB的Flash是否含有程序代碼。
2.外部數據存儲器擴展
AT89S52單片機內部的256B的RAM如果不夠用,外部還可以擴展64KB的數據存儲器空間。
由于訪問外部數據存儲器是隨機的,因此其訪問地址可由工作寄存器R0或R1來尋址256B單元或由數據指針(DPTR)尋址54KB的空間。
訪問外部數據存儲器的硬件結構和訪問外部程序程序器相同。R0或R1的8位地址由P0口送入地址鎖存器輸出,DPTR的16位地址則由P0口輸出低8位地址到鎖存器中,P2口則輸出高8位地址。讀/寫的數據由P0口輸入/輸出,因此P0口仍然是地址/數據分時復用的。
訪問外部數據MOVX類指令是單字節雙周期指令,因此在第二個機器周期ALE信號將減少一次。
訪問外部數據存儲器的讀/寫選通信號為和
,均為低電平有效。訪問外部程序和數據存儲器各有不同的地址指針PC、Ri、DPTR,各指針又有不同的讀或者讀/寫選通信號
、
。這就從結構上把程序存儲器和數據存儲器的訪問截然分開。兩者雖然同用16位地址總線,由于使用兩套完全不同的地址指針和讀、讀/寫選通信號,從而保證了指令的執行不會出錯,為單片機的應用提供了方便。
訪問內部RAM用MOV類指令,訪問片內RAM還是特殊功能寄存器則由尋址方式來區分。
◆ 訪問特殊功能寄存器只能用直接尋址方式。
◆ 訪問外部數據存儲器則需選用MOVX類指令。
◆ 對于只需尋址256B單元的可采用Ri進行8位地址間接尋址,否則選用DPTR16位地址指針,尋址64KB地址空間。
◆ 讀取程序存儲器中的固定數據,則需選用MOVC類指令。
可見,訪問不同地址空間的數據需要采用不同的指令類型。