天天看點

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

本節書摘來自異步社群《例說51單片機(c語言版)(第3版)》一書中的第1章,第1-3節,作者 張義和,王敏男,許宏昌,餘春長,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

除了無rom型的8031及8032外,mcs-51的存儲器包括程式存儲器(rom)與資料存儲器(ram)兩部分,一般地這兩部分是獨立的個體。标準的8x51系列具有4kb程式存儲器、128b資料存儲器,而标準的8x52系列具有8kb、256b資料存儲器,剛好是8x51系列的兩倍。不管是8x51、8031、8032或8x52,其外部擴充的程式存儲器或資料存儲器最多為64kb。

雖然mcs-51的相容單片機都擴充了其内部程式存儲器與資料存儲器,例如atmel半導體公司的ts83c51rb2,其内部有16kb程式存儲器、256b資料存儲器;ts83c51rc2,其内部有32kb程式存儲器、256b資料存儲器;ts83c51rd2,其内部有64kb程式存儲器、768kb資料存儲器。盡管如此,在此仍探讨mcs-51單片機微控制器的标準存儲器結構。

顧名思義,程式存儲器(rom)是存放程式的位置,而cpu将自動從程式存儲器中讀取所要執行的指令碼。mcs-51可選擇使用内部程式存儲器或外部程式存儲器(如圖1-18所示),說明如下。

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

當cpu複位後,程式将從程式存儲器0000h位址位置開始執行,如沒有遇到跳轉指令,則按程式存儲器位址順序執行。當然,程式存儲器前面幾個位置還有一些玄機,留待中斷的單元再詳細說明。

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

mcs-51的程式存儲器與資料存儲器是分開的獨立區塊,是以存取資料存儲器時,所使用的位址并不會與程式存儲器沖突。相對于程式存儲器而言,資料存儲器就不那麼簡單,如圖1-19所示。

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

除了内部資料存儲器外,8x51的資料存儲器還可擴充外部資料存儲器,這兩部分的資料存儲器可以并存。不過,存取資料存儲器時,所采用的指令并不一樣,例如,存取内部資料存儲器時,可用mov指令,但存取外部資料存儲器時,則使用movx指令。

另外,内部資料存儲器中,從0000h到007fh之間的128b為可直接尋址或間接尋址的存儲器。在編寫c語言程式時,以資料類型來差別直接尋址與間接尋址。在這一區間的資料存儲器又可分成三部分(如圖1-20所示),說明如下。

1.寄存器組區

0000h到001fh的32個位址為寄存器組(register bank)區,說明如下。

(1)0000h到0007h為寄存器組0(即rb0),0008h到000fh為寄存器組1(即rb1),0010h到0017h為寄存器組2(即rb2),0018h到001fh為寄存器組3(即rb3)。

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

(2)每組寄存器組都包含r0~r7共8個寄存器,而任一時刻隻能使用其中一組寄存 器組。

(3)寄存器組的切換可以用程式狀态字寄存器(program status word,psw)中的rs1與rs0來決定,如表1-4所示。

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

(4)當cpu複位時,系統的堆棧指針(sp)指向07h位址,是以資料存入堆棧時,将從08h開始,也就是rb1裡的r0位址。為避免沖突或不必要的錯誤,通常會把堆棧指針移到30h以後的位址。

2.可位尋址區

0020h到002fh的16個位元組存儲器區為可位尋址區。通常存取存儲器是以位元組為機關,“可位尋址”則是指定存取1個位(bit)。在8051的彙編語言裡,可使用布爾運算指令進行位操作,例如,要把20h存儲器位址的bit 5設定為1,則可使用下列指令:

另外,從0020h到002fh的16個位元組總共128個位(16×8),也可以直接指定為0到127,以剛才的20h存儲器位址的bit 5而言,也可将“20h.5”指定為“05”,指令如下:

同理,若要将25h存儲器位址的bit 2清除為0,則可使用下列指令:

其中,42=58+2。

3.一般資料與堆棧區

0030h到007fh的80個位元組位址為一般資料存取及堆棧區。由于cpu複位後,堆棧指針指向07h位置,為了確定資料的安全與程式執行的正确,如果在程式之中使用了push、pop指令,最好能把堆棧指針改至本區,例如,要将堆棧指針移至0030h位址,則在程式開始處即使用如下指令:

從0080h到00ffh之間的128b為特殊功能寄存器(special function register,sfr)或可直接尋址的存儲器,至于“特殊功能寄存器”,稍後再詳細說明。

如果是8052/8032,則0080h到00ffh之間的128b除了是特殊功能寄存器或可直接尋址的存儲器外,另外也可以使用間接尋址的方式存取與這特殊功能寄存器位置重疊但為獨立的存儲器。

在mcs-51裡,寄存器隻是cpu裡特定位址的資料存儲器而已。而在0080h到00ffh之間的128b,正是特殊功能寄存器(special function register,sfr)所在位置。特殊功能寄存器就是8x51/52内部的結構,若以彙編語言編寫程式時,必須熟練掌握這些寄存器,若以c語言編寫程式,就不是那麼重要。其位置的聲明放置在keil c所提供的“reg51.h”頭檔案(詳見後面章節)裡,隻要把它包含到程式裡即可,而不必記憶這些位置。以下簡單介紹這些寄存器(如表1-5所示),僅供參考。

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

注:(1)本表c8-cf行部分為8052/8032才有的寄存器,本表第1列的部分為可位尋址的寄存器,較深灰底的部分為89s51/52才有的。

(2)8051/52、89c51/52隻有一組資料指針寄存器,是以其中的dp0l應改為dpl,dp0h應改為dph。

p0、p1、p2、p3

p0~p3為mcs-51的4個輸入/輸出端口,其位址分别為80h、90h、0a0h及0b0h,待第3章再詳細介紹。

sp

sp為堆棧指針寄存器(stack pointer register),其位址為81h。堆棧是一種特殊的資料存儲方式,其資料的操作順序是先進後出(first in last out,filo),當資料以push指令送入堆棧時,sp自動減1;若以pop指令從堆棧取出資料時,sp自動加1。

dpl、dph

89c51隻有一組16位的資料指針寄存器(data pointer register,dptr),這組資料指針寄存器是由dpl與dph兩個8位的資料指針寄存器組成,其位址分别為82h、83h。若以dpl為低8位、dph為高8位,所組成的16位資料指針寄存器将可尋址到64kb的資料位址。89s51有兩組16位資料指針寄存器,分别是dp0l、dp0h、dp1l及dp1h,其位址分别為82h、83h、84h、85h。若以彙編語言編寫程式時,dptr是查表法的必備寄存器。不過,使用c語言編寫程式時,就不太需要由我們直接控制這個寄存器。

pcon

pcon為電源控制寄存器(power control register),其位址為87h,其功能是設定cpu的電源方式,待後續7-3-3節再行說明。

tcon

tcon為定時器/計數器控制寄存器(timer/counter control register),其位址為88h,其功能是設定定時器/計數器的啟動,記錄定時/計數溢出及外部中斷的類型等(見第6章),待後續關于定時器/計數器部分(第7章),再行說明。

tmod

tmod為定時器/計數器方式控制寄存器(timer/counter mode control register),其位址為089h,其功能是設定定時/計數的方式,待後續關于定時器/計數器部分(第7章)再行說明。

tl0、tl1、th0、th1

tl0、th0為第一組定時器/計數器(timer0)的計數器,其位址為8ah、8ch,将th0與tl0組合即可進行16位的定時/計數。tl1、th1為第二組定時器/計數器(timer1)的計數器,其位址為8bh、8dh,将th1與tl1組合即可進行16位的定時/計數,待後續關于定時器/計數器部分(第7章)再行說明。

scon

scon為串行口控制寄存器(serial port control register),其位址為98h,其功能是設定串行口工作方式與标志,待後續關于串行口部分(第8章)再行說明。

sbuf

sbuf為串行口緩沖器(serial buffer),其位址為99h,它由使用同一個位址的兩個寄存器所構成,其中一個寄存器作為發送資料用的緩沖器,另一個寄存器作為接收資料用的緩沖器。至于如何分辨同一個位址的兩個寄存器,視指令而定,若是資料發送的指令,則自動定位到發送資料用的緩沖器;若是接收資料的指令,則自動定位到接收資料用的緩沖器,待後續關于串行口部分(第8章)再行說明。

ie

ie為中斷使能寄存器(interrupt enable register),其位址為0a8h,其功能是啟用中斷功能,待後續關于中斷部分(第6章)再行說明。

圓 ip

ip為中斷優先等級寄存器(interrupt priority register),其位址為0b8h,其功能是設定中斷的優先等級,待後續關于中斷部分(第6章)再行說明。

t2con

t2con為timer2的定時器/計數器控制寄存器,其位址為0c8h,其功能是設定timer2的啟動、記錄定時/計數溢出,以及外部中斷的類型等,而timer2隻在8052/8032中才有。

rcap2l、rcap2h

rcap2l、rcap2h為捕捉寄存器(capture register),其位址為0cah、0cbh。當timer2在捕捉方式時,若t2ex(p1.1)引腳上的輸入信号由高電平跳變為低電平,tl2與th2的内容将被載入rcap2l與rcap2h裡,就像是把timer2的内容“捉進”rcap寄存器一樣。

tl2、th2

tl2、th2為第三組定時器/計數器(timer2)的計數器,其位址為0cch、0cdh,将th2與tl2組合即可進行16位的定時/計數。

psw

psw為cpu的程式狀态字組寄存器(program status word register),其位址為0d0h,其内容說明如下。

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

psw.7:本位為進位标志(cy),進行加法(減法)運算時,若最左邊位(msb,即bit 7)産生進位(借位)時,則本位将自動設定為1,即cy=1;否則cy=0。

psw.6:本位為輔助進位标志(ac),進行加法(減法)運算時,若bit 3産生進位(借位)時,則本位将自動設定為1,即ac=1;否則ac=0。

psw.5:本位為使用者标志(f0),可由使用者自行設定的位。

psw.4與psw.3:這兩個位為寄存器組選擇位(rs1、rs0),其功能如表1-4所示。

psw.2:本位為溢出标志(ov),當進行算術運算時,若發生溢出,則ov=1;否則 ov=0。

psw.1:本位為保留位,沒有提供服務。

psw.0:本位為校驗标志(p),8051采用偶校驗,若acc裡有奇數個1,則p=1;若acc裡有偶數個1,則p=0。

acc

acc累加器(accumulator)又稱為a寄存器,其位址為0e0h,這個寄存器提供cpu主要運作的位置,可說是最常用的寄存器。

b

b寄存器的位址為0f0h,主要功能是配合a寄存器進行乘法或除法運算,進行乘法運算時,乘數放在b寄存器,而運算結果的高8位放在b寄存器;進行除法運算時,除數放在b寄存器,而運算結果的餘數放在b寄存器。若不進行乘/除法運算,b寄存器也可當成一般寄存器使用。

auxr

auxr寄存器為89s51新增的輔助寄存器(auxiliary register),其位址為8eh,其内容說明如下。

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

wdidle:本位設定在待機方式(idle mode)下,是否啟用看門狗。若本位設定為1,則在idle方式下将啟用看門狗;若本位設定為0,則在idle方式下将停用看門狗。

disrto:本位設定是否輸出複位信号,若本位設定為1,則reset引腳(第9腳)隻有輸入功能;若本位設定為0,則在wdt計數完畢後,reset引腳輸出複位信号(即高電平脈沖)。

disale:本位設定是否啟用ale信号,若本位設定為1,則隻有在執行movx指令或movc指令時,ale引腳(第30腳)才會正常工作;若本位設定為0,則固定每6個脈沖就輸出1個高電平脈沖,稍後說明。

其他位為保留位。當然,這個寄存器隻有在89s51裡才有作用。

auxr1

auxr1寄存器為89s51新增的第2個輔助寄存器,其位址為0a2h,其内容說明如下:

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

dps:本位的功能是選擇資料指針寄存器。若本位設定為1,則使用dp1l及dp1h;若本位設定為0,則使用dp0l及dp0h。

其他位為保留位。同樣,這個寄存器隻有在89s51裡才有作用。

wdtrst

《例說51單片機(C語言版)(第3版)》——1-3 認識MCS-51的存儲器結構

繼續閱讀