官术网_书友最值得收藏!

3.3 MCS-51單片機的存儲器結構

MCS-51系列單片機存儲器采用哈佛結構,即程序存儲器和數據存儲器完全分開,程序存儲器和數據存儲器各有自己的尋址方式、尋址空間和控制信號。

MCS-51系列單片機存儲器從物理結構上可分為片內、片外程序存儲器(8031 和8032無片內程序存儲器)與片內、片外數據存儲器等4部分;從功能上可分為64KB程序存儲器空間、128B片內數據存儲器空間、128B內部特殊功能寄存器空間、位地址空間和64KB片外數據存儲器等5部分;其尋址空間可劃分為:程序存儲器、片內數據存儲器和片外數據存儲器3個獨立的地址空間。

MCS-51單片機的程序存儲器(ROM)和數據存儲器(RAM),在使用上是嚴格區分的,不得混用。程序存儲器通常存放程序指令、常數及表格等,系統在運行過程中不能修改其中的數據;數據存儲器則存放緩沖數據,系統在運行過程中可修改其中的數據。

3.3.1 程序存儲器

1.編址與訪問

計算機的工作是按照事先編制好的程序命令序列逐條順序執行的,程序存儲器用來存放這些已編制好的程序和表格常數,它由只讀存儲器ROM或EPROM組成。計算機為了有序地工作,設置了一個專用寄存器——程序計數器PC。每取出指令的1個字節后,其內容自動加1,指向下一個字節,使計算機依次從程序存儲器中取指令予以執行,完成某種操作。由于MCS-51單片機的程序計數器為16位,因此可尋址的地址空間為64KB。

MCS-51單片機從物理配置上可有片內、片外程序存儲器,但作為一個編址空間,其編址規律為:先片內,后片外,片內、外連續,二者一般不重疊。圖3-7所示為編址圖。

圖3-7 程序存儲器編址圖

單片機執行指令時,是從片內程序存儲器取指令,還是從片外程序存儲器取指令,由單片機引腳電平的高低來決定。= 1時,先執行片內程序存儲器的程序,當PC的內容超過片內程序存儲器地址的最大值(51子系列為0FFFH,52子系列為1FFFH)時,將自動轉去執行片外程序存儲器中的程序;=0時,CPU從片外程序存儲器中取指令執行程序。對于片內無程序存儲器的8031、8032單片機,引腳應接低電平。對于片內有程序存儲器的單片機,如果引腳接低電平,將強行執行片外程序存儲器中的程序。此時應在片外程序存儲器中存放調試程序,以便對單片機進行調試工作。注意:片外程序存儲器存放調試程序的部分,其編址與片內程序存儲器的編址是可以重疊的,借的換接可實現分別訪問。在現代單片機應用系統設計中,一般都選擇片內帶足夠大程序存儲器的單片機,所以不需要擴展片外的程序程序器,這樣就可以直接將接高電平。

2.程序存儲器中的6個特殊地址

程序地址空間原則上可由用戶任意安排,但復位和5 個中斷源的程序入口地址在MCS-51系列單片機中是固定的,用戶不能更改。這些入口地址如表3-3所示。

表3-3 MCS-51系列單片機復位、中斷入口地址

注:定時器/計數器2溢出或T2EX端負跳變(52子系列)中斷源的程序入口地址為002BH。

表3-3中6個入口地址互相離得很近,只隔3個或8個單元,容納不下稍長的程序段。所以其中實際存放的往往是一條無條件轉移指令,使程序分別跳轉到用戶程序真正的起始地址,或跳轉到所對應的中斷服務程序的真正入口地址。

3.3.2 數據存儲器

1.編址與訪問

MCS-51單片機片內、外數據存儲器是兩個獨立的地址空間,應分別單獨編址。片內數據存儲器除RAM塊外,還有特殊功能寄存器(SFR)塊。對于51子系列,前者有128個字節,其編址為00H~7FH;后者有128個字節,其編址為80H~0FFH;二者連續但不重疊。對52子系列,前者有256B,其編址為00H~0FFH;后者有128B,其編址為80H~0FFH。后者與前者高128B的編址是重疊的。由于訪問它們所用的指令不同,并不會引起混亂。片外數據存儲器一般是16位編址。數據存儲器的編址如圖3-8所示。

圖3-8 數據存儲器編址圖

說明:① MS-51單片機的51子系列的內部數據存儲器為128B,地址空間為00H~7FH,52子系列的內部數據存儲器為256B,地址空間為00H~0FFH,特殊功能寄存器地址空間為80H~0FFH。顯然,內部數據存儲器區的80H~0FFH空間與特殊功能寄存器的地址重疊,但是通過指令中采取不同的尋址方式可解決這個重疊問題,即特殊功能寄存器只能用“直接尋址”方式,內部數據存儲器80H~0FFH單元只能用“寄存器間接尋址”方式,也就是說,地址重疊不會造成混亂,只是在軟件編程時應注意。

② 如果只擴展少量片外數據存儲器,容量不超過256B,也可按8位編址,自00H開始,最大可至FFH。這種情況下,地址空間與片內數據存儲器重疊,但訪問片內、外用不同的指令,也不會引起混亂。

③ 片外數據存儲器按16位編址,其地址空間與程序存儲器重疊,但不會引起混亂,訪問程序存儲器是用信號控制,而訪問片外數據存儲器時,由信號(讀)和信號(寫)控制。

2.片內數據存儲器

MCS-51單片機片內RAM共有128B,字節范圍為00H~7FH。圖3-9所示為51子系列單片機片內RAM的配置圖。由圖3-9可見,片內數據存儲器共分為工作寄存器區、位尋址區、數據緩沖區共3個區域。

圖3-9 MCS-51單片機內部RAM分布圖

(1)工作寄存器區

00H~1FH單元為工作寄存器區。工作寄存器也稱通用寄存器,用于臨時寄存8位信息。工作寄存器分成4組,每組都是8個寄存器,用R0~R7來表示。程序中每次只用一組,其余各組不工作。使用哪一組寄存器工作,由程序狀態字PSW中的PSW.3(RS0)和PSW.4(RS1)兩位來選擇,其對應關系如表3-4所示。

表3-4 工作寄存器組的選擇表

通過軟件設置RS0和RS1兩位的狀態,就可任意選一組寄存器工作。這個特點使MCS-51單片機具有快速現場保護的功能,對于提高程序效率和響應中斷的速度是很有利的。

該區域當不被用做工作寄存器時,可以作為一般的RAM區使用。

(2)位尋址區

20H~2FH單元是位尋址區。這16個單元(共計16×8=128位)的每一位都賦予了一個位地址,位地址范圍為00H~7FH。位地址區的每一位都可當做軟件觸發器,由程序直接進行位處理。通??梢园迅鞣N程序狀態標志、位控制變量存入位尋址區內。

該區域當不被用做位尋址區時,可以作為一般的RAM區使用。

在這里要注意,位地址7FH和字節地址7FH是兩個完全不同的概念。

(3)數據緩沖區

30H~7FH是數據緩沖區,即用戶RAM,共80個單元。

由于工作寄存器區、位尋址區、數據緩沖區統一編址,使用同樣的指令訪問,這三個區的單元既有自己獨特的功能,又可統一調度使用。因此,前兩個區未使用的單元也可作為用戶RAM單元使用,使容量較小的片內RAM得以充分利用。

52子系列單片機片內RAM有256個單元,前兩個區的單元數與地址都與51子系列的一致,用戶RAM區卻為30H~0FFH,有208個單元。對于片內RAM區的字節地址80H~0FFH的區域,只能采用間接尋址方式進行訪問。

(4)堆棧和堆棧指針

堆棧是按先進后出的原則進行讀寫的特殊RAM區域。MCS-51單片機的堆棧區是不固定的,原則上可以在內部RAM的任何區域內。實際應用中要根據對片內RAM各功能區的使用情況靈活設置,但應避開工作寄存器區、位尋址區和用戶實際使用的數據區。

系統復位后,SP初始化為07H,所以第一個壓入堆棧的數據存放在08H單元,即堆棧區是從07H單元開始的一部分連續存儲單元。在編程時用戶應將堆棧區設定在30H單元以上,如通過指令:

            MOV     SP,#60H

將堆棧區設定在從片內RAM60H開始的一部分連續單元。

3.3.3 特殊功能寄存器

特殊功能寄存器(SFR,Special Function Registers),又稱為專用寄存器,專用于控制、管理片內算術邏輯部件、并行I/O接口、串行I/O接口、定時器/計數器、中斷系統等功能模塊的工作。用戶在編程時可以置數設置,卻不能自由地移作它用。各專用寄存器(PC例外)與片內RAM統一編址,且作為直接尋址字節可直接尋址。除PC外,51子系列單片機共有18個專用寄存器,其中3個為雙字節寄存器,共占用21B;52子系列有21個專用寄存器,其中5個為雙字節寄存器,共占用26B。按地址排列的各個特殊功能寄存器名稱、表示符、地址如表3-5所示。

表3-5 特殊功能寄存器名稱、符號、地址一覽表

注:表中帶*的寄存器與定時器/計數器2有關,只在52子系列芯片中存在。RLDH、RLDL也可寫為RCAP2H、RCAP2L,分別稱為定時器/計數器2捕捉高字節、低字節寄存器。

其中有12個專用寄存器可以位尋址,它們字節地址的低半字節為0H或8H(即可位尋址的特殊功能寄存器字節地址具有能被8整除的特征)。在表3-6中列出了這些位的位地址與位名稱。

表3-6 特殊功能寄存器可位尋址的寄存器名稱、位地址名稱及地址表

注意,在SFR塊地址空間80H~0FFH中,僅有21個(51子系列)或26個(52子系列)字節作為特殊功能寄存器離散分布在這128個字節范圍內,其余字節無意義,用戶不能對這些字節進行讀/寫操作。若對其進行訪問,則將得到一個不確定的隨機數,因而是沒有意義的。

用戶在使用特殊功能寄存器時,不需要記住特殊功能寄存器及其位的地址,只要記住特殊功能寄存器及位的名稱就可以了,操作時對其名字進行操作。

主站蜘蛛池模板: 玉山县| 丹棱县| 钟山县| 阿克苏市| 东阿县| 英山县| 上林县| 松滋市| 锦屏县| 康保县| 花莲市| 维西| 珠海市| 封开县| 永泰县| 新绛县| 桓仁| 宜都市| 浦东新区| 哈巴河县| 托克逊县| 基隆市| 崇信县| 原平市| 西乌| 马龙县| 恩平市| 商都县| 湛江市| 赤城县| 洛宁县| 台湾省| 句容市| 安新县| 孝感市| 营山县| 广南县| 乌拉特中旗| 承德市| 牙克石市| 阆中市|