【正文】
存儲器用的是 SRAM程序存儲器用的是 ROM。 由于上述特點,所以在單片機中一般做為程序存儲器。單片機存儲器結(jié)構(gòu)中都采用半導(dǎo)體存儲器。 DRAM:動態(tài)存儲器,即使在加電期間數(shù)據(jù)也會丟失(數(shù)據(jù)要刷新)。 ( 3)內(nèi)部程序存儲器( 4K FlashROM AT89S51)。 1. 內(nèi)部數(shù)據(jù)存儲器的結(jié)構(gòu) 內(nèi)部數(shù)據(jù)儲存器它由工作寄存器區(qū)、位尋址區(qū)、用戶區(qū)三個部分組成,地址范圍 00H~7FH,共128個單元。 如: MOV A , 30H ;就是將 30H中的數(shù)送給 A。 如: MOV A, Ri ; 指令中的“ Ri”就是指工作寄存器 R0和 R1。 ★ 這 32個單元可以使用“直接尋址” 方式,也可使用“寄存器尋址”方式來進行訪問。 注:★ 字節(jié)地址: 20H~2FH,位地址: 00H~7FH。除了寄存器尋址的方式, R0和 R1也可采用寄存器間接尋址 Ri的方式,在使用中 R0和 R1必須先滿足間接尋址方式,有多余的可用于寄存器尋址方式。 51子系列共有 18個特殊功能寄存器,占用 21個單元,其余107個單元用戶不好使用( AT89C51)。 D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0AC C E 0 HA C C . 7 A C C . 6 A C C . 5 A C C . 4 A C C . 3 A C C . 2 A C C . 1 A C C . 0E 7 H E 6 H E 5 H E 4 H E 3 H E 2 H E 1 H E 0 H 在指令系統(tǒng)中,可直接使用寄存器名 ACC( A)和字節(jié)地址 E0H對這八個二進制位進行操作,前者稱之為寄存器尋址,后者稱之為直接尋址( direct),用戶一般使用寄存器尋址,即寄存器尋址,在特殊條件下才會使用直接尋址。其結(jié)構(gòu)和定義如圖 310所示。 F0:用戶位,用戶可以作為一般的一位二進制數(shù)的存儲器使 用。 D 7 D 6 D 5 D 4D 3 D 2 D 1 D 0D P H8 3 HD 7 D 6 D 5 D 4D 3 D 2 D 1 D 0D P L8 2 HD 1 5 D 1 4 D 1 3 D 1 2D 1 1 D 1 0 D 9 D 88 3 HD 7 D 6 D 5 D 4D 3 D 2 D 1 D 08 2 HD P T R 在指令中一般都是以一個 16位的寄存器 DPTR使用 ,用于存放外部數(shù)據(jù)存儲器的地址和程序程序器的地址,訪問外部數(shù)據(jù)存儲器是用 DPTR,稱之為 寄存器間接尋址 ;訪問程序存儲器是用 A+DPTR,稱之 為變址尋址 。一般為了書寫方便,堆棧的示意圖,如圖 314所示。 PUSH 40H PUSH 41H POP 40H POP 41H 解:根據(jù)初始條件,得示意圖,存儲器中沒有提到單元的數(shù)據(jù)為任意值。但原來進棧的數(shù)還存于堆棧中,直到下次進棧的數(shù)據(jù)將其覆蓋。 ★ 這 18個 SFR, 21個單元中,字節(jié)地址能被 8整除的單 元是可以進行位尋址的,也就是說字節(jié)地址的后面 一位是 0或者 8,都是可以進行位尋址的( bit)。 ● 高 60K(1000H~FFFFH) 的地址區(qū)為片外 ROM所專用。 注:★ 不管是程序還是數(shù)表,在程序存儲器中都是二進制 數(shù),程序只能由 CPU直接訪問并執(zhí)行,數(shù)表只能由 上述的兩條指令來讀取,在編程時要注意避免將數(shù)表 當(dāng)程序來執(zhí)行。又由于 PC復(fù)位后指向 0000H單元,故主程序的第一條指令必須放在 0000H開始的單元, 0000H也就是主程序的入口地址。 AT89S51單片機內(nèi)部有 4K的程序存儲器FlashROM,外部最多可擴展 64K的程序存儲器,內(nèi)外程序存儲器采用統(tǒng)一編址的方法,即共用 64K的地址,地址范圍0000H~FFFFH,不管是內(nèi)部還是外部都是用指令 MOVC來訪問。若根據(jù)某個程序設(shè)計的需要,需要 16個單元堆棧來存儲數(shù)據(jù),堆棧開辟在40H到 4FH單元,則堆棧指示器 SP的初始值應(yīng)付 3FH,第一個入棧的數(shù)放入 40H中,在程序的設(shè)計中, 40H~41H中不能用于其它的數(shù)據(jù)的存放,否則數(shù)據(jù)被覆蓋。進棧后,示意圖如圖 316( b)所示。二是軟件操作,由指令PUSH direct(進棧)和指令 POP direct(出棧)來實現(xiàn)。存儲單元的個數(shù)稱為堆棧的深度,可理解為倉庫容量。 ★ RS RS0是工作寄存器組的選擇位,由用戶根據(jù)需 要通過指令來設(shè)定,去選擇寄存器組(軟件設(shè)定)。 AC:輔助進(借)位標(biāo)志位,低四位向高四位的進(借) 位,有進(借)( AC) =1,否則( AC) =0,主要用 于加減運算中。 在乘除指令中,直接使用寄存器名 B,稱之為 寄存器尋址 。許多指令的操作數(shù)取自 ACC,許多運算的結(jié)果存放在 ACC 中。 2. 外部數(shù)據(jù)存儲器 當(dāng)內(nèi)部數(shù)據(jù)存儲器不夠用時,在單片機的外總線上可以最大擴展 64K的 RAM,可獨立尋址,有專用指令系統(tǒng)( MOVX傳送指令),不能用于數(shù)據(jù)的運算及處理,所以僅有 4條指令,兩條讀,兩條寫,用于一般數(shù)據(jù)的存放,地址為 0000H- FFFFH。 80C51對用戶 RAM區(qū)中每個 RAM單元只能按字節(jié)存取的(不可位尋址)。 圖 36,位地址表。如圖 35所示, R0所指的操作數(shù)就是10101010B( AAH)。 指令系統(tǒng)中出現(xiàn)的“ Rn” ,在實際編程的過程中不能出現(xiàn),必須寫對應(yīng)的寄存器“ R0~R7” 。 工作寄存器組 地址 寄存器名 RS1 RS0 0組 00H~07H R0~R7 0 0 1組 08H~0FH R0~R7 0 1 2組 10H~17H R0~R7 1 0 3組 18H~1FH R0~R7 1 1 在指令系統(tǒng)中對于這些空間的訪問有以下方法: ● 直接使用地址,在指令系統(tǒng)中用“ direct” 表示,這種方式稱之為直接尋址。 ( 3)外部數(shù)據(jù)存儲器 RAM( 64K),獨立的一