版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第2章8051存儲(chǔ)器2.18051存儲(chǔ)器的基本結(jié)構(gòu)2.2尋址方式2.3數(shù)據(jù)傳送類指令2.4存儲(chǔ)器的擴(kuò)展2.5設(shè)計(jì)課目與演練——
秘密存放數(shù)據(jù):數(shù)據(jù)的搬移與變換小結(jié)
習(xí)題
本章通過大量的圖表來講解8051存儲(chǔ)器的結(jié)構(gòu)和類型,以及匯編語言如何訪問這些單元(尋址方式),利用數(shù)據(jù)傳送類的完整例子去查看指令如何操作、控制存儲(chǔ)單元,并結(jié)合上一章的程序框架結(jié)構(gòu),進(jìn)一步認(rèn)識(shí)程序的編寫方法。2.18051存儲(chǔ)器的基本結(jié)構(gòu)2.1.1位、字節(jié)、字、存儲(chǔ)單元及地址(編號(hào))位、字節(jié)、字、存儲(chǔ)單元及地址是在以后的學(xué)習(xí)和使用過程中出現(xiàn)頻度比較高的幾個(gè)量。位(bit)是單片機(jī)系統(tǒng)中最小的儲(chǔ)存單位。8位構(gòu)成一個(gè)字節(jié)(Byte),兩個(gè)字節(jié)構(gòu)成一個(gè)字(Word)。對(duì)于51、52系列,這個(gè)規(guī)則是適用的;對(duì)于16位機(jī),該定義則有所變化。上面的描述如圖2-1所示。我們對(duì)位的標(biāo)識(shí)和描述常常采用bit*(如bit0、bit1…)的形式,但描述數(shù)據(jù)的時(shí)候則常常采用d*(如d0、d1…)的形式,實(shí)際上是同一種事物的不同表達(dá)形式。圖2-1位、字節(jié)、字、存儲(chǔ)單元及地址的描述在8位機(jī)中,總線是8位的,存儲(chǔ)單元的接口常常也是8位的,所以Byte成為了51(52)單片機(jī)的基本訪問單元。為了能夠識(shí)別不同的字節(jié),單片機(jī)給每個(gè)字節(jié)都有一個(gè)編號(hào),如圖2-1所示,最開始的單元的編號(hào)為0000H,下一個(gè)單元的編號(hào)為0001H,依次類推。每一個(gè)字節(jié)的編號(hào)都是唯一的,這個(gè)唯一的編號(hào)稱為該字節(jié)的地址。單片機(jī)對(duì)某一個(gè)字節(jié)的訪問是靠地址實(shí)現(xiàn)的,一個(gè)地址對(duì)應(yīng)一個(gè)字節(jié),或者說,一個(gè)地址指向一個(gè)字節(jié)。在C程序中,根據(jù)這個(gè)意思定義了指向存儲(chǔ)單元的指針(實(shí)際上就是這里講的地址)和存放指針的指針變量。當(dāng)然,要深入理解這些定義,需先學(xué)好匯編語言,以后學(xué)習(xí)C程序的時(shí)候就可以得心應(yīng)手了。地址的編號(hào)范圍或者編碼范圍稱為地址空間,也就是單片機(jī)的尋址空間。16bit地址的尋址空間為64KB,即0000H~0FFFFH。本書中的表達(dá)習(xí)慣是:在字節(jié)中,最高位在左,最低位在右;在存儲(chǔ)單元中,低地址字節(jié)在下,高地址字節(jié)在上。2.1.28051存儲(chǔ)器的分配
51單片機(jī)的存儲(chǔ)器組織結(jié)構(gòu)采用的是哈佛(Harvard)結(jié)構(gòu),即將程序存儲(chǔ)器與數(shù)據(jù)存儲(chǔ)器分開,各自有獨(dú)立的尋址方式和控制系統(tǒng)。在物理結(jié)構(gòu)上,51單片機(jī)有4個(gè)獨(dú)立的存儲(chǔ)空間,它們分別是片內(nèi)程序存儲(chǔ)器、片外程序存儲(chǔ)器、片內(nèi)數(shù)據(jù)存儲(chǔ)器、片外數(shù)據(jù)存儲(chǔ)器,并且地址空間有部分重疊,如圖2-2所示。在讀寫邏輯上,51單片機(jī)具有3個(gè)邏輯空間,分別是:
(1)片內(nèi)、外統(tǒng)一編址的64KBROM/FLASH程序存儲(chǔ)器空間(0000H~FFFFH)。
(2)片內(nèi)256BRAM內(nèi)部數(shù)據(jù)存儲(chǔ)器空間(00H~FFH)。
(3)片外64KBRAM外部數(shù)據(jù)存儲(chǔ)器空間(0000H~FFFFH)。圖2-28051存儲(chǔ)器的分配2.1.3程序存儲(chǔ)器空間設(shè)計(jì)人員編寫的程序就存放在單片機(jī)的程序存儲(chǔ)器中,又稱為“只讀存儲(chǔ)器”(ReadonlyMemory,ROM)?,F(xiàn)在實(shí)際使用的大部分程序存儲(chǔ)器為FLASH存儲(chǔ)器,但在描述時(shí)習(xí)慣使用ROM。很多開發(fā)平臺(tái)具有仿真功能,如果不把程序?qū)懭氲匠绦虼鎯?chǔ)器,那么在單片機(jī)離開仿真環(huán)境后,程序便會(huì)失效。只有寫入程序存儲(chǔ)器的程序,才可以自動(dòng)被單片機(jī)實(shí)際運(yùn)行。
51系列單片機(jī)具有64KB程序存儲(chǔ)器的尋址空間,?這64KB的地址空間是統(tǒng)一編址的,沒有采用片內(nèi)、片外區(qū)分方式。區(qū)分片內(nèi)、片外是由引腳上的電平來指示的。
=1,即接高電平時(shí),CPU從片內(nèi)的程序存儲(chǔ)器中讀取程序,當(dāng)程序計(jì)數(shù)器PC值超過片內(nèi)ROM的容量時(shí),才會(huì)轉(zhuǎn)向外部的程序存儲(chǔ)器讀取程序。
=0,即接低電平時(shí),CPU從片外的程序存儲(chǔ)器中讀取程序,并輸出選通信號(hào)。此時(shí),無論CPU內(nèi)部是否有ROM,都不會(huì)被訪問。對(duì)于8031或8032等沒有內(nèi)部ROM的單片機(jī),一定要使用外部程序存儲(chǔ)器,所以其引腳必須接地。程序存儲(chǔ)器由16位的程序計(jì)數(shù)器指示當(dāng)前地址。片內(nèi)ROM的地址范圍為0000H~0FFFH。單片機(jī)啟動(dòng)復(fù)位后,程序計(jì)數(shù)器的內(nèi)容為0000H,系統(tǒng)將從0000H單元開始執(zhí)行程序。訪問時(shí)使用MOVC指令。程序存儲(chǔ)器的0003H~0032H,共48B存儲(chǔ)單元,被保留專門用于中斷處理程序,稱為中斷矢量區(qū),系統(tǒng)應(yīng)盡量避免使用這一區(qū)域。程序存儲(chǔ)器的結(jié)構(gòu)如圖2-3所示。
0000H~0002H:系統(tǒng)復(fù)位后,PC為0000H,單片機(jī)從0000H單元開始執(zhí)行程序。如果程序不從0000H單元開始執(zhí)行,則應(yīng)在這3個(gè)單元中存放一條無條件轉(zhuǎn)移指令,讓系統(tǒng)跳過這一區(qū)域,直接去執(zhí)行用戶指定的程序,如:LJMPMAIN。
0003H~0032H:這48個(gè)單元各有用途,被均勻地分為6段,每一段占用8個(gè)字節(jié)。其定義如表2-1所示。圖2-3程序存儲(chǔ)器的結(jié)構(gòu)表2-1程序存儲(chǔ)器中特殊定義的存儲(chǔ)空間以上地址單元是專門用于存放中斷處理程序的。這些地址單元不能用于存放程序的其他內(nèi)容,只能存放中斷向量。中斷響應(yīng)后,按中斷的類型自動(dòng)轉(zhuǎn)到各自的中斷服務(wù)區(qū)去執(zhí)行中斷服務(wù)程序。一般在中斷響應(yīng)的地址區(qū)存放一條無條件轉(zhuǎn)移指令,指向程序存儲(chǔ)器真正存放中斷服務(wù)程序的空間。這樣中斷響應(yīng)后,CPU讀到這條轉(zhuǎn)移指令,便轉(zhuǎn)向真正存放中斷服務(wù)程序的空間,繼續(xù)執(zhí)行中斷服務(wù)程序。2.1.4外部數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器也稱為“隨機(jī)讀寫存儲(chǔ)器”(RandomAccessMemory,RAM)。51系列單片機(jī)的數(shù)據(jù)存儲(chǔ)器在物理邏輯上分為兩個(gè)地址空間,即片內(nèi)數(shù)據(jù)存儲(chǔ)器和片外數(shù)據(jù)存儲(chǔ)器。
8051的外部數(shù)據(jù)存儲(chǔ)器的存取只能通過MOVX指令來執(zhí)行,當(dāng)系統(tǒng)擴(kuò)充的外部存儲(chǔ)器不大時(shí),可以使用下列指令:
MOVX A,@Ri
MOVX @Ri,A此時(shí)Ri寄存器中存放的是8位的外部存儲(chǔ)器的地址值,其訪問空間是256B。因此要擴(kuò)充空間的話,這個(gè)指令意義不大。當(dāng)系統(tǒng)擴(kuò)充的外部存儲(chǔ)器較大時(shí),可使用下列指令:
MOVX @DPTR,A
MOVX A,@DPTR這兩條指令都是通過16位的DPTR指針對(duì)外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取操作,DPTR中必須事先設(shè)置外部數(shù)據(jù)存儲(chǔ)器的地址值。因此,對(duì)外部數(shù)據(jù)存儲(chǔ)器讀寫的格式就成為:
MOV DPTR,#DATA16 ;設(shè)置外部數(shù)據(jù)存儲(chǔ)器的地址
MOVX A,@DPTR ;從外部數(shù)據(jù)存儲(chǔ)器DPTR對(duì)應(yīng)的 ;地址中讀取一個(gè)字節(jié)到A或者
MOV DPTR,#DATA16;設(shè)置外部數(shù)據(jù)存儲(chǔ)器的地址
MOVX @DPTR,A ;將A值寫入到外部數(shù)據(jù)存儲(chǔ)器DPTR對(duì)應(yīng)的存儲(chǔ)單元中去2.1.5內(nèi)部數(shù)據(jù)存儲(chǔ)器
8051的內(nèi)部RAM共有256B,通常這些單元按照其功能被劃分為兩部分:
低128B單元(單元地址:00H~7FH);
高128B單元(單元地址:80H~FFH)。
1.低128B單元這部分結(jié)構(gòu)如圖2-4(a)所示。它由工作寄存器區(qū)、位尋址區(qū)、用戶RAM區(qū)三部分組成,不同的地址區(qū)域內(nèi),功能和操作不完全相同。單片機(jī)內(nèi)部數(shù)據(jù)存儲(chǔ)器的特點(diǎn)之一是工作寄存器和數(shù)據(jù)存儲(chǔ)器是統(tǒng)一編址的。內(nèi)部RAM的00~1FH為工作寄存器區(qū),共分4個(gè)組,每組有8個(gè)工作寄存器R0~R7,共32個(gè)內(nèi)部RAM單元。在任一時(shí)刻,CPU只能使用其中一組寄存器,并且把正在使用的那組寄存器稱之為當(dāng)前寄存器組。當(dāng)前程序使用的工作寄存器組是由程序狀態(tài)字PSW中的RS1(PSW.4)和RS0(PSW.3)兩位來決定的,用戶可以通過指令改變PSW中的RS1和RS0來切換當(dāng)前工作寄存器組。這種功能給用戶程序保護(hù)寄存器內(nèi)容提供了極大的方便,在進(jìn)行程序設(shè)計(jì)時(shí)非常有用。PSW狀態(tài)寄存器的狀態(tài)和工作寄存器組的對(duì)應(yīng)關(guān)系如圖2-4(b)所示。CPU通過修改PSW中RS1和RS0兩位的狀態(tài),就能選擇一個(gè)工作寄存器組作為當(dāng)前工作寄存器組。這個(gè)特點(diǎn)使MCS-51具有快速保護(hù)現(xiàn)場的功能,對(duì)提高程序的效率和響應(yīng)中斷的速度是很有利的。若程序中并不需要4個(gè)工作寄存器組,那么剩下的工作寄存器組所對(duì)應(yīng)的單元也可作為一般的數(shù)據(jù)緩沖區(qū)使用。內(nèi)部RAM的20H~2FH單元為位尋址區(qū)。這16個(gè)單元的每一位都有一個(gè)8位的地址,位地址范圍為00H~7FH。位尋址區(qū)的每一位都可以當(dāng)作軟件觸發(fā)器,由程序直接進(jìn)行位處理。在進(jìn)行程序設(shè)計(jì)時(shí),通常把各種程序狀態(tài)標(biāo)志、位控制變量設(shè)在位尋址區(qū)內(nèi)。同樣,位尋址區(qū)的RAM單元也可以做一般的數(shù)據(jù)緩沖器使用。圖2-4內(nèi)部數(shù)據(jù)存儲(chǔ)器的分配及功能定義在用戶進(jìn)行實(shí)際的程序設(shè)計(jì)時(shí),往往需要一個(gè)后進(jìn)先出(LastInFirstOut,LIFO)的RAM區(qū),以保存CPU的現(xiàn)場。這種后進(jìn)先出的緩沖區(qū)稱為堆棧。SP是堆棧寄存器。MCS-51單片機(jī)的堆棧原則上可以設(shè)在內(nèi)部RAM的任意區(qū)域內(nèi),但一般設(shè)在30H~7FH的范圍內(nèi),棧頂?shù)奈恢糜蓷V羔楽P指出。低128B數(shù)據(jù)存儲(chǔ)器的操作是指令系統(tǒng)中最頻繁的操作。其特點(diǎn)是:片內(nèi)存儲(chǔ)器中任一單元都可以作為直接地址(Direct)或間接地址(@Ri,i=0,1)的形式參與尋址。低128B的間接尋址是通過工作寄存器R0、R1進(jìn)行的,標(biāo)記為:@Ri。
2.高128B單元我們常常把這一部分稱為特殊功能寄存器區(qū)(SpecialFunctionRegister,SFR)。這個(gè)時(shí)候,內(nèi)部數(shù)據(jù)存儲(chǔ)器專指低128B單元。特殊功能寄存器是用來對(duì)片內(nèi)各功能模塊進(jìn)行管理、控制、監(jiān)視的控制寄存器和狀態(tài)寄存器,是一個(gè)特殊功能的RAM區(qū)。MCS—51單片機(jī)片內(nèi)的I/O口鎖存器、定時(shí)器、串行口緩沖器以及各種控制寄存器和狀態(tài)寄存器都以特殊功能寄存器的形式出現(xiàn),它們位于片內(nèi)數(shù)據(jù)存儲(chǔ)器的高128B單元中,離散地分布在80H~FFH的地址空間范圍內(nèi)。特殊功能寄存器的總數(shù)為26個(gè),其中12個(gè)可以位尋址。用戶通過位功能標(biāo)記可以對(duì)這12個(gè)寄存器的任一有效位進(jìn)行操作。此外,還有5個(gè)是8052/8032所特有的,8051/8751/8031無定義。對(duì)于無定義的字節(jié)地址單元,用戶不能做寄存器使用。若訪問沒有定義的單元,則將得到一個(gè)不確定的隨機(jī)數(shù)。特殊功能寄存器的名稱、地址、符號(hào)標(biāo)記、可以位尋址的位地址及位功能標(biāo)記等如圖2-4(c)所示。
3.部分寄存器簡介
1)程序計(jì)數(shù)器(ProgramCounter,PC)
PC是一個(gè)16位的計(jì)數(shù)器。其內(nèi)容為將要執(zhí)行的指令地址,尋址范圍達(dá)64KB。PC有自動(dòng)加1的功能,以實(shí)現(xiàn)程序的順序執(zhí)行。PC在物理上是獨(dú)立的,不屬于SFR,沒有地址,因而是不可尋址的,用戶無法對(duì)它進(jìn)行讀寫。但可以通過轉(zhuǎn)移、調(diào)用、返回等指令來改變PC的內(nèi)容,以實(shí)現(xiàn)程序的轉(zhuǎn)移。
2)累加器(Accumulator,A或者Acc)累加器為8位寄存器,是最常用的專用寄存器,其功能較多,地位重要。它既可用于存放操作數(shù),也可用來存放運(yùn)算的中間結(jié)果。MCS—51單片機(jī)的大部分單操作數(shù)指令的操作數(shù)就取自累加器,許多雙操作數(shù)指令中的一個(gè)操作數(shù)也取自累加器。
3)?B寄存器
B寄存器是一個(gè)8位寄存器,主要用于乘、除運(yùn)算。乘法運(yùn)算時(shí),B是乘數(shù),乘法操作后,乘積的高8位存放于B中。除法運(yùn)算中,B是除數(shù),除法操作后,余數(shù)存放于B中。此外,B寄存器也可作為一般數(shù)據(jù)存儲(chǔ)器使用。
4)程序狀態(tài)字(ProgramStatusWord,PSW)程序狀態(tài)字是一個(gè)8位寄存器,用于寄存程序運(yùn)行的狀態(tài)信息。其中有些位的狀態(tài)是根據(jù)程序執(zhí)行結(jié)果,由硬件自動(dòng)設(shè)置的,而有些位的狀態(tài)由軟件設(shè)定。PSW的位狀態(tài)可以用專門的指令進(jìn)行測試,也可以用指令讀出。一些條件轉(zhuǎn)移指令將根據(jù)PSW有關(guān)位的狀態(tài),進(jìn)行程序轉(zhuǎn)移。PSW各位的定義如圖2-5所示。圖2-5PSW各位的定義
CY:進(jìn)位標(biāo)志位。如果指令運(yùn)算結(jié)果高位產(chǎn)生進(jìn)位或借位,則CY被置為“1”,否則為“0”。它在位處理指令中作位累加器用,所以又稱它為“布爾累加器”。
AC:輔助進(jìn)位標(biāo)志位。根據(jù)指令運(yùn)算結(jié)果的低4位(判斷D3)有無向高4位(判斷D4)進(jìn)位或借位,來進(jìn)行置位。如果有進(jìn)位或借位,則置AC為“1”,否則為“0”。AC也常稱為半字節(jié)進(jìn)位標(biāo)志位,常用于BCD碼調(diào)整。
F0:用戶標(biāo)志位。該標(biāo)志位不是在指令執(zhí)行過程中自動(dòng)形成的,而是由用戶根據(jù)需要通過傳送指令設(shè)置的。該標(biāo)志位可用于決定用戶程序的走向。
RS1和RS0:工作寄存器組選擇標(biāo)志位。該標(biāo)志位用于選擇當(dāng)前工作寄存器組。每個(gè)寄存器組由8個(gè)8位寄存器(R0~R7)組成,通過改變RS1和RS0,可以決定當(dāng)前寄存器的實(shí)際物理地址。該標(biāo)志位與寄存器組的選擇對(duì)應(yīng)關(guān)系如圖2-4(b)所示。
OV:溢出標(biāo)志位。當(dāng)運(yùn)算結(jié)果的絕對(duì)值超過允許的最大值時(shí),就會(huì)產(chǎn)生溢出。在程序執(zhí)行過程中,由硬件自動(dòng)對(duì)該標(biāo)志位設(shè)置。當(dāng)運(yùn)算結(jié)果的A7或者A6中有一位產(chǎn)生進(jìn)位或者借位時(shí),OV位自動(dòng)置“1”,否則置“0”。其邏輯表達(dá)式為:。
—:保留位,無定義,用戶不能使用。
P:奇偶校驗(yàn)標(biāo)志位。邏輯運(yùn)算后,若運(yùn)算結(jié)果中1的個(gè)數(shù)為奇數(shù),則P位自動(dòng)置“1”,否則置“0”。
5)堆棧指針(StackPointer,SP)堆棧是一種數(shù)據(jù)結(jié)構(gòu),是只允許在其一端進(jìn)行數(shù)據(jù)刪除操作的線性表。數(shù)據(jù)寫入堆棧稱為入棧。數(shù)據(jù)從堆棧中讀出稱為出棧。堆棧操作時(shí)采取“后進(jìn)先出”的操作規(guī)則,英文縮寫為LIFO(Lasst-In,F(xiàn)irstOut)。這里所說的進(jìn)與出就是數(shù)據(jù)的入棧與出棧,即先入棧的數(shù)據(jù)由于存放在棧的底部,因此后出棧;而后入棧的數(shù)據(jù)存放在棧的頂部,因此先出棧。
(1)堆棧的功能。堆棧是為子程序調(diào)用和中斷操作而設(shè)立的。其具體功能有兩個(gè):保護(hù)斷點(diǎn)和保護(hù)現(xiàn)場。在計(jì)算機(jī)中無論是執(zhí)行子程序或中斷操作,最終都要返回主程序。因此在計(jì)算機(jī)轉(zhuǎn)去執(zhí)行子程序或中斷服務(wù)之前,必須考慮其返回問題。為此,應(yīng)預(yù)先把主程序的斷點(diǎn)保護(hù)起來,為程序的返回做準(zhǔn)備。計(jì)算機(jī)在轉(zhuǎn)去執(zhí)行子程序或中斷服務(wù)程序后,很可能要使用單片機(jī)中的某些寄存單元,這樣就會(huì)破壞這些寄存單元的原有內(nèi)容。為了既能在子程序或中斷服務(wù)程序中使用這些寄存單元,又能保證在返回主程序之后恢復(fù)這些寄存單元的原有內(nèi)容,在轉(zhuǎn)去執(zhí)行中斷服務(wù)程序之前要將單片機(jī)中各有關(guān)寄存單元的內(nèi)容保存起來,這就是現(xiàn)場保護(hù)。斷點(diǎn)和現(xiàn)場內(nèi)容保存在哪兒呢?堆棧中??梢?,堆棧主要是為中斷服務(wù)操作和子程序調(diào)用而設(shè)立的。為了使計(jì)算機(jī)能進(jìn)行多級(jí)中斷嵌套及多重子程序嵌套,還要求堆棧具有足夠的容量(或者說堆棧深度)。該功能對(duì)于單片機(jī)和計(jì)算機(jī)都是一樣的。
(2)堆棧操作。堆棧共有兩種操作:入棧和出棧,如圖2-6所示。出棧是入棧的逆過程。數(shù)據(jù)入棧時(shí),SP自動(dòng)增1,將數(shù)據(jù)壓入SP所指向的堆棧單元;出棧時(shí),將SP所指向的堆棧單元內(nèi)的數(shù)據(jù)推出棧,然后SP自動(dòng)減1。棧底是指單片機(jī)初始化SP后,SP所指向的存儲(chǔ)單元;棧頂則是單片機(jī)進(jìn)行堆棧操作時(shí),SP所指向的存儲(chǔ)單元。SP總是指向棧頂,SP的值就是堆棧棧頂?shù)拇鎯?chǔ)單元地址。隨著出、入棧的操作,棧頂?shù)奈恢靡搽S之改變,所以SP是動(dòng)態(tài)變化的。當(dāng)棧頂和棧底重合時(shí),堆棧為空。單片機(jī)系統(tǒng)本身并不判斷棧頂?shù)奈恢茫砸沙绦蛟O(shè)計(jì)者編程判斷堆棧是否為空。初學(xué)者在進(jìn)行堆棧操作時(shí),可以采用入棧次數(shù)和出棧次數(shù)對(duì)等原則,這樣不用再編程判斷堆棧是否為空了。在系統(tǒng)復(fù)位后,棧指針SP的初始值為07H,即為棧底,這樣就與工作寄存器區(qū)域重疊,必須重新定義SP。由內(nèi)部存儲(chǔ)器結(jié)構(gòu)圖可知,最好把SP的值初始化為30H以后。SP的初始值一旦確定,堆棧的位置也就確定下來。由于SP可初始化為不同值,因此堆棧位置是浮動(dòng)的。圖2-6入棧過程演示
6)數(shù)據(jù)指針(DPTR)數(shù)據(jù)指針(DPTR)是一個(gè)16位寄存器,由8位寄存器DPH和DPL組合而成。其中,DPH為DPTR的高8位,DPL為DPTR的低8位。它既可作為16位數(shù)據(jù)指針用,也可以分開作為兩個(gè)8位寄存器(DPH、DPL)單獨(dú)使用。DPTR可以用來存放片內(nèi)ROM的地址,也可用來存放片外RAM和片外ROM的地址。
AT89S52設(shè)有2個(gè)DPTR,分別為DP0(DP0H、DP0L)和DP1(DP1H、DP1L),通過特殊功能寄存器AUXR1的DPS位對(duì)其進(jìn)行設(shè)置選擇。當(dāng)DPS?=?0時(shí),選擇DP0,否則選擇DP1。2.2尋址方式在指令系統(tǒng)中,操作數(shù)是一個(gè)重要的組成部分,它指出運(yùn)算或操作中的數(shù)據(jù)或數(shù)據(jù)所在單元的地址。一般來說,單片機(jī)CPU在規(guī)定的尋址空間快速獲得操作數(shù)的方式稱為尋址方式。尋址方式越豐富,程序設(shè)計(jì)越方便,在某些時(shí)候可以提高程序的執(zhí)行速度;但是也將導(dǎo)致指令系統(tǒng)越復(fù)雜,給程序的學(xué)習(xí)帶來不便。
51系列單片機(jī)的指令系統(tǒng)中提供了7種尋址方式,這是單片機(jī)匯編語言程序設(shè)計(jì)的基礎(chǔ)。下面分別介紹這幾種尋址方式。2.2.1立即尋址當(dāng)指令中的源操作數(shù)為常數(shù)時(shí),操作碼與操作數(shù)一起存放在程序存儲(chǔ)器中,即操作數(shù)存放的單元緊跟在操作碼存放的單元之后。在取指令時(shí),直接從程序存儲(chǔ)器中取得該操作數(shù)。這種尋址方式稱為立即尋址。通常把出現(xiàn)在指令中的操作數(shù)稱為立即數(shù),并用“#”符號(hào)予以標(biāo)記,以說明是立即進(jìn)行操作的數(shù),而非地址。例如:MOVA,#48H,表示將常數(shù)48H送入累加器A,執(zhí)行過程如圖2-7所示。從該圖可以看出,MOVA,#48H是一條雙字節(jié)指令,74H是操作碼,48H是操作數(shù),緊跟操作碼之后。圖2-7立即尋址方式(8位立即數(shù))另外,立即數(shù)可以是8位的,也可以是16位的。例如:MOVDPTR,#1234H,其中,“1234H”為16位立即數(shù),該指令將立即數(shù)的高8位12H送入DPH,將低8位34H送入DPL。該指令的操作碼是90H,操作數(shù)是1234H。其執(zhí)行過程如圖2-8所示。從該圖可以看出,這條指令是3字節(jié)指令。由于立即數(shù)存放在程序存儲(chǔ)器中,不占用數(shù)據(jù)存儲(chǔ)空間,因此只能作為源操作數(shù)。下面給出查看指令的機(jī)器碼和字節(jié)數(shù)等匯編代碼的方法。前面已經(jīng)說明我們要使用的環(huán)境是μV3,并且已經(jīng)做了介紹。要查看某條指令的機(jī)器代碼和編碼形式,可先編寫一個(gè)簡單的程序,包含你要查看的指令;編譯成功后,啟動(dòng)調(diào)試(,找到這個(gè)工具,點(diǎn)擊);然后在菜單“View”中找到“DisassemblyWindow”選項(xiàng),如圖2-9所示;這個(gè)時(shí)候就可以根據(jù)設(shè)定的地址找到相關(guān)的指令,如圖2-10所示。建議讀者采用這種方法來觀察和研究指令,這對(duì)深入學(xué)習(xí)匯編指令很有幫助。圖2-8立即尋址方式(16位立即數(shù))圖2-9設(shè)置反匯編窗口顯示圖2-10觀察指令代碼2.2.2直接尋址直接尋址方式就是在指令中直接給出操作數(shù)的地址。此時(shí),指令的操作數(shù)部分就是操作數(shù)所存放的地址。這里給出的操作數(shù)地址為8位二進(jìn)制地址。例如:MOVA,48H,操作過程如圖2-11所示。其中,“48H”表示直接地址。該指令的功能是把內(nèi)部RAM地址為48H中的內(nèi)容5DH傳送給累加器A。指令的操作碼是E5H。利用直接尋址方式可尋址的存儲(chǔ)空間為:
內(nèi)部RAM低128B,在指令中直接地址以單元地址的形式給出。
對(duì)于特殊功能寄存器,其直接地址還可以用特殊功能寄存器的符號(hào)名稱來表示。如對(duì)累加器A,在指令中可以使用其直接地址0E0H,也可使用其符號(hào)形式A。需特別強(qiáng)調(diào)的是,直接尋址方式是訪問特殊功能寄存器的唯一方法。圖2-11直接尋址方式示意2.2.3寄存器尋址寄存器尋址方式是由指令給出某一寄存器,將該寄存器的內(nèi)容作為操作數(shù)。寄存器尋址方式可用于訪問選定的當(dāng)前工作寄存器組R0~R7以及某些特殊功能寄存器,如A、B、DPTR等。值得注意的是,工作寄存器有四組共32個(gè)寄存器,在指令中只能使用當(dāng)前工作寄存器組中的寄存器。因此,使用前需通過對(duì)PSW寄存器RS1、RS0位的設(shè)置來選擇當(dāng)前工作寄存器組,默認(rèn)選擇為0組。例如:MOVA,R1,其執(zhí)行過程如圖2-12所示。該指令將寄存器R1中的內(nèi)容48H傳送到累加器A中。指令的操作碼和操作數(shù)放在同一個(gè)字節(jié)中,因而是單字節(jié)指令。寄存器在單片機(jī)內(nèi)部,因此采用寄存器尋址方式,程序執(zhí)行的速度比其它幾種尋址方式要快,使程序具有較高的處理速度。圖2-12寄存器尋址方式示意圖2.2.4寄存器間接尋址寄存器間接尋址方式是由指令給出某一個(gè)寄存器,該寄存器的內(nèi)容作為操作數(shù)的地址。在這種尋址方式中,存放在寄存器中的內(nèi)容不是操作數(shù),而是操作數(shù)所在的存儲(chǔ)單元的地址。寄存器間接尋址需要在寄存器的前面加上“@”,以區(qū)分寄存器尋址和寄存器間接尋址。例如:MOVA,@R1,其執(zhí)行過程如圖2-13所示。這條指令的功能是把R1寄存器中的內(nèi)容作為地址所指向的存儲(chǔ)單元的內(nèi)容傳送給A。該指令為單字節(jié)指令,操作碼為E7H。寄存器間接尋址方式可以訪問的存儲(chǔ)空間有如下幾種情況:
內(nèi)部RAM低128B單元,可以采用R0、R1作為間接尋址的寄存器。圖2-13寄存器間接尋址方式示意圖
內(nèi)部RAM高128B單元(8052/32才有),只能使用R0、R1作為間接尋址寄存器進(jìn)行間接尋址。
外部RAM。這里有兩種形式:一是采用R0、R1作為間接尋址的寄存器,可尋址256個(gè)單元;二是采用16位的DPTR作為間接尋址的寄存器,可尋址外部RAM的完整64KB地址空間。2.2.5基址加變址尋址這種尋址方式以基址寄存器(DPTR或PC)和變址寄存器A兩者之和作為地址,來讀取程序存儲(chǔ)器中某個(gè)常數(shù)字節(jié)。該指令的格式有以下兩種:
MOVCA,@A+PC該指令以PC作為基址寄存器,A的內(nèi)容作為無符號(hào)整數(shù)和PC的內(nèi)容(下一條指令的起始地址)相加得到一個(gè)16位的地址,將該地址指向的程序存儲(chǔ)器單元的內(nèi)容送到累加器A中。指令執(zhí)行過程如圖2-14所示。圖2-14基址加變址尋址方式(PC作基址)該指令為單字節(jié)指令,不需改變特殊功能寄存器及PC的狀態(tài),根據(jù)A的內(nèi)容就可以取出表格中的常數(shù)。但該指令所查詢內(nèi)容只能存放在其后面的256個(gè)單元之內(nèi),查詢的范圍受到限制,因而被查詢的內(nèi)容常常只能被一段程序所利用。
MOVCA,@A+DPTR該指令以DPTR作為基址寄存器,A的內(nèi)容作為無符號(hào)數(shù)和DPTR的內(nèi)容相加得到一個(gè)16位地址,將該地址指出的程序存儲(chǔ)器單元的內(nèi)容送到累加器A。執(zhí)行過程如圖2-15所示。該指令也是單字節(jié)指令?;芳幼冎穼ぶ贩绞綖椴楸聿僮魈峁┝藰O大的方便。該指令的執(zhí)行結(jié)果只和DPTR及累加器A的內(nèi)容有關(guān),與該指令存放的地址及常數(shù)表格存放的地址無關(guān),因此表格的大小和位置可以在64KB程序存儲(chǔ)器中任意安排,表格的內(nèi)容可以為各程序塊公用。圖2-15基址加變址尋址方式(DPTR作基址)2.2.6相對(duì)尋址相對(duì)尋址方式是將計(jì)數(shù)器PC中的當(dāng)前值與指令第二字節(jié)給出的數(shù)相加,結(jié)果作為轉(zhuǎn)移指令的轉(zhuǎn)移地址。轉(zhuǎn)移地址也稱為轉(zhuǎn)移目的地址;PC中的當(dāng)前值稱為基地址;指令第二字節(jié)給出的數(shù)稱為偏移量。由于目的地址是相對(duì)于PC中的基地址而言的,因而這種尋址方式稱為相對(duì)尋址。偏移量為帶符號(hào)的數(shù),所能表示的范圍為?-128~+127。這種尋址方式主要用于轉(zhuǎn)移指令。例如:SJMPD7H,其執(zhí)行過程如圖2-16所示。當(dāng)前指令地址為0097H,80H為操作碼,D7H為補(bǔ)碼表示的操作數(shù)(rel),當(dāng)前PC值為0099H(該指令為雙字節(jié)指令),因此得到的新的跳轉(zhuǎn)地址為0099H?+?0FFD7H?=?0070H?(16bit地址)圖2-16相對(duì)尋址方式2.2.7位尋址
51系列單片機(jī)內(nèi)部RAM中有兩個(gè)區(qū)域可以位尋址:
單片機(jī)RAM的20H~2FH單元,是可位尋址區(qū)域,共16×8=128位。
字節(jié)地址能被8整除的特殊功能寄存器的相應(yīng)位。51系列單片機(jī)有位處理功能,可對(duì)尋址的位進(jìn)行操作,由此產(chǎn)生了位尋址方式。這種尋址方式在指令的操作數(shù)位置上直接給出位地址,例如:
MOVC,2AH.3該指令的功能是把地址2AH中的第4位D3,即2AH.3的值傳送到位累加器CY中。其執(zhí)行過程如圖2-17所示。圖2-17位尋址方式示意圖在51系列單片機(jī)的指令系統(tǒng)中,位地址的表示可以采用以下幾種方式:
直接使用位地址。單片機(jī)內(nèi)部RAM的可位尋址區(qū)為20H~2FH,共16個(gè)單元,16×8=128位,其位地址為00H~7FH。例如,24H單元的0~7位的位地址為20H~27H。
用RAM地址加位序號(hào)表示,如2AH.3,表示2AH單元的D3位。
對(duì)于特殊功能寄存器,其中的可尋址位均有位名稱,可以用位名稱來表示該位,如可用RS0來表示PSW中的D3位(也可以用D0H.3表示)。
對(duì)特殊功能寄存器也可以直接采用符號(hào)加位序號(hào)表示。如PSW中的D3位,可以表示為PSW.3。以上介紹了MCS-51單片機(jī)指令系統(tǒng)的7種尋址方式,可用表2-2予以概括。表2-251系列單片機(jī)尋址方式概括2.3數(shù)據(jù)傳送類指令數(shù)據(jù)傳送是單片機(jī)工作時(shí)一種最主要的操作,數(shù)據(jù)傳送指令是編制程序中使用最頻繁的一類指令。除了可以通過累加器進(jìn)行數(shù)據(jù)傳送之外,還可以在數(shù)據(jù)存儲(chǔ)器之間或工作寄存器與數(shù)據(jù)存儲(chǔ)器之間直接進(jìn)行數(shù)據(jù)傳送。數(shù)據(jù)傳送類指令是最常用的一類指令,這類指令一般是把源操作數(shù)傳送到目的操作數(shù),指令執(zhí)行后,源操作數(shù)不變,目的操作數(shù)修改為源操作數(shù)。數(shù)據(jù)傳送類指令一般不影響標(biāo)志位(除非用POP或MOV指令將數(shù)據(jù)傳送到PSW)。數(shù)據(jù)傳送類指令主要有MOV、MOVC、MOVX、XCH、XCHD、SWAP、PUSH、POP,共8種。源操作數(shù)可以采用直接尋址、寄存器尋址、寄存器間接尋址、立即尋址、基址加變址尋址等5種尋址方式;目的操作數(shù)可以采用前3種尋址方式。表2-3列出了51系列單片機(jī)指令系統(tǒng)中全部31條數(shù)據(jù)傳送類指令。該指令的數(shù)據(jù)傳送路徑如圖2-18所示。仔細(xì)對(duì)比傳送路徑,然后對(duì)比表2-3中的指令,這對(duì)于理解、記憶指令尋址方式非常有益。需要注意以下事項(xiàng):
如果既不包括立即數(shù),也不包括直接尋址的地址,則該指令為單字節(jié)指令;
若指令中包含直接地址或8位立即數(shù),則該指令為雙字節(jié)指令;
如果包括兩個(gè)直接地址或8位立即數(shù),則該指令為3字節(jié)指令;
以DPTR為目的操作數(shù)的數(shù)據(jù)傳送指令,為3字節(jié)指令。圖2-18數(shù)據(jù)傳送類指令的數(shù)據(jù)傳送路徑表2-351單片機(jī)數(shù)據(jù)傳送類指令下面給出部分指令的例程。
分析下面這個(gè)程序段:
MOV48H,#59H ;把立即數(shù)59H送到48H存儲(chǔ)單元
MOVR0,#48H ;把立即數(shù)48H送到寄存器R0中
MOVA,@R0 ;把R0中的數(shù)48H作為地址,將該地址所 ;指向的存儲(chǔ)單元中的數(shù)59H送給A該程序段的執(zhí)行過程如圖2-19所示。當(dāng)然,這里是舉例子。如果只是為了達(dá)到上述目的,則可以根據(jù)需要完成的具體任務(wù)進(jìn)行指令的簡化,即:
要把48H地址單元中的數(shù)據(jù)送給A,采用:
MOVA,48H
要把59H這個(gè)數(shù)據(jù)送給A,采用:
MOVA,#59H
圖2-19內(nèi)部RAM傳送類指令示例1
分析下面這個(gè)程序段:
PUSH52H ;把52H單元中的數(shù)據(jù)壓入堆棧
PUSH53H ;把53H單元中的數(shù)據(jù)壓入堆棧
POP52H ;把堆棧中的數(shù)據(jù)彈出到52H單元中
POP53H ;把堆棧中的數(shù)據(jù)彈出到53H單元中該程序段的執(zhí)行過程如圖2-20所示。上述4條指令的執(zhí)行結(jié)果是把52H、53H兩個(gè)存儲(chǔ)單元的數(shù)據(jù)07H、18H互換。如果僅是為了這個(gè)功能,我們還可以對(duì)其進(jìn)行如下簡化:
借助于一個(gè)中間緩沖單元:
MOVR0,52H
MOV52H,53H
MOV53H,R0圖2-20內(nèi)部RAM傳送類指令示例2
借助于A,直接使用互換指令:
MOVA,52H ;把52H單元中的數(shù)據(jù)07H送到A
XCHA,53H ;把53H單元中的數(shù)據(jù)18H與A中的數(shù)據(jù)07H交換再次強(qiáng)調(diào),完成同樣的任務(wù)可以有不同的方法,而不同的方法會(huì)占用不同的字節(jié)數(shù)和不同的執(zhí)行時(shí)間。所以在程序編制過程中,需要注意指令的選擇:在高效和精確定時(shí)的程序中,要注意不同指令執(zhí)行需要的機(jī)器周期數(shù);在強(qiáng)調(diào)存儲(chǔ)空間的節(jié)約和查表程序設(shè)計(jì)時(shí),要從手冊(cè)中查找指令的字節(jié)數(shù)。2.4存儲(chǔ)器的擴(kuò)展存儲(chǔ)器的擴(kuò)展分為程序存儲(chǔ)器的擴(kuò)展和數(shù)據(jù)存儲(chǔ)器的擴(kuò)展。51系列單片機(jī)的程序?qū)ぶ房臻g為64KB,但市場上51系列單片機(jī)內(nèi)部自帶的程序存儲(chǔ)器空間大部分是8KBFlash,能夠滿足一般用戶的需要(有些自帶的程序存儲(chǔ)器空間為16KB、32KB和64KBFlash)?,F(xiàn)在程序存儲(chǔ)器的擴(kuò)展不是關(guān)鍵的問題,大部分用戶不用擴(kuò)展就已夠用。但是,對(duì)于數(shù)據(jù)存儲(chǔ)器卻依然是個(gè)關(guān)鍵問題,這一方面是因?yàn)閱纹瑱C(jī)內(nèi)部的數(shù)據(jù)存儲(chǔ)器空間太小,另一方面是因?yàn)橥獠吭O(shè)備和外部I/O空間的擴(kuò)展都是按照外部RAM的空間范圍來訪問的。這里為了保持存儲(chǔ)器擴(kuò)展的完整性,分成三個(gè)部分予以介紹:程序存儲(chǔ)器的擴(kuò)展、數(shù)據(jù)存儲(chǔ)器的擴(kuò)展和存儲(chǔ)器空間地址的分配。2.4.1外部程序存儲(chǔ)器的擴(kuò)展由圖2-2已經(jīng)知道,程序存儲(chǔ)器的空間可以擴(kuò)展到64KB,這時(shí)需要將單片機(jī)的引腳接高電平。在程序存儲(chǔ)器擴(kuò)展的情況下,程序可以首先從片內(nèi)的程序存儲(chǔ)器開始順序執(zhí)行,當(dāng)訪問超過內(nèi)部程序存儲(chǔ)器空間時(shí),單片機(jī)會(huì)自動(dòng)轉(zhuǎn)向外部程序存儲(chǔ)器執(zhí)行程序。訪問外部程序存儲(chǔ)器的時(shí)序如圖2-21所示。在CPU訪問外部程序存儲(chǔ)器時(shí),P0口作為地址/數(shù)據(jù)總線分時(shí)復(fù)用端口,先送出外部ROM低8位地址A0~A7,在ALE的下降沿將其鎖存到鎖存器得到PCL,P2口輸出的A8~A15不用鎖存,這樣形成的16位的PC指針便指向外部程序存儲(chǔ)器的相應(yīng)存儲(chǔ)單元,在有效后,指令就出現(xiàn)在數(shù)據(jù)總線上。在每個(gè)機(jī)器周期中,ALE信號(hào)兩次有效,每次都在其下降沿鎖存P0口的低8位地址;也兩次有效,用于將程序存儲(chǔ)器的內(nèi)容讀到數(shù)據(jù)總線上。由上面的分析得出兩點(diǎn)重要的信息:一是鎖存器的鎖存信號(hào)應(yīng)當(dāng)是ALE的下降沿;二是外部程序存儲(chǔ)器的地址線是鎖存器的低8位地址和P2口輸出的高8位地址的合成。下面以擴(kuò)展一片2764A(8KB的EPROM)為例,來看一下鎖存器的使用和其他信號(hào)線的連接,電路如圖2-22所示。鎖存器使用74LS373。ALE的每個(gè)下降沿把P0口輸出的8位地址鎖存到74LS373,形成低8位地址A0~A7,和P2口輸出的高5位地址(A8~A12)一起形成13位的地址,尋址2764A內(nèi)部的存儲(chǔ)單元。當(dāng)有效時(shí),數(shù)據(jù)出現(xiàn)在P0口上,從而進(jìn)入內(nèi)部數(shù)據(jù)總線。如果需要擴(kuò)展更大的程序存儲(chǔ)器,則連接相應(yīng)的P2口線即可,最大可擴(kuò)展到64KB空間。從后面介紹的數(shù)據(jù)存儲(chǔ)器擴(kuò)展中,讀者可以了解到更多的地址線連接方法和空間布局的關(guān)系。圖2-21外部程序存儲(chǔ)器訪問時(shí)序圖2-22擴(kuò)展一片2764A2.4.2外部數(shù)據(jù)存儲(chǔ)器的擴(kuò)展外部數(shù)據(jù)存儲(chǔ)器的訪問指令為單字節(jié)雙周期MOVX類指令。其操作時(shí)序如圖2-23所示。分析時(shí)序圖可知:在第一個(gè)機(jī)器周期,用來從程序存儲(chǔ)器讀指令,在S4P2后,將從指令中獲得的外部RAM的地址送出。在這個(gè)周期中,ALE信號(hào)有效兩次:第一次鎖存外部程序存儲(chǔ)器的低8位地址,該地址來源于PCL(如果訪問的是內(nèi)部程序存儲(chǔ)器,則這個(gè)信號(hào)仍然出現(xiàn)),與P2口送出的PCH一起構(gòu)成16位地址;第二次鎖存外部數(shù)據(jù)存儲(chǔ)器的低8位地址,該地址來源于Ri(操作數(shù)為@Ri)或DPL(操作數(shù)為@DPTR),與P2輸出的高8位一起形成16位地址。在第二個(gè)機(jī)器周期,ALE的第一個(gè)有效信號(hào)不再出現(xiàn),而讀信號(hào)有效,從而把外部RAM中的數(shù)據(jù)送到P0口,進(jìn)入到單片機(jī)內(nèi)部數(shù)據(jù)總線。如果是寫信號(hào)有效,則把P0口送出的數(shù)據(jù)寫入外部RAM。該周期的第二個(gè)ALE仍然有效,沒有操作進(jìn)行。可以看出,信號(hào)只對(duì)訪問程序存儲(chǔ)器有用,而在訪問外部數(shù)據(jù)存儲(chǔ)器時(shí)不起作用。由此可以得到擴(kuò)展外部數(shù)據(jù)存儲(chǔ)器的幾個(gè)信息:一是數(shù)據(jù)存儲(chǔ)器擴(kuò)展中仍然要把地址的低8位進(jìn)行鎖存,其鎖存原理與上面程序存儲(chǔ)器擴(kuò)展的一樣;二是數(shù)據(jù)存儲(chǔ)器擴(kuò)展中控制信號(hào)只使用、,而沒有使用,所以數(shù)據(jù)存儲(chǔ)器與程序存儲(chǔ)器地址可以完全重疊,都是64KB的訪問空間,而不會(huì)產(chǎn)生沖突(但是數(shù)據(jù)存儲(chǔ)器與I/O口及外圍設(shè)備是統(tǒng)一編址的,即任何擴(kuò)展的I/O口以及外圍設(shè)備均占用數(shù)據(jù)存儲(chǔ)器地址)。圖2-24所示為擴(kuò)展一片6116靜態(tài)RAM的電路圖。圖2-23外部數(shù)據(jù)存儲(chǔ)器訪問時(shí)序圖2-24擴(kuò)展一片6116靜態(tài)RAM的電路圖
6116是2KB?×?8位的靜態(tài)RAM。A0~A10為地址線,I/O0~I(xiàn)/O7為雙向數(shù)據(jù)線;是寫允許;是讀允許;是片選信號(hào)。它們之間的邏輯關(guān)系如表2-4所示。
P2.7連接6116的片選端,如要選中該芯片進(jìn)行操作,則P2.7要置0;不訪問該芯片時(shí),P2.7要置1。因此,該芯片的地址空間為0****00000000000B~0****11111111111B。2.4.3節(jié)會(huì)作進(jìn)一步解釋。分析下面的程序段:
MOVDPTR,#7132H ;給DPTR賦值7132H
MOVXA,#DPTR ;讀外部數(shù)據(jù)存儲(chǔ)器0132H單元的內(nèi)容到A
SWAPA ;把累加器A半字節(jié)交換
MOVX@DPTR,A ;再把A中的數(shù)據(jù)送到外部數(shù)據(jù)存儲(chǔ)器;0132H單元中整體完成的功能就是把 ;外部數(shù)據(jù)存儲(chǔ)器0132H單元的內(nèi)容進(jìn)行;了半字節(jié)交換表2-46116控制信號(hào)間的邏輯關(guān)系2.4.3存儲(chǔ)器空間地址的分配在單片機(jī)的實(shí)際應(yīng)用中,往往既要擴(kuò)展程序存儲(chǔ)器,又要擴(kuò)展數(shù)據(jù)存儲(chǔ)器,還要擴(kuò)展I/O設(shè)備,或者是它們的某種組合。所有的外圍芯片或設(shè)備都可以通過總線與單片機(jī)相連,但是它們不能同時(shí)有效。在MCU的控制下,在同一個(gè)時(shí)刻,只能有一個(gè)設(shè)備的數(shù)據(jù)出現(xiàn)在總線上,這樣才可以避免沖突。所以,單片機(jī)要在多個(gè)芯片或設(shè)備之間進(jìn)行切換。這樣就需要進(jìn)行兩種選擇:選擇哪個(gè)芯片或者設(shè)備進(jìn)行工作,稱之為片選;選擇該芯片或者設(shè)備的哪個(gè)單元進(jìn)行訪問,稱之為字選。片選和字選都會(huì)對(duì)該設(shè)備的訪問入口地址和空間造成影響。存儲(chǔ)器的擴(kuò)展方式如圖2-25所示。下面詳細(xì)分析這些影響。
(1)擴(kuò)展4片6116,?前兩片對(duì)應(yīng)的片選控制線為P2.3、P2.4。?當(dāng)P2.3為0時(shí),選中6116(1)進(jìn)行訪問(讀或?qū)?;當(dāng)P2.4為0時(shí),選中6116(2)進(jìn)行訪問??梢钥闯?,每一根地址線單獨(dú)控制一個(gè)芯片的選擇。這種選擇芯片(片選)的方法稱為線選法。地址線A10~A0用于字選,尋址對(duì)應(yīng)6116內(nèi)部的2KB的存儲(chǔ)空間。6116(3)、6116(4)的片選線來源于74LS138譯碼后的、。另外,單片機(jī)外部擴(kuò)展設(shè)備8279、8255A的片選信號(hào)也來源于74LS138。這4個(gè)設(shè)備的片選信號(hào)是P2.5、P2.6兩位經(jīng)過74LS138譯碼后產(chǎn)生的,這種片選方式稱為譯碼法。片選、字選和設(shè)備的對(duì)應(yīng)關(guān)系如表2-5所示。圖2-25存儲(chǔ)器的擴(kuò)展方式表2-5片選、字選和設(shè)備的對(duì)應(yīng)關(guān)系
可以看出,單片機(jī)發(fā)出的16位地址里面既包含了片選信號(hào),也包含了字選信號(hào)。在任一時(shí)刻,只有一個(gè)設(shè)備的片選信號(hào)有效,否則會(huì)導(dǎo)致沖突,發(fā)生錯(cuò)誤。比如,當(dāng)A12為0時(shí),選中6116(2),占用數(shù)據(jù)總線進(jìn)行訪問。但是如果A15、A14、A13同時(shí)為011,也就是同時(shí)選中了芯片8255A,這個(gè)時(shí)候總線(D7~D0)既與8255A連通,也與6116(2)連通,發(fā)生了沖突。這種情況必須避免發(fā)生。
“*”可以為0,也可以為1,一般推薦使用1。
(2)線選法的優(yōu)點(diǎn)是硬件電路結(jié)構(gòu)簡單,但一線只能控制一個(gè)設(shè)備,會(huì)造成資源浪費(fèi);而且,由于片選使用的地址線都是高位地址線(為什么?自己研究一下),權(quán)重較大,地址空間會(huì)有跳躍。系統(tǒng)中擴(kuò)展的存儲(chǔ)器或者外圍設(shè)備較少使用這種方法。譯碼法的優(yōu)點(diǎn)是地址線的利用率較高,對(duì)應(yīng)的各個(gè)設(shè)備的地址空間是連續(xù)的,因此把這種方法稱為全地址譯碼法(但這種方法會(huì)增加硬件開銷)。系統(tǒng)中需要擴(kuò)展的設(shè)備較多時(shí),常選用這種方法。地址空間的連續(xù)與跳躍的分析如圖2-26所示。P2.3片選6116(1),2KB的空間,P2.4片選6116(2),也是2KB的空間,上面的這兩個(gè)2KB是連續(xù)分布的。但是,如果使用的片選線繼續(xù)向上端靠近,則開始出現(xiàn)跳躍。如使用P2.4片選6116(1),P2.5片選6116(2),這個(gè)時(shí)候兩個(gè)芯片的控制地址之間出現(xiàn)2KB的地址空間的跳躍。另外,如表2-5所示,里面的“*”可以為0,也可以為1,所以在這個(gè)段上,地址就出現(xiàn)了重疊,也就是說,同一個(gè)存儲(chǔ)單元或設(shè)備可以有不同的地址對(duì)應(yīng)。單片機(jī)編程者一定要注意空間的這個(gè)特點(diǎn)。圖2-26地址空間的連續(xù)與跳躍
(3)并不是每一種擴(kuò)展設(shè)備都會(huì)完全利用它所擁有的空間資源。?如8255A的空間地址范圍為7800H~7FFFH,但是事實(shí)上8255A只有4個(gè)寄存器需要尋址,其他不用的地址線置1。這樣尋址空間中只有7FFCH、7FFDH、7FFEH、7FFFH4個(gè)地址有用,分別對(duì)應(yīng)四個(gè)寄存器中的一個(gè)(同樣存在地址重疊的問題,請(qǐng)讀者進(jìn)一步分析)。2.5設(shè)計(jì)課目與演練——秘密存放數(shù)據(jù):數(shù)據(jù)的搬移與變換
ORG 0000H ;起始地址偽指令
LJMPSTART ;跳轉(zhuǎn)到程序代碼區(qū)
TABLE:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年研發(fā)成果購買合同模板
- 2024年大數(shù)據(jù)處理知識(shí)產(chǎn)權(quán)及保密合作協(xié)議3篇
- 2024年中國夜光手表針市場調(diào)查研究報(bào)告
- 2024年中國塑料紗管斗市場調(diào)查研究報(bào)告
- 2025年度企業(yè)健康體檢顧問聘用協(xié)議3篇
- 2024年電子產(chǎn)品銷售業(yè)績達(dá)成及售后服務(wù)合同范本3篇
- 有限元方法課程設(shè)計(jì)
- 大氣課程設(shè)計(jì)吸收
- 2025版體育賽事活動(dòng)球隊(duì)贊助合作協(xié)議3篇
- 2025至2030年中國銀色行業(yè)投資前景及策略咨詢研究報(bào)告
- 中南地區(qū)工程建設(shè)標(biāo)準(zhǔn)設(shè)計(jì)建筑圖集 13ZJ301 建筑無障礙設(shè)施
- 鹵味熟食策劃方案
- 餐廳飯店顧客意見反饋表格模板(可修改)
- 頌缽培訓(xùn)課件
- 石油形成過程科普知識(shí)講座
- 輔警心理健康知識(shí)講座
- 《棗樹常見病蟲害》課件
- 刑法試題庫大全
- 燃?xì)獍惭b人員管理制度
- 省份簡稱課件
- 公民科學(xué)素質(zhì)調(diào)查問卷
評(píng)論
0/150
提交評(píng)論