單片機(jī)原理及接口技術(shù)第八章_第1頁(yè)
單片機(jī)原理及接口技術(shù)第八章_第2頁(yè)
單片機(jī)原理及接口技術(shù)第八章_第3頁(yè)
單片機(jī)原理及接口技術(shù)第八章_第4頁(yè)
單片機(jī)原理及接口技術(shù)第八章_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

單片機(jī)原理及接口技術(shù)華中科技大學(xué)出版社2013-21第8章單片機(jī)高級(jí)語(yǔ)言

KeilC51應(yīng)用程序設(shè)計(jì)基礎(chǔ)單片機(jī)程序可以用匯編語(yǔ)言編寫,也可以用C語(yǔ)言編寫,二者都可以在KeilC51環(huán)境中編程、調(diào)試、開發(fā)。394KeilC51編譯器是專門為MCS-51系列單片機(jī)開發(fā)而研制的,支持符合ANSI標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì),同時(shí)也針對(duì)MCS-51系列單片機(jī)的特點(diǎn)做了一些特殊擴(kuò)展,特別適合用C語(yǔ)言為MCS-51系列單片機(jī)進(jìn)行程序設(shè)計(jì),所以這種語(yǔ)言又被稱為C51語(yǔ)言。

C51語(yǔ)言中的標(biāo)識(shí)符是用來(lái)標(biāo)識(shí)程序中某個(gè)對(duì)象名稱的是程序設(shè)計(jì)人員用自己定義的字符序列,來(lái)命名需要辨識(shí)的對(duì)象。

8.1.1標(biāo)識(shí)符和關(guān)鍵字3958.1KeilC51程序設(shè)計(jì)的基本語(yǔ)法C51語(yǔ)言中涉及到的基本語(yǔ)法主要有標(biāo)識(shí)符、關(guān)鍵字、數(shù)據(jù)類型、數(shù)據(jù)存儲(chǔ)類型、運(yùn)算符等。1.標(biāo)識(shí)符標(biāo)識(shí)符由字符串、數(shù)字和下劃線組成,且必須以字母或下劃線開頭。2.關(guān)鍵字C語(yǔ)言中保留了一些標(biāo)識(shí)符,這些保留標(biāo)識(shí)符被稱為關(guān)鍵字。程序員不能把關(guān)鍵字作為自己的標(biāo)識(shí)符使用。ANSIC標(biāo)準(zhǔn)中的關(guān)鍵字有:auto、break、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、int、long、register、return、short、signed、sizeof、static、struct、switch、typedef、union、unsigned、void、volatile、while等共32個(gè)。MCS-51系統(tǒng)的擴(kuò)展關(guān)鍵字,主要有:_at_、alien、bdata、bit、code、compact、data、idata、interrupt、large、pdata、reentrant、sbit、sfr、sfr16、small、using、xdata等。8.1.2KeilC51的數(shù)據(jù)類型及對(duì)C語(yǔ)言數(shù)據(jù)類型的擴(kuò)展1.C語(yǔ)言的數(shù)據(jù)類型C語(yǔ)言中提供的數(shù)據(jù)結(jié)構(gòu)是以數(shù)據(jù)類型的形式出現(xiàn)的。按表達(dá)含義可分為:常量和變量二種。按構(gòu)造形式可分為基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型。C的基本數(shù)據(jù)類型有整型(int)、浮點(diǎn)型(float)、字符型(char)、指針型(*)。2.KeilC51對(duì)C語(yǔ)言數(shù)據(jù)類型的擴(kuò)展bit、sbit、sfr、sfr16為擴(kuò)充數(shù)據(jù)類型。表8-1C51的數(shù)據(jù)類型數(shù)據(jù)類型位數(shù)字節(jié)數(shù)值域unsignedchar8單字節(jié)0~255signedchar8單字節(jié)-128~127unsignedint16雙字節(jié)0~65535signedint16雙字節(jié)-32768~32767unsignedlong32四字節(jié)0~232-1signedlong32四字節(jié)-231~231-1float32四字節(jié)10-37~1038*8~241~3字節(jié)對(duì)象的地址bit1位0或1sbit1位0或1sfr8單字節(jié)0~255sfr1616雙字節(jié)0~655361)bit的用法bit可以定義一個(gè)位標(biāo)量、位變量、位類型的函數(shù)和位函數(shù)參數(shù)等它的值是一個(gè)二進(jìn)制位0或1,或布爾類型的True和False。例如:bitVa_max;//將Va_max定義為一個(gè)位變量bitfun1(//將fun1定義為bit類型函數(shù)bitredled,//將redled定義為bit類型函數(shù)參數(shù)bitgreenled)//將greenled定義為bit類型函數(shù)參數(shù)bit不能定義位指針,也不能定義位數(shù)組。2)sbit的用法sbit可以聲明一個(gè)可位尋址的位變量。常用來(lái)定義特殊功能寄存器中的一些特定位,對(duì)于80C51單片機(jī),它可以定義的有效范圍為80H~F7H。它主要有以下幾種使用方法。(1)sbit位變量名=位地址;例如:sbitselectkey=0x90;//定義位地址90H為位變量selectkey(2)sbit位變量名=特殊功能寄存器名^位位置;例如:sbitselectkey=P1^0;(3)sbit位變量名=字節(jié)地址^位位置;例如:sbitselectkey=0x90^0;3)sfr的用法sfr的作用是聲明一個(gè)8位的特殊功能寄存器,sfr16的作用是聲明一個(gè)16位的特殊功能寄存器。sfr和sfr16可以實(shí)現(xiàn)對(duì)SFR的直接尋址。其使用形式分別為:sfr特殊功能寄存器名=地址常數(shù);sfr16特殊功能寄存器名=地址常數(shù);例如:sfrP1=0x90;//定義80C51片內(nèi)地址90H單元是特殊功能寄存器P18.1.3C語(yǔ)言的數(shù)據(jù)存儲(chǔ)類型和數(shù)據(jù)存儲(chǔ)類別相關(guān)的關(guān)鍵字有auto(自動(dòng)變量)、static(靜態(tài)變量)、register(寄存器變量)、extern(外部變量)。按照變量的存在時(shí)間可劃分為:靜態(tài)存儲(chǔ)類型和動(dòng)態(tài)存儲(chǔ)類型按照變量的有效作用范圍分為:局部變量和全局變量8.1.4KeilC51數(shù)據(jù)存儲(chǔ)類型對(duì)ANSIC語(yǔ)言數(shù)據(jù)存儲(chǔ)類型的擴(kuò)展在C51中對(duì)變量定義的格式如下:存儲(chǔ)類型數(shù)據(jù)類型存儲(chǔ)器類型變量名;存儲(chǔ)類型:是變量的存儲(chǔ)類別,用到ANSIC中的數(shù)據(jù)存儲(chǔ)類別關(guān)鍵字auto、static、register、extern等4種數(shù)據(jù)存儲(chǔ)類型。默認(rèn)為auto。數(shù)據(jù)類型:用到的關(guān)鍵字為表8-1中所列出的數(shù)據(jù)類型名。存儲(chǔ)器類型:是變量所存放的空間存儲(chǔ)器類別,包含data、bdata、idata、pdata、xdata、code等6個(gè)C51擴(kuò)展關(guān)鍵字。表8-2KeilC51存儲(chǔ)器類型含義存儲(chǔ)器類型長(zhǎng)度值域所在存儲(chǔ)空間data1B0~127直接尋址的片內(nèi)低128B數(shù)據(jù)存儲(chǔ)器bdata1B32~47可位尋址的片內(nèi)數(shù)據(jù)存儲(chǔ)器16Bidata1B0~255間接訪問(wèn)的片內(nèi)數(shù)據(jù)存儲(chǔ)器256Bpdata1B0~255分頁(yè)尋址的片外數(shù)據(jù)存儲(chǔ)器256Bxdata2B0~65535片外數(shù)據(jù)存儲(chǔ)器64KBcode2B0~65535程序存儲(chǔ)器64KBdata區(qū)是指直接尋址的片內(nèi)低128B數(shù)據(jù)存儲(chǔ)器,地址范圍為:00H~7FH。bdata區(qū)是可位尋址的片內(nèi)數(shù)據(jù)存儲(chǔ)器,該區(qū)也允許按字節(jié)訪問(wèn),共包括20H~2FH地址單元16字節(jié)。idata區(qū)是間接訪問(wèn)的片內(nèi)數(shù)據(jù)存儲(chǔ)器,它允許訪問(wèn)片內(nèi)RAM的地址范圍為:00H~FFH。這部分地址空間和SFR地址重疊,訪問(wèn)時(shí)對(duì)idata采用間接尋址,對(duì)SFR采用直接尋址。pdata區(qū)是指分頁(yè)尋址的片外數(shù)據(jù)存儲(chǔ)器,每頁(yè)256字節(jié),一共256頁(yè),共64K字節(jié),可以覆蓋所有的片外數(shù)據(jù)存儲(chǔ)器。訪問(wèn)時(shí)使用MOVX@Ri,A或者M(jìn)OVXAi,@R指令來(lái)指定片外數(shù)據(jù)存儲(chǔ)器的低8位,用P2口指定高8位。xdata區(qū)是指片外數(shù)據(jù)存儲(chǔ)器XRAM,共64K字節(jié)。使用MOVX@DPTR,A或者M(jìn)OVXA,@DPTR指令對(duì)xdata區(qū)的數(shù)據(jù)訪問(wèn)。code區(qū)是指程序存儲(chǔ)器,共64K字節(jié)。用來(lái)存儲(chǔ)程序段代碼。它是只讀存儲(chǔ)器(ROM),讀出時(shí)只能用MOVCA,@A+DPTR指令2.KeilC51編譯器在不同編譯模式下的存儲(chǔ)器類型的選擇編譯模式存儲(chǔ)器類型smalldatacompactpdatalargelarge表8-3KeilC51編譯器在不同編譯模式下的存儲(chǔ)器類型默認(rèn)存儲(chǔ)器模式的定義形式為:#pragma存儲(chǔ)器模式例:#pragmasmall//默認(rèn)存儲(chǔ)器模式設(shè)置為small,默認(rèn)存儲(chǔ)器類型為data在定義變量時(shí)如果省略了存儲(chǔ)類型,則按默認(rèn)項(xiàng)auto處理。按編譯時(shí)使用的默認(rèn)存儲(chǔ)器模式small、compact或large的來(lái)自動(dòng)確定默認(rèn)存儲(chǔ)器類型,以確定變量的存儲(chǔ)空間。small:變量及參數(shù)放入單片機(jī)片內(nèi)數(shù)據(jù)存儲(chǔ)器,默認(rèn)存儲(chǔ)器類型為data區(qū),其長(zhǎng)度為128字節(jié)。該區(qū)使用直接尋址compact:變量及參數(shù)放入分頁(yè)尋址的片外數(shù)據(jù)存儲(chǔ)器中,默認(rèn)存儲(chǔ)器類型為pdata區(qū)。large:變量及參數(shù)放入片外數(shù)據(jù)存儲(chǔ)器,默認(rèn)存儲(chǔ)器類型為xdata區(qū)。8.1.5KeilC51運(yùn)算符1.賦值運(yùn)算符賦值運(yùn)算符標(biāo)記為“=”,它的作用的將一個(gè)數(shù)據(jù)賦給變量,具有右結(jié)合性。其一般形式為:變量=表達(dá)式2.基本算術(shù)運(yùn)算符“+”(加法)、“-”(減法)、“*”(乘法)、“/”(除法)、“%”(求余)等共五種,可以用于兩個(gè)量參與的運(yùn)算,都具有左結(jié)合性。3.自增自減運(yùn)算符標(biāo)記為“++”和“--”,屬于算術(shù)運(yùn)算符,具有右結(jié)合性。++i的意思為變量i自增1后再參與運(yùn)算;--i的意思為變量i自減1后再參與運(yùn)算;i++的意思為變量i先參與運(yùn)算后,再自增1;i--的意思為變量i先參與運(yùn)算后,再自減1。4.強(qiáng)制類型轉(zhuǎn)換運(yùn)算符一般形式為:(類型說(shuō)明符)(表達(dá)式);作用是把表達(dá)式的結(jié)果強(qiáng)制轉(zhuǎn)換成類型說(shuō)明符表示的類型。5.關(guān)系運(yùn)算符有:>、<、>=、<=、==、!=共6種,都是雙目運(yùn)算符,具有左結(jié)合性。關(guān)系運(yùn)算符用于比較兩個(gè)量的運(yùn)算關(guān)系,進(jìn)行比較運(yùn)算,將兩個(gè)量的值進(jìn)行比較,判斷比較的結(jié)果是否符合給定的條件,條件滿足時(shí)結(jié)果為1,不滿足時(shí)結(jié)果為0,只有1和0兩種結(jié)果。6.邏輯運(yùn)算符&&和||是雙目運(yùn)算符,具有左結(jié)合性;!是單目運(yùn)算符,具有右結(jié)合性。作用是判斷結(jié)果是否符合給定的條件,條件滿足時(shí)結(jié)果為1,不滿足時(shí)結(jié)果為0,只有1和0兩種結(jié)果。4137.位運(yùn)算符C51程序中位控制類指令應(yīng)用比較多。位操作的對(duì)象只能是整型和字符型數(shù)據(jù),不能是實(shí)型數(shù)據(jù)。位運(yùn)算符的作用是按位對(duì)變量進(jìn)行運(yùn)算,并不改變參與運(yùn)算的變量的值。C51中的位運(yùn)算符有:&(按位與)、|(按位或)、^(按位異或)、~(按位取反)、<<(左移)、>>(右移)。除~是單目運(yùn)算符,且具有右結(jié)合性外,其余全為雙目運(yùn)算符,并且具有左結(jié)合性。位運(yùn)算符的優(yōu)先級(jí)從高到低依次為:~→<<→>>→&→^→|。8.逗號(hào)運(yùn)算符“,”是一個(gè)特殊的運(yùn)算符,又稱順序求值運(yùn)算符,具有左結(jié)合性。用“,”運(yùn)算符連接起來(lái)的兩個(gè)或多個(gè)表達(dá)式,稱為逗號(hào)表達(dá)式。9.條件運(yùn)算符一般形式為:邏輯表達(dá)式?表達(dá)式1:表達(dá)式2作用是先計(jì)算邏輯表達(dá)式,當(dāng)值為非0時(shí),將表達(dá)式1的值作為整個(gè)條件表達(dá)式的值;當(dāng)值為0時(shí)將表達(dá)式2的值作為整個(gè)條件表達(dá)式的值。10.指針和地址運(yùn)算符指針運(yùn)算符是:*(取內(nèi)容)、&(取地址)2個(gè),單目運(yùn)算符。其含義為:變量=*指針變量;指針變量=&目標(biāo)變量;即&a為變量a的地址,*p為指針變量p所指向的變量。變量在使用前必須定義以規(guī)定其類型,指針定義的一般形式是:類型標(biāo)識(shí)符*標(biāo)識(shí)符;例如:char*px;//定義字符型指針變量pxC51中一般指針的定義形式為:類型標(biāo)識(shí)符*存儲(chǔ)器類型標(biāo)識(shí)符;基于存儲(chǔ)器指針的定義形式為:類型標(biāo)識(shí)符存儲(chǔ)器類型1*存儲(chǔ)器類型2標(biāo)識(shí)符;例如:char*xdatavarp1;//定義位于xdata區(qū)的char型一般指針varp1chardata*xdatavarp2;//定義指向data區(qū)的char型數(shù)據(jù)的指針,指針本身在xdata區(qū)的基于存儲(chǔ)器的指針varp2在一般指針定義時(shí),存儲(chǔ)器類型為可選項(xiàng),定義基于存儲(chǔ)器的指針時(shí)存儲(chǔ)器類型2為可選項(xiàng),兩者缺省時(shí)由默認(rèn)的編譯模式確定。8.2KeilC51程序的基本語(yǔ)句C51的基本語(yǔ)句可劃分為表達(dá)式語(yǔ)句、條件類語(yǔ)句、循環(huán)類語(yǔ)句、其它控制語(yǔ)句等幾種。8.2.1表達(dá)式語(yǔ)句C51程序是由表達(dá)式語(yǔ)句構(gòu)成的,在一個(gè)表達(dá)式后面加上“;”就構(gòu)成了一個(gè)表達(dá)式語(yǔ)句。單獨(dú)的“;”也是一條語(yǔ)句,稱為空語(yǔ)句(相當(dāng)于匯編語(yǔ)言的NOP)。任何一條語(yǔ)句末尾必須加“;”,并以其結(jié)束。8.2.2條件類語(yǔ)句1.形式1if(表達(dá)式)語(yǔ)句;其含義為,若表達(dá)式的值為非0(即真),則執(zhí)行緊跟在其后面的語(yǔ)句,否則跳過(guò)該語(yǔ)句執(zhí)行下一條語(yǔ)句。2.形式2if(表達(dá)式)語(yǔ)句1;else語(yǔ)句2;其含義為,如果表達(dá)式的值為非0,則執(zhí)行語(yǔ)句1,執(zhí)行完語(yǔ)句1后繼續(xù)執(zhí)行語(yǔ)句2后面的下一條語(yǔ)句(不執(zhí)行語(yǔ)句2);如果表達(dá)式的值為0,則跳過(guò)語(yǔ)句1,執(zhí)行語(yǔ)句2。C51中有以下4種形式。3.形式3if(表達(dá)式1)語(yǔ)句1;elseif(表達(dá)式2)語(yǔ)句2;……elseif(表達(dá)式n)語(yǔ)句n;else語(yǔ)句n+1;這種結(jié)構(gòu)從上到下逐個(gè)對(duì)條件進(jìn)行判斷,一旦發(fā)現(xiàn)條件滿足就執(zhí)行相對(duì)應(yīng)的語(yǔ)句,并跳過(guò)本結(jié)構(gòu)中其它剩余部分,如果沒有一個(gè)條件滿足,則執(zhí)行最后一個(gè)else對(duì)應(yīng)的語(yǔ)句。switch(表達(dá)式){case常量表達(dá)式1:語(yǔ)句1;case常量表達(dá)式2:語(yǔ)句2;……case常量表達(dá)式n:語(yǔ)句n;default:語(yǔ)句n+1;}其含義為:將switch后面表達(dá)式的值與每個(gè)case后面的常量表達(dá)式的值逐個(gè)進(jìn)行比較,若與其中一個(gè)相等,則執(zhí)行該常量表達(dá)式后面的語(yǔ)句,若沒有相等的值,則執(zhí)行default后面的語(yǔ)句。4.switch語(yǔ)句switch語(yǔ)句是多分支選擇語(yǔ)句,可以直接處理多個(gè)分支。8.2.3循環(huán)類語(yǔ)句C51中的循環(huán)類語(yǔ)句有while語(yǔ)句、dowhile語(yǔ)句、for語(yǔ)句和goto語(yǔ)句4種。1.形式1while(條件表達(dá)式)語(yǔ)句;含義為條件表達(dá)式值為非0時(shí),執(zhí)行其后面的語(yǔ)句,否則路過(guò)該語(yǔ)句,即跳出循環(huán)圈執(zhí)行下一條語(yǔ)句。2.形式2do語(yǔ)句while(條件表達(dá)式);含義為先執(zhí)行do后面的語(yǔ)句,然后判斷條件表達(dá)式的值是否為0,其值為非0時(shí),返回重新執(zhí)行do后面的語(yǔ)句,否則跳過(guò)該語(yǔ)句,即跳出循環(huán)圈執(zhí)行下一條語(yǔ)句。3.形式3for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語(yǔ)句;或for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)語(yǔ)句;實(shí)際使用該語(yǔ)句時(shí),常按“for(循環(huán)變量賦初值表達(dá)式;循環(huán)條件表達(dá)式;循環(huán)變量增值表達(dá)式)語(yǔ)句;”的形式使用?!埃ǎ眱?nèi)的3部分之間一定要用“;”分開,且“;”不能省略,而“()”內(nèi)的3項(xiàng)是選擇項(xiàng),可以根據(jù)實(shí)際使用情況省略。例如省略了“表達(dá)式1”,只表示不對(duì)循環(huán)變量賦初值,但語(yǔ)法上沒有錯(cuò)誤。4.goto語(yǔ)句Goto語(yǔ)句標(biāo)號(hào):該語(yǔ)句是是一個(gè)無(wú)條件轉(zhuǎn)移語(yǔ)句,C51中g(shù)oto語(yǔ)句一般只被用來(lái)跳出多重循環(huán)。8.2.4其它語(yǔ)句1.continue語(yǔ)句continue;2.break語(yǔ)句break;3.return語(yǔ)句1)return(表達(dá)式);或者2)return;如果return語(yǔ)句帶有表達(dá)式,則計(jì)算表達(dá)式的值并作為函數(shù)返回值。return語(yǔ)句若沒有帶表達(dá)式,則被調(diào)用函數(shù)返回主調(diào)函數(shù)時(shí),函數(shù)值不確定。一個(gè)被調(diào)用函數(shù)也可以不用return語(yǔ)句,這時(shí)當(dāng)程序執(zhí)行到“}”處時(shí),自動(dòng)返回主調(diào)函數(shù)。8.3KeilC51的函數(shù)KeilC51程序的基本結(jié)構(gòu)有結(jié)構(gòu)化程序結(jié)構(gòu)和模塊化程序結(jié)構(gòu)。KeilC51程序結(jié)構(gòu)清晰,可讀性強(qiáng),調(diào)試方便,移植性好,編制程序的效率和編寫的程序質(zhì)量都很高,這都依賴于C51語(yǔ)言由函數(shù)組成,其內(nèi)部帶有功能強(qiáng)大的庫(kù)函數(shù)。C51語(yǔ)言允許用戶自己定義函數(shù),用戶可以用自己的算法編寫函數(shù),然后調(diào)用這些函數(shù)。一個(gè)C51語(yǔ)言程序中只能有一個(gè)主函數(shù),不管主函數(shù)放在程序的哪個(gè)位置,程序總是從主函數(shù)開始執(zhí)行。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)之間也可以相互調(diào)用,但任何函數(shù)都不能調(diào)用主函數(shù)。函數(shù)以“{”開始,以“}”結(jié)束,這兩者間的內(nèi)容稱為函數(shù)體。8.3.1函數(shù)的定義1.無(wú)參函數(shù)的定義形式類型標(biāo)識(shí)符函數(shù)名(){函數(shù)體語(yǔ)句}“類型標(biāo)識(shí)符”是指函數(shù)返回值的類型,一般無(wú)參函數(shù)被調(diào)用時(shí)無(wú)參數(shù)輸入,也沒有函數(shù)返回值,因此可以不寫類型標(biāo)識(shí)符?!埃ǎ北硎具@是一個(gè)無(wú)參函數(shù),此圓括號(hào)不能省略。2.有參函數(shù)的定義形式類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列){函數(shù)體語(yǔ)句}有參函數(shù)可以沒有函數(shù)返回值,此時(shí)類型標(biāo)識(shí)符用“void”表示?!靶问絽?shù)表列”(簡(jiǎn)稱形參)中列出的是在主調(diào)用函數(shù)與被調(diào)用函數(shù)之間傳遞數(shù)據(jù)的形式參數(shù)定義。有參函數(shù)被調(diào)用時(shí),要提供實(shí)際的輸入?yún)?shù),并且說(shuō)明與實(shí)際參數(shù)一一對(duì)應(yīng)的形式參數(shù),在函數(shù)被調(diào)用結(jié)束時(shí)返回結(jié)果供調(diào)用它的函數(shù)使用。3.空函數(shù)的定義形式類型標(biāo)識(shí)符函數(shù)名(){}一般來(lái)說(shuō),空函數(shù)的目的是為了以后程序功能的擴(kuò)充。8.3.2函數(shù)的調(diào)用1.函數(shù)調(diào)用的一般形式為:函數(shù)名(實(shí)際參數(shù)表列);“函數(shù)名”指被調(diào)用的函數(shù)?!皩?shí)際參數(shù)表列”(簡(jiǎn)稱實(shí)參)是指主調(diào)用函數(shù)傳遞給被調(diào)用函數(shù)的實(shí)際參數(shù),其數(shù)量、類型、順序必須與函數(shù)定義時(shí)的形式參數(shù)一致,以便于將實(shí)際參數(shù)的值正確地傳遞給形式參數(shù)。實(shí)際參數(shù)表列中可以包含多個(gè)實(shí)際參數(shù),各個(gè)參數(shù)之間用逗號(hào)隔開。如果調(diào)用的是無(wú)參函數(shù),沒有形式參數(shù),可以沒有實(shí)際參數(shù),但函數(shù)名后的“()”仍不能省略。2.函數(shù)調(diào)用的方式C51常用的有3種函數(shù)調(diào)用方式。1)函數(shù)語(yǔ)句在主調(diào)用函數(shù)中,把函數(shù)作為一條語(yǔ)句,形式為:函數(shù)名();例如:MotorRun();2)函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這時(shí)主函數(shù)要求被調(diào)用函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。例如:c=2*max(a,b);函數(shù)max是表達(dá)式的一部分,它的返回值與2相乘后把積賦給c。3)函數(shù)參數(shù)函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參,即在主調(diào)函數(shù)中將函數(shù)調(diào)用作為另一個(gè)調(diào)用函數(shù)的實(shí)際參數(shù)。這種在調(diào)用一個(gè)函數(shù)的過(guò)程中又調(diào)用另外一個(gè)函數(shù)的方式,叫做嵌套函數(shù)調(diào)用。8.3.4KeilC51編譯器對(duì)ANSIC函數(shù)的擴(kuò)展1.函數(shù)定義的擴(kuò)展C51中函數(shù)定義的一般形式為:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列)編譯模式reentrantinterruptnusingm{函數(shù)體語(yǔ)句}其中編譯模式、reentrant、interruptn、usingm選項(xiàng)為C51對(duì)ANSIC的擴(kuò)展。編譯模式標(biāo)識(shí)符為small、compact、large三者之一,用于指定函數(shù)內(nèi)變量和參數(shù)的存儲(chǔ)器空間。該項(xiàng)為可選項(xiàng),缺省時(shí)按文件開頭指定的默認(rèn)編譯模式處理。reentrant用于定義再入函數(shù),一般在中斷函數(shù)和非中斷函數(shù)共用一個(gè)函數(shù)時(shí)將該函數(shù)定義為再入函數(shù)。interruptn用于定義中斷函數(shù),其中n為中斷號(hào),其取值范圍為0~31,取決于單片機(jī)芯片型號(hào),例如80C51的n可在0~4之間選取。usingm用于確定該函數(shù)的工作寄存器組,即確定該函數(shù)所使用的工作寄存器R0~R7的實(shí)際地址。該項(xiàng)為可選項(xiàng),缺省時(shí)該函數(shù)所使用的工作寄存器組與主調(diào)函數(shù)相同。其取值范圍為0~3,共4組,每組8個(gè)工作寄存器。合理選擇函數(shù)的工作寄存器,可便于參數(shù)傳遞或者避免參數(shù)地址沖突引起的程序錯(cuò)誤。2.C51的中斷函數(shù)一般使用形式為:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列)編譯模式interruptnusingm{函數(shù)體語(yǔ)句}例如:voidINT1_KEY()interrupt1using3{函數(shù)體語(yǔ)句}3.C51的庫(kù)函數(shù)C51在ANSIC函數(shù)的基礎(chǔ)上擴(kuò)展了若干適合其使用的庫(kù)函數(shù),這些函數(shù)都具有特定的功能,用戶可以根據(jù)自己的需要通過(guò)頭文件把它包含進(jìn)來(lái),以便于程序的編制和調(diào)試。C51編譯器提供的庫(kù)函數(shù)主要包括以下幾種:絕對(duì)地址訪問(wèn)庫(kù)函數(shù)absacc.h、字符庫(kù)函數(shù)ctype.h、內(nèi)部庫(kù)函數(shù)intrins.h、數(shù)學(xué)庫(kù)函數(shù)math.h、SFR訪問(wèn)庫(kù)函數(shù)reg51.h、標(biāo)準(zhǔn)庫(kù)函數(shù)stdlib.h、輸入輸出庫(kù)函數(shù)stdio.h、字符串庫(kù)函數(shù)string.h等。8.4KeilC51的編譯預(yù)處理C51預(yù)處理功能是指編譯系統(tǒng)在程序掃描前對(duì)特殊命令進(jìn)行的預(yù)處理工作。C51程序中的宏定義、文件包含等都放在函數(shù)外,位于源文件的前面,我們稱其為預(yù)處理部分。這些命令稱為預(yù)處理命令,預(yù)處理命令均以“#”開頭。8.4.1宏定義1.無(wú)參數(shù)的宏定義無(wú)參數(shù)的宏定義的一般形式為:#define標(biāo)識(shí)符字符串例如:#definePORTA0x7CFF//定義某外圍器件端口A的地址為7CFFH2.有參數(shù)的宏定義和宏調(diào)用宏定義的一般形式為:#define宏名(形式參數(shù)表)字符串宏調(diào)用的一般形式為:宏名(實(shí)際參數(shù)表);1)宏定義時(shí),宏名與帶參數(shù)的括號(hào)之間不應(yīng)加空格,否則將空格以后的字符都作為替代字符串,此時(shí)原本要用作參數(shù)的參數(shù)表也變成了字符串的一部分,把有參數(shù)的宏變成了無(wú)參數(shù)的宏。2)要區(qū)分有參數(shù)的宏與函數(shù)的區(qū)別,兩者在本質(zhì)上是不同的。使用有參數(shù)的宏時(shí)應(yīng)注意:8.4.2文件包含文件包含是指處理一個(gè)源文件時(shí),可以將另外一個(gè)源文件包含進(jìn)來(lái),也就是把另外一個(gè)文件包含到本文件中。文件包含的一般形式為:#include"文件名"或#include<文件名>8.4.3條件編譯一般來(lái)說(shuō),源程序中的所有行都應(yīng)該參加編譯,但如果只希望其中一部分內(nèi)容參加編譯,可使用ifdef、ifndef、if、else、endif等關(guān)鍵詞進(jìn)行條件編譯。例如:#include“reg51.h”或者#include"reg52.h"因?yàn)閞eg51.h文件中用特殊寄存器名定義了80C51中所有SFR寄存器的絕對(duì)地址,所以編程訪問(wèn)SFR寄存器時(shí),就可以直接使用寄存器名作為其實(shí)際地址使用。8.5KeilC51編譯器的絕對(duì)地址訪問(wèn)C51編譯器提供的絕對(duì)地址訪問(wèn)方式主要有利用基于存儲(chǔ)器的指針變量訪問(wèn)、利用擴(kuò)展關(guān)鍵字_at_訪問(wèn)、使用預(yù)定義宏指定變量的絕對(duì)地址和連接定位控制命令等。8.5.1基于存儲(chǔ)器的指針變量訪問(wèn)絕對(duì)地址先定義一個(gè)基于存儲(chǔ)器的指針變量,然后對(duì)該變量賦以存儲(chǔ)器絕對(duì)地址值,就可以實(shí)現(xiàn)對(duì)

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論