MCS-51單片機(jī)在物理結(jié)構(gòu)上有四個存儲空間:
1、片內(nèi)程序存儲器
2、片外程序存儲器
3、片內(nèi)數(shù)據(jù)存儲器
4、片外數(shù)據(jù)存儲器
但在邏輯上,即從用戶的角度上,8051單片機(jī)有三個存儲空間:
1、片內(nèi)外統(tǒng)一編址的64K的程序存儲器地址空間(MOVC)
2、256B的片內(nèi)數(shù)據(jù)存儲器的地址空間(MOV)
3、以及64K片外數(shù)據(jù)存儲器的地址空間(MOVX)
在訪問三個不同的邏輯空間時,應(yīng)采用不同形式的指令(具體我們在后面的指令系統(tǒng)學(xué)習(xí)時將會講解),以產(chǎn)生不同的存儲器空間的選通信號。
程序存儲器
一個微處理器能夠聰明地執(zhí)行某種任務(wù),除了它們強(qiáng)大的硬件外,還需要它們運(yùn)行的軟件,其實(shí)微處理器并不聰明,它們只是完全按照人們預(yù)先編寫的程序而執(zhí)行之。那么設(shè)計(jì)人員編寫的程序就存放在微處理器的程序存儲器中,俗稱只讀程序存儲器(ROM)。程序相當(dāng)于給微處理器處理問題的一系列命令。其實(shí)程序和數(shù)據(jù)一樣,都是由機(jī)器碼組成的代碼串。只是程序代碼則存放于程序存儲器中。
MCS-51具有64kB程序存儲器尋址空間,它是用于存放用戶程序、數(shù)據(jù)和表格等信息。對于內(nèi)部無ROM的8031單片機(jī),它的程序存儲器必須外接,空間地址為64kB,此時單片機(jī)的EA端必須接地。強(qiáng)制CPU從外部程序存儲器讀取程序。對于內(nèi)部有ROM的8051等單片機(jī),正常運(yùn)行時,則需接高電平,使CPU先從內(nèi)部的程序存儲中讀取程序,當(dāng)PC值超過內(nèi)部ROM的容量時,才會轉(zhuǎn)向外部的程序存儲器讀取程序。
當(dāng)EA=1時,程序從片內(nèi)ROM開始執(zhí)行,當(dāng)PC值超過片內(nèi)ROM容量時會自動轉(zhuǎn)向外部ROM空間。
當(dāng)EA=0時,程序從外部存儲器開始執(zhí)行,例如前面提到的片內(nèi)無ROM的8031單片機(jī),在實(shí)際應(yīng)用中就要把8031的EA引腳接為低電平。
程序內(nèi)存ROM
尋址范圍:0000H ~ FFFFH 容量64KB
EA = 1,尋址內(nèi)部ROM;EA = 0,尋址外部ROM
地址長度:16位
作用: 存放程序及程序運(yùn)行時所需的常數(shù)。
下圖是ROM的地址分配圖:
8051片內(nèi)有4kB的程序存儲單元,其地址為0000H—0FFFH,單片機(jī)啟動復(fù)位后,程序計(jì)數(shù)器的內(nèi)容為0000H,所以系統(tǒng)將從0000H單元開始執(zhí)行程序。但在程序存儲中有些特殊的單元,這在使用中應(yīng)加以注意:
其中一組特殊是0000H—0002H單元,系統(tǒng)復(fù)位后,PC為0000H,單片機(jī)從0000H單元開始執(zhí)行程序,從上圖中大家可以看到,0000H-0002H,只有三個存儲單元,3個存儲單元在我們的程序存放時是存放不了實(shí)際意義的程序的,通常我們在實(shí)際編寫程序時是在這里安排一條ORG指令,通過ORG指令跳轉(zhuǎn)到從0033H開始的用戶ROM區(qū)域,再來安排我們的程序語言。從0033開始的用戶ROM區(qū)域用戶可以通過ORG指令任意安排,但在應(yīng)用中應(yīng)注意,不要超過了實(shí)際的存儲空間,不然程序就會找不到。
另一組特殊單元是0003H—002AH,這40個單元各有用途,它們被均勻地分為五段,它們的定義如下:
0003H—000AH 外部中斷0中斷地址區(qū)。
000BH—0012H 定時/計(jì)數(shù)器0中斷地址區(qū)。
0013H—001AH 外部中斷1中斷地址區(qū)。
001BH—0022H 定時/計(jì)數(shù)器1中斷地址區(qū)。
0023H—002AH 串行中斷地址區(qū)。
可見以上的40個單元是專門用于存放中斷處理程序的地址單元,中斷響應(yīng)后,按中斷的類型,自動轉(zhuǎn)到各自的中斷區(qū)去執(zhí)行程序。從上面可以看出,每個中斷服務(wù)程序只有8個字節(jié)單元,用8個字節(jié)來存放一個中斷服務(wù)程序顯然是不可能的。因此以上地址單元不能用于存放程序的其他內(nèi)容,只能存放中斷服務(wù)程序。但是通常情況下,我們是在中斷響應(yīng)的地址區(qū)安放一條無條件轉(zhuǎn)移指令,指向程序存儲器的其它真正存放中斷服務(wù)程序的空間去執(zhí)行,這樣中斷響應(yīng)后,CPU讀到這條轉(zhuǎn)移指令,便轉(zhuǎn)向其他地方去繼續(xù)執(zhí)行中斷服務(wù)程序。
數(shù)據(jù)存儲器
數(shù)據(jù)存儲器也稱為隨機(jī)存取數(shù)據(jù)存儲器。數(shù)據(jù)存儲器分為內(nèi)部數(shù)據(jù)存儲和外部數(shù)據(jù)存儲。MCS-51內(nèi)部RAM有128或256個字節(jié)的用戶數(shù)據(jù)存儲(不同的型號有分別),片外最多可擴(kuò)展64KB的RAM,構(gòu)成兩個地址空間,訪問片內(nèi)RAM用“MOV”指令,訪問片外RAM用“MOVX”指令。它們是用于存放執(zhí)行的中間結(jié)果和過程數(shù)據(jù)的。MCS-51的數(shù)據(jù)存儲器均可讀寫,部分單元還可以位尋址。
MCS-51單片機(jī)的內(nèi)部數(shù)據(jù)存儲器在物理上和邏輯上都分為兩個地址空間,即:
數(shù)據(jù)存儲器空間(低128單元);
特殊功能寄存器空間(高128單元);
這兩個空間是相連的,從用戶角度而言,低128單元才是真正的數(shù)據(jù)存儲器。下面我們就來詳細(xì)的與大家講解一下:
內(nèi)部數(shù)據(jù)存儲器RAM
物理上分為兩大區(qū):00H ~ 7FH即128B內(nèi)RAM 和 SFR區(qū)。
作用:作數(shù)據(jù)緩沖器用。
從上圖中我們可以看到,8051單片機(jī)片內(nèi)RAM共有256個單元(00H-FFH),這256個單元共分為兩部分。其一是地址從00H—7FH單元(共128個字節(jié))為用戶數(shù)據(jù)RAM。從80H—FFH地址單元(也是128個字節(jié))為特殊寄存器(SFR)單元。從圖1中可清楚地看出它們的結(jié)構(gòu)分布。
低128單元:
片內(nèi)數(shù)據(jù)存儲器為8位地址,所以最大可尋址的范圍為256個單元地址,對片外數(shù)據(jù)存儲器采用間接尋址方式,R0、R1和DPTR都可以做為間接尋址寄存器,R0、R1是8位的寄存器,即R0、R1的尋址范圍最大為256個單元,而DPTR是16位地址指針,尋址范圍就可達(dá)到64KB。也就是說在尋址片外數(shù)據(jù)存儲器時,尋址范圍超過了256B,就不能用R0、R1做為間接尋址寄存器,而必須用DPTR寄存器做為間接尋址寄存器。
1、通用寄存器區(qū)(00H-1FH)
在00H—1FH共32個單元中被均勻地分為四塊,每塊包含八個8位寄存器,均以R0—R7來命名,我們常稱這些寄存器為通用寄存器。這四塊中的寄存器都稱為R0—R7,那么在程序中怎么區(qū)分和使用它們呢?聰明的INTEL工程師們又安排了一個寄存器——程序狀態(tài)字寄存器(PSW)來管理它們,CPU只要定義這個寄存的PSW的D3和D4位(RS0和RS1),即可選中這四組通用寄存器。對應(yīng)的編碼關(guān)系如下表所示。惹程序中并不需要用4組,那么其余的可用做一般的數(shù)據(jù)緩沖器,CPU在復(fù)位后,選中第0組工作寄存器。
組
RS1 RS0
R0
R1
R2
R3
R4
R5
R6
R7
0
1
2
3
0 0
0 1
1 0
1 1
00H
08H
10H
18H
01H
09H
11H
19H
02H
0AH
12H
1AH
03H
0BH
13H
1BH
04H
0CH
14H
1CH
05H
0DH
15H
1DH
06H
0EH
16H
1EH
07H
0FH
17H
1FH
2、位尋址區(qū)(20H-2FH)
片內(nèi)RAM的20H—2FH單元為位尋址區(qū),既可作為一般單元用字節(jié)尋址,也可對它們的位進(jìn)行尋址。位尋址區(qū)共有16個字節(jié),128個位,位地址為00H—7FH。位地址分配如下表所示:
RAM位尋址區(qū)地址表
單元地址
MSB 位地址 LSB
2FH
7FH
7EH
7DH
7CH
7BH
7AH
79H
78H
2EH
77H
76H
75H
74H
73H
72H
71H
70H
2DH
6FH
6EH
6DH
6CH
6BH
6AH
69H
68H
2CH
67H
66H
65H
64H
63H
62H
61H
60H
2BH
5FH
5EH
5DH
5CH
5BH
5AH
59H
58H
2AH
57H
56H
55H
54H
53H
52H
51H
50H
29H
4FH
4EH
4DH
4CH
4BH
4AH
49H
48H
28H
47H
46H
45H
44H
43H
42H
41H
40H
27H
3FH
3EH
3DH
3CH
3BH
3AH
39H
38H
26H
37H
36H
35H
34H
33H
32H
31H
30H
25H
2FH
2EH
2DH
2CH
2BH
2AH
29H
28H
24H
27H
26H
25H
24H
23H
22H
21H
20H
23H
1FH
1EH
1DH
1CH
1BH
1AH
19H
18H
22H
17H
16H
15H
14H
13H
12H
11H
10H
21H
0FH
0EH
0DH
0CH
0BH
0AH
09H
08
H
20H
07H
06H
05H
04H
03H
02H
01H
00H
CPU能直接尋址這些位,執(zhí)行例如置“1”、清“0”、求“反”、轉(zhuǎn)移,傳送和邏輯等操作。我們常稱MCS-51具有布爾處理功能,布爾處理的存儲空間指的就是這些為尋址區(qū)。
3、用戶RAM區(qū)(30H-7FH)
在片內(nèi)RAM低128單元中,通用寄存器占去32個單元,位尋址區(qū)占去16個單元,剩下的80個單元就是供用戶使用的一般RAM區(qū)了,地址單元為30H-7FH。對這部份區(qū)域的使用不作任何規(guī)定和限制,但應(yīng)說明的是,堆棧一般開辟在這個區(qū)域。
高128單元:(80H-FFH)
符號
地址
功能介紹
B
F0H
B寄存器
ACC
E0H
累加器
PSW
D0H
程序狀態(tài)字
IP
B8H
中斷優(yōu)先級控制寄存器
P3
B0H
P3口鎖存器
IE
A8H
中斷允許控制寄存器
P2
A0H
P2口鎖存器
SBUF
99H
串行口鎖存器
SCON
98H
串行口控制寄存器
P1
90H
P1口鎖存器
TH1
8DH
定時器/計(jì)數(shù)器1(高8位)
TH0
8CH
定時器/計(jì)數(shù)器1(低8位)
TL1
8BH
定時器/計(jì)數(shù)器0(高8位)
TL0
8AH
定時器/計(jì)數(shù)器0(低8位)
TMOD
89H
定時器/計(jì)數(shù)器方式控制寄存器
TCON
88H
定時器/計(jì)數(shù)器控制寄存器
DPH
83H
數(shù)據(jù)地址指針(高8位)
DPL
82H
數(shù)據(jù)地址指針(低8位)
SP
81H
堆棧指針
P0
80H
P0口鎖存器
PCON
87H
電源控制寄存器