MCS-51系列單片機片內有一個串行I/O端口,通過引腳RXD(P3.0)和TXD(P3.1)可與外設電路進行全雙工的串行異步通信。
1.串行端口的基本特點
8031單片機的串行端口有4種基本工作方式,通過編程設置,可以使其工作在任一方式,以滿足不同應用場合的需要。其中,方式0主要用于外接移位寄存器,以擴展單片機的I/O電路;方式1多用于雙機之間或與外設電路的通信;方式2,3除有方式l的功能外,還可用作多機通信,以構成分布式多微機系統。
串行端口有兩個控制寄存器,用來設置工作方式、發送或接收的狀態、特征位、數據傳送的波特率(每秒傳送的位數)以及作為中斷標志等。
串行端口有一個數據寄存器SBUF(在特殊功能寄存器中的字節地址為99H),該寄存器為發送和接收所共同。發送時,只寫不讀;接收時,只讀不寫。在一定條件下,向陽UF寫入數據就啟動了發送過程;讀SBUf就啟動了接收過程。
串行通信的波特率可以程控設定。在不同工作方式中,由時鐘振蕩頻率的分頻值或由定時器Tl的定時溢出時間確定,使用十分方便靈活。
2.串行端口的工作方式
①方式0
8位移位寄存器輸入/輸出方式。多用于外接移位寄存器以擴展I/O端口。波特率固定為fosc/12。其中,fosc為時鐘頻率。
在方式0中,串行端口作為輸出時,只要向串行緩沖器SBUF寫入一字節數據后,串行端口就把此8位數據以等的波特率,從RXD引腳逐位輸出(從低位到高位);此時,TXD輸出頻率為fosc/12的同步移位脈沖。數據發送前,僅管不使用中斷,中斷標志TI還必須清零,8位數據發送完后,TI自動置1。如要再發送,必須用軟件將TI清零。
串行端口作為輸入時,RXD為數據輸入端,TXD仍為同步信號輸出端,輸出頻率為fosc/12的同步移位脈沖,使外部數據逐位移入RxD。當接收到8位數據(一幀)后,中斷標志RI自動置。如果再接收,必須用軟件先將RI清零。
串行方式0發送和接收的時序過程見下圖。
②方式1
10位異步通信方式。其中,1個起始位(0),8個數據位(由低位到高位)和1個停止位(1)。波特率由定時器T1的溢出率和SMOD位的狀態確定。
一條寫SBUF指令就可啟動數據發送過程。在發送移位時鐘(由波特率確定)的同步下,從TxD先送出起始位,然后是8位數據位,最后是停止位。這樣的一幀10位數據發送完后,中斷標志TI置位。
在允許接收的條件下(REN=1),當RXD出現由1到O的負跳變時,即被當成是串行發送來的一幀數據的起始位,從而啟動一次接收過程。當8位數據接收完,并檢測到高電乎停止位后,即把接收到的8位數據裝入SBUF,置位RI,一幀數據的接收過程就完成了。
方式1的數據傳送波特率可以編程設置,使用范圍寬,其計算式為:
波特率=2SMOD/32×(定時器T1的溢出率)
其中,SMOD是控制寄存器PCON中的一位程控位,其取值有0和l兩種狀態。顯然,當SMOD=0時,波特率=1/32(定時器Tl溢出率),而當SMOD=1時,波特率=1/16(定時器T1溢出率)。所謂定時器的溢出率,就是指定時器一秒鐘內的溢出次數。波特率的算法,以及要求一定波特率時定時器定時初值的求法,后面將詳細討論。
串行方式1的發送和接收過程的時序見下圖。
③方式2,3
11位異步通信方式。其中,1個起始位(0),8個數據位(由低位到高位),1個附加的第9位和1個停止住(1)。方式2和方式3除波特率不同外,其它性能完全相同。方式2,3的發送、接收時序見下圖。
由圖可見,方式2和方式3與方式l的操作過程基本相同,主要差別在于方式2,3有第9位數據。
發送時,發送機的這第9位數據來自該機SCON中的TB8,而接收機將接收到的這第9位數據送入本機SCON中的RB8。這個第9位數據通常用作數據的奇偶檢驗位,或在多機通信中作為地址/數據的特征位。
方式2和方式3的波特率計算式如下:
方式2的波特率=2SMOD/64×fosc
方式3的波特率=2SMOD/32×定時器T1的溢出率
由此可見,在晶振時鐘頻率一定的條件下,方式2只有兩種波特率,而方式3可通過編程設置成多種波特率,這正是這兩種方式的差別所在。
3.串行端口的控制寄存器
串行端口共有2個控制寄存器SCON和PCON,用以設置串行端口的工作方式、接收/發送的運行狀態、接收/發送數據的特征、波特率的大小,以及作為運行的中斷標志等。
二、51單片機I/O腳工作原理分析
一、P0端口的結構及工作原理
P0端口8位中的一位結構圖見下圖:
由上圖可見,P0端口由鎖存器、輸入緩沖器、切換開關、一個與非門、一個與門及場效應管驅動電路構成。再看圖的右邊,標號為P0.X引腳的圖標,也就是說P0.X引腳可以是P0.0到P0.7的任何一位,即在P0口有8個與上圖相同的電路組成。
下面,我們先就組成P0口的每個單元部份跟大家介紹一下:
先看輸入緩沖器:在P0口中,有兩個三態的緩沖器,在學數字電路時,我們已知道,三態門有三個狀態,即在其的輸出端可以是高電平、低電平,同時還有一種就是高阻狀態(或稱為禁止狀態),大家看上圖,上面一個是讀鎖存器的緩沖器,也就是說,要讀取D鎖存器輸出端Q的數據,那就得使讀鎖存器的這個緩沖器的三態控制端(上圖中標號為‘讀鎖存器’端)有效。下面一個是讀引腳的緩沖器,要讀取P0.X引腳上的數據,也要使標號為‘讀引腳’的這個三態緩沖器的控制端有效,引腳上的數據才會傳輸到我們單片機的內部數據總線上。
D鎖存器:構成一個鎖存器,通常要用一個時序電路,時序的單元電路在學數字電路時我們已知道,一個觸發器可以保存一位的二進制數(即具有保持功能),在51單片機的32根I/O口線中都是用一個D觸發器來構成鎖存器的。大家看上圖中的D鎖存器,D端是數據輸入端,CP是控制端(也就是時序控制信號輸入端),Q是輸出端,Q非是反向輸出端。
對于D觸發器來講,當D輸入端有一個輸入信號,如果這時控制端CP沒有信號(也就是時序脈沖沒有到來),這時輸入端D的數據是無法傳輸到輸出端Q及反向輸出端Q非的。如果時序控制端CP的時序脈沖一旦到了,這時D端輸入的數據就會傳輸到Q及Q非端。數據傳送過來后,當CP時序控制端的時序信號消失了,這時,輸出端還會保持著上次輸入端D的數據(即把上次的數據鎖存起來了)。如果下一個時序控制脈沖信號來了,這時D端的數據才再次傳送到Q端,從而改變Q端的狀態。
多路開關:在51單片機中,當內部的存儲器夠用(也就是不需要外擴展存儲器時,這里講的存儲器包括數據存儲器及程序存儲器)時,P0口可以作為通用的輸入輸出端口(即I/O)使用,對于8031(內部沒有ROM)的單片機或者編寫的程序超過了單片機內部的存儲器容量,需要外擴存儲器時,P0口就作為‘地址/數據’總線使用。那么這個多路選擇開關就是用于選擇是做為普通I/O口使用還是作為‘數據/地址’總線使用的選擇開關了。大家看上圖,當多路開關與下面接通時,P0口是作為普通的I/O口使用的,當多路開關是與上面接通時,P0口是作為‘地址/數據’總線使用的。
輸出驅動部份:從上圖中我們已看出,P0口的輸出是由兩個MOS管組成的推拉式結構,也就是說,這兩個MOS管一次只能導通一個,當V1導通時,V2就截止,當V2導通時,V1截止。
與門、與非門:這兩個單元電路的邏輯原理我們在第四課數字及常用邏輯電路時已做過介紹,不明白的同學請回到第四節去看看。
前面我們已將P0口的各單元部件進行了一個詳細的講解,下面我們就來研究一下P0口做為I/O口及地址/數據總線使用時的具體工作過程。
1、作為I/O端口使用時的工作原理
P0口作為I/O端口使用時,多路開關的控制信號為0(低電平),看上圖中的線線部份,多路開關的控制信號同時與與門的一個輸入端是相接的,我們知道與門的邏輯特點是“全1出1,有0出0”那么控制信號是0的話,這時與門輸出的也是一個0(低電平),與讓的輸出是0,V1管就截止,在多路控制開關的控制信號是0(低電平)時,多路開關是與鎖存器的Q非端相接的(即P0口作為I/O口線使用)。
P0口用作I/O口線,其由數據總線向引腳輸出(即輸出狀態Output)的工作過程:當寫鎖存器信號CP 有效,數據總線的信號→鎖存器的輸入端D→鎖存器的反向輸出Q非端→多路開關→V2管的柵極→V2的漏極到輸出端P0.X。前面我們已講了,當多路開關的控制信號為低電平0時,與門輸出為低電平,V1管是截止的,所以作為輸出口時,P0是漏極開路輸出,類似于OC門,當驅動上接電流負載時,需要外接上拉電阻。
下圖就是由內部數據總線向P0口輸出數據的流程圖(紅色箭頭)。
P0口用作I/O口線,其由引腳向內部數據總線輸入(即輸入狀態Input)的工作過程:數據輸入時(讀P0口)有兩種情況
1、讀引腳
讀芯片引腳上的數據,讀引腳數時,讀引腳緩沖器打開(即三態緩沖器的控制端要有效),通過內部數據總線輸入,請看下圖(紅色簡頭)。
2、讀鎖存器
通過打開讀鎖存器三態緩沖器讀取鎖存器輸出端Q的狀態,請看下圖(紅色箭頭):
在輸入狀態下,從鎖存器和從引腳上讀來的信號一般是一致的,但也有例外。例如,當從內部總線輸出低電平后,鎖存器Q=0,Q非=1,場效應管T2開通,端口線呈低電平狀態。此時無論端口線上外接的信號是低電乎還是高電平,從引腳讀入單片機的信號都是低電平,因而不能正確地讀入端口引腳上的信號。又如,當從內部總線輸出高電平后,鎖存器Q=1,Q非=0,場效應管T2截止。如外接引腳信號為低電平,從引腳上讀入的信號就與從鎖存器讀入的信號不同。為此,8031單片機在對端口P0一P3的輸入操作上,有如下約定:為此,8051單片機在對端口P0一P3的輸入操作上,有如下約定:凡屬于讀-修改-寫方式的指令,從鎖存器讀入信號,其它指令則從端口引腳線上讀入信號。
讀-修改-寫指令的特點是,從端口輸入(讀)信號,在單片機內加以運算(修改)后,再輸出(寫)到該端口上。下面是幾條讀--修改-寫指令的例子。
這樣安排的原因在于讀-修改-寫指令需要得到端口原輸出的狀態,修改后再輸出,讀鎖存器而不是讀引腳,可以避免因外部電路的原因而使原端口的狀態被讀錯。
P0端口是8031單片機的總線口,分時出現數據D7一D0、低8位地址A7一AO,以及三態,用來接口存儲器、外部電路與外部設備。P0端口是使用最廣泛的I/O端口。
2、作為地址/數據復用口使用時的工作原理
在訪問外部存儲器時P0口作為地址/數據復用口使用。
這時多路開關‘控制’信號為‘1’,‘與門’解鎖,‘與門’輸出信號電平由“地址/數據”線信號決定;多路開關與反相器的輸出端相連,地址信號經“地址/數據”線→反相器→V2場效應管柵極→V2漏極輸出。
例如:控制信號為1,地址信號為“0”時,與門輸出低電平,V1管截止;反相器輸出高電平,V2管導通,輸出引腳的地址信號為低電平。請看下圖(蘭色字體為電平):
反之,控制信號為“1”、地址信號為“1”,“與門”輸出為高電平,V1管導通;反相器輸出低電平,V2管截止,輸出引腳的地址信號為高電平。請看下圖(蘭色字體為電平):
可見,在輸出“地址/數據”信息時,V1、V2管是交替導通的,負載能力很強,可以直接與外設存儲器相連,無須增加總線驅動器。
P0口又作為數據總線使用。在訪問外部程序存儲器時,P0口輸出低8位地址信息后,將變為數據總線,以便讀指令碼(輸入)。
在取指令期間,“控制”信號為“0”,V1管截止,多路開關也跟著轉向鎖存器反相輸出端Q非;CPU自動將0FFH(11111111,即向D鎖存器寫入一個高電平‘1’)寫入P0口鎖存器,使V2管截止,在讀引腳信號控制下,通過讀引腳三態門電路將指令碼讀到內部總線。請看下圖
如果該指令是輸出數據,如MOVX @DPTR,A(將累加器的內容通過P0口數據總線傳送到外部RAM中),則多路開關“控制”信號為‘1’,“與門”解鎖,與輸出地址信號的工作流程類似,數據據由“地址/數據”線→反相器→V2場效應管柵極→V2漏極輸出。
如果該指令是輸入數據(讀外部數據存儲器或程序存儲器),如MOVX A,@DPTR(將外部RAM某一存儲單元內容通過P0口數據總線輸入到累加器A中),則輸入的數據仍通過讀引腳三態緩沖器到內部總線,其過程類似于上圖中的讀取指令碼流程圖。
通過以上的分析可以看出,當P0作為地址/數據總線使用時,在讀指令碼或輸入數據前,CPU自動向P0口鎖存器寫入0FFH,破壞了P0口原來的狀態。因此,不能再作為通用的I/O端口。大家以后在系統設計時務必注意,即程序中不能再含有以P0口作為操作數(包含源操作數和目的操作數)的指令。
二、P1端口的結構及工作原理
P1口的結構最簡單,用途也單一,僅作為數據輸入/輸出端口使用。輸出的信息有鎖存,輸入有讀引腳和讀鎖存器之分。P1端口的一位結構見下圖.
由圖可見,P1端口與P0端口的主要差別在于,P1端口用內部上拉電阻R代替了P0端口的場效應管T1,并且輸出的信息僅來自內部總線。由內部總線輸出的數據經鎖存器反相和場效應管反相后,鎖存在端口線上,所以,P1端口是具有輸出鎖存的靜態口。
由上圖可見,要正確地從引腳上讀入外部信息,必須先使場效應管關斷,以便由外部輸入的信息確定引腳的狀態。為此,在作引腳讀入前,必須先對該端口寫入l。具有這種操作特點的輸入/輸出端口,稱為準雙向I/O口。8051單片機的P1、P2、P3都是準雙向口。P0端口由于輸出有三態功能,輸入前,端口線已處于高阻態,無需先寫入l后再作讀操作。
P1口的結構相對簡單,前面我們已詳細的分析了P0口,只要大家認真的分析了P0口的工作原理,P1口我想大家都有能力去分析,這里我就不多論述了。
單片機復位后,各個端口已自動地被寫入了1,此時,可直接作輸入操作。如果在應用端口的過程中,已向P1一P3端口線輸出過0,則再要輸入時,必須先寫1后再讀引腳,才能得到正確的信息。此外,隨輸入指令的不同,H端口也有讀鎖存器與讀引腳之分。
三、P2端口的結構及工作原理:
P2端口的一位結構見下圖:
由圖可見,P2端口在片內既有上拉電阻,又有切換開關MUX,所以P2端口在功能上兼有P0端口和P1端口的特點。這主要表現在輸出功能上,當切換開關向下接通時,從內部總線輸出的一位數據經反相器和場效應管反相后,輸出在端口引腳線上;當多路開關向上時,輸出的一位地址信號也經反相器和場效應管反相后,輸出在端口引腳線上。
對于8031單片機必須外接程序存儲器才能構成應用電路(或者我們的應用電路擴展了外部存儲器),而P2端口就是用來周期性地輸出從外存中取指令的地址(高8位地址),因此,P2端口的多路開關總是在進行切換,分時地輸出從內部總線來的數據和從地址信號線上來的地址。因此P2端口是動態的I/O端口。輸出數據雖被鎖存,但不是穩定地出現在端口線上。其實,這里輸出的數據往往也是一種地址,只不過是外部RAM的高8位地址。
在輸入功能方面,P2端口與P0和H端口相同,有讀引腳和讀鎖存器之分,并且P2端口也是準雙向口。
可見,P2端口的主要特點包括:
①不能輸出靜態的數據;
②自身輸出外部程序存儲器的高8位地址;
②執行MOVX指令時,還輸出外部RAM的高位地址,故稱P2端口為動態地址端口。
即然P2口可以作為I/O口使用,也可以作為地址總線使用,下面我們就不分析下它的兩種工作狀態。
1、作為I/O端口使用時的工作過程
當沒有外部程序存儲器或雖然有外部數據存儲器,但容易不大于256B,即不需要高8位地址時(在這種情況下,不能通過數據地址寄存器DPTR讀寫外部數據存儲器),P2口可以I/O口使用。這時,“控制”信號為“0”,多路開關轉向鎖存器同相輸出端Q,輸出信號經內部總線→鎖存器同相輸出端Q→反相器→V2管柵極→V2管9漏極輸出。
由于V2漏極帶有上拉電阻,可以提供一定的上拉電流,負載能力約為8個TTL與非門;作為輸出口前,同樣需要向鎖存器寫入“1”,使反相器輸出低電平,V2管截止,即引腳懸空時為高電平,防止引腳被鉗位在低電平。讀引腳有效后,輸入信息經讀引腳三態門電路到內部數據總線。
2、作為地址總線使用時的工作過程
P2口作為地址總線時,“控制”信號為‘1’,多路開關車向地址線(即向上接通),地址信息經反相器→V2管柵極→漏極輸出。由于P2口輸出高8位地址,與P0口不同,無須分時使用,因此P2口上的地址信息(程序存儲器上的A15~A8)功數據地址寄存器高8位DPH保存時間長,無須鎖存。
四、P3端口的結構及工作原理
P3口是一個多功能口,它除了可以作為I/O口外,還具有第二功能,P3端口的一位結構見下圖。
由上圖可見,P3端口和Pl端口的結構相似,區別僅在于P3端口的各端口線有兩種功能選擇。當處于第一功能時,第二輸出功能線為1,此時,內部總線信號經鎖存器和場效應管輸入/輸出,其作用與P1端口作用相同,也是靜態準雙向I/O端口。當處于第二功能時,鎖存器輸出1,通過第二輸出功能線輸出特定的內含信號,在輸入方面,即可以通過緩沖器讀入引腳信號,還可以通過替代輸入功能讀入片內的特定第二功能信號。由于輸出信號鎖存并且有雙重功能,故P3端口為靜態雙功能端口。
P3口的特殊功能(即第二功能):
使P3端品各線處于第二功能的條件是:
1、串行I/O處于運行狀態(RXD,TXD);
2、打開了處部中斷(INT0,INT1);
3、定時器/計數器處于外部計數狀態(T0,T1)
4、執行讀寫外部RAM的指令(RD,WR)
在應用中,如不設定P3端口各位的第二功能(WR,RD信叼的產生不用設置),則P3端口線自動處于第一功能狀態,也就是靜態I/O端口的工作狀態。在更多的場合是根據應用的需要,把幾條端口線設置為第二功能,而另外幾條端口線處于第一功能運行狀態。在這種情況下,不宜對P3端口作字節操作,需采用位操作的形式。
端口的負載能力和輸入/輸出操作:
P0端口能驅動8個LSTTL負載。如需增加負載能力,可在P0總線上增加總線驅動器。P1,P2,P3端口各能驅動4個LSTTL負載。
前已述及,由于P0-P3端口已映射成特殊功能寄存器中的P0一P3端口寄存器,所以對這些端口寄存器的讀/寫就實現了信息從相應端口的輸入/輸出。例如:
MOV A, P1 ;把Pl端口線上的信息輸入到A
MoV P1, A ;把A的內容由P1端口輸出
MOV P3, #0FFH ;使P3端口線各位置l
這里我們已將51單片機的4個8位的并行口跟大家一起來分析了一下~
三、編碼及譯碼器工作原理分析
這里主要簡單介紹下,學過數字電路對編碼譯碼了解的朋友可以跳過這部分。
把所使用的每一種二進制代碼狀態都賦于特定的含義,表示一個特定的信號或對象,叫編碼。如用四位二進制數的0000~1001這十種狀太,分別表示0~9這十個十進制數碼,稱為8421編碼。反過來把代碼的特定含義翻譯出來,稱為譯碼。
計算機在處理各種文字符號或數碼時,必須把這些信息進行二進制編碼,在編碼時所使用的第一種二進制代碼狀態都賦予了特定的含義,即表示一個確定的信號或者對象,實現這種功能的電路叫編碼器,如用于鍵盤的BCD碼,ASCII碼編碼器等。
單片機外圍電路用譯碼器較多,所以在這節課我們主要與大家一起來學習下譯碼器的工作原理(購買了本站產品的朋友,在我們配套的多媒體教學光盤中有相關的教學內容,建議大家觀看),把代碼的含義‘翻譯’成相應的輸出信號,以表示其原意。其功能恰恰與編碼器相反。
譯碼器可以將輸入代碼的狀態翻譯成相應的輸出信號,以高、低電平的形式在各自的輸出端口送出,以表示其意愿。譯碼器有多個輸入端和多個輸出端。假如輸入的端個數為,每個輸出端只能有兩個狀態,則輸出端個數最多有2n個。常用譯碼器輸入、輸出端頭數來稱呼譯碼器,如3線-8線譯碼器,4線-10線譯碼器等。我們經常用到的74138就是一個三線-八線譯碼器,朋友們可以到百度搜索74138的中文資料。
編碼、譯碼的概念我們了解下,下面我們就來重點來講一下三-八譯碼器的工作原理,這在我們51單片機的接口電路中也是經常用到的。
74138的工作原理如下圖所示:
從上圖可看出,74138有三個輸入端:A0、A1、A2和八個輸出端Q0~Q7。當輸入端A0、A1、A2的編碼為000時,譯碼器輸出為Q0=0,而Q1~Q7=1。即Q0對應于A0、A1、A2為000狀態,低電平有效。A0、A1、A2的另外7種組合見后面的真值表。
圖中S1、S2、S3為使能控制端,起到控制譯碼器是否能進行譯碼的作用。只有S1為高電平,S2、S3均為低電平時,才能進行譯碼,否則不論輸入羰輸入為何值,每個輸出端均為1。
下圖是輸入端A0、A1、A2為000,控制端S1=1、S1=0、S2=0的電平示意圖(紅色數字為端口電平),大家可按下圖進行分析,也可以分析輸出端另外七種組合時的輸出情況。
四、51單片機CPU結構分析
在前面的文章里我們已知道了單片機內部有一個8位的CPU,同時知道了CPU內部包含了運算器,控制器及若干寄存器。在這節課,我們就與大家一起來討論一下51單片機CPU的內部結構及工作原理。
從上圖中我們可以看到,在虛線框內的就是CPU的內部結構了,8位的MCS-51單片機的CPU內部有數術邏輯單元ALU(Arithmetic Logic Unit)、累加器A(8位)、寄存器B(8位)、程序狀態字PSW(8位)、程序計數器PC(有時也稱為指令指針,即IP,16位)、地址寄存器AR(16位)、數據寄存器DR(8位)、指令寄存器IR(8位)、指令譯碼器ID、控制器等部件組成。
1、運算器(ALU)的主要功能
A)算術和邏輯運算,可對半字節(一個字節是8位,半個字節就是4位)和單字節數據進行操作。
B)加、減、乘、除、加1、減1、比較等算術運算。
C)與、或、異或、求補、循環等邏輯運算。
D)位處理功能(即布爾處理器)。
由于ALU內部沒有寄存器,參加運算的操作數,必須放在累加器A中。累加器A也用于存放運算結果。
例如:執行指令 ADD A,B
執行這條指令時,累加器A中的內容通過輸入口In_1輸入ALU,寄存器B通過內部數據總線經輸入口In_2輸入ALU,A+B的結果通過ALU的輸出口Out、內部數據總線,送回到累加器A。
2、程序計數器PC
PC的作用是用來存放將要執行的指令地址,共16位,可對64K ROM直接尋址,PC低8位經P0口輸出,高8位經P2口輸出。也就是說,程序執行到什么地方,程序計數器PC就指到哪里,它始終是跟躥著程序的執行。我們知道,用戶程序是存放在內部的ROM中的,我們要執行程序就要從ROM中一個個字節的讀出來,然后到CPU中去執行,那么ROM具體執行到哪一條呢?這就需要我們的程序計數器PC來指示。
程序計數器PC具有自動加1的功能,即從存儲器中讀出一個字節的指令碼后,PC自動加1(指向下一個存儲單元)。
3、指令寄存器IR
指令寄存器的作用就是用來存放即將執行的指令代碼。
在這里我們先簡單的了解下CPU執行指令的過程,首先由程序存儲器(ROM)中讀取指令代碼送入到指令寄存器,經譯碼器譯碼后再由定時與控制電路發出相應的控制信號,從而完成指令的功能。關于指令在單片機內部的執行過程,我們在后面將會在后面的文章里進行詳細的講解。
4、指令譯碼器ID
用于對送入指令寄存器中的指令進行譯碼,所謂譯碼就是把指令轉變成執行此指令所需要的電信號。當指令送入譯碼器后,由譯碼器對該指令進行譯碼,根據譯碼器輸出的信號,CPU控制電路定時地產生執行該指令所需的各種控制信號,使單片機正確的執行程序所需要的各種操作。
5、地址寄存器AR(16位)
AR的作用是用來存放將要尋址的外部存儲器單元的地址信息,指令碼所在存儲單元的地址編碼,由程序計數器PC產生,而指令中操作數所在的存儲單元地址碼,由指令的操作數給定。從上圖中我們可以看到,地址寄存器AR通過地址總線AB與外部存儲器相連。
6、數據寄存器DR
用于存放寫入外部存儲器或I/O端口的數據信息。可見,數據寄存器對輸出數據具有鎖存功能。數據寄存器與外部數據總線DB直接相連。
7、程序狀態字PSW
用于記錄運算過程中的狀態,如是否溢出、進位等。
例如,累加器A的內容83H,執行:
ADD A,#8AH ;累加器A與立即數8AH相加,并把結果存放在A中。
指令后,將產生和的結果為[1]0DH,而累加器A只有8位,只能存放低8位,即0DH,元法存放結果中的最高位B8。為些,在CPU內設置一個進位標志位C,當執行加法運算出現進位時,進位標志位C為1。
8、時序部件
由時鐘電路和脈沖分配器組成,用于產生微操作控制部件所需的定時脈沖信號
五、存儲器的存儲原理
存儲器:用來存放計算機中的所有信息:包括程序、原始數據、運算的中間結果及最終結果等。
只讀存儲器(ROM):只讀存儲器在使用時,只能讀出而不能寫入,斷電后ROM中的信息不會丟失。因此一般用來存放一些固定程序,如監控程序、子程序、字庫及數據表等。ROM按存儲信息的方法又可分為以下幾種:
1、掩膜ROM:
掩膜ROM也稱固定ROM,它是由廠家編好程序寫入ROM(稱固化)供用戶使用,用戶不能更改內部程序,其特點是價格便宜。
2、可編程的只讀存儲器(PROM):
它的內容可由用戶根據自已所編程序一次性寫入,一旦寫入,只能讀出,而不能再進行更改,這類存儲器現在也稱為OTP(Only Time Programmable)。
3、可改寫的只讀存儲器EPROM:
前兩種ROM只能進行一次性寫入,因而用戶較少使用,目前較為流行的ROM芯片為EPROM。因為它的內容可以通過紫外線照射而徹底擦除,擦除后又可重新寫入新的程序。
4、可電改寫只讀存儲器(EEPROM):
EEPROM可用電的方法寫入和清除其內容,其編程電壓和清除電壓均與微機CPU的5V工作電壓相同,不需另加電壓。它既有與RAM一樣讀寫操作簡便,又有數據不會因掉電而丟失的優點,因而使用極為方便。現在這種存儲器的使用最為廣泛。
隨機存儲器(RAM):
這種存儲器又叫讀寫存儲器。它不僅能讀取存放在存儲單元中的數據,還能隨時寫入新的數據,寫入后原來的數據就丟失了。斷電后RAM中的信息全部丟失。因些,RAM常用于存放經常要改變的程序或中間計算結果等信息。
RAM按照存儲信息的方式,又可分為靜態和動態兩種:
1、靜態SRAM:其特點是只要有電源加于存儲器,數據就能長期保存。
2、動態DRAM:寫入的信息只能保存若干ms時間,因此,每隔一定時間必須重新寫入一次,以保持原來的信息不變。
可現場改寫的非易失性存儲器:
這種存儲器的特點是:從原理上看,它們屬于ROM型存儲器,從功能上看,它們又可以隨時改寫信息,作用又相當于RAM。所以,ROM、RAM的定義和劃分已逐漸的失去意義。
1、快擦寫存儲器(FLASH)
這種存儲器是在EPROM和EEPROM的制造基礎上產生的一種非易失性存儲器。其集成度高,制造成本低于DRAM,既具有SRAM讀寫的靈活性和較快的訪問速度,又具有ROM在斷電后可不丟失信息的特點,所以發展迅速。
2、鐵電存儲器FRAM
它是利用鐵電材料極化方向來存儲數據的。它的特點是集成度高,讀寫速度快,成本低,讀寫周期短。
通過前面的學習,我們已知道存儲器是計算機的重組成部份。存儲器是由大量緩沖寄存器組成的,其用途是存放程序和數據,使計算機具有記憶功能。這些程序和數據在存儲器中是以二進制代碼表示的。根據計算機的命令,按照指定地址,可以把代碼取出來或存入新代碼。
在這,我們的學習重點就是來研究一下存儲器的內部結構、工作原理及其存儲器的主要的技術指標。
第一個要學習的問題:存儲器單元和存儲單元地址:
存儲器是由大量寄存器組成的,其中每一個寄存器就稱為一個存儲單元。它可存放一個有獨立意義的二進制代碼。一個代碼由若干位(bit)組成,代碼的位數稱為位長,習慣上也稱為字長。
每個存儲單元存放幾位二進制數呢?一般情況下,計算機中一個代碼的位數和它的算術運算單元的位數是相同的。例如,8051單片機中算術單元是8位,則字長就是8位。在計算機中把一個8位的二進制代碼稱為一個字節(Byte),常寫為B。對于一個8位二進制代碼的最低位稱為第0位(位0),最高位稱為第7位(位7)。
在計算機中的存儲器往往有成千上萬個存儲單元,為了使存入和取出不發生混淆,必須給每個存儲單元一個唯一的固定編號,這個編號就稱為存儲單元的地址。因為存儲單元的數量很大,我們不可能每個存儲單元都把線引到外部,如果每個存儲單元都引根線到外部,那一個8位的單片機就需外向外部引出65536根線了,這在現實中是不可能的。為了減少存儲器向外引出的地址線,在存儲器內部都帶有譯碼器。根據二進制編碼、譯碼的原理,除地線公用之外,n根導線可以譯成2n個地址號。例如,當地址線為3根時,可以譯成23=8個地址號;地址線為3根時,可以譯成28=256個地址號。依此類推,在8051單片機中有16根地址線,也就是說在8051單片機中有216=65 536個地址號,地址號的多少就是我們尋址范圍的大小,也就是前面我們提到過的8051單片機的尋址范圍是64K。
從上面的介紹可以看出,存儲單元地址和這個存儲單元的內容含義是不同的。存儲單元如同一個旅館的每個房間;存儲單元地址則相當于每個房間的房間號;存儲單元內容(二進制代碼)就相當于這個房間的房客。
前面我們已講過,8051的單片機有16根地址線,它的存儲地址有216=65 536個,這么多的存儲地址,而地址線卻只有16根,我們怎么用16根地址線來控制這6萬多個存儲地址呢?接下來我們就這個問題與大家一起做個探討:在上節課《第九課:51單片機CPU的結構》時我們已知道,在51單片機的內部有一個叫做譯碼器的部件。用16根地址線來控制65536個存儲地址,就是用譯碼來實現的。
我們知道,計算機可以進行數學運算,這可令我們非常的難以理解,計算機嗎,里面只不過是一些電子元件組成的,怎能么可以進行數學運算呢?我們做數學題時如25+36是這樣做的,先在紙上寫25,然后在下面寫36,然后大腦運算,最后寫出結果,運算的原材料:25、36和結果61都是寫在紙上的。計算機中又是怎樣存放的呢?為了解決定個問題,我們先做一個實驗:
下面有一盞燈,我們知道燈要么亮,要么不亮,就有兩種狀態,我們可以用“0”和“1”來代替這兩種狀態,規定亮為“1”,不亮為“0”。南以上兩盞燈,一共有幾種狀態呢?
上面已例出,兩盞燈可以表達成00 01 10 11四種狀態,那么三盞燈呢?
三盞燈應該就是可以表達成000 001 010 011 100 101 110 111八種狀態,
如果是八盞燈呢?那么其狀就表達就是00000000 00000001 00000010。。。。。11111111 共256種狀態。
我們來看,上面這些000 001 010。。。。等等這些數不就是我們學過的二進制數嗎?本來燈的亮滅是一種物理現象,可當我們把它們按一定的順序排列好后,燈的亮和滅就代表數字了。讓我們再抽象一步,燈為什么會亮呢?是因為輸出電路輸出高電平,給燈通了電。因此,燈亮和滅就可以用電路的輸出是高電平還是低電平來代替了。這樣,數字就和電平的高、低聯系上了。
位的含義:通過上面的實驗我們已知道:一盞燈亮或者說一根線的電平的高低,可以代表兩種狀態:0和1。實際上這就是一個二進制位,困此我們把一根線(或者一盞燈)稱為一“位”,用BIT表示。
字節的含義:一根線可以表示0和1,兩根線可以表達00,01,10,11四種狀態,也就是可以表示0到3,而三根給可以表達0至7,計算機中通常用8根線放在一起,同時計數,就可以表達到0~255共256種狀態。這8根線或者8位就稱之為一個字節(BYTE)。不要問我為什么是8根而不是其它數,因為我也不知道。(計算機是一個人造的世界,不是自然界,很多事情無法問為什么,只能說:字是一種規定,大家在以后的學習過程中也要注意這個問題)。
存儲器是用來存放數據的地方。它是利用電平的高低來存放數據的。也就是說,它存放的實際上是電平的高、低,而不是我們習慣認為的1234這樣的數字。下面我們就來看看,單片機內的存儲器是怎樣來尋址的,也就是怎么來找到我們存放在存儲器內的數據。
MCS-51單片機在物理結構上有四個存儲空間:
1、片內程序存儲器
2、片外程序存儲器
3、片內數據存儲器
4、片外數據存儲器
但在邏輯上,即從用戶的角度上,8051單片機有三個存儲空間:
1、片內外統一編址的64K的程序存儲器地址空間
2、256B的片內數據存儲器的地址空間
3、以及64K片外數據存儲器的地址空間
在訪問三個不同的邏輯空間時,應采用不同形式的指令(具體我們在后面的指令系統學習時將會講解),以產生不同的存儲器空間的選通信號。
程序存儲器
一個微處理器能夠聰明地執行某種任務,除了它們強大的硬件外,還需要它們運行的軟件,其實微處理器并不聰明,它們只是完全按照人們預先編寫的程序而執行之。那么設計人員編寫的程序就存放在微處理器的程序存儲器中,俗稱只讀程序存儲器(ROM)。程序相當于給微處理器處理問題的一系列命令。其實程序和數據一樣,都是由機器碼組成的代碼串。只是程序代碼則存放于程序存儲器中。
MCS-51具有64kB程序存儲器尋址空間,它是用于存放用戶程序、數據和表格等信息。對于內部無ROM的8031單片機,它的程序存儲器必須外接,空間地址為64kB,此時單片機的 端必須接地。強制CPU從外部程序存儲器讀取程序。對于內部有ROM的8051等單片機,正常運行時, 則需接高電平,使CPU先從內部的程序存儲中讀取程序,當PC值超過內部ROM的容量時,才會轉向外部的程序存儲器讀取程序。
當 =1時,程序從片內ROM開始執行,當PC值超過片內ROM容量時會自動轉向外部ROM空間。
當 =0時,程序從外部存儲器開始執行,例如前面提到的片內無ROM的8031單片機,在實際應用中就要把8031的 引腳接為低電平。
8051片內有4kB的程序存儲單元,其地址為0000H—0FFFH,單片機啟動復位后,程序計數器的內容為0000H,所以系統將從0000H單元開始執行程序。但在程序存儲中有些特殊的單元,這在使用中應加以注意:
其中一組特殊是0000H—0002H單元,系統復位后,PC為0000H,單片機從0000H單元開始執行程序,如果程序不是從0000H單元開始,則應在這三個單元中存放一條無條件轉移指令,讓CPU直接去執行用戶指定的程序。
另一組特殊單元是0003H—002AH,這40個單元各有用途,它們被均勻地分為五段,它們的定義如下:
0003H—000AH 外部中斷0中斷地址區。
000BH—0012H 定時/計數器0中斷地址區。
0013H—001AH 外部中斷1中斷地址區。
001BH—0022H 定時/計數器1中斷地址區。
0023H—002AH 串行中斷地址區。
可見以上的40個單元是專門用于存放中斷處理程序的地址單元,中斷響應后,按中斷的類型,自動轉到各自的中斷區去執行程序。從上面可以看出,每個中斷服務程序只有8個字節單元,用8個字節來存放一個中斷服務程序顯然是不可能的。因此以上地址單元不能用于存放程序的其他內容,只能存放中斷服務程序。但是通常情況下,我們是在中斷響應的地址區安放一條無條件轉移指令,指向程序存儲器的其它真正存放中斷服務程序的空間去執行,這樣中斷響應后,CPU讀到這條轉移指令,便轉向其他地方去繼續執行中斷服務程序。
下圖是ROM的地址分配圖:
從上圖中大家可以看到,0000H-0002H,只有三個存儲單元,3個存儲單元在我們的程序存放時是存放不了實際意義的程序的,通常我們在實際編寫程序時是在這里安排一條ORG指令,通過ORG指令跳轉到從0033H開始的用戶ROM區域,再來安排我們的程序語言。從0033開始的用戶ROM區域用戶可以通過ORG指令任意安排,但在應用中應注意,不要超過了實際的存儲空間,不然程序就會找不到。
數據存儲器
數據存儲器也稱為隨機存取數據存儲器。數據存儲器分為內部數據存儲和外部數據存儲。MCS-51內部RAM有128或256個字節的用戶數據存儲(不同的型號有分別),片外最多可擴展64KB的RAM,構成兩個地址空間,訪問片內RAM用“MOV”指令,訪問片外RAM用“MOVX”指令。它們是用于存放執行的中間結果和過程數據的。MCS-51的數據存儲器均可讀寫,部分單元還可以位尋址。
MCS-51單片機的內部數據存儲器在物理上和邏輯上都分為兩個地址空間,即:
數據存儲器空間(低128單元);
特殊功能寄存器空間(高128單元);
這兩個空間是相連的,從用戶角度而言,低128單元才是真正的數據存儲器。下面我們就來詳細的與大家講解一下:
低128單元:
片內數據存儲器為8位地址,所以最大可尋址的范圍為256個單元地址,對片外數據存儲器采用間接尋址方式,R0、R1和DPTR都可以做為間接尋址寄存器,R0、R1是8位的寄存器,即R0、R1的尋址范圍最大為256個單元,而DPTR是16位地址指針,尋址范圍就可達到64KB。也就是說在尋址片外數據存儲器時,尋址范圍超過了256B,就不能用R0、R1做為間接尋址寄存器,而必須用DPTR寄存器做為間接尋址寄存器。
從上圖中我們可以看到,8051單片機片內RAM共有256個單元(00H-FFH),這256個單元共分為兩部分。其一是地址從00H—7FH單元(共128個字節)為用戶數據RAM。從80H—FFH地址單元(也是128個字節)為特殊寄存器(SFR)單元。從圖1中可清楚地看出它們的結構分布。
1、通用寄存器區(00H-1FH)
在00H—1FH共32個單元中被均勻地分為四塊,每塊包含八個8位寄存器,均以R0—R7來命名,我們常稱這些寄存器為通用寄存器。這四塊中的寄存器都稱為R0—R7,那么在程序中怎么區分和使用它們呢?聰明的INTEL工程師們又安排了一個寄存器——程序狀態字寄存器(PSW)來管理它們,CPU只要定義這個寄存的PSW的D3和D4位(RS0和RS1),即可選中這四組通用寄存器。對應的編碼關系如下表所示。惹程序中并不需要用4組,那么其余的可用做一般的數據緩沖器,CPU在復位后,選中第0組工作寄存器。
2、位尋址區(20H-2FH)
片內RAM的20H—2FH單元為位尋址區,既可作為一般單元用字節尋址,也可對它們的位進行尋址。位尋址區共有16個字節,128個位,位地址為00H—7FH。位地址分配如下表所示:
CPU能直接尋址這些位,執行例如置“1”、清“0”、求“反”、轉移,傳送和邏輯等操作。我們常稱MCS-51具有布爾處理功能,布爾處理的存儲空間指的就是這些為尋址區。
3、用戶RAM區(30H-7FH)
在片內RAM低128單元中,通用寄存器占去32個單元,位尋址區占去16個單元,剩下的80個單元就是供用戶使用的一般RAM區了,地址單元為30H-7FH。對這部份區域的使用不作任何規定和限制,但應說明的是,堆棧一般開辟在這個區域。
高128單元:(80H-FFH)
前面提到,在片內的RAM中,高128位是專用寄存器區,因這節比較重要,所以我們單獨的安排一節課跟大家介紹。下節課我們就重點介紹51單片機片內RAM的高128位,即專用寄存器區。
-
存儲器
+關注
關注
38文章
7598瀏覽量
165691 -
cpu
+關注
關注
68文章
10995瀏覽量
214849 -
51單片機
+關注
關注
275文章
5707瀏覽量
125650
原文標題:51單片機CPU結構、串行口、I/O腳、編碼及譯碼器&存儲器的存儲工作原理分析
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
學習目錄-STC-51單片機(15系列,51的升級版)精選資料分享
詳細分析stm32f10x.h
MCS-51單片機硬件結構各部件的詳細介紹和功能資料免費下載

使用51單片機實現平衡智能小車的個各部件的程序合集免費下載

基于Boonton功率表的脈沖射頻部件及系統的詳細分析

詳解51單片機基本硬件結構

單片機定時器一1ms12MHz_51單片機CPU結構各部件的原理詳細分析

評論