8051单晶片原理与程式设计_第1页
8051单晶片原理与程式设计_第2页
8051单晶片原理与程式设计_第3页
8051单晶片原理与程式设计_第4页
8051单晶片原理与程式设计_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

單晶片原理與程式設計

第一章

單晶片微電腦簡介

第二章

程式與編譯

第三章

8051單晶片程式指令

第四章

暫存器與資料記憶體

第五章

8051基本電路與輸出輸入實例

第六章

計時/計數器

第七章

中斷服務與中斷設定

第八章

串列埠

第一章單晶片微電腦簡介1.1 微電腦硬體結構 微電腦硬體結構包含中央處理單元、記憶體單元、輸入單元與輸出單元等四個主要單元,其結構關係則如下圖所示。

其中,中央處理單元則是由運算單元與控制單元兩部分所組成的單元,即是一般所通稱的CPU(CenterProcessingUnit),此為微電腦最重要的部分。以下就微電腦中各單元的功能做簡單介紹:1.運算單元(ArithmeticLogicUnit,簡稱ALU)運算單元又稱為算數邏輯單元,在中央處理單元中可用於執行算數運算,(如:加、減、乘、除等),以及邏輯運算(如:AND、OR、NOT等),能將記憶體單元或輸入單元送至中央處理單元的資料執行各種運算。當運算完成後再由控制單元將結果資料送至記憶體單元或輸出單元。2.控制單元(ControlUnit,簡稱CU)此單元在中央處理單元中,負責協調與指揮各單元間的資料傳送與運作,使得微電腦可依照指令的要求完成工作。在執行一個指令時,控制單元先予以解碼(Decode),瞭解指令的動作意義後再執行(Execute)該指令,因此控制單元將指令逐一執行,直到做完整個程式的所有指令為止。3.輸入單元(InputUnit,簡稱IU)此單元是用以將外部的資訊傳送到CPU做運算處理或存入記憶體單元,一般在為電腦的輸入單元有鍵盤、磁碟機、光碟機、滑鼠、光筆、掃描器或讀卡機等週邊設備。4.輸出單元(OutputUnit,簡稱OU)此單元是用以將CPU處理過的資料輸出或儲存傳送外部週邊設備,一般在為電腦的輸出單元有顯示器、印表機、繪圖機、燒錄機或磁碟機等週邊設備。5.記憶體單元(MemoryUnit,簡稱MU)記憶體單元是用來儲存輸入單元傳送來的資料,或儲存經過中央處理單元處理完成的資料。記憶體單元之記憶體可分為主記憶體(MainMemory)與輔助記憶體(AuxiliaryMemory)兩種,而主記憶體依存取方式不同,又可分為唯讀記憶體(ReadOnlyMemory,簡稱ROM)與隨機存取記憶體(RandomAccessMemory,簡稱RAM)。ROM所儲存的資料,在微電腦中只能被讀出但不能被寫入,也不會因為關機斷電而使資料流失;至於RAM在微電腦中,則可被讀出或寫入資料,但在關機斷電後儲存於RAM中的資料將會流失。輔助記憶體則是指磁片、硬碟或磁帶等週邊硬體,一般亦為輸出入單元,主要用來彌補主記憶體的不足,其容量可無限制擴充。1-28051單片的內部結構:8051為Intel公司所推出的MCS-51系列產品之一,其內部結構如下:

8051單片具有以下之特性:1.

專為控制使用所設計的8位元單晶片。2.

具有位元邏輯運算能力。3.

具有128位元的RAM,以及4K位元的ROM。4.

具有4個8位元I/O埠。5.

具有2個16位元的計時/計數器。6.

具有全雙工的UART。7.

具有5個中斷源及兩層中斷優先權結構。8.

具有時脈產生電路。

具有外部電路擴充64位元程式記憶體的能力。1-38051單晶片的接腳:8051為40支接腳之單晶片,其接腳圖與功能說明如下:1.

Vcc:+5電源供應接腳。2.

GND:接地接腳。

3.P0.0~P0.7:埠0,為開洩極(OpenDrain)雙向I/O埠。在做為外部擴充記憶體時,可低八位元位址線

(A0~A7addressline)與資料匯流排(databus)雙重功能。在做為一般I/O埠時必須加上如下之外部提升電路。4.

P1.0~P1.7:埠1,為具有內部提升電路的雙向I/O埠。5.

P2.0~P2.7:埠2,為具有內部提升電路的雙向I/O埠。在做為外部擴充記憶體時,可為高八位元位址線(A8~A15addressline)。6.

P3.0~P3.7:埠3,為具有內部提升電路的雙向I/O埠。此外,埠3的每支接腳都具有另一特殊功能,其功能如下:RXD(P3.0):串列傳輸的接收端。TXD(P3.1):串列傳輸的輸出端。(P3.2):外部中斷輸入端。(P3.3):外部中斷輸入端。T0(P3.4):計時/計數器外部輸入端。T1(P3.5):計時/計數器外部輸入端。(P3.6):外部資料記憶體寫入激發信號(Strobe)。(P3.7):外部資料記憶體讀取激發信號(Strobe)。7.

RST:重置信號(Reset)輸入端。在單晶片工作時,將此腳保持在“Hi”兩個機械週期,CPU將重置。8.

ALE:位址鎖住致能(AddressLatchEnable),在每個機械週期都會出現,可做為外部電路的時脈源。9.

:程式激發致能(ProgramStrobeEnable),可輸入外部程式記憶體的讀取信號。10.

:外部存取致能(ExternalAccessEnable),當EA接腳為“L0”時,則讀取外部程式記憶體執行。11.

XTAL1:反相振盪放大器的輸入端。

12.XTAL2:反相振盪放大器的輸出端。其基本電路連接如下:基本電路圖12MHz8051XTAL1XTAL2RST193118912MHz8051XTAL1XTAL2RST1931189

第二章

程式與編譯§2-1程式編寫流程8051單晶片應用於控制上時,整體系統的設計包括軟體程式及硬體電路兩方面。硬體電路設計是依受控系統之不同而異,雖然有時候系統的某些功能可以採用軟體或硬體來完成,但在考量硬體成本及8051單晶片運算能力所及程度,以軟體程式來完成為較佳方法。對於8051單晶片之編譯流程如下:

編譯流程圖

§2-28051組合語言程式的格式8051組合語言程式是由一列一列的敘述(statement)所組成,而程式的執行則須先經8051組譯器編譯後,並經燒錄器燒錄至8051單晶片中方可執行。而8051組合語言的格式則是由4個欄位所構成,其格式如下:〔Label〕〔Mnemonic〕〔Operand〕〔Comment〕標記欄

指令欄

運算元欄註解欄1.

標記欄(Label)標記的功用是用以替代繁複的記憶體位址計算,以方便程式的編寫、分析與維護。標記的編寫必須從文書編輯軟體的第一格開始,標記可以由英文字母、阿拉伯數字、問號及底線字元組合而成,長度最多可以達32個位元,最後必須以冒號來結束。2.

指令欄(Mnemonic)指令可分為兩種,一種是8051單片指令,另一種則是編譯程式的虛指令,用以通知編譯器對程式作某些特定的處理。如果一列指令開頭沒有標記時,則指令前必須保留一個以上的空格。3.

運算元欄(Operand)運算元依指令決定需要與否,且其需要長度亦依指令而異。4.

註解欄(Comment)

註解欄是以分號起頭的一段說明文字,直到該行結束。可提供程式設計師註解說明。

第三章

8051單晶片程式指令8051單晶片程式指令依其功能,可分為以下5類:1.

算術指令2.

邏輯指令3.

資料轉移指令4.

布林(Boolean)運算指令5.

程式跳躍指令以下就上列指令;分別說明每個指令動作、佔用的位元數及執行時間週期:指令表

指令符號定義符號說明Rn所選擇暫存器庫中之R0~R7,n=0~7。direct直接定址位址。@Ri間接定址位址,i=0或1。#data8位元資料常數。#data1616位元資料常數。addr1111位元位址常數,使用於ACALL及AJMP指令。addr1616位元位址常數,使用於LCALL及LJMP指令。rel8位元偏移位址常數,使用於SJMP及相對跳躍指令中。bit位元定址位址。←以右方資料取代左方資料。(X)將X內容取出。((X))以X內容為位址,以間接定址方式取出資料。rrrn之2進制值。如n=6,rrr=110。符號定義算數運算指令指令說明位元組機械週期ADDA,Rn將暫存器內容加入A累加器11ADDA,direct將直接位址內容加入A累加器21ADDA,@Ri將間接位址內容加入A累加器11ADDA,#data將8位元常數資料加入A累加器21ADDCA,Rn將暫存器與進位CF加入A累加器11ADDCA,direct直接位址內容與進位CF加入累加器21ADDCA,@Ri間接位址內容與進位CF加入累加器11ADDCA,#data將8位元常數資料與進位加入累加器21SUBBA,RnA累加器內容減暫存器與借位CF11SUBBA,directA累加器內容減直接位址內容與借位21SUBBA,@RiA累加器內容減間接位址內容與借位11SUBBA,#data累加器內容減8位元常數資料與借位21INCAA累加器內容加111INCRn暫存器內容加111INCdirect直接位址內容加121INC@Ri間接位址內容加111INCDPTR資料指標DPTR內容加112DECAA累加器內容減111DECRn暫存器內容減111DECdirect直接位址內容減121DEC@Ri間接位址內容減111MULABA累加器乘以暫存器B,相乘結果之高8位元存入B,低8位元存入A14DIVABA累加器除以暫存器B,相除結果之商存入A,餘數存入B14DAAA累加器內容調整成10進制BCD數11算數運算指令

邏輯運算指令指令說明位元組機械週期ANLA,Rn暫存器AND至A累加器內11ANLA,direct直接位址內容AND至A累加器內21ANLA,@Ri間接位址內容AND至A累加器內11ANLA,#data8位元資料AND至A累加器內21ANLdirect,AA累加器內容AND至直接位址內21ANLdirect,#data8位元資料AND至直接位址內32ORLA,Rn暫存器OR至A累加器內11ORLA,direct直接位址內容OR至A累加器內21ORLA,@Ri間接位址內容OR至A累加器內11ORLA,#data8位元資料OR至A累加器內21ORLdirect,AA累加器內容OR至直接位址內21ORLdirect,#data8位元資料OR至直接位址內32XRLA,Rn暫存器XOR至A累加器內11XRLA,direct直接位址內容XOR至A累加器內21XRLA,@Ri間接位址內容XOR至A累加器內11XRLA,#data8位元資料XOR至A累加器內21XRLdirect,AA累加器內容XOR至直接位址內21XRLdirect,#data8位元資料XOR至直接位址內32CLRA清除A累加器11CPLAA累加器內容取補數11RLAA累加器內容向左旋轉1位元11RLCAA累加器與進位CF一起左旋1位元11RRAA累加器內容向右旋轉1位元11RRCAA累加器與進位CF一起右旋1位元11SWAPAA累加器的高低4位元互相交換11邏輯運算指令

資料轉移指令指令說明位元組機械週期MOVA,Rn將暫存器內容移入A累加器11MOVA,direct將直接位址內容移入A累加器21MOVA,@Ri暫存器間接位址內容移入A累加器11MOVA,#data將8位元常數資料移入A累加器21MOVRn,A將A累加器內容移入暫存器11MOVRn,direct將直接位址內容移入暫存器22MOVRn,#data將8位元常數資料移入暫存器21MOVdirect,A將A累加器內容移入直接位址內21MOVdirect,Rn將暫存器內容移入直接位址內22MOVdirect,direct將直接位址內容移入直接位址內32MOVdirect,@Ri暫存器間接定址內容移入直接位址內22MOVdirect,#data將8位元常數資料移入直接位址內32MOV@Ri,A將A累加器內容移入間接位址內11MOV@Ri,direct將直接位址內容移入間接位址內22MOV@Ri,#data將8位元常數資料移入間接位址內21MOVDPTR,#data16將16位元常數資料移入資料指標內32MOVCA,@A+DPTR將程式記憶體內容移入A累加器內12MOVCA,@A+PC將程式記憶體內容移入A累加器內12MOVXA,@Ri將外部資料記憶體內容移入A累加器12MOVXA,@DPTR將外部資料記憶體內容移入A累加器12MOVX@Ri,A將A累加器內容移入外部資料記憶體12MOVX@DPTR,A將A累加器內容移入外部資料記憶體12PUSHdirect將直接位址內容存入堆疊內22POPdirect自堆疊頂端取出資料存入直接位址內22XCHA,RnA累加器內容與暫存器內容互換11XCHA,directA累加器內容與直接位址內容互換21XCHA,@RiA累加器內容與間接位址內容互換11XCHDA,@Ri累加器與間接位址低4位元內容互換11資料轉移指令布林運算指令指令說明位元組機械週期CLRC清除進位旗標CF=011CLRbit清除位元位址內容21SETBC設定進位旗標CF=111SETBbit設定位元位址內容21CPLC將進位旗標CF內容取補數11CPLbit將位元位址內容取補數21ANLC,bit將位元位址內容AND至CF內21ANLC,/bit將位元位址內容取補數AND至CF內22ORLC,bit將位元位址內容OR至CF內22ORLC,/bit將位元位址內容取補數OR至CF內22MOVC,bit將位元位址內容移入進位旗標CF內21MOVbit,C將進位旗標CF移入位元位址內22JCrel若CF=1,則跳至相對位址rel22JNCrel若CF=0,則跳至相對位址rel22JBbit,rel若(bit)=1,則跳至相對位址rel32JNBbit,rel若(bit)=0,則跳至相對位址rel32JBCbit,rel若(bit)=1,則跳至相對位址rel,同時清除位元位址bit內容32布林運算指令程式分支指令指令說明位元組機械週期ACALLaddrl1副程式呼叫(可定址2KB範圍)22ACALLaddrl6副程式呼叫(可定址64KB範圍)32RET自副程式返回主程式12RETI自中斷副程式返回主程式12AJMPaddrl1絕對跳躍(2KB範圍)32LJMPaddrl6遠程跳躍(64KB範圍)32SJMPrel相對跳躍(-128byte~+127byte)22JMP@A+DPTR間接跳躍(64KB範圍)12JZrel若A=0,則跳至rel位址範圍-128byte~+127byte22JNZrel若A≠0,則跳至rel位址範圍-128byte~+127byte22CJNEA,direct,rel若A累加器與直接位址內容不相等,則跳至rel位址範圍-128byte~+127byte32CJNEA,#data,rel若A≠data,則跳至rel位址,範圍-128byte~+127byte32CJNERn,#data,rel若暫存器內容≠data,則跳至rel位址範圍-128byte~+127byte32CJNE@Ri,#data,rel若間接位址內容≠data,則跳至rel位址,範圍-128byte~+127byte32DJNZRn,rel暫存器內容減1,若不等於0,則跳至rel位址22DJNZdirect,rel直接位址內容減1,若不等於0,則跳至rel位址32NOP無動作11程式分支指令資料表示形式:以資料的轉移為例,來說明直接資料、直接定址位址、間接定址位址的差異:1.

假設Acc的值為0,執行直接資料轉移。Mov A #FFH;十六進制值表示法(或 Mov A #255);十進制值表示法則Acc的值變為2552.

假設Acc的值為0,執行直接定址位址之資料轉移。Mov A #40H(或 Mov A #64)則Acc的值變為2553.

假設Acc的值為0,且記憶體位址40H的內容FFH與暫存器R0的內容為40H。Mov A @R0則Acc的值變為255以上三種資料轉移方式都會使Acc變為255以圖示來說明其差異:直接資料

AccFFH(或255)Acc間接定址位址

(暫存器)(內容)R0:40H(位址)(內容)40H:FFH直接定址定址

Acc(位址)(內容)40H:FFH

第四章暫存器與資料記憶體§4-1累加器累加器(Accumulator)一般以A或Acc簡稱,是使用頻率最高的暫存器,許多算數運算、邏輯運算及資料搬移等工作,都需要藉由累加器來完成。

§4-2工作暫存器在8051中共有8個8位元(bits)工作暫存器,分別為0、1、2、3、4、5、6及7。這些工作暫存器可用以輔助累加器在運算上的不足,如儲存即將被處理的資料,或已完成的結果及迴圈數值控制等。由於在撰寫較複雜程式尤其是呼叫副程式時,為了避免工作暫存器之內容遭到破壞,在8051中提供四個暫存器庫,分別為RB、RB1、RB及RB3,每一個暫存器庫均有個8位元工作暫存器,並可經由工作暫存器0~7來存取,但程式執行中只能選擇四個暫存器庫中的一個暫存器來使用,而其選擇方法則可透過設定RS1與RS0此兩位元來選擇:

RS1RS0暫存器庫位址

00RB000H~07H

01RB108H~0FH

10RB210H~17H

11RB318H~1FH

當8051選擇使用RB0時,程式中存取R0~R7暫存器的值,實際上是在存取資料記憶體位址00H~07H的內容;而使用RB1時,程式中存取R0~R7暫存器的值,實際上是在存取資料記憶體位址08H~0FH的內容;而使用RB2時,程式中存取R0~R7暫存器的值,實際上是在存取資料記憶體位址10H~17H的內容;而使用RB3時,程式中存取R0~R7暫存器的值,實際上是在存取資料記憶體位址18H~1FH的內容。所以在複雜程式中,主程式與副程式可分配使用不同暫存器庫,即可避免暫存器的值被破壞。§4-3輸出/輸入埠暫存器8051具有4個8位元(bits)的輸出輸入埠,經由這四個輸出輸入埠與外界進行資料交換因此在8051內部用個暫存器來記錄輸出/輸入接腳的狀態,分別為資料記憶體80H、90H、A0H、B0H等四個位元組(byte),並一輸出/輸入埠分別命名為P0、P1、P2及P3。當軟體程式對輸出輸入埠P0~3作輸出/輸入的動作,即是對80H、90H、A0H及B0H等四個位元組作寫入/讀出的動作。§4-4資料記憶體8051的記憶體可分為兩大部份,一是程式記憶體,即是使用者撰寫軟體程式的存放記憶體區塊;另一是資料記憶體,是用以存放程式執行結果所使用的記憶體。而在8051中暫存器與資料記憶體則是結合在一起,均存放在資料記憶體中,及結構如下圖所示:SFR的內部結構F8

FFF0B

F7E8

EFE0ACC

E7D8

DFD0PSW

D7C8

CFC0

C7B8IP

BFB0P3

B7A8IE

AFA0P2

A798SCONSBUF

9F90P1

9788TCONTMODTLOTL1TH0TH1

8F80P0SPDPL

PCON87此行記憶體位元組可做位元定址。在SFR內部結構圖中可以發現累加器Acc、四個輸出/輸入暫存器0、1、2及P3。其他暫存器的功能簡介如下:B:用於乘、除法中所使用到之暫存器。PSW(ProgramStatusWord):程式狀態字元暫存器。IP(InterruptPriorityRegister):中斷優先暫存器。IE(InterruptEnableRegister):中斷致能暫存器。SCON(SerialPortControlRegister):串列埠控制暫存器。SBUF(SerialPortBuffer):串列埠資料緩衝器。TCON(Timer/CounterControlRegister):計時/計數控制暫存器。TMOD(Timer/CounterModeControlRegister):計時/計數模式控制暫存器。TL0:Timer016位元計時/計數直之低8位元TL1:Timer116位元計時/計數直之低8位元TH0:Timer016位元計時/計數直之高8位元TH1:Timer116位元計時/計數直之高8位元SP(StackPointer):堆疊指標暫存器。DPL:DPTR(DataPointer)資料指標暫存器16位元值之低8位元值DPH:DPTR(DataPointer)資料指標暫存器16位元值之高8位元值PCON(PowerControlRegister):電源控制暫存器。SFR內各暫存器的值在8051重置(Reset)後,會自動設如下:暫存器二進位表示值*Acc00000000*B00000000*PSW00000000SP00000111DPTRDPHDPL

0000000000000000*P011111111*P111111111*P211111111*P311111111IPXXXX0000IE0XX00000TMOD00000000*TCOM00000000TH000000000TL000000000TH100000000TL100000000*SCON00000000SBUFXXXXXXXXPCONHMOS0XXXXXXXCHMOS0XXX0000X:未定*:可位元定址另外在資料記憶體中,亦可以位元定址00H~7共248個位元位址,其在記憶中之位址如下圖:F0H

F7F6F5F4F3F2F1F0BE0H

E7E6E5E4E3E2E1E0AccD0H

CYD7ACD6F0D5RS1D4RS0D30VD2D1PD0PSWB8H

---PSBCPT1BBPX1BAPT0B9PX0B8IPB0H

B7B6B5B4B3B2B1B0P3A8H

AF--ESACET1ABEX1AAET0A9EX0A8IEA0H

A7A6A5A4A3A2A1A0P298H

SM09FSM19ESM29DREN9CTB89BRB89ATI99RI98SCON90H

9796959493929190P188H

TF18FTR18ETF08DTR08CIE18BIT18AIE089IT088TCON80H

8786858483828180P07FH∫30H一般資料存放區或堆疊區

2FH

7F7E7D7C7B7A7978

2EH

|

|

2DH

|

|

2CH

|

|

2BH

|

|

2AH

|

|

29H

|

|

28H

|

|

27H

|

|

26H

|

|

25H

2F------28

24H

27------20

23H

1F1E1D1C1B1A1918

22H

17------10

21H

0F------08

20H

0706050403020100

RB3

RB2

RB1

RB0

在上圖表中,最左側為可位元定址記憶體的位址;中間數字代表可畏原定址的位元位址,其中位元位址上之文字即為該位元的名稱;最右側為暫存器的名稱。在位原定址使用上,8051提供具彈性的使用方法,例如:1.

將位址20H的第0Bit設定為1,可以寫成下面兩種方式:SETP00H;位元定址SETB20H.0;第20H位元組的第0位元2.

將P0的第3Bit清除為0,可以寫成下面三種方式:CLR83H;位元位址CLR80H.3;第80H位元組的第3位元CLRP0.3;P0暫存暫存器的第3位元3.

將IT0位元的值反相,可以寫成下面四種方式:CPL88H;位元位址CPL88H.0;第88位元組的第0位元CPLIT0;位元名稱CPLTCON.0;TCON暫存器的第0位元

第五章8051基本電路與輸出輸入實例§5-1基本電路8051單晶片是同步式的順序邏輯系統,整個系統的工作完全是依賴系統內部的時脈信號,用以來產生各種動作週期及同步信號。在8051單晶片中已內建時脈產生器,在使用時只需接上石英振盪晶體及電容就可以讓系統產生正確的時脈信號。為方便說明及應用,對於往後章節中之實例均利用下列之基本硬體時脈振盪電路。基本硬體時脈振盪電路圖§5-2資料的輸出實例下圖是本例的電路圖:電路圖程式1:以邏輯旋轉指令,輸出P0到P3之走馬燈。;

;

本程式以P0到P3為輸出

程式下載

;

;

應用指令:

;

旋轉指令RL

;

互斥或指令XRL

;

包括進位旗標之右旋轉指令RLC

;

邏輯相反指令CPL

;

;

動作:當LED全亮時則逐點暗掉,當LED全暗時則逐點亮起

;

說明:暫存器R0用以控制P0到P3為全亮或全暗,R1用以控制目前掃描的位置

;

ORG00H

JMPSTART

;規避00H至2FH間之中斷向量執行位址

ORG30H

;

MOVSP,#30H

;將堆疊指標重新指向

MOVA,#00H

MOVP3,A

;輸出資料至埠3

CALLDELAY

MOVP2,A

;輸出資料至埠2

CALLDELAY

MOVP1,A

;輸出資料至埠1

CALLDELAY

MOVP0,A

;輸出資料至埠0

CALLDELAY

START:

MOVA,#01H

RT0:

MOVR1,A

XRLA,P0

;與埠0執行互斥或

MOVP0,A

;輸出資料至埠0

CALLDELAY

;呼叫0.2秒延遲副程式

MOVA,R1

CLRC

;清除進位旗標

RLCA

;與進位旗標一起向左旋轉

JNCRT0

;若進位旗標不為0則跳回再次執行

MOVA,#01H

RT1:

MOVR1,A

XRLA,P1

;與埠1執行互斥或

MOVP1,A

;輸出資料至埠1

CALLDELAY

;呼叫0.2秒延遲副程式

MOVA,R1

CLRC

;清除進位旗標

RLCA

;與進位旗標一起向左旋轉

JNCRT1

;若進位旗標不為0則跳回再次執行

MOVA,#01H

RT2:

MOVR1,A

XRLA,P2

;與埠2執行互斥或

MOVP2,A

;輸出資料至埠2

CALLDELAY

;呼叫0.2秒延遲副程式

MOVA,R1

CLRC

;清除進位旗標

RLCA

;與進位旗標一起向左旋轉

JNCRT2

;若進位旗標不為0則跳回再次執行

MOVA,#01H

RT3:

MOVR1,A

XRLA,P3

;與埠3執行互斥或

MOVP3,A

;輸出資料至埠3

CALLDELAY

;呼叫0.2秒延遲副程式

MOVA,R1

CLRC

;清除進位旗標

RLCA

;與進位旗標一起向左旋轉

JNCRT3

;若進位旗標不為0則跳回再次執行

JMPSTART

DELAY:

MOVR5,#10

;延遲時間約為R5*20mS

D1:

MOVR6,#40

D2:

MOVR7,#249

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET

END程式2:以查表法,輸出P0到P3之走馬燈。;

;

本程式以P0到P3為輸出(查表法運用)

程式下載

;

;

應用指令:

;

BD虛指令用以定義資料

;

間接資料指標暫存器DPTR之設定與索引定指法應用

;

比較是否相等指令CJNE,若不等則跳躍

;

暫存器累加1指令

;

;

動作:LED逐一亮起後再逐一滅掉

;

說明:利用間接資料指標暫存器DPTR讀取資料庫之資料並顯示在各輸出埠上

;

ORG00H

JMP

START

;規避00H至2FH間之中斷向量執行位址

ORG

30H

;

MOV

SP,#30H

;將堆疊指標重新指向

START:

MOV

A,#00

MOV

P3,A

;輸出資料至埠3

CALL

DELAY

;呼叫0.2秒延遲副程式

MOV

P2,A

;輸出資料至埠2

CALL

DELAY

;呼叫0.2秒延遲副程式

MOV

P1,A

;輸出資料至埠1

CALL

DELAY

;呼叫0.2秒延遲副程式

MOV

P0,A

;輸出資料至埠0

CALL

DELAY

;呼叫0.2秒延遲副程式

LOOP:

MOV

DPTR,#DAT

;載入資料DAT之位址至資料指標暫存器DPTR中

RT0:

MOV

A,#0

MOVC

A,@A+DPTR

;載入DPTR所指位址之資料至累積器A中

MOV

P0,A

;輸出資料至埠0

CALL

DELAY

;呼叫0.2秒延遲副程式

INC

DPTR

;將DPTR加1,即用於指向下一筆資料

CJNE

A,#FFH,RT0

;比較A是否為值FFH,若否則跳回RT0重新執行

RT1:

MOV

A,#0

MOVC

A,@A+DPTR

;載入DPTR所指位址之資料至累積器A中

MOV

P1,A

CALL

DELAY

INC

DPTR

CJNE

A,#FFH,RT1

RT2:

MOV

A,#0

MOVC

A,@A+DPTR

;載入DPTR所指位址之資料至累積器A中

MOV

P2,A

CALL

DELAY

INC

DPTR

CJNE

A,#FFH,RT2

RT3:

MOV

A,#0

MOVC

A,@A+DPTR

;載入DPTR所指位址之資料至累積器A中

MOV

P3,A

CALL

DELAY

INC

DPTR

CJNE

A,#FFH,RT3

RT4:

MOV

A,#0

MOVC

A,@A+DPTR

;載入DPTR所指位址之資料至累積器A中

MOV

P3,A

;輸出資料至埠3

CALL

DELAY

;呼叫0.2秒延遲副程式

INC

DPTR

;將DPTR加1,即用於指向下一筆資料

CJNE

A,#0,RT4

;比較A是否為值0,若否則跳回RT4重新執行

RT5:

MOV

A,#0

MOVC

A,@A+DPTR;載入DPTR所指位址之資料至累積器A中

MOV

P2,A

CALL

DELAY

INC

DPTR

CJNE

A,#0,RT5

RT6:

MOV

A,#0

MOVCA,@A+DPTR;載入DPTR所指位址之資料至累積器A中

MOV

P1,A

CALL

DELAY

INC

DPTR

CJNE

A,#0,RT6

RT7:

MOV

A,#0

MOVC

A,@A+DPTR;載入DPTR所指位址之資料至累積器A中

MOV

P0,A

CALL

DELAY

INC

DPTR

CJNE

A,#0,RT7

JMP

LOOP

DELAY:MOV

R5,#10

D1:

MOV

R6,#40

D2:

MOV

R7,#249

DJNZ

R7,$

DJNZ

R6,D2

DJNZ

R5,D1

RET

DAT:

DB

01H,03H,07H,0FH,1FH,3FH,7FH,FFH

DB

01H,03H,07H,0FH,1FH,3FH,7FH,FFH

DB

01H,03H,07H,0FH,1FH,3FH,7FH,FFH

DB

01H,03H,07H,0FH,1FH,3FH,7FH,FFH

DB

7FH,3FH,1FH,0FH,07H,03H,01H,00H

DB

7FH,3FH,1FH,0FH,07H,03H,01H,00H

DB

7FH,3FH,1FH,0FH,07H,03H,01H,00H

DB

7FH,3FH,1FH,0FH,07H,03H,01H,00H

END程式技巧說明:

在上列兩程式均將P0~P3做為輸出埠,程式中ORG為虛指令,用以告知編譯器將其下之程式,放置於程式記憶體中之位址。由於8051之中斷向量位址,如下圖,故程式撰寫時應養成不使用這部分之記憶體。

中斷源中斷向量ResetTimer0 Timer1UART(TXD)UART(RXD)0000H0003H000BH0013H001BH0023H002BH首先,8051啟動後,須給予一Reset信號,則程式由0000H位址開始執行,而程式中JMPSTART指令則是用以規避中斷向量,故ORG30H則指定另一程式記憶體放置起始點。

另外,CALLDELAY指令則是用以呼叫延遲副程式,而在副程式中是以RET做為結束,執行到RET後則在跳回主程式中繼續執行。§5-3資料的輸入實例:下圖示本例之電路圖:電路圖程式:以P3.7為切換開關設定不同顯示P0~P2之走馬燈模式,當P3.7為0時P0到P2為全亮或全暗,當全亮則逐點暗掉,若全暗則會逐點亮起。P3.0~P3.6則用以設定走馬燈執行的速度。;

;

本程式以P0到P2為輸出,P3為輸入,

程式檔

;

;

應用指令:

;

旋轉指令RL

;

互斥或指令XRL

;

堆疊PUSH和POP

;

;

動作:以P3.7為切換開關設定不同顯示方式,

;

當P3.7為0時LED全亮時則逐點暗掉,當LED全暗時則逐點亮起,

;

P3.0~6為延遲時間長短控制

;

;

說明:暫存器R0用以控制P0到P3為全亮或全暗,R1用以控制目前掃描的位置

;

暫存器R2用以儲存延遲時間之設定

;

ORG00H

JMPINIT

;規避00H至2FH間之中斷向量執行位址

ORG30H

INIT:

MOVSP,#30H

;將堆疊指標重新指向

MOVR2,#25

;暫存器R2設定初始延遲時間25*20mS

MOVA,#00H

;將埠2至埠0設定為全滅

MOVR3,A

MOVA,R3

MOVP2,A

CALLDELAY

MOVA,R3

MOVP1,A

CALLDELAY

MOVA,R3

MOVP0,A

CALLDELAY

START:

MOVR2,#25

;暫存器R5設定初始延遲時間25*20mS

MOVA,R3

CPLA

MOVR3,A

MOVP2,A

CALLDELAY

MOVA,R3

MOVP1,A

CALLDELAY

MOVA,R3

MOVP0,A

CALLDELAY

LOOP:

MOVA,P3

;讀入埠3之設定資料

CPLA

;將資料作反相邏輯運算

PUSHA

;將累積器A資料存入堆疊中

ANLA,#7FH

;將累積器A資料與值7FH做邏輯AND運算

MOVR2,A

;將累積器A資料存入R5中做為延遲時間之設定值

MOVA,#01H

RT0:

MOVR1,A

XRLA,P0

MOVP0,A

CALLDELAY

MOVA,R1

CLRC

RLCA

JNCRT0

MOVA,#01H

RT1:

MOVR1,A

XRLA,P1

MOVP1,A

CALLDELAY

MOVA,R1

CLRC

RLCA

JNCRT1

MOVA,#01H

RT2:

MOVR1,A

XRLA,P2

MOVP2,A

MOVR3,A

CALLDELAY

MOVA,R1

CLRC

RLCA

JNCRT2

POPA

;將之前堆疊中資料取出

JBA.7,LOOP

;若累積器A為1則跳回到LOOP重新執行

JMPSTART

;若累積器A為0則跳回到START重新執行

DELAY:

MOVA,R2

;載入R2之延遲時間設定

MOVR5,A

JNZD1

;若累積器A不為0則跳到D0執行

MOVR5,#25

;當R5為0時則重設延遲時間為25*20mS

D1:

MOVR6,#40

D2:

MOVR7,#249

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET

END

第六章計時/計數器

§6-1計時/計數器的功能在8051單晶片的內部有2個計時/計數器,可接收外界輸入的驅動信號,而能產生一個輸出信號以供讀取外界輸入信號發生的次數。如果這個外界輸入信號代表某一事件發生的次數,則計時/計數器即是在作事件的計數;如果這個外界輸入信號是一個固定頻率的信號,則計時/計數器則可用以作計算時間的工作。因此,8051單晶片的計時/計數器為一體兩面,完全取決於驅動信號的特質而定。

§6-2計時/計數器的驅動與使用Timer0與Timer1是8051單晶片的兩個16位元計時/計數器,其計數值是存放於兩個8位元暫存器中,Timer0的計數是由TH0(Highbyte)及TL0(Lowbyte)來執行,Timer1的計數是由TH1(Highbyte)及TL1(Lowbyte)來執行。其位址分別位於SFR內部記憶體的8CH、8AH、8DH及8BH中,如第四章之SFR記憶體圖所示。在程式撰寫上,編輯器允許直接使用暫存器的名稱TH0、TL0、TH1及TL1,亦可直接使用其暫存器位址,來作直接定址。在使用8051單晶片計時/計數器前須先設定計時/計數器模式控制暫存器(Timer/counterModeControlRegister,簡稱TMOD)及計時/計數器控制暫存器(Timer/counterControlRegister,簡稱TCON)兩個暫存器,此二暫存器分別用來決定Timer0及Timer1的工作模式及中斷執行的控制設定。

§6-3TMOD模式控制暫存器之設定Timer的計時時脈來源有兩種,一種是8051單晶片的內部時脈,一種是從T0與T1接腳所輸入的外部時脈。在8051單晶片接收時脈計時/計數時,會在每個機械週期值由〝1〞變為〝0〞時,將Timer的值累加1。而8051單晶片對時脈來源的選擇是由TMOD暫存器中的C/T位元來決定。當C/T設定為1時,Timer使用外部時脈;當C/T設定為0時,Timer使用內部時脈。TMOD的結構如下:TMOD檔當TCON暫存器中的TR0(或TR1)為1時,則Timer0(或Timer1)由TMOD暫存器的GATE位元與INT0(或INT1)接腳構成Timer的軟體控制;當TCON暫存器中的TR0(或TR1)為0時,則Timer0(或Timer1)將停止計時/計數。若以布林帶數表示則為Y=(GATE+INTx)。Timer0與Timer1一共有四種模式,是由TMOD暫存器中的M0與M1位元來設定。以下為四種工作模式:1.模式0:(M1=M0=0,13位元計時/計數器)將Timer設定為模式0時,會形成一個13位元計時/計數器,計時/計數暫存器是由THx的8位元與TLx的低5位元所組成。當TR0(或TR1)設定為1時,計時/計數器開始作動,若13個位元由全部為〝1〞變為全部為〝0〞時,則會將Timer溢位旗號TFx設定為1。結合IE暫存器(中斷致能暫存器,InterruptEnableRegister)致能Timer0(或Timer1),則8051單晶片會擷取TF0(或TF1)的資料,以偵測是否要產生中斷。當8051單晶片執行中斷副程式時會自動將TF0(或TF1)清除為0。將在下一章介紹8051單晶片中斷服務。Timer工作模式0時,13位元計時/計數值最大為8192(2的13次方),因此,THx的值應為計時/計數值除以32的商,TLx的值則為計時/計數值除以32的餘數。若計時/計數值為5000時,即TL0=#(8192-5000)×MOD×32TH0=#(8192-5000)/32則程式可寫為:MOVTL0,#(8192-5000)×MOD×32MOVTH0,#(8192-5000)/322.模式1:(M1=0,M0=1,16位元計時/計數器)模式0與模式1的動作幾乎相同,兩者之間的差別在於Timer工作在模式1時是16位元的計時/計數器。模式1計時/計數最大值為65536(2的16次方),因此,THx的值應為計時/計數值除以256的商,TLx的值則為計時/計數值除以256的餘數。若計時/計數值為5000時,即TH0=#(65536-5000)/256TL0=#(65536-5000)×MOD×256則程式可寫為:MOVTH0,#(65536-5000)/256MOVTL0,#(65536-5000)×MOD×256或寫成:MOVTH0,#>(65536-5000)MOVTL0,#<(65536-5000)其中,〝<〞符號是通知編譯器將後面的值取16位元的低位元組,而〝>〞符號是通知編譯器將後面的值取16位元的高位元組。3.模式2:(M1=1,M0=0,8位元自動重新載入計時器)將Timer設定成模式2時,會形成一個8位元自動重新載入計時/計數器。當計時/計數完畢後會產生TFx溢位旗號設定為1,並會將THx的值自動載入TLx中,因此,THx的值須事先由軟體設定。此模式適合用在需要固定時間的計時。模式2計時/計數最大值為256(2的8次方),因此計時/計數值須同時存放於THx與TLx中。若計時/計數值為200時,即TH0=#(256-200)TL0=#(256-200)則程式可寫成MOVTH0,#(256-200)MOVTL0,#(256-200)4.模式3:(M1=1,M0=1,兩個8位元的計時器)Timer在模式3時,會將TH0與TL0分成兩個獨立的8位元計時器。TL0的計時器使用Timer0的控制信號,即C/T、GATE、TR0、INT0與TF0。而TH0則為計數機械週期的計數器,且使用Timer1的TR1及TF1做控制信號,因此TH0是控制Timer1計時/計數器。若使用Timer0的TL0計時/計數值為200時,即TL0=#(256-200)則程式可寫成MOVTL0,#(256-200)

TMOD暫存器在各種情形下的設定值:1.Timer0做計時器模式功能內部控制外部控制013位元計時器00000000B00001000B116位元計時器00000001B00001001B28位元自動重新載入00000010B00001010B3兩個8位元計時器00000011B00001011B

2.Timer0做計數器模式功能內部控制外部控制013位元計數器00000100B00001100B116位元計數器00000101B00001101B28位元自動重新載入00000110B00001110B3一個8位元計數器00000111B00001111B

3.Timer1做計時器模式功能內部控制外部控制013位元計時器00000000B10000000B116位元計時器00010000B10010000B28位元自動重新載入00100000B10100000B3(TH0計時器)00110000B10110000B

4.Timer1做計數器模式功能內部控制外部控制013位元計數器01000000B11000000B116位元計數器01010000B11010000B28位元自動重新載入01100000B11100000B3無--------

§6-4TCON控制暫存器之設定TCON為Timer的計時控制暫存器,其結構如下:

TCON之圖

§6-5計時/計數器實例1.利用模式1做為計時,其電路圖如下:

電路圖

計時模式1程式;

;

本程式以計時方式掃描驅動,以P0.0為0.05秒的閃爍,

;

P1到P3分別為秒分時的輸出

;

;

應用指令:

;

位元設定指令SETB用以設定位元為1

;

比較跳躍指令CJNE若暫存器與參數值比較不相等實則跳躍

;

位元為1時清除並跳躍指令JBC若暫存器位元為1則清除並跳躍

;

;

動作:P0.0之LED閃爍20Hz,秒分時以十進制二進位法顯示

;

說明:利用Timer0做0.05秒計時,並為求執行時間控制,進位累加.

;

顯示秒.顯示分與顯示時分四次迴路執行,以求可分別在0.05秒內

;

執行完畢

;

ORG00H

JMPSTART

ORG30H

MOVSP,#30H

;將堆疊指標重新指向

START:

MOVTMOD,#01

;設定16位元計時模式

MOVP0,#0

;將埠0設定為全滅

MOVR6,#0

;頻率記數初值設定為0

MOVR0,#0

;時R2分R1秒R0初值設定為0

MOVR1,#0

MOVR2,#0

LOOP:

MOVTL0,#<(65536-46079)

;儲存16位元之低8位元

MOVTH0,#>(65536-46079)

;儲存16位元之高8位元

SETBTR0

;啟動計時

CJNER6,#20,SHOW

MOVR6,#0

SECINCR0

CJNER0,#60,WAIT

MOVR0,#0

INCR1

CJNER1,#60,WAIT

MOVR1,#0

INCR2

CJNER2,#12,WAIT

MOVR2,#0

JMPWAIT

SHOW:

CJNER6,#10,SHOW1

MOVA,R0

CALLBCD

;呼叫轉換為二進位時進制副程式

MOVP1,A

SHOW1:

CJNER6,#11,SHOW2

MOVA,R1

CALLBCD

;呼叫轉換為二進位時進制副程式

MOVP2,A

SHOW2:

CJNER6,#12,WAIT

MOVA,R2

CALLBCD

;呼叫轉換為二進位時進制副程式

MOVP3,A

WAIT:

JBCTF0,OVERFLOW

;測試是否計時完畢產生溢位

JMPWAIT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论