單片機按存儲結(jié)構可分為二類:一類是哈佛結(jié)構,另一類是普林斯頓結(jié)構。
①哈佛結(jié)構
所謂哈佛結(jié)構是指程序存儲器地址空間與數(shù)據(jù)存儲器地址空間分開的單片機結(jié)構,如80c51單片機采用哈佛結(jié)構,所以80c51單片機的程序存儲器地址空間與數(shù)據(jù)存
儲器地址空間是分開的,各有64k存儲空間。
②普林斯頓結(jié)構
所謂普林斯頓結(jié)構是指程序存儲器地址空間與數(shù)據(jù)存儲器地址空間合并的單片機結(jié)構,如mcs-96單片機采用普林斯頓結(jié)構,所以mcs-96單片機的程序存儲器地址空
間與數(shù)據(jù)存儲器地址空間是合并的,共有64k存儲空間。
1.單片機的cpu
圖1是80c51單片機的內(nèi)部結(jié)構框圖。若除去圖中的存儲器電路和i/o部件,剩下的便是cpu。它可以分為運算器和控制器兩部分。運算器功能部件包括算術邏輯運
算單元alu、累加器acc、寄存器b、暫存寄存器tmp1、tmp2、程序狀態(tài)字寄存器psw等??刂破鞴δ懿考ǔ绦蛴嫈?shù)器pc、指令寄存器ir、指令譯碼器id、定時控制邏輯
電路cu、數(shù)據(jù)指針寄存器dptr、堆棧指針sp及時鐘電路等。
(1)運算器
①算術邏輯運算單元alu(arithmetic logical unit)
alu可以進行算術、邏輯運算。算術運算有:加、減、乘、除,邏輯運算有:與、或、異或等。
②累加器acc
累加器acc的主要功能是在運算前存放一個操作數(shù),運算后存放一個操作結(jié)果。80c51系列單片機雖然在結(jié)構上仍然以累加器a作為重要部件。但由于內(nèi)部電路采取
了措施,使得累加器a在數(shù)據(jù)傳送、邏輯操作等方面的核心作用有所削弱。數(shù)據(jù)可以在片內(nèi)直接/間接地址的存儲器之間直接傳送,而不必經(jīng)過累加器a。但,加、減、乘、
除算術運算指令的運算結(jié)果都存放在累加器a或ab寄存器對中。
③暫存器tmp1、tmp2
由圖1可知,alu進行算術邏輯運算前的兩個操作數(shù)來自暫存器tmp1、tmp2,所以暫存器tmp1、tmp2用于存放運算前的兩個操作數(shù)。
④程序狀態(tài)字寄存器psw
程序狀態(tài)字寄存器psw用來存放運算結(jié)果的狀態(tài)標志。psw寄存器各位的含義如下,其中psw.1未定義,其它各位說明如下:
cy
ac
f0
rs1
rs0
ov
/
p
cy:進位標志。它是累加器a的進位位,如果操作結(jié)果在最高位有進位(加法)或借位(減法)時置1,否則清0。
ac:半進位標志。它是低半字節(jié)的進位位(累加器a中a3位向a4位的進位),主要用于bcd碼調(diào)整。低4位有進位(加法時)或向高4位有借位時(減法時),ac是
1,否則,ac清0。
f0:用戶定義的狀態(tài)標志位??赏ㄟ^軟件對它置位、復位或測試,以控制程序的流向。
rs1、rs0:工作寄存器區(qū)選擇控制位,用于選擇4組工作寄存器之一??梢杂密浖碇梦换蚯辶悖源_定工作寄存器區(qū)。rs1、rs0與寄存器區(qū)的對應關系如下:
rs1、rs0=00——0區(qū)(地址00h~07h)
rs1、rs0=01——1區(qū)(地址08h~0fh)
rs1、rs0=10——2區(qū)(地址10h~17h)
rs1、rs0=11——3區(qū)(地址18h~1fh)
ov:溢出標志位,用于表示有符號數(shù)算術運算的溢出。溢出時ov為1,否則ov為0。
p:奇偶標志位。每個指令周期都由硬件來置位或清零,以表示累加器a中1的個數(shù)的奇偶性。若1的個數(shù)為奇數(shù),則p置位;若1的個數(shù)為偶數(shù),則清零。
⑤寄存器b
在乘除指令中,用到了寄存器b。
(2)控制器
控制器是控制單片機各種操作的部件,用于完成指令規(guī)定的操作。它包括程序計數(shù)器pc、指令寄存器ir、指令譯碼器id、定時控制邏輯、數(shù)據(jù)指針寄存器dptr、時
鐘發(fā)生器、復位電路、堆棧指針sp等。
①程序計數(shù)器 pc
程序計數(shù)器pc為16位寄存器,用于存放下一條要執(zhí)行指令地址,具有自動加1功能。
②指令寄存器ir、指令譯碼器id、定時控制邏輯電路
指令寄存器ir用來暫時存放當前取出的指令,并由指令譯碼器id譯碼,產(chǎn)生相應的譯碼信號,并傳送給定時控制電路,定時控制電路發(fā)出各種控制信號控制各器件
完成指令規(guī)定的操作。
③數(shù)據(jù)指針dptr
dptr為16位寄存器。由于80c51單片機采用哈佛結(jié)構,因此,其程序存儲器與地址存儲器是分開的,程序存儲器的地址是由程序計數(shù)器pc提供,而數(shù)據(jù)存儲器的地址是由數(shù)據(jù)指針dptr提供的,所以dptr用于存放片外數(shù)據(jù)存儲器及i/o口的地址。
④時鐘電路
時鐘電路是計算機的心臟,它控制著計算機的工作節(jié)奏。
⑤復位和復位電路
計算機在啟動運行時都需要復位,復位就是使cpu和系統(tǒng)中的其它部件處于一個確定的初始狀態(tài),并從這個狀態(tài)開始工作。
⑥堆棧指針sp
堆棧指針sp用于存放棧頂單元的地址。
2.單片機的存儲器配置
由于80c51單片機采用哈佛結(jié)構,所以其程序存儲器和數(shù)據(jù)存儲器是分開的,各有自身的尋址系統(tǒng)、控制信號和功能。程序存儲器用來存放程序和表格常數(shù);數(shù)據(jù)存儲器通常用來存放程序運行所需要的給定參數(shù)和運行結(jié)果。
從實際的物理存儲介質(zhì)來看,80c51有4種存儲空間,它們是片內(nèi)程序存儲器、片外程序存儲器、片內(nèi)數(shù)據(jù)存儲器(含特殊功能寄存器)和片外數(shù)據(jù)存儲器。80c51的存儲器配置情況如圖2所示。
邏輯地址空間來看,80c51單片機可分為三部分,即:程序存儲器、片外數(shù)據(jù)存儲器、片內(nèi)數(shù)據(jù)存儲器。這3部分分別使用不同的地址指針,不同的訪問指令。因此,下面按邏輯結(jié)構介紹80c51的存儲器結(jié)構。
(1)程序存儲器
由圖3可知,程序存儲器以程序計數(shù)器pc作地址指針,通過16位地址總線,可尋址的地址空間為0000h~0ffffh共64k(216=64k)字節(jié),其訪問指令為movc。用于存放程序指令碼與固定的數(shù)據(jù)表格等。
80c51單片機中內(nèi)部和外部共64k字節(jié)程序存儲器的地址空間是統(tǒng)一的。對于有內(nèi)部rom的單片機,在正常運行時,應把引腳接高電平,使程序從內(nèi)部rom開始執(zhí)行。當pc值超出內(nèi)部rom的容量時,會自動轉(zhuǎn)向外部程序存儲器空間。
(2)片外數(shù)據(jù)存儲器
由圖可知,片外數(shù)據(jù)存儲器以dptr作為地址指針,通過16位地址總線,可尋址的地址空間為0000h~0ffffh共64k(216=64k)字節(jié),其訪問指令為movx。用于存放數(shù)據(jù)與運算結(jié)果。
(3)片內(nèi)據(jù)存儲器
片內(nèi)數(shù)據(jù)存儲器的地址空間從00h~ffh共256字節(jié),其訪問指令為mov。其地址可由r0、r1寄存器提供。內(nèi)部數(shù)據(jù)存儲器是最靈活的地址空間,它分成物理上獨立且性質(zhì)上不同的2個區(qū):00h~7fh單元組成的128字節(jié)ram區(qū),地址為80h~ffh的特殊功能寄存器區(qū)(簡稱sfr區(qū))。
1)ram區(qū)(00h~7fh)
由圖2-3可知,ram區(qū)又分為3個區(qū):工作寄存器區(qū)、位地址區(qū)與數(shù)據(jù)緩沖區(qū)。
①工作寄存器區(qū)(00h~1fh)
80c51單片機的內(nèi)部ram區(qū)結(jié)構如圖2-3所示。
②位地址區(qū)(20h~2fh)
內(nèi)部ram的20h~2fh為位尋址區(qū)域,見表1所示。這16個單元的每一位都有一個位地址,位地址范圍為00h~7fh。通常把各種程序狀態(tài)標志、位控制變量設在位尋址區(qū)內(nèi)。位尋址區(qū)的ram單元也可以作為一般的數(shù)據(jù)緩沖區(qū)使用。
表1 內(nèi)部ram區(qū)的位地址映像表
③數(shù)據(jù)緩沖區(qū)
數(shù)據(jù)緩沖區(qū)的地址空間從30h~7fh共80個字節(jié)單元,用于存放數(shù)據(jù)與運算結(jié)果,如加法運算時,存放加數(shù)、被加數(shù)及運算和。通常堆棧區(qū)也設置在該區(qū)內(nèi)。有些單片機將顯示緩沖區(qū)設置在該區(qū)內(nèi)。
2)特殊功能寄存器sfr(80h~ffh)
80c51單片機內(nèi)的i/o口鎖存器、狀態(tài)標志寄存器、定時器、串行口、數(shù)據(jù)緩沖器以及各種控制寄存器統(tǒng)稱為特殊功能寄存器,它們離散地分布在內(nèi)部ram地址空間(80h~0ffh)內(nèi),表2列出了這些特殊功能寄存器的標識符、名稱及地址。由表2-2可知累加器acc、寄存器b、程序狀態(tài)字psw、i/o口p0~p3等均為特殊功能寄存器。
表2 特殊功能寄存器sfr
注:帶“·”號的寄存器可按字節(jié)和按位尋址,其特征是直接地址能被8整除。帶“*”號的寄存器是與定時器/計數(shù)器2有關的寄存器,僅在80c52系列中存在。下面以一個實例說明單片機的內(nèi)部存儲器。
3.80c51單片機并行輸入/輸出口
80c51單片機含有4 個8位并行i/o口p0、p1、p2和p3。每個口有8個引腳,如圖2-1所示,共有32個i/o引腳,每一個并行i/o口都能用作輸入或輸出。各口的第
一、第二功能如下:
i/o口 引腳 第一功能 第二功能
p0口 p0.0~p0.7 輸入與輸出 分時的傳送地址低8位與數(shù)據(jù)線
p1口 p1.0~p0.7 輸入與輸出 無第二功能
p2口 p2.0~p2.7 輸入與輸出 傳送地址的高8位
p3口 p3.0~p3.7 輸入與輸出 p3.0——rxd:串行口輸入端
p3.1——txd:串行口輸出端
p3.2—— :外部中斷0中斷請求輸入端
p3.3—— :外部中斷1中斷請求輸入端
p3.4——t0:定時器/計數(shù)器0外部輸入端
p3.5——t1:定時器/計數(shù)器1外部輸入端
p3.6—— :外部數(shù)據(jù)存儲器寫選通信號
p3.7—— :外部數(shù)據(jù)存儲器讀選通信號
四個通道口都有一種特殊的線路結(jié)構,每個口都包含一個鎖存器,即特殊功能寄存器p0~p3,一個輸出驅(qū)動器和兩個(p3口有三個)三態(tài)緩沖器。這種結(jié)構在數(shù)據(jù)
輸出時,可以鎖存,即在重新輸出新的數(shù)據(jù)之前,口上的數(shù)據(jù)一直保持不變。但對于輸入信號是不鎖存的,所以外設欲輸入的數(shù)據(jù)必須保持到取數(shù)指令執(zhí)行(把數(shù)據(jù)讀取
后)為止。
下面分別敘述各個端口的結(jié)構、功能和使用方法。
(1)p0口的組成與功能
1)位結(jié)構
在訪問外部存儲器時,p0口是一個真正的雙向數(shù)據(jù)總線口,并分時送出地址的低8位。圖2-4所示的是p0口的一位結(jié)構圖。它包含兩個輸入緩沖器、一個輸出鎖存器以及輸出驅(qū)動電路、輸出控制電路。輸出驅(qū)動電路由兩只場效應管v1和v2組成,其工作狀態(tài)受輸出控制電路的控制。輸出控制電路包括與門、反相器和多路模擬開關mux。p0口既能用作通用i/o口,又能用作地址/數(shù)據(jù)總線。
2)作為通用i/o口
p0口作為通用i/o口使用時,cpu令控制信號為低電平。這時多路開關mux接通b端即輸出鎖存器的 端,同時使與門輸出低電平,場效應管v1截止,因而輸出級為開漏輸出電路。
①作為輸出口
當用p0口輸出數(shù)據(jù)時,寫信號加在鎖存器的時鐘端cl上,此時與內(nèi)部總線相連的d端其數(shù)據(jù)經(jīng)反相后出現(xiàn)的 端上,再經(jīng)v2管反相,于是在p0口引腳上出現(xiàn)的數(shù)據(jù)正好是內(nèi)部總線上的數(shù)據(jù)。由于輸出級為開漏電路,所以用作輸出口時應外接上拉電阻。
②作為輸入口
當p0口用于輸入數(shù)據(jù)時,要使用端口中的兩個三態(tài)輸入緩沖器之一。這時有兩種工作方式:讀引腳和讀鎖存器。
當cpu執(zhí)行一般的端口輸入指令時,“讀引腳”信號使圖2-4中下面一個緩沖器開通,于是端口引腳上的數(shù)據(jù)經(jīng)過緩沖器輸入到內(nèi)部總線上。
當cpu執(zhí)行“讀一修改一寫”一類指令時,“讀鎖存器”信號使圖2-4上面一個緩沖器開通,鎖存器q端的數(shù)據(jù)經(jīng)緩沖器輸入內(nèi)部數(shù)據(jù)總線。
在p0口作為輸入口使用時,必須首先向端口鎖存器寫入“1”。這是因為當進行讀引腳操作時,如果v2是導通的,那么不論引腳上的輸入狀態(tài)如何,都會變?yōu)榈碗娖?。為了正確讀入引腳上的邏輯電平,先要向鎖存器寫1,使其 端為0,v2截止。該引腳成為高阻抗的輸入端。
3)作為地址/數(shù)據(jù)總線
p0口還能作為地址總線低8位或數(shù)據(jù)總線,供系統(tǒng)擴展時使用。這時控制信號為高電平,多路開關mux接通a端。有兩種工作情況:一種是總線輸出,另一種是外部
數(shù)據(jù)輸入。作為總線輸出時,從“地址/數(shù)據(jù)”端輸入的地址或數(shù)據(jù)信號通過與門驅(qū)動v2,同時通過非門驅(qū)動v2,結(jié)果在引腳上得到地址或數(shù)據(jù)輸出信號。
作為數(shù)據(jù)總線輸入數(shù)據(jù)時,從引腳上輸入的外部數(shù)據(jù)經(jīng)過讀引腳緩沖器進入內(nèi)部數(shù)據(jù)總線。對于80c51、87c51單片機,p0口能作為i/o口或地址/數(shù)據(jù)總線使用。對于80c31單片機,p0口只能用作地址/數(shù)據(jù)總線。
綜上所述,p0口既可以作為地址/數(shù)據(jù)總線口,這時它是真正的雙向口,也可作通用的i/o口,但只是一個準雙向口。準雙向口的特點是:復位時,口鎖存器均置“1”,8根引腳可當一般輸入線使用,而在某引腳由原輸出狀態(tài)變成輸入狀態(tài)時,則應先寫入“1”,以免錯讀引腳上的信息。一般情況下,p0口已當作地址/數(shù)據(jù)總線口使用時,就不能再作通用i/o口使用。
(2)p1口組成與功能
p1口只用作通用i/o口,其一位結(jié)構圖如圖所示。與p0口相比,p1口的位結(jié)構圖中少了地址/數(shù)據(jù)的傳送電路和多路開關,上面一只mos管改為上拉電阻。
p1口作為一般i/o的功能和使用方法與p0口相似。當輸入數(shù)據(jù)時,應先向端口寫“1”。它也有讀引腳和讀鎖存器兩種方式。所不同的是當輸出數(shù)據(jù)時,由于內(nèi)部有了上拉電阻,所以不需要再外接上拉電阻。
(3)p2口的組成與功能
當系統(tǒng)中接有外部存儲器時,p2口可用于輸出高8位地址,若當作通用i/o口用,p2口則是一個準雙向口。因此說p2口能用作通用i/o口或地址總線,其一位的結(jié)構如圖所示。
①作為通用i/o口
當控制信號為低電平時,多路開關接到b端,p2口作為通用i/o口使用,其功能和使用方法與p1口相同。
②作為地址總線
當控制端輸出高電平時,多路開關接到a端,地址信號經(jīng)反相器、v從引腳輸出。這時p2口輸出地址總線高8位,供系統(tǒng)擴展使用。
對80c51、87c51單片機,p2口能作為i/o口或地址總線作用。對于80c31單片機,p2口只能用作地址總線。
(4)p3口組成與功能
p3口能作通用i/o口,同時每一引腳還有第二功能。p3口的一位結(jié)構如圖2-7所示。
作為通用i/o口:當“第二功能輸出”端為高電平時,p3口用作通用i/o口。這時與非門對于輸入端q來說相當于非門,位結(jié)構與p2口完全相同,因此p3口用作通用i/o口時的功能和使用方法與p2口、p1口相同。
用作第二功能: 當p3口的某一位作為第二功能輸出使用時,應將該位的鎖存器置“1”,使與非門的輸出狀態(tài)只受“第二功能輸出”端的控制?!暗诙δ茌敵觥倍说臓顟B(tài)經(jīng)與非門和驅(qū)動管v輸出到該位引腳上。
當p3口的某一位作為第二功能輸入使用時,該位的鎖存器和“第二功能輸出”端都應為“1”,這樣,該位引腳上的輸入信號經(jīng)緩沖器送入“第二功能輸入”端。
至此,可以對組成一般單片機應用系統(tǒng)時各個并行口的分工小結(jié)如下:
p0口:分時的用作地址低8位與數(shù)據(jù)線,低8位地址由pc低8位或dpl提供。
p1口:按位可編址的輸入輸出口。
p2口:地址線的高8位,高8位地址由pc高8位或dph提供。
p3口:雙功能口,若不用第二功能,可作為一般的i/o口。