第7章-單片機(jī)C語言編程基礎(chǔ)知識_第1頁
第7章-單片機(jī)C語言編程基礎(chǔ)知識_第2頁
第7章-單片機(jī)C語言編程基礎(chǔ)知識_第3頁
第7章-單片機(jī)C語言編程基礎(chǔ)知識_第4頁
第7章-單片機(jī)C語言編程基礎(chǔ)知識_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、237.1.1標(biāo)識符和關(guān)鍵字7.1.2C51 數(shù)據(jù)類型7.1.3常量與變量45 C語言是一種編譯型程序設(shè)計(jì)語言,它既具有高級語言的特點(diǎn),又具備了匯編語言的功能。相對于匯編語言而言,使用C語言開發(fā)系統(tǒng)可以縮短開發(fā)周期、增強(qiáng)程序的可讀性,并且便于改進(jìn)、擴(kuò)充和移植。 C語言程序本身不依賴于硬件開發(fā)平臺,程序不做修改或做少量修改就可以移植到不同的單片機(jī)中。目前,使用C語言進(jìn)行程序設(shè)計(jì)已經(jīng)成為單片機(jī)軟件開發(fā)的主流。 基于單片機(jī)的C語言又稱為C51語言。和標(biāo)準(zhǔn)C語言所不同的是,C51語言運(yùn)行于單片機(jī)平臺上,并根據(jù)單片機(jī)的硬件特點(diǎn)擴(kuò)展了部分關(guān)鍵字。以下關(guān)于C語言的描述都是基于單片機(jī)的,后面不再強(qiáng)調(diào)這一點(diǎn)。1

2、 C 語言程序由一個主函數(shù)和若干其他函數(shù)構(gòu)成,主函數(shù)可以調(diào)用其他函數(shù),其他函數(shù)之間可以相互調(diào)用。主函數(shù)名必須為main( )。C程序通過調(diào)用該函數(shù)去執(zhí)行指定的語句。23C程序的執(zhí)行是從main( )函數(shù)開始的,系統(tǒng)對該函數(shù)的位置無特殊規(guī)定。4C程序中,一個函數(shù)需要調(diào)用另一個函數(shù)時,被調(diào)用函數(shù)應(yīng)預(yù)先定義或聲明。6基于單片機(jī)的C語言程序有以下幾個特點(diǎn):5函數(shù)通常由說明部分和函數(shù)體兩部分組成,說明部分是對函數(shù)名、函數(shù)類型、形參名和形參類型等所做的說明。C程序書寫格式自由,一行可以有多條語句,每條語句均以“;”結(jié)尾。67指針與指針變量:若定義變量x,&x即為指向x的指針;若xp=&x,那么,利用*xp

3、可以訪問變量x。8當(dāng)前程序需要包含其他源程序文件時,應(yīng)在當(dāng)前程序的開始處使用包含處理命令#include,該命令的含義是將其他源文件的全部內(nèi)容包含到本程序中。9在C程序中,可以用#define定義的標(biāo)識符來表示一個常量。71標(biāo)識符 標(biāo)識符是表示程序中自定義對象名稱的符號。其中的自定義對象可以是常量、變量、數(shù)組、結(jié)構(gòu)、語句標(biāo)號以及函數(shù)等。 C51語言中,標(biāo)識符由字母(az,AZ)、數(shù)字(09)和下劃線“_”組成,一個標(biāo)識符最多可支持32個字符。 標(biāo)識符應(yīng)盡量見名知意,定義標(biāo)識符時需要遵守以下規(guī)則: 標(biāo)識符的第一個字符必須是字母或者下劃線,不能為數(shù)字。 C51的標(biāo)識符區(qū)分大小寫,例如,“ch1”和

4、“Ch1”表示兩個不同的標(biāo)識符。 用戶自定義的標(biāo)識符不能與系統(tǒng)保留的關(guān)鍵字相同。82關(guān)鍵字關(guān)鍵字是C51編譯器保留的一些特殊標(biāo)識符,它們具有特定的含義和用法。單片機(jī)的C51語言繼承了ANSIC標(biāo)準(zhǔn)定義的32個關(guān)鍵字,如表7-1所示。表7-1 C51的關(guān)鍵字9關(guān)鍵字用途說明auto存儲種類說明用以說明局部變量為自動變量,可省略break程序語句退出最內(nèi)層循環(huán)case程序語句switch語句中的選擇項(xiàng)char數(shù)據(jù)類型說明單字節(jié)整型數(shù)或字符型數(shù)據(jù)const存儲類型說明在程序執(zhí)行過程中不可更改的常量值continue程序語句轉(zhuǎn)向下一次循環(huán)default程序語句switch語句中的失敗選擇項(xiàng)do程序語句

5、構(gòu)成do-while循環(huán)結(jié)構(gòu)double數(shù)據(jù)類型說明雙精度浮點(diǎn)數(shù)else程序語句構(gòu)成if-else選擇結(jié)構(gòu)enum數(shù)據(jù)類型說明枚舉類型extern存儲種類說明在其他程序模塊中說明了的全局變量表7-1 C51的關(guān)鍵字(續(xù))10關(guān)鍵字用途說明float數(shù)據(jù)類型說明單精度浮點(diǎn)數(shù)for程序語句構(gòu)成for循環(huán)結(jié)構(gòu)goto程序語句構(gòu)成goto轉(zhuǎn)移結(jié)構(gòu)if程序語句構(gòu)成ifelse選擇結(jié)構(gòu)int數(shù)據(jù)類型說明基本整型數(shù)long數(shù)據(jù)類型說明長整型數(shù)register存儲種類說明使用CPU內(nèi)部寄存的變量return程序語句函數(shù)返回short數(shù)據(jù)類型說明短整型數(shù)signed數(shù)據(jù)類型說明有符號數(shù),二進(jìn)制數(shù)據(jù)的最高位為符號

6、位sizeof運(yùn)算符計(jì)算表達(dá)式或數(shù)據(jù)類型的字節(jié)數(shù)static存儲種類說明靜態(tài)變量struct數(shù)據(jù)類型說明結(jié)構(gòu)類型數(shù)據(jù)switch程序語句構(gòu)成switch選擇結(jié)構(gòu)typedef數(shù)據(jù)類型說明重新進(jìn)行數(shù)據(jù)類型定義union數(shù)據(jù)類型說明聯(lián)合類型數(shù)據(jù)unsigned數(shù)據(jù)類型說明無符號數(shù)據(jù)void數(shù)據(jù)類型說明無類型數(shù)據(jù)volatile數(shù)據(jù)類型說明該變量在程序執(zhí)行中可被隱含地改變while程序語句構(gòu)成while和do-while循環(huán)語句 同時,C51語言又結(jié)合單片機(jī)硬件的特點(diǎn)擴(kuò)展了19個關(guān)鍵字,包括_at_,idata,sfr16,alien,interrupt,small,bdata,large,_tas

7、k_,code,bit,pdata,using,reentrant,xdata,compact,sbit,data和sfr等。Keil軟件中的C51編譯器支持的數(shù)據(jù)類型如表7-2所示。表7-2 C51編譯器支持的數(shù)據(jù)類型11數(shù)據(jù)類型長度值域unsigned char單字節(jié)0255signed char單字節(jié)128+127unsigned int雙字節(jié)065535signed int雙字節(jié)32768+32767unsigned long四字節(jié)04294967295signed long四字節(jié)2147483648+2147483647float四字節(jié)1.175494E383.402823E+38*

8、13字節(jié)對象的地址bit位0或1sfr單字節(jié)0255sfr16雙字節(jié)065535sbit位0或1121 bit字下面針對C51語言中擴(kuò)展的數(shù)據(jù)類型做簡單說明。2 sfr bit是C51編譯器擴(kuò)充的數(shù)據(jù)類型,它可以定義一個位變量,定義位變量時可以為變量賦值,但不能定義位指針或位數(shù)組。位變量的取值是一個二進(jìn)制位,非0即1。 該數(shù)據(jù)類型的定義格式為: bit 變量名=變量值; sfr是一種擴(kuò)充數(shù)據(jù)類型,它能夠定義一個特殊功能寄存器,利用它可以訪問51單片機(jī)內(nèi)部的所有特殊功能寄存器。該類型的變量占用一個內(nèi)存單元,變量的取值范圍為0 x800 xFF。 該數(shù)據(jù)類型的定義格式為: sfr 變量名=變量地址

9、; 例如,“sfr P1=0 x90;”這條語句定義變量P1為P1端口在片內(nèi)的寄存器。 133 sfr16 sfr16也是一種擴(kuò)充數(shù)據(jù)類型,它定義的變量占用兩個內(nèi)存單元。sfr16和sfr一樣用于操作特殊功能寄存器,不同的是,sfr16定義的變量可訪問16位特殊功能寄存器,sfr16類型變量的取值范圍為065535。 該數(shù)據(jù)類型的定義格式如下: sfr16 變量名=變量地址; 此處的變量地址為16位地址中的低8位地址。通過sfr16類型變量訪問16位特殊功能寄存器時,先讀低字節(jié)數(shù)據(jù),后讀高字節(jié)數(shù)據(jù);對特殊功能寄存器寫入數(shù)據(jù)時,先寫入高字節(jié)地址,再寫入低字節(jié)地址。144sbit位尋址位 sbit

10、是C51的一種擴(kuò)充數(shù)據(jù)類型,利用它可以訪問單片機(jī)內(nèi)部RAM中位地址空間或特殊功能寄存器中的可位尋址的位。 該數(shù)據(jù)類型的定義格式有以下3種: sbit 變量名=位地址; sbit 變量名=sfr地址位序號; sbit 變量名=字節(jié)地址位序號; 例如: sbit OV=0 xd2;/0 xd2是OV的位地址 sbit OV=PSW2;/PSW寄存器需要先使用sfr定義 sbit OV=0 xd02;/0 xd0是PSW寄存器的地址(2)浮點(diǎn)型常量浮點(diǎn)型常量可分為十進(jìn)制和指數(shù)兩種表示形式。 十進(jìn)制浮點(diǎn)型常量由數(shù)字和小數(shù)點(diǎn)組成,整數(shù)或小數(shù)部分為0時可以省略,但必須要保留小數(shù)點(diǎn),如0.888,3345.

11、345,0.0,.25,300.等。 指數(shù)浮點(diǎn)型常量表示形式為:數(shù)字.數(shù)字e數(shù)字。中的內(nèi)容為可選項(xiàng),如125e3,7e9,3.0e3等。 1常量在程序運(yùn)行過程中,值不能被修改的量稱為常量,如固定的數(shù)據(jù)表、字符等。常量的數(shù)據(jù)類型有整型、浮點(diǎn)型、字符型、字符串型和位標(biāo)量型等。(1)整型常量整型常量的表示方法有多種,可以采用十進(jìn)制方式表示,如123,0,89等;若采用十六進(jìn)制表示,數(shù)據(jù)應(yīng)以0 x開頭,如0 x34,0 x3B等;如果是長整型數(shù)據(jù),則需要在數(shù)字后面加上字母L,如104L,034L,7850L等。15 (3)字符型常量 將單個字符放在單引號內(nèi)的常量就是字符型常量,如ad等。有一類字符型常

12、量專門用來表示控制字符,如回車符、換行符等,它們被稱為轉(zhuǎn)義字符,其表示方式為在字符前面加上一個反斜杠“”,如n。常用轉(zhuǎn)義字符如表7-3所示。表7-3 常用轉(zhuǎn)義字符表16轉(zhuǎn)義字符含義ASCII碼(十六/十進(jìn)制)o空字符(NULL)00H/0n換行符(LF)0AH/10r回車符(CR)0DH/13t水平制表符(HT)09H/9b退格符(BS)08H/8f換頁符(FF)0CH/12單引號27H/39雙引號22H/34反斜杠5CH/92 (4)字符串型常量 該常量通常由放在雙引號內(nèi)的一個或多個字符組成,如testOK等。當(dāng)雙引號內(nèi)沒有字符時,該字符串為空字符串。 在C51語言中,字符串常量是被當(dāng)作字符

13、類型數(shù)組來處理的。在存儲字符串時系統(tǒng)會在字符串尾部加上“0”轉(zhuǎn)義字符作為該字符串的結(jié)束符。例如,字符串常量A和字符常量A是不同的,前者在存儲時多占用一個字節(jié)的空間。17 (5)位標(biāo)量 該常量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,它的值是一個二進(jìn)制位。 例如,定義位標(biāo)量False和True: #define False 0 x0/用預(yù)定義語句可以定義常量,這里定義False為0,True為1 #define True 0 x1/程序中用到False時編譯器自動用0替換,同理True替換為12變量在程序運(yùn)行過程中,值可以改變的量稱為變量,C51編譯器支持的數(shù)據(jù)類型均可定義變量。要在程序中使用變量,必須

14、先定義變量,即指定變量名,并指出變量對應(yīng)的數(shù)據(jù)類型和存儲模式,這樣編譯系統(tǒng)才能為變量分配相應(yīng)的存儲空間。18 變量的定義格式如下: 存儲類型 數(shù)據(jù)類型 存儲器類型 變量名表 在定義格式中,除了數(shù)據(jù)類型和變量名表是必要的,其他的都是可選項(xiàng)。 (1)存儲類型 不同存儲類型的變量或不同位置定義的變量都具有不同的作用范圍,這個有效范圍即是變量的作用域。在單片機(jī)程序中,變量的存儲種類可以分為自動變量、全局變量、靜態(tài)變量和寄存器變量。 自動變量 定義變量時,在變量名前面加上關(guān)鍵字auto,即把該變量定義為自動變量。它一般出現(xiàn)在函數(shù)內(nèi)部或復(fù)合語句中,其作用范圍是本函數(shù)或復(fù)合語句內(nèi)部,如果省略關(guān)鍵字auto,

15、即默認(rèn)該變量為自動型變量。 19 在程序執(zhí)行過程中,自動變量的存儲空間是動態(tài)分配的。當(dāng)程序執(zhí)行到該變量的聲明語句時,編譯器根據(jù)變量類型自動為其分配存儲空間;當(dāng)函數(shù)或復(fù)合語句執(zhí)行完畢后,自動變量的存儲空間將立刻被取消,自動變量失效。 全局變量 此類變量以關(guān)鍵字extern標(biāo)識。全局變量一般定義在所有函數(shù)的外部,其作用域是從全局變量定義的位置到源文件結(jié)束,它可以被作用域范圍內(nèi)的任何函數(shù)調(diào)用。全局變量有時也稱為外部變量。 靜態(tài)變量 此類變量以關(guān)鍵字static標(biāo)識。從變量的作用域來看,靜態(tài)變量和自動變量類似,其作用域是定義該變量的函數(shù)的內(nèi)部。如果靜態(tài)變量定義在函數(shù)外部,它將具有全局變量的作用域。 2

16、0 從內(nèi)存占用的角度來看,靜態(tài)變量和全局變量類似,一旦分配存儲空間,它始終占有該內(nèi)存空間,直至程序運(yùn)行結(jié)束。 寄存器變量 單片機(jī)的CPU寄存器中也可以保存少量的變量,這種變量稱為寄存器變量。寄存器變量以關(guān)鍵字register標(biāo)識。單片機(jī)對CPU寄存器的讀寫速度要遠(yuǎn)高于對其他類型變量的訪問速度,所以把最頻繁使用的變量定義為寄存器變量可以有效地提高程序運(yùn)行速度。 由于單片機(jī)資源有限,系統(tǒng)只允許同時定義兩個寄存器變量。如果多于兩個,編譯時系統(tǒng)會自動將其他寄存器變量當(dāng)做非寄存器變量來處理。 21 (2)存儲器類型 存儲器類型用于指定變量在C51硬件系統(tǒng)中所使用的存儲區(qū)域,這樣便于在編譯時進(jìn)行準(zhǔn)確定位。

17、Keil軟件所能識別的存儲器類型如表7-4所示。 22存儲器類型說明data直接訪問內(nèi)部數(shù)據(jù)存儲器(128字節(jié)),訪問速度最快bdata可位尋址內(nèi)部數(shù)據(jù)存儲器(16字節(jié)),允許位與字節(jié)混合訪問idata間接訪問內(nèi)部數(shù)據(jù)存儲器(256字節(jié)),允許訪問全部內(nèi)部地址pdata分頁訪問外部數(shù)據(jù)存儲器(256字節(jié)),用MOVX Ri指令訪問xdata外部數(shù)據(jù)存儲器(64KB),用MOVX DPTR指令訪問code程序存儲器(64KB),用MOVC A+DPTR指令訪問表7-4 存儲器類型 如果在定義變量時省略了存儲器類型,編譯系統(tǒng)會按照默認(rèn)的存儲模式去指定變量的存儲區(qū)域,這些存儲模式包括small,co

18、mpact和large。 small存儲模式 該模式是將函數(shù)參數(shù)和局部變量都放置在片內(nèi)RAM中(默認(rèn)變量類型為data,最大128字節(jié))。另外,其他所有對象(包括棧)也都優(yōu)先放置在片內(nèi)RAM區(qū),當(dāng)片內(nèi)RAM用滿時,再放置到片外RAM中。 compact存儲模式 此種存儲模式是將參數(shù)和局部變量都放置在片外RAM區(qū)(默認(rèn)存儲類型是pdata,最大256字節(jié)),變量需要通過間接尋址方式進(jìn)行訪問。 large存儲模式 該模式是將參數(shù)和局部變量放在片外RAM中(默認(rèn)的存儲類型是XDATA,最大64KB);變量需要使用數(shù)據(jù)指針DPTR通過間接尋址方式訪問。23 (3)對變量進(jìn)行絕對定位 C51擴(kuò)展的關(guān)鍵字

19、_at_用于對變量作絕對地址定位,_at_一般出現(xiàn)在變量的定義中,其格式為: 存儲類型 數(shù)據(jù)類型 存儲區(qū) 變量名1 _at_ 地址常數(shù),變量名2 例如: unsigned char data aa _at_ 0 x30; /對data區(qū)域中的變量aa作絕對地址定位 unsigned int pdata cc10 _at_ 0 x34;/對pdata區(qū)域中的數(shù)組cc作絕對地址定位 unsigned char xdata printer_port _at_ 0 x7fff; /對xdata區(qū)域中的變量printer_port作絕對地址定位24對變量定位絕對地址時,要注意以下幾點(diǎn): 定位絕對地址時,

20、變量不能初始化,因此不能對code型常量絕對定位; 定位絕對地址的變量只能是全局變量,不能在函數(shù)中對變量進(jìn)行絕對定位; 定位絕對地址的變量多用于I/O端口,一般情況下不對變量作絕對定位; 位變量不能使用_at_進(jìn)行絕對定位。25 3變量的初始化及賦值 (1)變量的初始化 變量的初始化是指定義時給變量賦予一個默認(rèn)值,外部變量和靜態(tài)全局變量一般在定義時被初始化,局部變量包括靜態(tài)局部變量是在進(jìn)入定義它們的函數(shù)或復(fù)合語句時才被初始化。所有的全局變量在沒被明確初始化時都會被系統(tǒng)自動清零,而局部變量和寄存器變量在未被賦值前其值是不確定的。 賦予外部變量和靜態(tài)變量的初值必須是常數(shù)表達(dá)式,而自動變量和寄存器變

21、量的初值可以是任意表達(dá)式,這個表達(dá)式可以是常數(shù)或前面說明過的變量和函數(shù)。例如: float f0,f1=0.2;/定義全局變量,在初始化時f0被清零,f1被賦0.2 main() static int i=10,j;/定義靜態(tài)局部變量,初始化時i被賦10,j為0 int k=i*5;/定義局部變量,初始化時k被賦10*5=50 char c=y; /定義字符型變量并初始化 26 (2)變量的賦值 變量賦值是指給已定義的變量賦一個具體值。常見的變量賦值有以下幾種類型: 給整型變量和浮點(diǎn)型變量賦值。賦值格式如下: 變量名=表達(dá)式; 例如: main() int a,m;/定義局部整型變量a,mfl

22、oat n;/定義局部浮點(diǎn)變量na=100,m=20;/給變量賦值n=a*m*0.1; 27 C語言中給多個變量賦同一數(shù)值時允許使用連等的方式。例如: main() int a,b,c;a=b=c=0;/同時給a,b,c賦值 給字符型變量賦值??蓪⒆址A俊⒆址腁SCII值或轉(zhuǎn)義字符等賦給字符型變量,例如: main() char a0,a1,a2; /定義局部字符型變量a0,a1,a2a0=b; /將字符b賦給a0a1=50; /將十進(jìn)制數(shù)字2的ASCII碼值50賦給a1a2=x0d; /將回車符賦給a2 28297.2.1算術(shù)運(yùn)算符7.2.2關(guān)系運(yùn)算符7.2.3邏輯運(yùn)算符7.2.4布爾“

23、位”運(yùn)算符7.2.5賦值運(yùn)算符7.2.6遞增/遞減運(yùn)算符7.2.7運(yùn)算符的優(yōu)先級30單片機(jī)C程序的運(yùn)算符和表達(dá)式如下: 關(guān)系運(yùn)算符6個=大于xy若x變量的值大于y變量的值,其結(jié)果為1,否則為0小于x=大于等于x=y若x變量的值大于或等于y變量的值,則結(jié)果為1,否則為0=小于等于xy)|(yz)若x變量的值大于y變量的值,或y變量的值也大于z變量的值,其結(jié)果為真(值為1),否則為假(值為0)!非運(yùn)算!(xy)若x變量的值大于y變量的值,其結(jié)果為真(值為1),否則為假(值為0)34布爾位運(yùn)算符與邏輯運(yùn)算符類似,不同之處在于邏輯運(yùn)算的最終結(jié)果為真或假,而布爾位運(yùn)算符的結(jié)果是一個具體數(shù)據(jù)。布爾位運(yùn)算符

24、如表7-8所示。表7-8 布爾“位”運(yùn)算符符號作用舉例解釋&與運(yùn)算A=x&y變量A的結(jié)果為將x與y變量的每個位進(jìn)行AND運(yùn)算|或運(yùn)算B=x|y變量B的結(jié)果為將x與y變量的每個位進(jìn)行OR運(yùn)算異或運(yùn)算C=xy變量C的結(jié)果為將x與y變量的每個位進(jìn)行XOR運(yùn)算取反運(yùn)算D=x變量D的結(jié)果為將x與y變量的每個位進(jìn)行取反運(yùn)算左移運(yùn)算E=x右移運(yùn)算F=xn變量F的結(jié)果為將變量x值右移n位。35常見的賦值運(yùn)算符是“=”,由它又衍生出其他多種賦值運(yùn)算符,如表7-9所示。表7-9 賦值運(yùn)算符36符號作用舉例說明=賦值A(chǔ)=x將變量x的值賦給變量A+=賦值加B+=x相當(dāng)于B=B+x- =賦值減C-=x相當(dāng)于C=C-x*

25、 =賦值乘D*=x相當(dāng)于D=D*x/ =賦值除E/=x相當(dāng)于E=E/x% =賦值取余F%=x相當(dāng)于F=F%x& =賦值與G&=x相當(dāng)于G=G&x| =賦值或H|=x相當(dāng)于H=H&x =賦值異或I=x相當(dāng)于I=Ix =左移賦值J=n相當(dāng)于J=J =右移賦值K=n相當(dāng)于K=Kn遞增/遞減運(yùn)算符包括自增與自減運(yùn)算符,如表7-10所示。表7-10 遞增/遞減運(yùn)算符符號作用舉例解釋+ +自加1x+將x變量的值自加1 - -自減1x- -將x變量的值自減137 自增運(yùn)算符+及自減運(yùn)算符-的作用是讓變量的值加1或減1。但自增自減運(yùn)算符都有前置與后置之分,前置后置決定了變量使用與計(jì)算(加1或減1)的順序: (

26、1)自增運(yùn)算符前置,如+i,是先將i的值加1,再使用加1后i的值。 (2)自增運(yùn)算符后置,如i+,是先使用i當(dāng)前的值,再將i的值加1。 (3)自減運(yùn)算符前置,如-i,是先將i的值減1,再使用減1后i的值。 (4)自減運(yùn)算符后置,如i-,是先使用i當(dāng)前的值,再將i的值減1。 在一個表達(dá)式中可能包含多個由不同運(yùn)算符連接起來的、具有不同數(shù)據(jù)類型的數(shù)據(jù)對象;由于表達(dá)式中有多種運(yùn)算,不同的運(yùn)算順序可能得出不同的結(jié)果。因而,當(dāng)表達(dá)式中含有多種運(yùn)算時,操作數(shù)必須按照一定的順序進(jìn)行結(jié)合,這樣才能保證運(yùn)算的合理 性和結(jié)果的正確性、唯一性。 運(yùn)算符的計(jì)算順序就是通常所說的優(yōu)先級,運(yùn)算符的優(yōu)先級如表7-11所示。括

27、號的優(yōu)先級最高,賦值運(yùn)算符的優(yōu)先級最低。在同一表達(dá)式中,優(yōu)先級高的運(yùn)算符先計(jì)算,優(yōu)先級低的運(yùn)算符后計(jì)算;若參與運(yùn)算的運(yùn)算符為同一優(yōu)先級,則按結(jié)合性原則進(jìn)行計(jì)算。38表7-11 運(yùn)算符的優(yōu)先級優(yōu)先級運(yùn)算符或提示符說明結(jié)合性1( )小括號自左向右2 !取補(bǔ)碼、反相運(yùn)算符自右向左3+ -自加1,自減1自右向左39表7-11 運(yùn)算符的優(yōu)先級(續(xù))優(yōu)先級運(yùn)算符或提示符說明結(jié)合性4* / %乘、除、取余數(shù)自左向右5+ -加、減自左向右6左移、右移自左向右7 = = !=關(guān)系運(yùn)算符自左向右8&按位與自左向右9按位異或自左向右10|按位或自左向右11&邏輯與自左向右12|邏輯或自左向右13= *= /= %=

28、 += -= &= = |=賦值運(yùn)算符自右向左407.3.1循環(huán)結(jié)構(gòu)7.3.2選擇結(jié)構(gòu)41 循環(huán)結(jié)構(gòu)是程序中需要反復(fù)執(zhí)行某個功能而設(shè)置的一種程序結(jié)構(gòu),它通常由循環(huán)體和循環(huán)條件構(gòu)成。它根據(jù)循環(huán)體中的條件判斷是否繼續(xù)執(zhí)行循環(huán)體。 C51語言提供3種循環(huán)語句:for語句、while語句和do-while語句。1 for 語句 for 語句的一般形式為: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句; 其中,表達(dá)式1為賦值語句,給循環(huán)變量進(jìn)行初始化賦值;表達(dá)式2是關(guān)系邏輯表達(dá)式,其值用于判斷循環(huán)條件是否成立,取值為真或假;表達(dá)式3定義循環(huán)變量在每次循環(huán)后的變化方式。 例如: for(int i=0;i

29、8;i+) P0=data;422while 語句 while 語句的特點(diǎn)是先判斷條件表達(dá)式,表達(dá)式的值為真就執(zhí)行循環(huán)體中的語句;表達(dá)式的值為假就結(jié)束循環(huán),繼續(xù)執(zhí)行循環(huán)外的下一條語句。語句格式如下: while(表達(dá)式) 語句; 433do-while 語句 do-while語句的特點(diǎn)是先執(zhí)行一遍循環(huán)體再判斷條件,語句格式如下: do 語句; while(表達(dá)式); 該語句在執(zhí)行時要先執(zhí)行一次do后面的語句,然后判斷表達(dá)式是否為真,如果表達(dá)式的值為真,則再次執(zhí)行do后面的語句直到表達(dá)式為假時,結(jié)束循環(huán)并繼續(xù)執(zhí)行循環(huán)外的后續(xù)語句。選擇結(jié)構(gòu)是根據(jù)條件決定程序的走向,C51提供的選擇語句有if-el

30、se語句及switch語句。 if-else 語句,又稱為條件選擇語句,在執(zhí)行時需要先對條件進(jìn)行判斷,再根據(jù)判斷結(jié)果執(zhí)行不同的語句,語句格式如下: if(表達(dá)式) 語句1; else 語句2;該語句需要先判斷表達(dá)式的值是否成立,如果成立,執(zhí)行語句1,否則執(zhí)行語句2。1 if-else 語句44 有時簡單的if-else語句不能滿足實(shí)際應(yīng)用,我們也可以使用if-else的多重條件判斷語句編寫程序,其格式如下: if(表達(dá)式1) 語句1; else if(表達(dá)式2) 語句2; else if(表達(dá)式3) 語句3; else 語句4;45 執(zhí)行該語句時,先判斷表達(dá)式1是否成立,如果成立,執(zhí)行語句1;

31、如果不成立,再判斷表達(dá)式2是否成立,如果成立,執(zhí)行語句2,否則判斷表達(dá)式3;如果表達(dá)式3成立,則執(zhí)行語句3,如不成立,執(zhí)行語句4。2 switch語句 switch語句為程序的走向提供多重選擇,因而被稱為多分支選擇語句。這種選擇方式不存在優(yōu)先等級的問題,語句格式如下: switch(表達(dá)式) case 常數(shù)1: 語句1; break; case 常數(shù)2: 語句2; break; default: 語句n; break; 46 switch后面表達(dá)式的值與某一case后面的常數(shù)值相等時,就執(zhí)行該case后面的語句,遇到break語句時退出switch語句。當(dāng)所有的case中的常數(shù)值都沒能夠與表達(dá)

32、式的值匹配時,就執(zhí)行default后面的語句。 switch語句在使用時要注意以下幾點(diǎn):47 每個case后面的常數(shù)值必須是互不相同的。 每個case和default出現(xiàn)的次序不影響程序的執(zhí)行結(jié)果。 如果遺忘了case后面的break語句,則程序在執(zhí)行了當(dāng)前case語句后,不會退出switch語句,而是繼續(xù)執(zhí)行后續(xù)的case語句。48 (1)數(shù)組的聲明 數(shù)組也是一種變量,它將相同數(shù)據(jù)形態(tài)的若干個變量以同一個變量名稱來表示。數(shù)組的聲明格式如下: 數(shù)據(jù)類型 數(shù)組名數(shù)組大小; 例如,聲明一個含有5個字符的數(shù)組,語句如下: char LPC5; 該字符數(shù)組共包含5個變量,分別是LPC0LPC4。由于C

33、51語言中沒有“字符串”這種數(shù)據(jù)類型,所以字符數(shù)組常用來存放字符串。數(shù)組(array)是一種將同類型數(shù)據(jù)集合管理的數(shù)據(jù)結(jié)構(gòu),而指針(Pointer)是存放存儲器地址的變量,它們都是數(shù)據(jù)管理的好幫手。 1數(shù)組49 (2)數(shù)組的賦值 聲明數(shù)組的同時也可以對其賦初值,如“char LPC5=ABCD;”。 經(jīng)過上述聲明后,LPC0=A,LPC1=B,LPC2=C,LPC3=D,LPC4=0。 若聲明時不知道數(shù)組的長度,也可將數(shù)組的長度省略,交由程序處理。例如: char string1= welcome to hua dong jiao dali gong xue yuan 聲明整型或浮點(diǎn)型數(shù)組時,

34、如需指定其初值,可采用如下方式: int Num6= 30,22,33,44,55,66;50多維數(shù)組定義格式如下:數(shù)據(jù)類型 數(shù)組名常量表達(dá)式1常量表達(dá)式2常量表達(dá)式n;例如:int Num32=10,11,12,13,14,15; 2指針 (1)指針的定義 指針是用來存放存儲器地址的變量,既然是變量,使用前也需要先定義。定義格式如下: 數(shù)據(jù)類型 *變量名稱; 例如,聲明一個名為ptr的指針,語句如下: int *ptr; 也可以將同類型的變量與指針放在一起聲明,例如: int *ptr1, *ptr2, a, b, c; 與指針息息相關(guān)的運(yùn)算符是“&”,該運(yùn)算符的功能是取變量的地址,它可以將

35、指定變量的地址放入指針變量。常見的語句形式如下: ptr1=&a;51 執(zhí)行上述語句后,a變量的地址被放入了ptr1指針變量中。該語句如果用于數(shù)組變量,可以先獲取數(shù)組的第一個元素的地址,例如: ptr1=&Num0; 執(zhí)行上面的語句后,Num數(shù)組的首地址將被放入ptr1指針變量中。若要將Num0的內(nèi)容輸出到P2口,可使用語句“p2=Num0;”或者“p2=*ptr1;”。 52 (2)指針變量的運(yùn)算 若先使指針變量p指向數(shù)組a(即p=a),則: p+(或p+=1),該操作將使指針變量p指向下一個數(shù)組元素,即a1。 *p+,由于+與*運(yùn)算符優(yōu)先級相同,而結(jié)合方向?yàn)閺挠蚁蜃?,因此?p+等價于*(

36、p+),即先得到p指向的變量的值(*p),然后再執(zhí)行p自加運(yùn)算。 (*p)+,表示p所指向的元素值加1,而不是p加1。例如,p=&a0,且a0=3,那么執(zhí)行完(*p)+后,a0=4。 若p指向當(dāng)前數(shù)組中第i個元素,則:53 *(p-)與ai-等價,相當(dāng)于先執(zhí)行*p,然后再使p自減; *(+p)與a+i等價,先執(zhí)行p自加操作,再執(zhí)行*p運(yùn)算; *(-p)與a-i等價,先執(zhí)行p自減操作,再執(zhí)行*p運(yùn)算。 3函數(shù) 函數(shù)由函數(shù)頭和函數(shù)體兩部分組成。 函數(shù)頭又由返回值類型、函數(shù)名和形式參數(shù)表組成。返回值類型可以是某個數(shù)據(jù)類型;函數(shù)名是用戶為函數(shù)起的名字,用來唯一標(biāo)識一個函數(shù);形式參數(shù)表可以有零個或多個變量,在進(jìn)行函數(shù)調(diào)用時,實(shí)際參數(shù)將被復(fù)制到這些變量中。 函數(shù)體則是函數(shù)實(shí)現(xiàn)自身功能的一組語句。函數(shù)的一般形式如下: 類型說明符 函數(shù)名(形式參數(shù)表) 函數(shù)體 54 例如: void Sub_name(int x) int i, j ; unsigned char LED; LED=0 xff;/*關(guān)閉LED*/ 其中,函數(shù)的返回值類型是void;函數(shù)名是Sub_name;從函數(shù)

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論