8051單晶片原理與程式設(shè)計_第1頁
8051單晶片原理與程式設(shè)計_第2頁
8051單晶片原理與程式設(shè)計_第3頁
8051單晶片原理與程式設(shè)計_第4頁
8051單晶片原理與程式設(shè)計_第5頁
已閱讀5頁,還剩59頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

單晶片原理與程式設(shè)計

第一章

單晶片微電腦簡介

第二章

程式與編譯

第三章

8051單晶片程式指令

第四章

暫存器與資料記憶體

第五章

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

第六章

計時/計數(shù)器

第七章

中斷服務(wù)與中斷設(shè)定

第八章

串列埠

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

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

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

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

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

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

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

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

具有全雙工的UART。7.

具有5個中斷源及兩層中斷優(yōu)先權(quán)結(jié)構(gòu)。8.

具有時脈產(chǎn)生電路。

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

Vcc:+5電源供應(yīng)接腳。2.

GND:接地接腳。

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

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

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

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

P3.0~P3.7:埠3,為具有內(nèi)部提升電路的雙向I/O埠。此外,埠3的每支接腳都具有另一特殊功能,其功能如下:RXD(P3.0):串列傳輸?shù)慕邮斩恕XD(P3.1):串列傳輸?shù)妮敵龆恕?P3.2):外部中斷輸入端。(P3.3):外部中斷輸入端。T0(P3.4):計時/計數(shù)器外部輸入端。T1(P3.5):計時/計數(shù)器外部輸入端。(P3.6):外部資料記憶體寫入激發(fā)信號(Strobe)。(P3.7):外部資料記憶體讀取激發(fā)信號(Strobe)。7.

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

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

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

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

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

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

第二章

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

編譯流程圖

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

指令欄

運算元欄註解欄1.

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

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

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

註解欄(Comment)

註解欄是以分號起頭的一段說明文字,直到該行結(jié)束??商峁┏淌皆O(shè)計師註解說明。

第三章

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

算術(shù)指令2.

邏輯指令3.

資料轉(zhuǎn)移指令4.

布林(Boolean)運算指令5.

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

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

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

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

假設(shè)Acc的值為0,執(zhí)行直接資料轉(zhuǎn)移。Mov A #FFH;十六進制值表示法(或 Mov A #255);十進制值表示法則Acc的值變?yōu)?552.

假設(shè)Acc的值為0,執(zhí)行直接定址位址之資料轉(zhuǎn)移。Mov A #40H(或 Mov A #64)則Acc的值變?yōu)?553.

假設(shè)Acc的值為0,且記憶體位址40H的內(nèi)容FFH與暫存器R0的內(nèi)容為40H。Mov A @R0則Acc的值變?yōu)?55以上三種資料轉(zhuǎn)移方式都會使Acc變?yōu)?55以圖示來說明其差異:直接資料

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

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

Acc(位址)(內(nèi)容)40H:FFH

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

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

RS1RS0暫存器庫位址

00RB000H~07H

01RB108H~0FH

10RB210H~17H

11RB318H~1FH

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

FFF0B

F7E8

EFE0ACC

E7D8

DFD0PSW

D7C8

CFC0

C7B8IP

BFB0P3

B7A8IE

AFA0P2

A798SCONSBUF

9F90P1

9788TCONTMODTLOTL1TH0TH1

8F80P0SPDPL

PCON87此行記憶體位元組可做位元定址。在SFR內(nèi)部結(jié)構(gòu)圖中可以發(fā)現(xiàn)累加器Acc、四個輸出/輸入暫存器0、1、2及P3。其他暫存器的功能簡介如下:B:用於乘、除法中所使用到之暫存器。PSW(ProgramStatusWord):程式狀態(tài)字元暫存器。IP(InterruptPriorityRegister):中斷優(yōu)先暫存器。IE(InterruptEnableRegister):中斷致能暫存器。SCON(SerialPortControlRegister):串列埠控制暫存器。SBUF(SerialPortBuffer):串列埠資料緩衝器。TCON(Timer/CounterControlRegister):計時/計數(shù)控制暫存器。TMOD(Timer/CounterModeControlRegister):計時/計數(shù)模式控制暫存器。TL0:Timer016位元計時/計數(shù)直之低8位元TL1:Timer116位元計時/計數(shù)直之低8位元TH0:Timer016位元計時/計數(shù)直之高8位元TH1:Timer116位元計時/計數(shù)直之高8位元SP(StackPointer):堆疊指標(biāo)暫存器。DPL:DPTR(DataPointer)資料指標(biāo)暫存器16位元值之低8位元值DPH:DPTR(DataPointer)資料指標(biāo)暫存器16位元值之高8位元值PCON(PowerControlRegister):電源控制暫存器。SFR內(nèi)各暫存器的值在8051重置(Reset)後,會自動設(shè)如下:暫存器二進位表示值*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一般資料存放區(qū)或堆疊區(qū)

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

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

將位址20H的第0Bit設(shè)定為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單晶片是同步式的順序邏輯系統(tǒng),整個系統(tǒng)的工作完全是依賴系統(tǒng)內(nèi)部的時脈信號,用以來產(chǎn)生各種動作週期及同步信號。在8051單晶片中已內(nèi)建時脈產(chǎn)生器,在使用時只需接上石英振盪晶體及電容就可以讓系統(tǒng)產(chǎn)生正確的時脈信號。為方便說明及應(yīng)用,對於往後章節(jié)中之實例均利用下列之基本硬體時脈振盪電路?;居搀w時脈振盪電路圖§5-2資料的輸出實例下圖是本例的電路圖:電路圖程式1:以邏輯旋轉(zhuǎn)指令,輸出P0到P3之走馬燈。;

;

本程式以P0到P3為輸出

程式下載

;

;

應(yīng)用指令:

;

旋轉(zhuǎn)指令RL

;

互斥或指令XRL

;

包括進位旗標(biāo)之右旋轉(zhuǎn)指令RLC

;

邏輯相反指令CPL

;

;

動作:當(dāng)LED全亮?xí)r則逐點暗掉,當(dāng)LED全暗時則逐點亮起

;

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

;

ORG00H

JMPSTART

;規(guī)避00H至2FH間之中斷向量執(zhí)行位址

ORG30H

;

MOVSP,#30H

;將堆疊指標(biāo)重新指向

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執(zhí)行互斥或

MOVP0,A

;輸出資料至埠0

CALLDELAY

;呼叫0.2秒延遲副程式

MOVA,R1

CLRC

;清除進位旗標(biāo)

RLCA

;與進位旗標(biāo)一起向左旋轉(zhuǎn)

JNCRT0

;若進位旗標(biāo)不為0則跳回再次執(zhí)行

MOVA,#01H

RT1:

MOVR1,A

XRLA,P1

;與埠1執(zhí)行互斥或

MOVP1,A

;輸出資料至埠1

CALLDELAY

;呼叫0.2秒延遲副程式

MOVA,R1

CLRC

;清除進位旗標(biāo)

RLCA

;與進位旗標(biāo)一起向左旋轉(zhuǎn)

JNCRT1

;若進位旗標(biāo)不為0則跳回再次執(zhí)行

MOVA,#01H

RT2:

MOVR1,A

XRLA,P2

;與埠2執(zhí)行互斥或

MOVP2,A

;輸出資料至埠2

CALLDELAY

;呼叫0.2秒延遲副程式

MOVA,R1

CLRC

;清除進位旗標(biāo)

RLCA

;與進位旗標(biāo)一起向左旋轉(zhuǎn)

JNCRT2

;若進位旗標(biāo)不為0則跳回再次執(zhí)行

MOVA,#01H

RT3:

MOVR1,A

XRLA,P3

;與埠3執(zhí)行互斥或

MOVP3,A

;輸出資料至埠3

CALLDELAY

;呼叫0.2秒延遲副程式

MOVA,R1

CLRC

;清除進位旗標(biāo)

RLCA

;與進位旗標(biāo)一起向左旋轉(zhuǎn)

JNCRT3

;若進位旗標(biāo)不為0則跳回再次執(zhí)行

JMPSTART

DELAY:

MOVR5,#10

;延遲時間約為R5*20mS

D1:

MOVR6,#40

D2:

MOVR7,#249

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET

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

;

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

程式下載

;

;

應(yīng)用指令:

;

BD虛指令用以定義資料

;

間接資料指標(biāo)暫存器DPTR之設(shè)定與索引定指法應(yīng)用

;

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

;

暫存器累加1指令

;

;

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

;

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

;

ORG00H

JMP

START

;規(guī)避00H至2FH間之中斷向量執(zhí)行位址

ORG

30H

;

MOV

SP,#30H

;將堆疊指標(biāo)重新指向

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之位址至資料指標(biāo)暫存器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重新執(zhí)行

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重新執(zhí)行

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之中斷向量位址,如下圖,故程式撰寫時應(yīng)養(yǎng)成不使用這部分之記憶體。

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

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

;

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

程式檔

;

;

應(yīng)用指令:

;

旋轉(zhuǎn)指令RL

;

互斥或指令XRL

;

堆疊PUSH和POP

;

;

動作:以P3.7為切換開關(guān)設(shè)定不同顯示方式,

;

當(dāng)P3.7為0時LED全亮?xí)r則逐點暗掉,當(dāng)LED全暗時則逐點亮起,

;

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

;

;

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

;

暫存器R2用以儲存延遲時間之設(shè)定

;

ORG00H

JMPINIT

;規(guī)避00H至2FH間之中斷向量執(zhí)行位址

ORG30H

INIT:

MOVSP,#30H

;將堆疊指標(biāo)重新指向

MOVR2,#25

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

MOVA,#00H

;將埠2至埠0設(shè)定為全滅

MOVR3,A

MOVA,R3

MOVP2,A

CALLDELAY

MOVA,R3

MOVP1,A

CALLDELAY

MOVA,R3

MOVP0,A

CALLDELAY

START:

MOVR2,#25

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

MOVA,R3

CPLA

MOVR3,A

MOVP2,A

CALLDELAY

MOVA,R3

MOVP1,A

CALLDELAY

MOVA,R3

MOVP0,A

CALLDELAY

LOOP:

MOVA,P3

;讀入埠3之設(shè)定資料

CPLA

;將資料作反相邏輯運算

PUSHA

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

ANLA,#7FH

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

MOVR2,A

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

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重新執(zhí)行

JMPSTART

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

DELAY:

MOVA,R2

;載入R2之延遲時間設(shè)定

MOVR5,A

JNZD1

;若累積器A不為0則跳到D0執(zhí)行

MOVR5,#25

;當(dāng)R5為0時則重設(shè)延遲時間為25*20mS

D1:

MOVR6,#40

D2:

MOVR7,#249

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET

END

第六章計時/計數(shù)器

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

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

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

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

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

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

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

§6-4TCON控制暫存器之設(shè)定TCON為Timer的計時控制暫存器,其結(jié)構(gòu)如下:

TCON之圖

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

電路圖

計時模式1程式;

;

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

;

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

;

;

應(yīng)用指令:

;

位元設(shè)定指令SETB用以設(shè)定位元為1

;

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

;

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

;

;

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

;

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

;

顯示秒.顯示分與顯示時分四次迴路執(zhí)行,以求可分別在0.05秒內(nèi)

;

執(zhí)行完畢

;

ORG00H

JMPSTART

ORG30H

MOVSP,#30H

;將堆疊指標(biāo)重新指向

START:

MOVTMOD,#01

;設(shè)定16位元計時模式

MOVP0,#0

;將埠0設(shè)定為全滅

MOVR6,#0

;頻率記數(shù)初值設(shè)定為0

MOVR0,#0

;時R2分R1秒R0初值設(shè)定為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

;呼叫轉(zhuǎn)換為二進位時進制副程式

MOVP1,A

SHOW1:

CJNER6,#11,SHOW2

MOVA,R1

CALLBCD

;呼叫轉(zhuǎn)換為二進位時進制副程式

MOVP2,A

SHOW2:

CJNER6,#12,WAIT

MOVA,R2

CALLBCD

;呼叫轉(zhuǎn)換為二進位時進制副程式

MOVP3,A

WAIT:

JBCTF0,OVERFLOW

;測試是否計時完畢產(chǎn)生溢位

JMPWAIT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論