版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1第4章
8051單片機(jī)程序設(shè)計(jì)基礎(chǔ)單片機(jī)程序設(shè)計(jì)基礎(chǔ)第1頁(yè)語(yǔ)言:匯編還是C?確定了單片機(jī),另一個(gè)老生常談爭(zhēng)論就不得不面對(duì)了,學(xué)匯編還是C好?現(xiàn)在很多宣傳一味鼓吹C語(yǔ)言好,似乎“萬(wàn)惡匯編”早就該下地獄了。這種觀點(diǎn)是有失偏頗??陀^講,匯編語(yǔ)言和C語(yǔ)言各有特點(diǎn)。匯編語(yǔ)言本質(zhì)是機(jī)器碼,是直接和單片機(jī)對(duì)話唯一路徑。優(yōu)點(diǎn)是效率高,缺點(diǎn)是難以駕馭。C語(yǔ)言邏輯性更強(qiáng),優(yōu)點(diǎn)是只要掌握了語(yǔ)言本身編程就變得簡(jiǎn)單,而且移植性好。缺點(diǎn)是即使你寫(xiě)出了程序,完成了功效,不過(guò)對(duì)單片機(jī)本身了解還是極少。2單片機(jī)程序設(shè)計(jì)基礎(chǔ)第2頁(yè)實(shí)際開(kāi)發(fā)中大多會(huì)使用C語(yǔ)言,匯編語(yǔ)言在較為復(fù)雜工程面前還是顯得很無(wú)力。不過(guò)匯編語(yǔ)言在學(xué)習(xí)單片機(jī)過(guò)程中卻很有用,想要真正知道單片機(jī)內(nèi)部奧妙,還得借助匯編語(yǔ)言這個(gè)窗口。所以,學(xué)習(xí)正確流程應(yīng)該是:先經(jīng)過(guò)匯編語(yǔ)言將單片機(jī)硬件資源掌握透徹,C語(yǔ)言僅是一門(mén)語(yǔ)言,對(duì)硬件了解清楚基礎(chǔ)之上再學(xué)習(xí)C語(yǔ)言,很輕易上手。3單片機(jī)程序設(shè)計(jì)基礎(chǔ)第3頁(yè)主要內(nèi)容4.1匯編語(yǔ)言程序結(jié)構(gòu)4.2算術(shù)運(yùn)算程序設(shè)計(jì)4.3C51基礎(chǔ)4.4C51和匯編語(yǔ)言混合編程4單片機(jī)程序設(shè)計(jì)基礎(chǔ)第4頁(yè)4.1匯編語(yǔ)言程序結(jié)構(gòu)4.1.1簡(jiǎn)單程序結(jié)構(gòu)4.1.2分支結(jié)構(gòu)4.1.3循環(huán)結(jié)構(gòu)4.1.4子程序及其參數(shù)傳遞方法4.1.5中止服務(wù)程序*4.1.6前后臺(tái)結(jié)構(gòu)*4.1.7并行結(jié)構(gòu)5單片機(jī)程序設(shè)計(jì)基礎(chǔ)第5頁(yè)4.1.1簡(jiǎn)單程序結(jié)構(gòu)
簡(jiǎn)單結(jié)構(gòu)程序執(zhí)行時(shí),從第一條指令開(kāi)始次序執(zhí)行,直到最終一條指令為止。它是組成較大、較復(fù)雜程序最基本結(jié)構(gòu)。但它本身只能完成一些簡(jiǎn)單任務(wù),所以叫做簡(jiǎn)單程序。6單片機(jī)程序設(shè)計(jì)基礎(chǔ)第6頁(yè)例4.1將單字節(jié)BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)
ORG100H
MOVR2,#28H;要轉(zhuǎn)換BCD數(shù)送入R2,入口
MOVA,R2
ANLA,#0F0H
;屏蔽低4位,取高4位
SWAPA
;高低4位交換MOVB,#10MULAB
;2×10
MOVR3,A
;乘積送R3保留7單片機(jī)程序設(shè)計(jì)基礎(chǔ)第7頁(yè)MOVA,R2ANLA,#0FH;取低4位ADDA,R3
;2×10+8送AMOVR3,A
;結(jié)果1CH送R3
END
;程序結(jié)束8單片機(jī)程序設(shè)計(jì)基礎(chǔ)第8頁(yè)例4.2雙字節(jié)移位
將30H、31H單元存放無(wú)符號(hào)數(shù)除2,商仍在原單元中,余數(shù)送入CY中。因?yàn)?051指令系統(tǒng)中只有單字節(jié)移位指令,故雙字節(jié)移位需要分步進(jìn)行,只給出程序段。9單片機(jī)程序設(shè)計(jì)基礎(chǔ)第9頁(yè)
CLRCMOVA,30HRRCAMOV30H,AMOVA,31HRRCAMOV31H,A10單片機(jī)程序設(shè)計(jì)基礎(chǔ)第10頁(yè)4.1.2分支結(jié)構(gòu)在大量實(shí)用程序中,需要對(duì)一些指令執(zhí)行結(jié)果進(jìn)行判斷,依據(jù)判斷結(jié)果決定程序走向。判斷后有“是”和“非”兩種結(jié)果,程序也就有兩種可能執(zhí)行方向,也就是程序產(chǎn)生了分支,形成了分支結(jié)構(gòu)。改變程序執(zhí)行次序有兩種方法:一是事先安排好,程序執(zhí)行到某條指令后轉(zhuǎn)去執(zhí)行指定指令。這是經(jīng)過(guò)無(wú)條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn);第二種就是依據(jù)程序執(zhí)行結(jié)果來(lái)決定轉(zhuǎn)移到何處去。這是經(jīng)過(guò)條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn),分支程序就屬這種情況。11單片機(jī)程序設(shè)計(jì)基礎(chǔ)第11頁(yè)轉(zhuǎn)移指令都有條件測(cè)試功效,依據(jù)測(cè)試后結(jié)果來(lái)確定是否轉(zhuǎn)移,條件成立則轉(zhuǎn)移,不然執(zhí)行下一條指令。例4.3給定8位有符號(hào)數(shù)X,求符號(hào)函數(shù)Y。所謂符號(hào)函數(shù),即當(dāng)X>0時(shí),Y為1,當(dāng)X<0時(shí),Y等于-1,而當(dāng)X=0時(shí),Y=0。這是一個(gè)經(jīng)典分支程序。12單片機(jī)程序設(shè)計(jì)基礎(chǔ)第12頁(yè)13圖4-1例4.3程序流程圖單片機(jī)程序設(shè)計(jì)基礎(chǔ)第13頁(yè)
ORG100H
START:MOVR0,#30H
;存放有符號(hào)數(shù)地址指針 ;
30H送R0,而(30H)=X
MOVA,@R0
;
(A)=X
ANLA,@R0;做與運(yùn)算,出標(biāo)志
JZZERO;判(A)=0否?(A)=0,轉(zhuǎn)ZERO,(A)非0,;下一條
JNBACC.7,NEXT
;(A)最高位不是1,即為正數(shù),轉(zhuǎn)
;標(biāo)號(hào)NEXT,如是1,執(zhí)行下一條MINUS:MOVR1,#0FFH
;(A)最高位是1,即為負(fù)數(shù),
;(R1)=-1
SJMPEXIT
;轉(zhuǎn)出口ZERO:
MOVR1,#0
;(R1)=0
SJMPEXIT
;轉(zhuǎn)出口
NEXT:MOVR1,#1 ;(R1)=1,即R1做為出口Y=1EXIT:SJMPEXIT
;原地踏步14單片機(jī)程序設(shè)計(jì)基礎(chǔ)第14頁(yè)4.1.3循環(huán)結(jié)構(gòu)
一個(gè)程序若包含屢次重復(fù)執(zhí)行程序段,則稱(chēng)為循環(huán)結(jié)構(gòu)。循環(huán)程序和分支程序都是非次序結(jié)構(gòu)程序,但它們?cè)诔绦蜃呦蚝退鶎?shí)現(xiàn)功效上是不一樣。
先看實(shí)例:15單片機(jī)程序設(shè)計(jì)基礎(chǔ)第15頁(yè)例4.4求存放在片內(nèi)RAM20H單元開(kāi)始10個(gè)無(wú)符號(hào)數(shù)最小值
ORG100HMOVR0,#20H
;置地址指針MOVR7,#10
;計(jì)數(shù)器初值
MOVA,@R0 ;取第一個(gè)數(shù)
DECR7
;實(shí)際比較次數(shù)LOOP:INCR0
;修改地址指針
MOV40H,@R0
;取后一個(gè)數(shù)
CJNEA,40H,NEXT;前數(shù)與后數(shù)比較16單片機(jī)程序設(shè)計(jì)基礎(chǔ)第16頁(yè)17NEXT:JCLOPP1;前一個(gè)數(shù)小,不交換
MOVA,40H
;前一個(gè)數(shù)大,把后一個(gè)數(shù)送A
LOPP1:DJNZR7,LOOP;計(jì)數(shù)器減1,不為0轉(zhuǎn)LOOP
MOV41H,A;循環(huán)結(jié)束,最小值送;41H單元HERE:SJMP$
;$指HERE標(biāo)號(hào),踏步
END單片機(jī)程序設(shè)計(jì)基礎(chǔ)第17頁(yè)18圖4-2例4.4程序流程圖單片機(jī)程序設(shè)計(jì)基礎(chǔ)第18頁(yè)19循環(huán)程序組成設(shè)置初值部分,進(jìn)入循環(huán)之前要給出初始狀態(tài),稱(chēng)為初始化,普通包含建立計(jì)數(shù)器,設(shè)置地址指針及其它變量初值。初值又分為循環(huán)工作部分初值和循環(huán)結(jié)束條件初值。循環(huán)工作部分,這是循環(huán)結(jié)構(gòu)基本部分,也叫循環(huán)體,是為重復(fù)執(zhí)行任務(wù)編寫(xiě)程序段。循環(huán)控制部分,控制循環(huán)次數(shù),普通包含修改計(jì)數(shù)器,修改指針,檢測(cè)循環(huán)結(jié)束條件等。結(jié)束部分用于分析和存放結(jié)果。單片機(jī)程序設(shè)計(jì)基礎(chǔ)第19頁(yè)20圖4-3循環(huán)程序流程圖單片機(jī)程序設(shè)計(jì)基礎(chǔ)第20頁(yè)
假如循環(huán)工作部分又包含新循環(huán)程序,稱(chēng)為循環(huán)嵌套,如出現(xiàn)屢次嵌套,就稱(chēng)為多重嵌套。而循環(huán)工作部分不包含另外循環(huán)體就稱(chēng)為單重循環(huán)。21單重循環(huán)和多重循環(huán)單片機(jī)程序設(shè)計(jì)基礎(chǔ)第21頁(yè)單重循環(huán)及其控制方法
控制循環(huán)方法有各種,這里只介紹其中三種。當(dāng)循環(huán)次數(shù)已知時(shí),利用計(jì)數(shù)器控制循環(huán)最方便。當(dāng)循環(huán)次數(shù)未知時(shí),可采取按實(shí)際條件控制循環(huán),或采取邏輯尺方法。22單片機(jī)程序設(shè)計(jì)基礎(chǔ)第22頁(yè)
例4.5求存放于首地址為20H單元多個(gè)學(xué)生考試成績(jī)之和。這個(gè)問(wèn)題可利用成績(jī)是正數(shù)特點(diǎn),在成績(jī)數(shù)據(jù)區(qū)后放一個(gè)負(fù)數(shù)作為結(jié)束條件。
ORG1000HSTART:MOVR0,#20H;首地址指針MOVR1,#0MOVR2,#023單片機(jī)程序設(shè)計(jì)基礎(chǔ)第23頁(yè)LOOP:MOVA,@R0 ;取第1個(gè)數(shù)JBACC.7,DONE
;是負(fù)數(shù),結(jié)束循環(huán)ADDA,R1JNCNEXTINCR2NEXT:INCR0MOVR1,ASJMPLOOPDONE:SJMP$24單片機(jī)程序設(shè)計(jì)基礎(chǔ)第24頁(yè)用邏輯尺控制循環(huán)
例4.6若單片機(jī)進(jìn)行8路巡回檢測(cè),采集數(shù)據(jù)要用不一樣函數(shù)加以處理。設(shè)第0、3、5路用FUNC1處理,而1、2、4、6、7路用FUNC2處理,這么在一個(gè)循環(huán)中包含兩個(gè)支路,可使用一個(gè)二進(jìn)制位串來(lái)控制程序沿那一個(gè)位串來(lái)循環(huán),本題位串設(shè)計(jì)為11010110,0表示用FUNC1處理,1表示用FUNC2處理,這個(gè)二進(jìn)制位串稱(chēng)為邏輯尺。其長(zhǎng)度依據(jù)需要可為一字節(jié),或多字節(jié)。程序運(yùn)行時(shí),可將邏輯尺移位,判斷是0還是1,以決定對(duì)數(shù)據(jù)怎樣處理。程序流程如圖4-4所表示。25單片機(jī)程序設(shè)計(jì)基礎(chǔ)第25頁(yè)26圖4-4用邏輯尺控制循環(huán)單片機(jī)程序設(shè)計(jì)基礎(chǔ)第26頁(yè)多重循環(huán)
假如在一個(gè)循環(huán)體中又包含了其它循環(huán)程序,即循環(huán)中還套著循環(huán),這種程序稱(chēng)為多重循環(huán)程序。
例4.710秒延時(shí)程序。
延時(shí)程序與MCS-51執(zhí)行指令時(shí)間相關(guān),假如使用12MHz晶振,一個(gè)機(jī)器周期為1μs計(jì)算出執(zhí)行一條指令以至一個(gè)循環(huán)所需要時(shí)間,給出對(duì)應(yīng)循環(huán)次數(shù),便能到達(dá)延時(shí)目標(biāo)。27單片機(jī)程序設(shè)計(jì)基礎(chǔ)第27頁(yè)DEL: MOVR5,#100DEL0: MOVR6,#200DEL1:
MOVR7,#248
;248*2+1=497個(gè)機(jī)器周期DEL2:
DJNZR7,DEL2
;(248*2+1+2)*200+1=99801個(gè)機(jī)器周期
DJNZR6,DEL1
;((248*2+1+2)*200+2)*100+1+2μs
DJNZR5,DEL0
RET28單片機(jī)程序設(shè)計(jì)基礎(chǔ)第28頁(yè)4.1.4子程序及其參數(shù)傳遞方法
在實(shí)際程序中,經(jīng)常會(huì)屢次進(jìn)行一些相同計(jì)算和操作。如數(shù)制轉(zhuǎn)換、函數(shù)式計(jì)算等等。假如每次都從頭開(kāi)始編制一段程序,不但麻煩,而且浪費(fèi)存放空間。因而對(duì)一些慣用程序段以子程序形式,事先存放在存放器某一個(gè)區(qū)域。當(dāng)主程序在運(yùn)行時(shí),需要用子程序時(shí),只要執(zhí)行調(diào)用子程序指令,使程序轉(zhuǎn)至子程序。當(dāng)子程序處理完成,返回主程序,繼續(xù)進(jìn)行以后操作。29單片機(jī)程序設(shè)計(jì)基礎(chǔ)第29頁(yè)
30調(diào)用子程序優(yōu)點(diǎn):
(1)防止了對(duì)相同程序段重復(fù)編制。
(2)簡(jiǎn)化程序邏輯結(jié)構(gòu),同時(shí)也便于子程序調(diào)試。
(3)節(jié)約存放器空間。
單片機(jī)程序設(shè)計(jì)基礎(chǔ)第30頁(yè)8051指令系統(tǒng)中,提供了兩條調(diào)用子程序指令A(yù)CALL及LCALL,并提供了一條返回主程序指令RET。ACALL:子程序距離本指令距離不超出2KLCALL:子程序距離本指令距離在64K內(nèi)子程序調(diào)用,包含兩個(gè)部分:保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。31單片機(jī)程序設(shè)計(jì)基礎(chǔ)第31頁(yè)參數(shù)傳遞
調(diào)用子程序時(shí),主程序應(yīng)先把相關(guān)參數(shù)存放在約定位置,子程序在執(zhí)行時(shí),能夠從約定位置取得參數(shù),當(dāng)子程序執(zhí)行完,將得到結(jié)果存入約定位置,返回主程序后,主程序能夠從這些約定位置讀取到需要結(jié)果,這就是參數(shù)傳遞。32單片機(jī)程序設(shè)計(jì)基礎(chǔ)第32頁(yè)用累加器或存放器進(jìn)行參數(shù)傳遞
用累加器和存放器存放輸入?yún)?shù)及結(jié)果參數(shù),能夠提升程序運(yùn)算速度,而且程序也很簡(jiǎn)單。其不足之處是參數(shù)不能傳遞得很多,因?yàn)榇娣牌鲾?shù)量有限;主程序在調(diào)用子程序前必須將參數(shù)先送入存放器;因?yàn)樽映绦騾?shù)個(gè)數(shù)是固定,故主程序不能任意設(shè)定參數(shù)多少。33單片機(jī)程序設(shè)計(jì)基礎(chǔ)第33頁(yè)用指針存放器進(jìn)行參數(shù)傳遞當(dāng)程序中所需處理數(shù)據(jù)量比較大時(shí),經(jīng)常用存放器存放數(shù)據(jù),而不用存放器。用指針指示數(shù)據(jù)在存放器中所處位置,可以大大節(jié)約參數(shù)傳遞中工作量,使用指針?lè)椒軐?shí)現(xiàn)數(shù)據(jù)長(zhǎng)度可變運(yùn)算。8051指令系統(tǒng)中提供由R0、R1作間址存放器指令很多,當(dāng)參數(shù)存放在內(nèi)部RAM時(shí),用R0、R1作指針,使參數(shù)傳遞十分方便。當(dāng)參數(shù)在外部RAM或在程序存放器時(shí),可用DPTR作指針。對(duì)可變長(zhǎng)度運(yùn)算時(shí),數(shù)據(jù)長(zhǎng)度可由存放器指出,也可采取在數(shù)據(jù)后設(shè)置標(biāo)志方法。34單片機(jī)程序設(shè)計(jì)基礎(chǔ)第34頁(yè)用堆棧進(jìn)行參數(shù)傳遞
堆棧能夠用于主程序調(diào)用子程序時(shí)相互之間參數(shù)傳遞。調(diào)用前,主程序用PUSH指令把參數(shù)壓入堆棧,子程序在執(zhí)行中按堆棧指針間接訪問(wèn)棧中參數(shù),而且把運(yùn)算結(jié)果送回堆棧。返回主程序后,主程序用POP指令得到堆棧中結(jié)果參數(shù)。利用堆棧傳遞參數(shù)方法比較簡(jiǎn)單,而且傳遞參數(shù)量比用存放器來(lái)傳遞參數(shù)多得多,也無(wú)須為特定參數(shù)分配存放單元。35單片機(jī)程序設(shè)計(jì)基礎(chǔ)第35頁(yè)例4.8一位16進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼HEASC:MOVR0,SP;借用R0,為堆棧指針
DECR0
DECR0
;R0指向被轉(zhuǎn)換參數(shù)地址
XCHA,@R0;保護(hù)累加器,取被轉(zhuǎn)換參數(shù)
ANLA,#0FH
ADDA,#2
;表首地址MOVCA,@A+PC
;查表
XCHA,@R0
;結(jié)果送回堆棧
RETATAB:DB30H,31H,32H,…,39HDB41H,…,46H36單片機(jī)程序設(shè)計(jì)基礎(chǔ)第36頁(yè)例4.9把內(nèi)部RAM中40H單元一字節(jié)16進(jìn)制數(shù)轉(zhuǎn)換成兩位ASCII碼,存放在R1指出兩個(gè)單元中,調(diào)用HEASC子程序。程序以下:
HEX_TO_ASCII:MOVA,40H;直接尋址,(40H)→A
SWAPA
;兩位16進(jìn)制數(shù)半字節(jié)交換PUSHACC
ACALLHEASC
POPACC37單片機(jī)程序設(shè)計(jì)基礎(chǔ)第37頁(yè)
MOV@R1,A;高半字節(jié)轉(zhuǎn)換成ASCII碼存結(jié)果
INCR1
PUSH40H
ACALLHEASCPOPACC
MOV@R1,A;低半字節(jié)轉(zhuǎn)換成ASCII碼存結(jié)果RET
END38單片機(jī)程序設(shè)計(jì)基礎(chǔ)第38頁(yè)4.1.5中止服務(wù)程序中止服務(wù)程序?qū)?shí)時(shí)事件請(qǐng)求作必要處理,使系統(tǒng)能實(shí)時(shí)地并行完成各個(gè)操作,中止服務(wù)程序必須包含現(xiàn)場(chǎng)保護(hù)、中止服務(wù)、現(xiàn)場(chǎng)恢復(fù)、中止返回4個(gè)部分。中止服務(wù)程序編寫(xiě)方法與子程序類(lèi)似,同時(shí)應(yīng)注意以下問(wèn)題:(1)在中止程序結(jié)尾一定要使用RETI,方便返回到主程序中止處。(2)中止服務(wù)程序中要去除中止標(biāo)志,以免重復(fù)進(jìn)入。詳細(xì)標(biāo)志和去除方法參見(jiàn)各中止部分。39單片機(jī)程序設(shè)計(jì)基礎(chǔ)第39頁(yè)(3)中止服務(wù)程序長(zhǎng)度應(yīng)盡可能短小,以免執(zhí)行時(shí)占用CPU過(guò)多時(shí)間。所以主程序與中止服務(wù)程序之間數(shù)據(jù)交換多采取標(biāo)志位。(4)中止嵌套深度受堆棧區(qū)影響。系統(tǒng)復(fù)位后,棧指針SP初始值為07H,與工作存放器區(qū)重合,所以程序中普通要重新定義。AT89S52內(nèi)部雖有256BRAM,但堆棧需利用低128B開(kāi)辟,所以其堆棧深度有限。40單片機(jī)程序設(shè)計(jì)基礎(chǔ)第40頁(yè)4.1.6前后臺(tái)結(jié)構(gòu)41單片機(jī)程序設(shè)計(jì)基礎(chǔ)第41頁(yè)4.1.7并行結(jié)構(gòu)(多任務(wù)結(jié)構(gòu))
一個(gè)系統(tǒng)能夠?qū)崿F(xiàn)多任務(wù)輪轉(zhuǎn)調(diào)度,并允許“準(zhǔn)并行”地執(zhí)行多個(gè)循環(huán)或任務(wù)。任務(wù)不是同時(shí)執(zhí)行,而是以時(shí)間片(timeslice)調(diào)度執(zhí)行。操作系統(tǒng)OS(OperationSystem)將可用CPU時(shí)間劃分成若干時(shí)間片,為每個(gè)任務(wù)指定一個(gè)時(shí)間片,每個(gè)任務(wù)允許在預(yù)先要求一段時(shí)間內(nèi)執(zhí)行。然后,OS切換到另一個(gè)就緒任務(wù),使這個(gè)任務(wù)也執(zhí)行一段時(shí)間。時(shí)間片是很短,通常是幾個(gè)毫秒。所以,任務(wù)看起來(lái)是同時(shí)執(zhí)行。42單片機(jī)程序設(shè)計(jì)基礎(chǔ)第42頁(yè)4.2算術(shù)運(yùn)算程序設(shè)計(jì)4.2.1不帶符號(hào)多字節(jié)加法4.2.2雙字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)乘法4.2.3碼制轉(zhuǎn)換程序4.2.4查表程序43單片機(jī)程序設(shè)計(jì)基礎(chǔ)第43頁(yè)4.2.1不帶符號(hào)多字節(jié)加法不帶符號(hào)多字節(jié)二進(jìn)制數(shù)定點(diǎn)加法程序在處理多字節(jié)運(yùn)算時(shí),應(yīng)注意低字節(jié)向高字節(jié)進(jìn)位(或借位),用進(jìn)位位CY判別,當(dāng)CY=0時(shí)表示無(wú)進(jìn)位或借位,反之則表示有進(jìn)位或借位。在進(jìn)行不帶符號(hào)單字節(jié)二進(jìn)制數(shù)加減運(yùn)算時(shí),用進(jìn)位CY判別和溢出是否。例4.11兩個(gè)多字節(jié)數(shù)P、Q均以低字節(jié)在前,高字節(jié)在后次序,分別存放在由R0、R1指出內(nèi)部RAM中,相加后存入P數(shù)據(jù)區(qū)。
44單片機(jī)程序設(shè)計(jì)基礎(chǔ)第44頁(yè)
ORG1000HSTAT1:CLRC
;清進(jìn)位
MOVR2,#N
;取字節(jié)數(shù)MADD:MOVA,@R0
;取加數(shù)(一個(gè)字節(jié))ADDCA,@R1
;兩數(shù)相加(由低字節(jié)開(kāi)始)MOV@R0,AINCR0INCR1
DJNZR2,MADD
;兩數(shù)加完?JC ERR
;和字節(jié)數(shù)大于N,則溢出RETERR:…
N EQU0AH
END45單片機(jī)程序設(shè)計(jì)基礎(chǔ)第45頁(yè)4.2.2雙字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)乘法將(R2R3)和(R6R7)中雙字節(jié)無(wú)符號(hào)數(shù)相乘,結(jié)果送R4R5R6R7。本子程序使用累加器A、存放器R0、R2~R7及標(biāo)志CY。子程序及其框圖如圖4-5所表示。
NMUL:MOVR4,#0;0→R4R5MOVR5,#0 MOVR0,#16;16→位計(jì)數(shù)器R0 CLRCNMLP:MOVA,R4 ;右移一位
RRCA MOVR4,A
46單片機(jī)程序設(shè)計(jì)基礎(chǔ)第46頁(yè)47圖4-5NMUL子程序框圖MOVA,R5 RRCA MOVR5,A MOVA,R6 RRCA MOVR6,A
MOVA,R7 RRCA MOVR7,A JNCNMLN;C為移出乘數(shù)最低位MOVA,R5 ;執(zhí)行加法 ADDA,R3 MOVR5,A MOVA,R4 ADDCA,R2 MOVR4,ANMLN:DJNZR0,NMLP;循環(huán)16次單片機(jī)程序設(shè)計(jì)基礎(chǔ)第47頁(yè) MOVA,R4 ;最終結(jié)果再右移-位RRCAMOVR4,A MOVA,R5RRCA MOVR5,A MOVA,R6RRCAMOVR6,AMOVA,R7RRCAMOVR7,ARET48單片機(jī)程序設(shè)計(jì)基礎(chǔ)第48頁(yè)4.2.3碼制轉(zhuǎn)換程序例4.13ASCII碼到BCD碼轉(zhuǎn)換
。
設(shè)ASCII字符置于工作存放器R2中,轉(zhuǎn)換結(jié)果放在R3中(高4位為0)。為提升程序容錯(cuò)性,若轉(zhuǎn)換結(jié)果<0或>9,R3為FFH。比如,ASCII碼39H轉(zhuǎn)換為BCD碼應(yīng)為9。49單片機(jī)程序設(shè)計(jì)基礎(chǔ)第49頁(yè)ASCII_TO_BCD:
MOVA,R2
CLRCSUBBA,#30HMOVR3,AJCERRSUBBA,#0AHJCENNDERR:MOVR3,#0FFH ;轉(zhuǎn)換結(jié)果<0,或
;≥10置犯錯(cuò)標(biāo)志ENND:SJMP$
END50單片機(jī)程序設(shè)計(jì)基礎(chǔ)第50頁(yè)例4.14BCD數(shù)到二進(jìn)制數(shù)之間轉(zhuǎn)換。n+1位BCD數(shù)可表示為(AnAn-1…A1A0)BCD
=An×10n+An-1×10n-1+…+A1×101+A0=(…(An×10+An?1)×10+An-2)×10+…+A1)×10+A0能夠依據(jù)此式編制轉(zhuǎn)換程序,為方便編程,從BCD數(shù)高位做起。下面是雙字節(jié)BCD數(shù)到二進(jìn)制數(shù)轉(zhuǎn)換程序。;功效:將4位BCD數(shù)轉(zhuǎn)換為二進(jìn)制數(shù);入口:BCD碼為R5(千位,百位),R4(十位,個(gè)位)。;出口為R5R4,為16位無(wú)符號(hào)數(shù)二進(jìn)制整數(shù)。;使用資源:累加器ACC、存放器R5、R4、B、R2、R6、R3、進(jìn)位標(biāo)志C51單片機(jī)程序設(shè)計(jì)基礎(chǔ)第51頁(yè)BCD4B:MOVA,R5MOVR2,AACALLBCD2BMOVB,#64HMULABMOVR6,AXCHA,BMOVR5,AMOVA,R4MOVR2,AACALLBCD2BADDA,R6MOVR4,AMOVA,R5ADDCA,#00HMOVR5,ARET52BCD2B:MOVA,R2 ANLA,#0F0HSWAPAMOVB,#0AHMULABMOVR3,AMOVA,R2ANLA,#0FHADDA,R3MOVR2,ARET單片機(jī)程序設(shè)計(jì)基礎(chǔ)第52頁(yè)4.2.4查表程序查表是一個(gè)慣用非數(shù)值操作,利用查表能夠使復(fù)雜計(jì)算簡(jiǎn)單化,并能完成如數(shù)據(jù)賠償、轉(zhuǎn)換、檢索、實(shí)現(xiàn)程序多分支轉(zhuǎn)移等各種功效。有簡(jiǎn)單查表和查表散轉(zhuǎn)兩種。53單片機(jī)程序設(shè)計(jì)基礎(chǔ)第53頁(yè)簡(jiǎn)單查表程序利用指令MOVCA,@A+DPTR查表
比如,查表求輸入數(shù)據(jù)X函數(shù)值Y=f(X),假設(shè)表在ROM中,首地址為T(mén)AB;X取值為1,2,…,N-1,N;對(duì)應(yīng)Y值存放地址為T(mén)AB+X;X,Y均占一個(gè)字節(jié),輸入數(shù)據(jù)X(X值在累加器A中),查表結(jié)果仍存于A
MOV DPTR,#TAB MOVCA,@A+DPTR …TAB:
DB…54單片機(jī)程序設(shè)計(jì)基礎(chǔ)第54頁(yè)用MOVCA,@A+PC指令查表將16進(jìn)制數(shù)0~F轉(zhuǎn)換成ASCII碼,程序入口在A,出口仍在A中
HASC2:INCAMOVCA,@A+PCHASC2+2:RETASCTAB:
DB30H,31H,32H,33HDB34H,35H,36H,37H,38HDB39H,41H,42H,43H,44HDB45H,46H55單片機(jī)程序設(shè)計(jì)基礎(chǔ)第55頁(yè)散轉(zhuǎn)程序設(shè)計(jì)
這是一個(gè)多分支程序,它可依據(jù)運(yùn)算結(jié)果或輸入數(shù)據(jù)將程序轉(zhuǎn)至不一樣分支,比如,依據(jù)工作存放器R0內(nèi)容不一樣,使程序轉(zhuǎn)入對(duì)應(yīng)分支。設(shè)R0=0,對(duì)應(yīng)分支程序標(biāo)號(hào)為PR0;
R0=1對(duì)應(yīng)分支程序標(biāo)號(hào)為PR1;……R0=n對(duì)應(yīng)分支程序標(biāo)號(hào)為PRn。
56單片機(jī)程序設(shè)計(jì)基礎(chǔ)第56頁(yè)LP0:MOVDPTR,#TAB ;取表頭地址 MOVA,R0 ADDA,R0 ;R0內(nèi)容乘以2 JNCLP1 ;無(wú)進(jìn)位轉(zhuǎn)移 INCDPH ;加進(jìn)位位LP1:JMP@A+DPTR;跳至散轉(zhuǎn)表中對(duì)應(yīng)位置 …TAB:AJMPPR0;跳至不一樣分支,2字節(jié)指令A(yù)JMPPR1…AJMPPRn57單片機(jī)程序設(shè)計(jì)基礎(chǔ)第57頁(yè)次序檢索程序例4.18從片內(nèi)RAM表中,次序檢索出關(guān)鍵字,給出關(guān)鍵字在表中序號(hào),當(dāng)找遍整個(gè)表而無(wú)關(guān)鍵字時(shí),序號(hào)為00H。表首地址為#TABLE,表長(zhǎng)為#LENTH。程序以下:TABLE EQU 20HLENGTHEQU 10HKEY EQU 33HSEARCH:MOVR0,#TABLEMOVR1,#LENGTHMOVR2,#00H58單片機(jī)程序設(shè)計(jì)基礎(chǔ)第58頁(yè)LOOP:MOVA,#KEYXRLA,@R0INCR0INCR2JZEXITDJNZR1,LOOPMOVR2,#00HEXIT:MOVA,R2RET59單片機(jī)程序設(shè)計(jì)基礎(chǔ)第59頁(yè)4.3C51基礎(chǔ)4.3.1KeilC51標(biāo)識(shí)符與關(guān)鍵字4.3.2C51數(shù)據(jù)與數(shù)據(jù)類(lèi)型4.3.3C51變量及其存放方式4.3.4C51數(shù)據(jù)存放類(lèi)型和存放模式4.3.5C51對(duì)8051特殊功效存放(SFR)定義4.3.6C51對(duì)8051并行接口定義4.3.7中止服務(wù)函數(shù)與存放器組定義4.3.8函數(shù)參數(shù)和局部變量存放器模式60單片機(jī)程序設(shè)計(jì)基礎(chǔ)第60頁(yè)4.3.1KeilC51標(biāo)識(shí)符與關(guān)鍵字1.標(biāo)識(shí)符C51編譯器要求標(biāo)識(shí)符最長(zhǎng)可達(dá)255個(gè)字符,但只有前面32個(gè)字符在編譯時(shí)有效,所以在編寫(xiě)源程序時(shí)標(biāo)識(shí)符長(zhǎng)度不要超出32個(gè)字符,這對(duì)于普通應(yīng)用程序來(lái)說(shuō)已經(jīng)足夠了。程序中對(duì)于標(biāo)識(shí)符命名應(yīng)簡(jiǎn)練明了,含義清楚,便于閱讀了解,如用標(biāo)識(shí)符“max”表示最大值,用“Timer0”表示定時(shí)器0等。61單片機(jī)程序設(shè)計(jì)基礎(chǔ)第61頁(yè)2.關(guān)鍵字C51編譯器除了支持ANSIC標(biāo)準(zhǔn)關(guān)鍵字之外,還擴(kuò)充了表4-1所表示關(guān)鍵字。表4-1C51擴(kuò)展關(guān)鍵字62關(guān)鍵字用途說(shuō)明bit位標(biāo)量申明申明一個(gè)位標(biāo)量或位類(lèi)型函數(shù)sbit位變量申明申明一個(gè)可位尋址變量sfr特殊功效存放器申明申明一個(gè)特殊功效存放器(8位)sfr16特殊功效存放器申明申明一個(gè)16位特殊功效存放器data存放器類(lèi)型說(shuō)明直接尋址8051內(nèi)部數(shù)據(jù)存放器bdata存放器類(lèi)型說(shuō)明可位尋址8051內(nèi)部數(shù)據(jù)存放器idata存放器類(lèi)型說(shuō)明間接尋址8051內(nèi)部數(shù)據(jù)存放器pdata存放器類(lèi)型說(shuō)明“分頁(yè)”尋址8051外部數(shù)據(jù)存放器xdata存放器類(lèi)型說(shuō)明8051外部數(shù)據(jù)存放器code存放器類(lèi)型說(shuō)明8051程序存放器interrupt中止函數(shù)申明定義一個(gè)中止函數(shù)reentrant再入函數(shù)申明定義一個(gè)再入函數(shù)using存放器組定義定義8051工作存放器組單片機(jī)程序設(shè)計(jì)基礎(chǔ)第62頁(yè)4.3.2C51數(shù)據(jù)與數(shù)據(jù)類(lèi)型C51支持?jǐn)?shù)據(jù)與數(shù)據(jù)類(lèi)型和ANSIC基本相同,僅多了“bit”數(shù)據(jù)類(lèi)型,如表4-2所列。因?yàn)?051是8位機(jī),因而不存在字節(jié)對(duì)準(zhǔn)問(wèn)題。這意味著數(shù)據(jù)結(jié)組成員是次序放置。63數(shù)據(jù)類(lèi)型長(zhǎng)度(bit/byte)數(shù)值范圍bit10,1unsignedchar8/10~255signedchar8/1-128~+127unsignedint16/20~65535signedint16/2-32768~+32767unsignedlong32/40~4294967295signedlong32/4-2147483648~2147483647float32/4±1.176E-38~±3.40E+38(6位數(shù)字)double64/8±1.176E-38~3.40E+38(10位數(shù)字)普通指針24/3存放空間0~65335表4-2KeilC51編譯器支持?jǐn)?shù)據(jù)類(lèi)型、長(zhǎng)度和數(shù)域單片機(jī)程序設(shè)計(jì)基礎(chǔ)第63頁(yè)4.3.3C51變量及其存放方式除了支持位變量外,C51變量定義和標(biāo)準(zhǔn)C變量定義是相同,下面給予簡(jiǎn)明說(shuō)明。位變量(bit)值能夠是1(true)或0(false)。與8051硬件特征操作相關(guān)位變量必須定位在8051CPU片內(nèi)存放區(qū)(RAM)可位尋址空間中。64單片機(jī)程序設(shè)計(jì)基礎(chǔ)第64頁(yè)1.位變量(1)位變量C51定義語(yǔ)法及語(yǔ)義:
bitdriverP11;/*將driverP11定義為位變量*/bitled_pointer;/*將led_pointer定義為位變量*/bitled_number;/*將led_number定義為位變量*/(2)函數(shù)可包含類(lèi)型為bit參數(shù),也能夠?qū)⑵渥鳛榉祷刂?。?/p>
bitfunc(bitb0,bitb1){/*…*/ return(b1);}65注意:使用禁止中止[#pragmadisable]或包含明確存放器組切換(usingn)函數(shù)不能返回位值,不然編譯器會(huì)返回一個(gè)錯(cuò)誤信息。單片機(jī)程序設(shè)計(jì)基礎(chǔ)第65頁(yè)(3)對(duì)位變量定義限制:位變量不能定義成一個(gè)指針,如不能定義bit*led_pointer;也不存在位數(shù)組,如不能定義 bitb_array[];
在位定義中,允許定義存放類(lèi)型,位變量都被放入一個(gè)位段,此段總位于8051內(nèi)部RAM中,所以存放類(lèi)型限制為data或idata。假如將位變量存放類(lèi)型定義成其它類(lèi)型,都將造成編譯犯錯(cuò)。66單片機(jī)程序設(shè)計(jì)基礎(chǔ)第66頁(yè)(4)可位尋址對(duì)象指能夠字節(jié)或位尋址對(duì)象。該對(duì)象應(yīng)位于8051片內(nèi)可位尋址RAM區(qū)中,C51編譯器允許數(shù)據(jù)類(lèi)型為idata對(duì)象放入8051片內(nèi)可位尋址RAM區(qū)中。例
先定義變量數(shù)據(jù)類(lèi)型和存放類(lèi)型:
bdataintibase;/*ibase定義為bdata整型變量*/bdatacharbary[4];/*bary[4]定義為bdata字符型數(shù)組*/然后可使用“sbit”定義可獨(dú)立尋址訪問(wèn)對(duì)象位,即sbitmybit0=ibase^0;/*mybit0定義為ibase第0位*/sbitmybitl5=ibase^15; /*mybit15定義為ibase第15位*/sbitAry07=bary[0]^7; /*Ary07定義為bary[0]第7位*/sbitAry37=bary[3]^7; /*Ary37定義為bary[3]第7位*/67單片機(jī)程序設(shè)計(jì)基礎(chǔ)第67頁(yè)對(duì)象“ibase”、“bary”也能夠字節(jié)尋址。例
Ary37=0;
/*bary[3]第7位賦值為0*/bary[3]='a';
/*字節(jié)尋址:bary[3]賦值為'a'*/sbit定義要求基址對(duì)象存放類(lèi)型為bdata,不然只有絕正確特殊位定義(sbit)是正當(dāng)。位置('^'操作符)后最大值依賴(lài)于指定數(shù)據(jù)類(lèi)型,對(duì)于char/uchar而言是0~7;對(duì)于int/uint而言是0~15;對(duì)于long/ulong而言是0~31。68單片機(jī)程序設(shè)計(jì)基礎(chǔ)第68頁(yè)2.其它類(lèi)型變量字符變量長(zhǎng)度為1字節(jié)(Byte)即8位。除非指明是有符號(hào)變量(signedchar),字符變量值域范圍是0~255(無(wú)符號(hào))。對(duì)于有符號(hào)變量,最含有主要意義位是最高位上符號(hào)標(biāo)志位(MSB),在此位上,1代表“負(fù)”,0代表“正”。有符號(hào)字符變量(signedchar)和無(wú)符號(hào)字符變量(unsignedchar)在表示0~127數(shù)值時(shí),其含義是一樣,都是00~0x7F。負(fù)數(shù)普通用補(bǔ)碼表示,即用11111111表示-1,用11111110表示-2等。69單片機(jī)程序設(shè)計(jì)基礎(chǔ)第69頁(yè)整型變量長(zhǎng)度為16位,8051系列CPU將int型變量MSB存放在低地址字節(jié)。有符號(hào)整型變量(signedint)也使用MSB位作為標(biāo)志位,并使用二進(jìn)制補(bǔ)碼表示數(shù)值??芍苯邮褂脦讉€(gè)專(zhuān)用機(jī)器指令來(lái)完成多字節(jié)加、減、乘、除運(yùn)算。整型變量值0x1234以圖4-6a)所表示方式保留在內(nèi)存中。長(zhǎng)整型變量長(zhǎng)度是32位,占用4字節(jié),其它方面與整型變量(int)相同。長(zhǎng)整型變量(longint)值0x12345678以圖4-6b)所表示方式保留在內(nèi)存中。70單片機(jī)程序設(shè)計(jì)基礎(chǔ)第70頁(yè)浮點(diǎn)型變量為32位,占4字節(jié)。許多復(fù)雜數(shù)學(xué)表示式都采取浮點(diǎn)變量數(shù)據(jù)類(lèi)型。它用符號(hào)位表示數(shù)符號(hào),用階碼和尾數(shù)表示數(shù)大小。用它們進(jìn)行任何數(shù)學(xué)運(yùn)算都需要使用由編譯器決定各種不一樣效率等級(jí)庫(kù)函數(shù)。KeilC51浮點(diǎn)變量數(shù)據(jù)類(lèi)型使用格式與IEEE-754標(biāo)準(zhǔn)(32)相關(guān),含有24位精度,尾數(shù)高位一直為“1”,因而不保留。71單片機(jī)程序設(shè)計(jì)基礎(chǔ)第71頁(yè)浮點(diǎn)變量位分布以下:
1位符號(hào)位;8位指數(shù)位;23位尾數(shù)。符號(hào)位是最高位,尾數(shù)為最低23位,內(nèi)存中按字節(jié)存放以下:其中,S:符號(hào)位,1表示負(fù),0表示正;E:階碼(在兩個(gè)字節(jié)中)偏移為127;M:23位尾數(shù),最高位為“1”。72字節(jié)地址+0+1+2+3內(nèi)容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM單片機(jī)程序設(shè)計(jì)基礎(chǔ)第72頁(yè)73
a)b)c)
圖4-6變量?jī)?chǔ)存方式
a)整型變量b)長(zhǎng)整型變量
c)浮點(diǎn)變量單片機(jī)程序設(shè)計(jì)基礎(chǔ)第73頁(yè)4.3.4C51數(shù)據(jù)存放類(lèi)型和存放模式1.存放類(lèi)型
在討論KEILC51數(shù)據(jù)類(lèi)型時(shí)候,必須同時(shí)提及它存放類(lèi)型以及它與8051單片存放器結(jié)構(gòu)關(guān)系,因?yàn)镵EILC51是面向8051系列單片機(jī)及其硬件控制系統(tǒng)開(kāi)發(fā)工具。它定義任何數(shù)據(jù)類(lèi)型必須以一定存放類(lèi)型定位在8051某一存放區(qū)中,不然便沒(méi)有任何實(shí)際意義。74單片機(jī)程序設(shè)計(jì)基礎(chǔ)第74頁(yè)由第2章,8051系列單片機(jī)在物理上有四個(gè)存放空間: ·片內(nèi)程序存放器空間; ·片外程序存放器空間;·片內(nèi)數(shù)據(jù)存放器空間;·片外數(shù)據(jù)存放器空間。KEILC51編譯器完全支持8051單片機(jī)硬件結(jié)構(gòu),可完全訪問(wèn)8051硬件系統(tǒng)全部部分。該編譯器經(jīng)過(guò)將變量、常量定義成不一樣存放類(lèi)型(data,bdata,idata,pdata,xdata,code)方法,將它們定位在不一樣存放區(qū)中。75單片機(jī)程序設(shè)計(jì)基礎(chǔ)第75頁(yè)表4-3C51存放器類(lèi)型與8051存放器空間關(guān)系76存放類(lèi)型與存放空間對(duì)應(yīng)關(guān)系data直接尋址片內(nèi)數(shù)據(jù)存放區(qū),訪問(wèn)速度快(128字節(jié))bdata可位尋址片內(nèi)數(shù)據(jù)存放器,允許位與字節(jié)混合訪問(wèn)(16字節(jié))idata間接尋址片內(nèi)數(shù)據(jù)存放區(qū),可訪問(wèn)片內(nèi)全部RAM地址空間(256字節(jié))pdata分頁(yè)尋址片外數(shù)據(jù)存放區(qū)(256字節(jié)),由MOVX@R0訪問(wèn)xdata片外數(shù)據(jù)存放區(qū)(64KB),由MOVX@DPTR訪問(wèn)code代碼存放區(qū)(64KB),由MOVC@DPTR訪問(wèn)單片機(jī)程序設(shè)計(jì)基礎(chǔ)第76頁(yè)當(dāng)使用存放類(lèi)型data、bdata定義常量和變量時(shí),C51編譯器會(huì)將它們定位在片內(nèi)數(shù)據(jù)存放區(qū)中(片內(nèi)RAM),這個(gè)存放區(qū)依據(jù)8051單片機(jī)CPU型號(hào)不一樣,其長(zhǎng)度分別為64,128,256或512字節(jié)。這個(gè)存放區(qū)不很大,但它能快速存取各種數(shù)據(jù)。外部數(shù)據(jù)存放器從物理上講屬于單片機(jī)一個(gè)組成部分,但用這種存放器存放數(shù)據(jù),在使用前必須將它們移到片內(nèi)數(shù)據(jù)存放區(qū)中。片內(nèi)數(shù)據(jù)存放區(qū)是存放暫時(shí)性變量或使用頻率較高變量理想場(chǎng)所。77單片機(jī)程序設(shè)計(jì)基礎(chǔ)第77頁(yè)當(dāng)使用xdata存放類(lèi)型定義常量、變量時(shí),C51編譯器會(huì)將其定位在外部數(shù)據(jù)存放空間(片外RAM)。該空間位于片外附加8KB、16KB、32KB或64KBRAM芯片中(如普通慣用6264、62256等)。其最大可尋址范圍為64KB。在使用外部數(shù)據(jù)區(qū)信息之前,必須用指令將它們移動(dòng)到內(nèi)部數(shù)據(jù)區(qū)中;當(dāng)數(shù)據(jù)處理完之后,將結(jié)果返回到片外數(shù)據(jù)存放區(qū)。片外數(shù)據(jù)存放區(qū)主要用于存放不常使用變量,或搜集等候處理數(shù)據(jù),或存放要被發(fā)往另一臺(tái)計(jì)算機(jī)數(shù)據(jù)。78單片機(jī)程序設(shè)計(jì)基礎(chǔ)第78頁(yè)還有兩種存放類(lèi)型是pdata和idata。pdata屬于xdata類(lèi)型,它高8位地址被妥善保留在P2口中,用于I/O操作。idata:能夠間接尋址內(nèi)部數(shù)據(jù)存放器(能夠超出128字節(jié))。訪問(wèn)片內(nèi)數(shù)據(jù)存放器(data、bdata、idata)比訪問(wèn)片外數(shù)據(jù)存放器(xdata、pdata)相對(duì)要快一些,所以可將經(jīng)常使用變量置于片內(nèi)數(shù)據(jù)存放器,而將規(guī)模較大、不常使用數(shù)據(jù)置于片外數(shù)據(jù)存放器中。79單片機(jī)程序設(shè)計(jì)基礎(chǔ)第79頁(yè)當(dāng)使用code存放類(lèi)型定義數(shù)據(jù)時(shí),C51編譯器會(huì)將其定義在代碼空間(ROM或EPROM或Flash或ISPFlash)。這里存放著指令代碼和其它非易失信息。調(diào)試完成程序代碼被寫(xiě)入8051單片機(jī)片內(nèi)ROM/EPROM或片外EPROM中。在程序執(zhí)行過(guò)程中,不會(huì)有信息寫(xiě)入這個(gè)區(qū)域,因?yàn)槌绦虼a是不能進(jìn)行自我改變。80單片機(jī)程序設(shè)計(jì)基礎(chǔ)第80頁(yè)表4-4C51存放器類(lèi)型及其大小和值域81存放類(lèi)型長(zhǎng)度/bit長(zhǎng)度/Byte值域范圍data810~255idata810~255pdata810~255code1620~65535xdata1620~65535單片機(jī)程序設(shè)計(jì)基礎(chǔ)第81頁(yè)變量存放類(lèi)型定義舉例:chardatavar1;
/*jsu1*/bitbdataflags;
/*jsu2*/floatidataa,b,c;
/*jsu3*/unsignedintpdatadimension;/*jsu4*/unsignedcharxdatavector[10][4][4];/*jsu5*/82單片機(jī)程序設(shè)計(jì)基礎(chǔ)第82頁(yè)2.存放模式假如在變量定義時(shí)略去存放類(lèi)型標(biāo)志符,則編譯器會(huì)自動(dòng)選擇默認(rèn)存放類(lèi)型。默認(rèn)存放類(lèi)型深入由SMALL、COMPACT和LARGE存放模式指令限制。比如,若申明charvar1,則在使用SMALL存放模式下,var1被定位在data存放區(qū)中;在使用COMPACT存放模式下,var1被定位在idata存放區(qū)中;在使用LARGE存放模式下,var1被定位在xdata存放區(qū)中。存放模式?jīng)Q定了變量默認(rèn)存放類(lèi)型、參數(shù)傳遞區(qū)和無(wú)明確存放類(lèi)型說(shuō)明變量存放類(lèi)型。83單片機(jī)程序設(shè)計(jì)基礎(chǔ)第83頁(yè)在固定存放器地址上進(jìn)行變量傳遞,是C51標(biāo)準(zhǔn)特征之一。在SMALL模式下,參數(shù)傳遞是在片內(nèi)數(shù)據(jù)存放區(qū)中完成。LARGE和COMPACT模式允許參數(shù)在外部存放器中傳遞。C51同時(shí)也支持混合模式,比如,在LARGE模式下,生成程序可將一些函數(shù)放入SMALL模式中,從而加緊執(zhí)行速度。存放模式詳細(xì)說(shuō)明見(jiàn)表4-5。C51甚至允許在變量類(lèi)型定義之前,指定存放類(lèi)型。所以,定義datacharx與chardatax是等價(jià),但應(yīng)盡可能使用后一個(gè)方法。84單片機(jī)程序設(shè)計(jì)基礎(chǔ)第84頁(yè)表4-5存放模式及說(shuō)明85存放模式說(shuō)明SMALL參數(shù)及局部變量放入可直接尋址片內(nèi)存放器(最大128字節(jié),默認(rèn)存放類(lèi)型是DATA),所以訪問(wèn)十分方便。另外全部對(duì)象,包含堆棧,都必須嵌入片內(nèi)RAM。棧長(zhǎng)很關(guān)鍵,因?yàn)閷?shí)際棧長(zhǎng)依賴(lài)于不一樣函數(shù)嵌套層數(shù)。COMPACT參數(shù)及局部變量放入分頁(yè)片外存放器(最大256字節(jié),默認(rèn)存放類(lèi)型是PDATA),經(jīng)過(guò)存放器R0和R1(@R0,@R1)間接尋址。棧空間位于8051系統(tǒng)內(nèi)部數(shù)據(jù)存放器。LARGE參數(shù)及局部變量放入片外數(shù)據(jù)存放器(最大64KB,默認(rèn)存放類(lèi)型是XDATA),使用數(shù)據(jù)指針DPTR來(lái)訪問(wèn)。用此數(shù)據(jù)指針訪問(wèn)效率較低,尤其是對(duì)于兩字節(jié)或多字節(jié)變量。單片機(jī)程序設(shè)計(jì)基礎(chǔ)第85頁(yè)4.3.5C51對(duì)8051特殊功效存放(SFR)定義為了能直接訪問(wèn)8051單片機(jī)特殊功效存放器SFR,KEILC51提供了一個(gè)自主形式定義方法。這種定義方法與標(biāo)準(zhǔn)C語(yǔ)言不兼容,只適合用于對(duì)8051系列單片機(jī)進(jìn)行C編程。這種定義方法是引入關(guān)鍵字“sfr”,語(yǔ)法以下:sfrsfr_name=
intconstant;
例
sfrP1=0x90;/*P1口地址90H*/sfrTMOD=0x89;/*定時(shí)器/計(jì)數(shù)器方式控制存放器地址89H*/注意:sfr后面必須跟一個(gè)特殊存放器名,“=”后面地址必須是常數(shù),不允許帶有運(yùn)算符表示式,這個(gè)常數(shù)值范圍必須在特殊功效存放器地址范圍內(nèi),位于0x80~0xFF之間。86單片機(jī)程序設(shè)計(jì)基礎(chǔ)第86頁(yè)對(duì)SFR16位數(shù)據(jù)訪問(wèn):對(duì)SFR16位數(shù)據(jù)訪問(wèn):在新8051系列產(chǎn)品中,SFR在功效上經(jīng)常組合為16位值。當(dāng)SFR高端地址直接位于其低端地址之后時(shí),對(duì)SFR16位值能夠進(jìn)行直接訪問(wèn)。比如8052定時(shí)器2就是這種情況。為了有效地訪問(wèn)這類(lèi)SFR,可使用關(guān)鍵字“sfr16”。16位SFR定義語(yǔ)法與8位SFR相同,16位SFR低端地址必須作為“sfr16”定義地址。87單片機(jī)程序設(shè)計(jì)基礎(chǔ)第87頁(yè)例
sfr16T2=0xCC;
/*定時(shí)器2:
T2低8位地址
=0CCHT2高8位地址
=0CDH*/定義中名字后面不是賦值語(yǔ)句,而是一個(gè)SFR地址,高字節(jié)必須位于低字節(jié)之后。這種定義適合用于全部新SFR,但不能用于定時(shí)器/計(jì)數(shù)器0和1。88單片機(jī)程序設(shè)計(jì)基礎(chǔ)第88頁(yè)訪問(wèn)8051
SFR位在經(jīng)典8051應(yīng)用問(wèn)題中,經(jīng)常需要單獨(dú)訪問(wèn)SFR中位,C51擴(kuò)充功效使之成為可能。特殊位(sbit)定義,像SFR一樣不與標(biāo)準(zhǔn)C兼容,使用關(guān)鍵字“sbit”能夠訪問(wèn)位尋址對(duì)象。與SFR定義一樣,用關(guān)鍵字“sbit”定義一些特殊位,并接收任何符號(hào)名,“=”號(hào)后將絕對(duì)地址賦給變量名。這種地址分配有三種方法。89單片機(jī)程序設(shè)計(jì)基礎(chǔ)第89頁(yè)第一個(gè)方法:sfr_name“^”int_constant當(dāng)特殊存放器地址為字節(jié)(8位)時(shí),可使用這種方法。sfr_name必須是已定義SFR名字?!癪”后常數(shù)定義了基地址上特殊位位置。該值必須是0~7數(shù)。如:
sfrPSW=0x0D0;/*定義PSW存放器地址為0xD0*/sbitOV=PSW^2;/*定義OV位為PSW.2,位地址為
0xD2*/sbitCY=PSW^7;/*定義CY位為PSW.7,位地址為0xD7*/90單片機(jī)程序設(shè)計(jì)基礎(chǔ)第90頁(yè)第二種方法:
int_constant“^”int_constant這種方法以一個(gè)整常數(shù)作為基地址。該值必須在0x80~0xFF之間,并能被8整除,確定位置方法同上。比如:sbitOV=0xD0^2;/*OV位地址為0xD2*/sbitCY=0xD0^7;/*CY位地址為0xD7*/91單片機(jī)程序設(shè)計(jì)基礎(chǔ)第91頁(yè)第三種方法:intconstant;這種方法將位絕對(duì)地址賦給變量,地址必須位于0x80~0xFF之間。比如:sbitOV=0xD2;sbitCY=0xD7;特殊功效位代表了一個(gè)獨(dú)立定義類(lèi),不能與其它位定義和位域交換。92單片機(jī)程序設(shè)計(jì)基礎(chǔ)第92頁(yè)4.3.6C51對(duì)8051并行接口定義對(duì)于8051片內(nèi)I/O口用關(guān)鍵字sfr來(lái)定義。例sfrP0=0x80;/*定義P0口,地址80H*/sfrP1=0x90;/*定義P1口,地址90H*/93單片機(jī)程序設(shè)計(jì)基礎(chǔ)第93頁(yè)對(duì)于片外擴(kuò)展I/O口,則依據(jù)其硬件譯碼地址,將其視為片外數(shù)據(jù)存放器一個(gè)單元,使用#define語(yǔ)句進(jìn)行定義:例 #include<absacc.h>/*將PORTA定義為外部I/O口,地址為0x0FFC0,長(zhǎng)度為8位*/#definePORTAXBYTE[0x0FFC0]PORTA=0x01;/*向外部I/O口輸出數(shù)據(jù)*/一旦在頭文件或程序中對(duì)這些片內(nèi)外I/O口進(jìn)行定義以后,在程序中就能夠自由使用這些口了。94單片機(jī)程序設(shè)計(jì)基礎(chǔ)第94頁(yè)實(shí)例:
sfrP1=0x90; /*P1SFR定義*/sfrP3=0xb0;/*P3SFR定義*/sbitDIPswitch=P1^4;/*P1口位4DIP開(kāi)關(guān)輸入*/sbitgreenLED=P1^5;/*P1口位5綠LED輸出*/voidmain(void){unsignedcharinval; inval=0; /*inval初始化值*/while(1){95單片機(jī)程序設(shè)計(jì)基礎(chǔ)第95頁(yè)
if(DIPswitch==1)
{//檢驗(yàn)P1.4輸出是否為高 inval=P1&0x0F; /*從P1讀位0~3*/ greenLED=0;/*置P1.5輸出為低*/}Else{/*若P1.4輸入為低*/greenLED=1; /*置P1.5輸出為高*/}P3=(P3&0xF0)|inval;/*值輸出到P3.0~P3.3*/}}96單片機(jī)程序設(shè)計(jì)基礎(chǔ)第96頁(yè)4.3.7中止服務(wù)函數(shù)與存放器組定義定義中止服務(wù)函數(shù)普通形式為:
函數(shù)類(lèi)型函數(shù)名(形式參數(shù)表)〔interruptn〕[usingn]關(guān)鍵字interrupt后面n是中止號(hào),n取值范圍為0~31,編譯器從8n+3處產(chǎn)生中止向量,詳細(xì)中止號(hào)n和中止向量取決于不一樣8051系列單片機(jī)芯片。8051單片機(jī)慣用中止源和中止向量見(jiàn)表6-1。97單片機(jī)程序設(shè)計(jì)基礎(chǔ)第97頁(yè)關(guān)鍵字using,專(zhuān)門(mén)用來(lái)選擇8051單片機(jī)中不一樣工作存放器組。using后面n是一個(gè)0~3常整數(shù),分別選中4個(gè)不一樣工作存放器組。在定義一個(gè)函數(shù)時(shí)using是一個(gè)選項(xiàng),假如不用該選項(xiàng),則由編譯器選擇一個(gè)存放器組作絕對(duì)存放器組訪問(wèn)。需要注意是,關(guān)鍵字using和interrupt后面都不允許跟帶運(yùn)算符表示式。98單片機(jī)程序設(shè)計(jì)基礎(chǔ)第98頁(yè)關(guān)鍵字using對(duì)函數(shù)目標(biāo)代碼影響以下:在函數(shù)入口處將當(dāng)前工作存放器組保護(hù)到堆棧中;指定工作存放器內(nèi)容不會(huì)改變。函數(shù)返回之前將被保護(hù)工作存放器組從堆棧中恢復(fù)。使用關(guān)鍵字using在函數(shù)中確定一個(gè)工作存放器組時(shí)必須十分小心,要確保任何存放器組切換都只在仔細(xì)控制區(qū)域內(nèi)發(fā)生,假如不做到這一點(diǎn)將產(chǎn)生不正確函數(shù)結(jié)果。另外還要注意,帶using屬性函數(shù)標(biāo)準(zhǔn)上不能返回bit類(lèi)型值。而且關(guān)鍵字using不允許用于外部函數(shù)。99單片機(jī)程序設(shè)計(jì)基礎(chǔ)第99頁(yè)關(guān)鍵字interrupt也不允許用于外部函數(shù),它對(duì)中止函數(shù)目標(biāo)代碼影響以下:在進(jìn)入中止函數(shù)時(shí),特殊功效存放器ACC,B,DPH,DPL,PSW將被保留入棧;假如不使用存放組切換,則將中止函數(shù)中所用到全部工作存放器都入棧;函數(shù)返回之前,全部存放器內(nèi)容出棧;中止函數(shù)由8051單片機(jī)指令RETI結(jié)束。100單片機(jī)程序設(shè)計(jì)基礎(chǔ)第100頁(yè)下面給出一個(gè)中止函數(shù)定義例子。
staticvoidtimer0_isr(void); /*定時(shí)器0中止服務(wù)程序*/ staticvoidtimer0_isr(void)interrupt1using1 { unsignedi;
/* 停頓定時(shí)器0,然后改變定時(shí)器計(jì)數(shù)值,
以得到10ms中止,再次開(kāi)啟定時(shí)器*/ TR0=0; /*停頓定時(shí)器0*/ i=TIMER0_COUNT+TL0+(TH0<<8); TL0=i; TH0=i>>8; TR0=1; /*開(kāi)啟定時(shí)器0*/ timer0_tick++;}101單片機(jī)程序設(shè)計(jì)基礎(chǔ)第101頁(yè)4.3.8函數(shù)參數(shù)和局部變量存放器模式C51編譯器允許采取三種存放器模式:SMALL、COMPACT和LARGE。一個(gè)函數(shù)存放器模式確定了函數(shù)參數(shù)和局部變量在內(nèi)存中地址空間。處于SMALL模式下函數(shù)參數(shù)和局部變量位于8051單片機(jī)內(nèi)部RAM中,處于COMPACT和LARGE模式下函數(shù)參數(shù)和局部變量則使用8051單片機(jī)外部RAM。在定義一個(gè)函數(shù)時(shí)能夠明確指定該函數(shù)存放器模式,普通形式為:
函數(shù)類(lèi)型函數(shù)名(形式參數(shù)表)[存放器模式]其中,存放器模式是C51編譯器擴(kuò)展一個(gè)選項(xiàng)。不用該選項(xiàng)時(shí)即沒(méi)有明確指定函數(shù)存貯器模式,這時(shí)該函數(shù)按編譯時(shí)默認(rèn)存放器模式處理。102單片機(jī)程序設(shè)計(jì)基礎(chǔ)第102頁(yè)例4.19函數(shù)存放器模式
#pragmalarge/*默認(rèn)存放器模式為L(zhǎng)ARGE*/externintcalc(chari,intb)small; /*指定SMALL模式*/externintfunc(inti,floatf)compact;/*指定Compact模式*/externvoid*tcp(charxdata*xp,intndx)small;/*指定SMALL模式*/
intmtest(inti,inty)small
/*指定SMALL模式
*/{return(i*y);
}intlarge_func(inti,intk)/*未指定模式,按默認(rèn)LARGE模式處理*/{return(mtest(i,k)+2);}103單片機(jī)程序設(shè)計(jì)基礎(chǔ)第103頁(yè)上述例子程序第一行用了一個(gè)預(yù)編譯命令“#pragma”,它意思是告訴C51編譯器在對(duì)程序進(jìn)行編譯時(shí),按該預(yù)編譯命令后面給出編譯控制指令“LARGE”進(jìn)行編譯,即本例程序編譯時(shí)默認(rèn)存放器模式為L(zhǎng)ARGE。程序中一共定義了五個(gè)函數(shù):calc()、func()、*tcp()、mtest()、large_func(),其中前面四個(gè)函數(shù)都在定義時(shí)明確指定了其存放器模式,只有最終一個(gè)函數(shù)未指定。在用C51進(jìn)行編譯時(shí),只有最終一個(gè)函數(shù)按LARGE存放器模式處理,其余四個(gè)函數(shù)則分別按它們各自指定存放器模式處理。這個(gè)例子說(shuō)明,C51編譯器允許采取所謂存放器混合模式,即允許在一個(gè)程序中某個(gè)(或幾個(gè))函數(shù)使用一個(gè)存放器模式,另一個(gè)(或幾個(gè))函數(shù)使用另一個(gè)存放器模式。采取存放器混合模式編程,能夠充分利用8051系列單片機(jī)中有限存放器空間,同時(shí)還可加緊程序執(zhí)行速度。104單片機(jī)程序設(shè)計(jì)基礎(chǔ)第104頁(yè)4.4C51和匯編語(yǔ)言混合編程4.4.1函數(shù)名轉(zhuǎn)換4.4.2參數(shù)傳遞和函數(shù)返回規(guī)則105單片機(jī)程序設(shè)計(jì)基礎(chǔ)第105頁(yè)匯編語(yǔ)言含有程序結(jié)構(gòu)緊湊、占用存放空間小,實(shí)時(shí)性強(qiáng)、執(zhí)行速度快,能直接管理和控制存放器及硬件接口特點(diǎn),故此C語(yǔ)言并不能完全替換匯編語(yǔ)言。單獨(dú)應(yīng)用匯編語(yǔ)言或C51語(yǔ)言進(jìn)行編程時(shí),都是應(yīng)用同一個(gè)語(yǔ)言編程,程序應(yīng)用不一樣語(yǔ)言進(jìn)行編程時(shí),稱(chēng)為混合編程?;旌暇幊讨兄饕▋煞N情況:C51程序調(diào)用匯編程序和匯編程序調(diào)用C51程序。因?yàn)镃語(yǔ)言提供了豐富庫(kù)函數(shù),含有很強(qiáng)數(shù)據(jù)處理能力,編程中對(duì)8051單片機(jī)存放器和存放器分配均由編譯器自動(dòng)管理,而匯編程序短小精干、執(zhí)行速度快,因而混合編程時(shí)通常主程序應(yīng)用C51編寫(xiě),與硬件相關(guān)程序應(yīng)用匯編語(yǔ)言編寫(xiě),所以程序中包括到C51程序調(diào)用匯編程序。106單片機(jī)程序設(shè)計(jì)基礎(chǔ)第106頁(yè)C51程序調(diào)用匯編程序主要有以下情況:外圍設(shè)備驅(qū)動(dòng)程序用匯編語(yǔ)言編寫(xiě),但主程序采取C51程序完成。如一些板卡驅(qū)動(dòng)程序普通用匯編語(yǔ)言編寫(xiě)。較為復(fù)雜程序需要采取結(jié)構(gòu)性較強(qiáng)C51語(yǔ)言開(kāi)發(fā),不過(guò)部分程序要求較高處理速度而必須使用更精練匯編語(yǔ)言編寫(xiě)。如高速數(shù)據(jù)采集中A/D轉(zhuǎn)換程序。程序中部分代碼因時(shí)序要求嚴(yán)格而使用匯編語(yǔ)言編寫(xiě)。如串行接口芯片讀寫(xiě)。107單片機(jī)程序設(shè)計(jì)基礎(chǔ)第107頁(yè)在實(shí)際程序開(kāi)發(fā)中,有些程序以匯編語(yǔ)言為主體,假如包括到復(fù)雜數(shù)學(xué)運(yùn)算,往往需要借助于C語(yǔ)言工具所提供庫(kù)函數(shù)和強(qiáng)大數(shù)據(jù)處理能力,這就要求匯編程序中調(diào)用C51程序。所以,在單片機(jī)應(yīng)用程序開(kāi)發(fā)過(guò)程中,有必要掌握C51和匯編語(yǔ)言混合編程方法。要實(shí)現(xiàn)混合編程,必須掌握兩種編程語(yǔ)言之間函數(shù)名轉(zhuǎn)換規(guī)則、參數(shù)傳遞和函數(shù)返回規(guī)則、C51程序中調(diào)用匯編語(yǔ)言以及匯編程序中調(diào)用C51程序方法。108單片機(jī)程序設(shè)計(jì)基礎(chǔ)第108頁(yè)4.4.1函數(shù)名轉(zhuǎn)換混合編程中,需要將欲調(diào)用每種語(yǔ)言編寫(xiě)程序用一段單獨(dú)程序表示,即C51中用函數(shù)表示,匯編中用子程序表示。相互調(diào)用時(shí),函數(shù)名稱(chēng)需要改變,即函數(shù)名轉(zhuǎn)換。C51與匯編中函數(shù)名轉(zhuǎn)換規(guī)則如表4-6所表示。109單片機(jī)程序設(shè)計(jì)基礎(chǔ)第109頁(yè)表4-6C51與匯編中函數(shù)名轉(zhuǎn)換規(guī)則110C51中函數(shù)說(shuō)明匯編中符號(hào)名解釋voidfunc(void)FUNC無(wú)參數(shù)傳遞或不含存放器參數(shù)函數(shù)名不作改變,轉(zhuǎn)入目標(biāo)文件中,名字只是簡(jiǎn)單地轉(zhuǎn)為大寫(xiě)形式。voidfunc(char)_FUNC帶存放器參數(shù)函數(shù)名加入“_”字符前綴以示區(qū)分,它表明這類(lèi)函數(shù)包含存放器內(nèi)參數(shù)傳遞voidfunc(char)reentrant_?FUNC對(duì)于重入函數(shù)加上“_?”字符串前綴以示區(qū)分,它表明該類(lèi)函數(shù)包含棧內(nèi)參數(shù)傳遞。單片機(jī)程序設(shè)計(jì)基礎(chǔ)第110頁(yè)4.4.2參數(shù)傳遞和函數(shù)返回規(guī)則C51參數(shù)傳遞規(guī)則:全部參數(shù)以內(nèi)部RAM固定位置傳遞給程序,若傳遞位則必須位于內(nèi)部可位尋址空間中,讓調(diào)用和被調(diào)用程序次序和長(zhǎng)度(字節(jié)/字/字符/整數(shù))一致。內(nèi)部RAM相同標(biāo)示塊可共享,進(jìn)行匯編程序調(diào)用前,調(diào)用程序在塊中填入要傳遞參數(shù),調(diào)用時(shí)程序假定所需值已在塊中。111單片機(jī)程序設(shè)計(jì)基礎(chǔ)第111頁(yè)1.參數(shù)傳遞
參數(shù)傳遞可使用存放器、固定存放器位置或使用堆棧。堆棧傳遞參數(shù)支持重入。因?yàn)?051系列有限內(nèi)部RAM,不能確保堆棧足夠大,所以函數(shù)不能調(diào)用自己本身。CPU存放器中最多傳遞3個(gè)參數(shù)。這種參數(shù)傳遞技術(shù)產(chǎn)生高效代碼,可與匯編語(yǔ)言相媲美。參數(shù)傳遞存放器規(guī)則如表4-7所表示。112單片機(jī)程序設(shè)計(jì)基礎(chǔ)第112頁(yè)參數(shù)類(lèi)型charintlong,float普通指針第1個(gè)參數(shù)R7R6,R7R4~R7R1,R2,R3第2個(gè)參數(shù)R5R4,R5R4~R7R1,R2,R3第3個(gè)參數(shù)R3R2,R3無(wú)R1,R2,R3113表4-7參數(shù)傳遞存放器選擇
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度兒童早期教育合作項(xiàng)目合同4篇
- 2025年湘師大新版八年級(jí)地理下冊(cè)月考試卷
- 2025年青島版六三制新必修3生物下冊(cè)月考試卷
- 2025年人民版七年級(jí)地理下冊(cè)月考試卷含答案
- 2025年滬科版九年級(jí)科學(xué)上冊(cè)階段測(cè)試試卷
- 2025年華東師大版必修3地理上冊(cè)月考試卷含答案
- 二零二五版旋轉(zhuǎn)門(mén)銷(xiāo)售及安裝服務(wù)合同范本3篇
- 2025年度豬圈建造與農(nóng)業(yè)循環(huán)經(jīng)濟(jì)合同4篇
- 二零二五年度廠區(qū)物料運(yùn)輸合同風(fēng)險(xiǎn)評(píng)估與管理協(xié)議3篇
- 二零二五版智能農(nóng)業(yè)物聯(lián)網(wǎng)解決方案合同4篇
- 2024年資格考試-對(duì)外漢語(yǔ)教師資格證筆試參考題庫(kù)含答案
- 軟件研發(fā)安全管理制度
- 三位數(shù)除以兩位數(shù)-豎式運(yùn)算300題
- 寺院消防安全培訓(xùn)課件
- 比摩阻-管徑-流量計(jì)算公式
- GB/T 42430-2023血液、尿液中乙醇、甲醇、正丙醇、丙酮、異丙醇和正丁醇檢驗(yàn)
- 五年級(jí)數(shù)學(xué)應(yīng)用題100道
- 西方經(jīng)濟(jì)學(xué)(第二版)完整整套課件(馬工程)
- 高三開(kāi)學(xué)收心班會(huì)課件
- GB/T 33688-2017選煤磁選設(shè)備工藝效果評(píng)定方法
- 科技計(jì)劃項(xiàng)目申報(bào)培訓(xùn)
評(píng)論
0/150
提交評(píng)論