存儲器是許多存儲單元的集合,存儲器單元實際上是時序邏輯電路(鎖存器)的一種,按單元號順序排列。每個單元由若干二進制位構成,以表示存儲單元中存放的數值,這種結構和數組的結構非常相似。按存儲器的使用類型可分為只讀存儲器(ROM)和隨機存取存儲器(RAM)。
1.1 存儲單位
位(bit):它是計算機中最小的數據單位。由于計算機采用二進制數,所以1位二進制數稱作1bit,例如101011為6bit。
字節(Byte,單位簡寫為B):8位二進制數稱為一個字節,1B=8bit。
字(Word):兩個字節構成一個字,即2Byte=1Word。
在單片機中還有一個常用術語:字長。所謂字長是指單片機一次能處理的二進制數的位數。51單片機一次能處理8位二進制數,所以51單片機的字長為8位。
1.2 存儲器編址
如下圖所示是一個容量為256字節的存儲器,內部有256個存儲單元,每個存儲單元可以存放8位二進制數,為了存取數據方便,需要對每個存儲單元進行編號,也即對存儲單元編址,編址采用二進制數,對256個存儲單元全部編址至少要用到8位二進制數,第1個存儲單元編址為00000000,編寫程序時為了方便,一般用十六進制數表示,二進制數00000000用十六進制表示就是00H,H表示十六制數,第二個存儲單元編址為01H,第256個存儲單元編址為FFH(也可以寫成0FFH)。
圖1 存儲器結構
1.3存儲器數據讀寫說明
要對256字節存儲器的每個存儲單元進行讀寫,需要8根地址線和8根數據線,先送8位地址選中某個存儲單元,再根據讀控制或寫控制,將選中的存儲單元的8位數據從8根數據線送出,或通過8根數據線將8位數據存入選中的存儲單元中。以圖1 存儲器結構為例,當地址總線A7~A0將8位地址00011111(1FH)送入存儲器時,會選中內部編址為1FH的存儲單元,這時再從讀控制線送入一個讀控制信號,1FH 存儲單元中的數據00010111從8根數據總線D7~D0送出。
1.4 存儲器的地址空間說明
MCS-51單片機采用哈佛結構,即程序空間(ROM)和數據空間(RAM)分開編址,它們有各自的地址空間,互不重疊,因此ROM和RAM可以有相同的地址編碼。為區分同一地址的變量是來自ROM還是RAM,要求編程時定義的任何變量都必須以一定的存儲器類型的方式定位在MCS-51單片機的某一存儲區中。使用C51編程時,只需用關鍵字就可定義變量的存儲器類型。C51變量的存儲器類型見下表所示。
從物理地址空間看,MCS-51單片機的存儲器有4個地址空間,分別是4KB的片內ROM、64KB的片外ROM、256B的片內RAM、64KB的片外RAM。
ROM(程序存儲器)存放程序、表格和始終要保留的常數,相當于計算機系統的硬盤;
2.1 片內外ROM(程序存儲器)
8051單片機內部有4KB的程序存儲器,如果內部程序存儲器不夠用(或無內部程序存儲器),可以外接程序存儲器。8051單片機最大可以外接容量為64KB的程序存儲器(ROM),它與片內4KB程序存儲器統一編址。?
當單片機的
端接高電平(接電源正極)時,片內、片外程序存儲器都可以使用,片內4KB 程序存儲器的編址為0000H~0FFFH,片外64KB 程序存儲器的編址為1000H~FFFFH,片外程序存儲器低4KB存儲空間無法使用。
如下圖所示:
當單片機的
端接低電平(接地)時,只能使用片外程序存儲器,其編址為0000H~FFFFH,片內4KB程序存儲器無法使用。
如下圖所示:?
2.2 片內外ROM(程序存儲器)說明
(1)無論是使用片內ROM還是使用片外ROM,程序的起始地址都是從ROM的0000H單元開始的。
(2)盡管單片機可以同時具備內、外ROM,但是在一般情況下,都需要通過
EA的設定來選擇其一。
(3)如果EA=1,當程序超過片內ROM容量(4KB:0000H~0FFFH)時,單片機就會自動轉向片外ROM,并且從1000H單元開始執行程序(無法使用片外ROM的低4KB空間)。目前,一般單片機的片內ROM容量都夠,因此,很少或沒必要擴展片外ROM。
ROM空間一般可以根據用戶需要任意安排使用,但ROM中的某些地址被中斷程序的入口地址占用。
具體如下表所示:
RAM(數據存儲器)存放數據(常量或變量)或運算的結果,相當于計算機的內存;
3.1 片內外RAM(數據存儲器)
8051單片機內部有256字節的數據存儲器,如果內部數據存儲器不夠用,可以外接數據存儲器。8051單片機最大可以外接容量為64KB的數據存儲器(RAM),它與片內256字節數據存儲器分開編址。
如下圖所示:? ??
當8051單片機連接片外RAM時,片內RAM的00H~FFH存儲單元地址與片外RAM的0000H~00FFH存儲單元地址相同,為了區分兩者,在用匯編語言編程時,讀寫片外RAM時要用“MOVX”指令(讀寫片內RAM時要用“MOV”指令),在用C語言編程時,讀寫RAM時須先聲明數據類型(內部數據或外部數據),若讀寫的數據存放在片內RAM中,要聲明數據類型為內部數據類型(如用“data”聲明),若讀寫的數據存放在片外RAM中,應聲明數據類型為外部數據類型(如用“xdata”聲明),單片機會根據聲明的數據類型自動選擇讀寫片內或片外RAM。
3.2? RAM(數據存儲器)的分區?
8051單片機內部有128字節的數據存儲器(地址為00H~7FH)和128字節的特殊功能寄存器區(地址為80H~FFH),如下圖所示。根據功能不同,8051單片機的數據存儲器可分為工作寄存器區(0~3組)(32 Bytes)、位尋址區(16 Bytes)、用戶RAM區(80 Bytes)、特殊功能寄存器區(128 bytes)。?
3.2.1 工作寄存器區
單片機在工作時需要處理很多數據,有些數據要用來運算,有些要反復調用,有些要用來比較校驗等,在處理這些數據時需要有地方能暫時存放這些數據,單片機提供暫存數據的地方就是工作寄存器。8051單片機的工作寄存器區總存儲空間為32字節,由0~3組工作寄存器組成,每組有8個工作寄存器(R0~R7),共32個工作寄存器(存儲單元),地址編號為00H~1FH,每個工作寄存器可存儲一個字節數據(8位),四組工作寄存器的各個寄存器地址編號如下:
單片機上電復位后,默認使用第0組工作寄存器,可以通過編程設置PSW(程序狀態字寄存器)的RS1、RS0位的值來換成其他組工作寄存器。當PSW的RS1位=0、RS0位=0時,使用第0組工作寄存器,RS1位=0、RS0位=1時使用第1組工作寄存器,RS1位=1、RS0位=0時使用第2組工作寄存器,RS1位=1、RS0位=1時使用第3組工作寄存器,如下圖所示。不使用的工作寄存器可當作一般的數據存儲器使用。
3.2.2 位尋址區
位尋址區位于工作寄存器區之后,總存儲空間為16字節,有16個字節存儲單元,字節地址為20H~2FH,每個字節存儲單元有8個存儲位,一共有16×8=128個存儲位,每個位都有地址,稱為位地址,利用位地址可以直接對位進行讀寫。位尋址區的16個字節單元與128個位的地址編號如下圖所示,從圖中可以看出,字節單元和存儲位有部分相同的地址編號,單片機是以指令類型來區分訪問地址為字節單元還是位單元,比如用字節指令訪問地址20H時,訪問的為20H字節單元,可以同時操作該字節單元的8位數,用位指令訪問地址20H時,訪問的為24H字節單元的D0位,只能操作該位的數據。
3.2.3 用戶RAM區
用戶RAM區又稱為數據緩存區,8051單片機的用戶RAM區有80個存儲單元(字節),地址編號為30H~7FH,用戶RAM區一般用來存儲隨機數據和運算中間結果等。
3.2.4 特殊功能寄存區
特殊功能寄存器簡稱SFR(Special Function Register),主要用于管理單片機內部各功能部件(如定時器/計數器、I/O 端口、中斷控制器和串行通信口等),通過編程設定一些特殊功能寄存器的值,可以讓相對應的功能部件進入設定的工作狀態。
1.特殊功能寄存器的符號、字節地址、位地址和復位值
8051單片機有21個特殊功能寄存器(SFR),見下表1,每個特殊功能寄存器都是一個字節單元(有8位),它們的地址離散分布在80H~FFH 范圍內,51單片機規定特殊寄存器只能用直接尋址(直接寫出 SFR 的地址或符號)方式訪問。
21個特殊功能寄存器都能以字節為單位進行訪問,其中有一些特殊功能寄存器還可以進行位訪問,能訪問的位都有符號和位地址,位地址為特殊功能寄存器的字節地址加位號。以特殊功能寄存器P0為例,其字節地址為80H(字節地址值可以被8整除),其P0.0~P0.7位的位地址為80H~87H,訪問字節地址80H時可讀寫8位(P0.0~P0.7位),訪問位地址82H時僅可讀寫P0.2位。
有位地址的特殊寄存器既可以用字節地址訪問整個寄存器(8位),也可以用位地址(或位符號)訪問寄存器的某個位,無位地址的特殊寄存器只能用字節地址訪問整個寄存器。當位地址和字節地址相同時,單片機會根據指令類型來確定該地址的類型。單片機上電復位后,各特殊功能寄存器都有個復位初始值,具體見表1,x表示數值不定(或1或0)。
表1?8051單片機的21個特殊功能寄存器(SFR)
2.部分特殊功能寄存器介紹
單片機的特殊功能寄存器很多,可以分為特定功能型和通用型。對于特定功能型特殊功能寄存器,當往某些位寫入不同的值,可以將其控制的功能部件設為不同工作方式,讀取某些位的值,可以了解相應功能部件的工作狀態;通用型特殊功能寄存器主要用于運算、尋址和反映運算結果狀態。
下面介紹一些通用型特殊功能寄存器。
(1)累加器(ACC)
累加器又稱ACC,簡稱A,是一個8位寄存器,其字節地址為E0H。累加器是單片機中使用最頻繁的寄存器,在進行算術或邏輯運算時,數據大多數先進入ACC,運算完成后,結果大多數也送入ACC。
(2)寄存器B
寄存器B主要用于乘、除運算,其字節地址是F0H。在乘法運算時,一個數存放在A(累加器)中,另一個數存放在B中,運算結果得到的積(16位)的高字節存放在B中,低字節存放在A中;在除法運算時,被除數存取自A,除數取自B,運算結果得到商(8位)和余數(8位),商存放在A中,余數存放在B中。
(3)數據指針寄存器(DPTR)
數據指針寄存器(DPTR)簡稱數據指針,是一個16位寄存器,由DPH和DPL兩個8位寄存器組成,地址分別為83H、82H。DPTR主要在單片機訪問片外RAM時使用,用于存放片外RAM的16位地址,DPH保存高8位地址,DPL保存低8位地址。
(4)堆棧指針寄存器(SP)
人們在洗碗碟時,通常是將洗完的碗碟一只一只由下往上堆起來,使用時則是將碗碟從上往下一只一只取走。這個過程有兩個要點:一是這些碗碟的堆放是連續的;二是先堆放的后取走,后堆放的先取走。單片機的堆棧與上述情況類似。堆棧是指在單片機數據存儲器中劃分出的一個連續的存儲空間,這個存儲空間存取數據時具有“先進后出,后進先出”的特點。在存儲器存取數據時,首先根據地址選中某個單元,再將數據存入或取出。如果有一批數據要連續存入存儲器,比如將5個數據(每個數據為8位)依次存入地址為30H~34H的5個存儲單元中,按一般的操作方法是:先選中地址為30H的存儲單元,再將第1個數據存入該單元,然后選中地址為31H的存儲單元,再將第2個數據存入該單元……顯然這樣存取數據比較麻煩,采用堆??梢院芎玫亟鉀Q這個問題。
在數據存儲器中劃分堆棧的方法是:通過編程的方法設置堆棧指針寄存器(SP)的值,如讓SP=2FH,SP就將存儲器地址為2FH的存儲單元設為堆棧的棧頂地址,2FH單元后面的連續存儲單元就構成了堆棧,如下圖所示。堆棧設置好后,就可以將數據按順序依次存入堆?;驈亩褩V腥〕?,在堆棧中存取數據按照“先進后出,后進先出”的規則進行。
需要注意的是,堆棧指針寄存器(SP)中的值并不是堆棧的第一個存儲單元的地址,而是前一個單元的地址,例如SP=2FH,那么堆棧的第一個存儲單元的地址是30H,第1個數據存入30H單元。單片機通電復位后,SP的初始值為07H,這樣堆棧第一個存儲單元的地址就為08H,由于08H~1FH地址已劃分給1~3組工作寄存器,在需要用到堆棧時,通常在編程時設SP=2FH,這樣就將堆棧設置在數據存儲器的用戶RAM區(30H~7FH)。
(5)程序狀態字寄存器(PSW)
程序狀態字寄存器(PSW)的地址是 D0H,它是一個狀態指示寄存器(又稱標志寄存器),用來指示系統的工作狀態。PSW是一個8位寄存器,可以存儲8位數,各位代表不同的功能。程序狀態字寄存器(PSW)的字節地址、各位地址和各位功能如下圖所示。
D7位(C):進位標志位。當單片機進行加、減運算時,若運算結果最高位有進位或借位時,C位置1,無進位或借位時,C位置0。在進行位操作時,C用作位操作累加器。
D6位(AC):半進位標志位。單片機進行加、減運算時,當低半字節的D3位向高半字節的D4位有進位或借位時,AC位置1,否則AC位置0。
D5位(F0):用戶標志位0。用戶可設定的標志位,可置1或置0。
D4位(RS1)、D3位(RS0):工作寄存器組選擇位。這兩位有4種組合狀態,用來控制工作寄存器區(00H~1FH)4組中的某一組寄存器進入工作狀態。
D2位(OV):溢出標志位。在進行有符號數運算時,若運算結果超出?128~+127范圍,OV=1,否則OV=0;當進行無符號數乘法運算時,若運算結果超出255,OV=1,否則OV=0;當進行無符號數除法運算時,若除數為0,OV=1,否則OV=0。
D1位(F1):用戶標志位1。同F0位,用戶可設定的標志位,可置1或置0。
D0位(P):奇偶校驗位。該位用于對累加器A中的數據進行奇偶校驗,當累加器A中“1”的個數為奇數值時,P=1,若累加器A中的“1”的個數為偶數值時,P=0。51系列單片機總是保持累加器A與P中“1”的總個數為偶數值,比如累加器A中有3個“1”,即“1”的個數為奇數值,那么 P 應為“1”,這樣才能讓兩者“1”的總個數為偶數值,這種校驗方式稱作偶校驗。
編輯:黃飛
?
評論
查看更多