版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、【知識鏈接2】pic單片機(jī)c語言入門1.2.1 認(rèn)識pic單片機(jī)c語言用c語言來開發(fā)單片機(jī)系統(tǒng)軟件最大的好處是編寫代碼效率高。軟件調(diào)試直觀、維護(hù)升級方便、代碼的重復(fù)利用率高、便于跨平臺的代碼移植等等,因此c語編程在單片機(jī)系統(tǒng)設(shè)計中已得到越來越廣泛的應(yīng)用。但在單片機(jī)上用c語言寫程序和在pc機(jī)上寫程序絕對不能簡單等同。珊在的pc機(jī)資源十分豐富,運算能力強大,因此,程序員在寫pc機(jī)的應(yīng)用程序時,幾乎不用關(guān)心編譯后的可執(zhí)行代碼在運行過程中需要占用多少系統(tǒng)資源,也基本不用擔(dān)心運行效率有多高。寫單片機(jī)的c語言程序最關(guān)鍵的一點是單片機(jī)內(nèi)的資源非常有限,控制的實時性要求又很高,因此,如果沒有對單片機(jī)體系結(jié)構(gòu)和
2、硬件資源作詳盡的了解,以筆者的愚見認(rèn)為是無法寫出高質(zhì)量實用性很高的c語程序。本書圍繞pic中檔系統(tǒng)單機(jī)來展開討論的,microchip公司自己沒有針對pic中檔系列單片機(jī)的c語言編譯器,但很多專業(yè)的第三方公司有眾多支持pic單片機(jī)的c語言編譯器提供,常見的有hitech、ccs、iar、bytecraft等公司。其中筆者最常用的是hitech公司的picc編譯器,它穩(wěn)定可靠,編譯生成的代碼效率高,在用pic單片機(jī)進(jìn)行系統(tǒng)設(shè)計和開發(fā)的工程師群體中得到廣泛認(rèn)可。其正式完全版軟件需要購置,但在其網(wǎng)站上有限時的試用版供用戶評估。另外,hitech公司針對廣大pic的業(yè)余愛好者和初學(xué)者,還提供了完全免費
3、的學(xué)習(xí)版picc-lite編譯器套件。它的使用方式與完全版相同,只是支持的pic單片機(jī)型號限制在pic16f84、pic16f877和pic16f628等幾款。這幾款flash型的單片機(jī)因其所具備的豐富的片上資源而最適用于單片機(jī)學(xué)習(xí)入門,因此,筆者建議感興趣的讀者可以從picc-lite入手掌握pic單片機(jī)的c語言編程。我們一起來認(rèn)識訓(xùn)練項目2跑馬燈的仿真與演示的程序leds.c。1#includepic.h2int a;/定義整型變量a3void main( )4trisb=0x00;/定義端口b為輸出模式5while(1)/while循環(huán)語句6portb=0xfe;/1111 1110 7
4、for(a=1000;a0;a-);/for循環(huán)語句8portb=0xfd;/1111 11019for(a=1000;a0;a-);/for循環(huán)語句10portb=0xfb;/1111 101111for(a=1000;a0;a-);/for循環(huán)語句12portb=0xf7;/1111 011113for(a=1000;a0;a-);/for循環(huán)語句14portb=0xef;/1110 111115for(a=1000;a0;a-);/for循環(huán)語句16portb=0xdf; /1101 111117for(a=1000;a0;a-);/for循環(huán)語句18portb=0xbf;/1011 1
5、11119for(a=1000;a0;a-);/for循環(huán)語句20portb=0x7f;/0111 111121for(a=1000;a0;a-);/for循環(huán)語句22 23說明:第1行:#includepic.h是文件包含語句,表示把語句中指定文件的全部內(nèi)容復(fù)制到此處,與當(dāng)前的源程序文件鏈接成一個源文件。該語句中指定的文件pic.h是hitech-picc編譯器提供的頭文件,保存在“c:ht-picinclude”路徑下,該文件包含了對pic單片機(jī)特殊功能寄存器sfr和位名稱的定義。在編寫每一個程序時,首先編寫的一條語句就是#includepic.h。第2行:int a。是定義一個整型變量a
6、,具體什么是整型變量?有何功能?請看數(shù)據(jù)與數(shù)據(jù)類型號中的介紹。第3行:void main( )。定義主函數(shù)void main( )。其是c語言程序中必不可少的主函數(shù),也是程序開始執(zhí)行的第一個函數(shù)。函數(shù)一般分成兩個部分,一個部分為函數(shù)名:main,另一個部分為函數(shù)體:從第4行的到23行的為止。第4行:trisb=0x00。是給單片機(jī)的b端口方向寄存器賦值,使b端口數(shù)據(jù)方向為輸出方向,具體trisb寄存器功能請查看【知識鏈接3】pic單片機(jī)i/o接口及其應(yīng)用。第5行:while(1)。是while( ) 循環(huán)語句。第6行:portb=0xfe。是給單片機(jī)的b端口寄存器賦值,使b端口寄存器為0xfe
7、,具體portb寄存器功能請查看【知識鏈接3】pic單片機(jī)i/o接口及其應(yīng)用。第7行:for(a=1000;a0;a-)。是for循環(huán)語句。第821行都與第6、7行相類似,在此就不再重復(fù),int 、while、for等c語言知識接下將一一介紹。1.2.2 數(shù)據(jù)與數(shù)據(jù)類型數(shù)據(jù)是計算機(jī)的對象,任何程序設(shè)計都要進(jìn)行數(shù)據(jù)處理。具有一定格式的數(shù)字或數(shù)值稱為數(shù)據(jù),數(shù)據(jù)的不同格式稱為數(shù)據(jù)類型。數(shù)據(jù)類型單精度型(float)雙精度型(double)整型(int)實型(浮點型)字符型(char)基本類型構(gòu)造類型枚舉類型號(enum)數(shù)組類型結(jié)構(gòu)體類型(struct)共用體類型(union)指針類型空類型(voi
8、d)在c語言中,數(shù)據(jù)類型可分為:基本數(shù)據(jù)類型、構(gòu)造數(shù)據(jù)類型、指針類型、空類型四大類,如圖1-2-1所示。圖1-2-1 c語言的數(shù)據(jù)類型在進(jìn)行pic單片機(jī)程序設(shè)計時,支持的數(shù)據(jù)類型與編譯器相關(guān)。hitech-picc編譯器所支持的數(shù)據(jù)類型如表1-2-1所示,其遵循little-endian標(biāo)準(zhǔn),多字節(jié)變量的低字節(jié)放在存儲空間的低地址,高字節(jié)放在高地址。表1-2-1 hitech-picc編譯器所支持的數(shù)據(jù)類型序號數(shù)據(jù)類型名稱長度(位數(shù))值 域1位類型bit1b0或1 2有符號字符型char8b-128 +1273無符號字符型unsigned char8b0 2554有符號整型short16b-3
9、2768 +327675無符號整型unsigned short16b0 655356有符號整型int 16b-32768 +327677無符號整型unsigned int16b0 655358有符號長整型long32b-2 147 483 648 +2 147 483 6479無符號長整型unsigned long32b0 4294 967 29510浮點型float24b-2 147 483 648 +2 147 483 64711雙精度浮點型double24b或32b-8 388 608 +8 388 607 或-2 147 483 648 +2 147 483 647注:hitech-p
10、icc編譯器缺省認(rèn)定double型變量為24位長,但可以改變編譯選項改成32位長1.2.3 常量與變量單片機(jī)程序中處理的數(shù)據(jù)有常量和變量兩種形式,二者的區(qū)別在于:常量的值在程序執(zhí)行期間是不能發(fā)生變化的,而變量的值在程序執(zhí)行期間可以發(fā)生變化。1常量在程序運行的過程中,其值不能改變的量稱為常量。常量的數(shù)據(jù)類型有整型、浮點型、字符型和字符串型。(1)整型常量可以表示為十進(jìn)制數(shù)、十六進(jìn)制數(shù)或八進(jìn)制數(shù)等,例如:十進(jìn)制數(shù)12、-60等;十六進(jìn)制數(shù)以0x開關(guān),如0x13、0xab等;八進(jìn)制數(shù)以字母o開關(guān),如o14、o17等。若要表示長整型,就在數(shù)字后面加字母l,如104l、o34l、0xf340l等。(2)
11、浮點型常量可以分為十進(jìn)制表示形式和指數(shù)表示形式兩種,如0.888、3345.345、123e3、-2.4e-2等。(3)字符型常量是用單引號括起來的單一字符,如a、9等。(4)字符串型常量是用雙引號括起來的一串字符,如“test”、“ok”等。字符串是由多個字符連接起來組成的。2變量在程序運行中,其值可以改變的量稱為變量。一個變量主要由兩部分構(gòu)成;一個是變量名,一個是變量值。每個變量都有一個變量名,在內(nèi)存中占據(jù)一定的存儲單元(地址),并在該內(nèi)存單元中存放該變量的值。下例為對符號常量和變量進(jìn)行說明:1#define const 602void main( )3int variable, resu
12、lt;4variable = 20;5result = variable * const;6第1行:#define const 60。這一行定義了一個符號常量const,其值為60。這樣在后面的程序中,凡是出現(xiàn)const的地方,都代表常量60。第2行:variable和result就是變量。它們的數(shù)據(jù)類型為整型(int)。注意:符號常量與變量的區(qū)別在于,符號變量的值在作用域(本例中為主函數(shù))中,不能改變,也不能用等號賦值,習(xí)慣上,總將符號常量名用大寫,變量名用小寫,以示區(qū)別。(1)變量的定義變量必須先定義后使用,用標(biāo)識符作為變量名,并指出所用的數(shù)據(jù)類型和存儲模式,這樣編譯系統(tǒng)才能為變量分配相應(yīng)
13、的存儲空間。變量的定義格式如下:存儲種類 數(shù)據(jù)類型 存儲器類型 變量名表;其中,數(shù)據(jù)類型和變量名表是必須的,存儲種類和存儲類型是可選項。存儲種類有四種:auto(自動變量)、extern(外部變量)、static(靜態(tài)變量)和register(寄存器變量)。默認(rèn)類型為auto(自動變量)。例如:int a ;/*定義a為整型變量*/int m,n;/*定義m和n為整型變量*/float x,y,z;/*定義x,y,z單精度實型變量*/char ch;/*定義ch為字符變量*/long int t;/*定義t為長整型變量*/static int r;/*定義r為靜態(tài)的整型變量*/進(jìn)行變量定義時,
14、應(yīng)注意以下幾點: 允許在一個數(shù)據(jù)類型標(biāo)識符后,說明多外相同類型的變量,各變量名之間用逗號隔開; 數(shù)據(jù)類型標(biāo)識符與變量名之間至少用一個空格隔開; 最后一個變量名后必須以分號“;”結(jié)尾; 變量說明必須放在變量使用之前,一般放在函數(shù)體的開頭部分; 在同一個程序中變量不允許重復(fù)定義。例如:int x,y,z;int a,b,x; /*變量x被重得定義*/(2)變量的初始化在定義變量的同時可以給變量賦初值,稱為變量的初始化。變量初始化的一般格式為:數(shù)據(jù)類型標(biāo)識符 變量名1=常量1,變量名2=常量2,變量名n=常量n;例如:int m=3,n=5; /*定義m和n為整型變量,同時m,n分別賦初值3,5*/
15、float x=0,y=0,z=0; /*定義x,y,z為單精度實型變量,同時x,y,z都賦初值為0*/char ch=a; /*定義ch為字符型變量,同時賦初值字符a*/long int a=1000,b;/*定義a,b為長整型變量,同時a賦初值1000*/(3)整型變量整型變量的基本類型符為int,可以根據(jù)數(shù)值的范圍將整型變量定義為基本整型變量、短整型變量或長整型變量。 基本整型變量用int表示; 短整型變量用short int 表示(或用short)表示; 長整型變量用long int 表示(或用long)表示。在計算機(jī)(或單片機(jī))中數(shù)據(jù)是以二進(jìn)制形式表示的,基本整型變量占用內(nèi)存2個字節(jié)
16、,即16位。16位中最左邊的一位表示符號,該位0,表示正數(shù);該位1,表示負(fù)數(shù)。一個基本整型變量的值范圍為-215(215-1),即-32 76832 767。實際應(yīng)用時注意整型變量的值不能超出范圍,否則容易出錯,為了充分利用變量表示數(shù)據(jù)的范圍,可以將變量定義為“無符號”類型。歸納起來,可以使用以下6種整型變量:帶符號基本整型變量signed int無符號基本整型變量unsigned int帶符號短整型變量signed short int無符號短整型變量unsigned short int帶符號長整型變量signed long int無符號長整型變量unsigned long int如果在定義整
17、型變量時不指定unsigned,則隱含為有符號(signed)。假設(shè)定義兩個變量a和b如下:int a;usigned int b;則變量a的取范圍為了-32 76832 767。而變量b的取值范圍為065 535。圖1-2-2(a)表示有符號的基本整型變量a的最大值(32 767),圖1-2-2(b)表示無符號的基本整型變量b的最大值(65 535)。符號位=32 7670111111111111111(a)有符號整型變量表示數(shù)據(jù)的最高位=65 5351111111111111111(b)無符號整型變量圖1-2-2 變量a和b的最大值(4)實型變量實型數(shù)據(jù)與整型數(shù)據(jù)在內(nèi)定中的存儲方式不同,實
18、型數(shù)據(jù)是按照指數(shù)形式存放的,系統(tǒng)把一個實數(shù)分成小數(shù)和指數(shù)兩個部分分別進(jìn)行存放。指數(shù)部分采用規(guī)范化的指數(shù)形式,例如:-21.34638在內(nèi)存中的存放形式如圖1-2-3所示。實型號變量分為單精度(float)、雙精度(double)和長雙精度(long double),但hitech-picc編譯器只支持單精度(float)和雙精度(double)兩種,具體規(guī)則如表1-2-1所示。-.21346382符號 小數(shù)部分 指數(shù) - .2134638 2 圖1-2-3 實數(shù)在內(nèi)存中的存放形式(5)字符型變量 字符型變量用來存放字符常量,注意只能存放一個字符。例如:char c1,c2,c3,c4,c5;/
19、定義5個字符變量c1=a;/正確c2=”a”; /不正確c3=abc; /不正確c4=107; /正確c5=6; /正確將一個字符常量放到一個字符變量中,實際上并不是把該字符本身放到內(nèi)存單元中去,而是將該字符的相應(yīng)的ascii代碼放到存儲單元中。例如:char c1,c2;/定義2個字符變量c1=a;c2=b;/給字符變量c1賦值為a、c2賦值為b字符a的ascii代碼為十進(jìn)制數(shù)97,字符b的ascii代碼為十進(jìn)制數(shù)98,在內(nèi)存中變量c1、c2的實際上是以二進(jìn)形式存放的。(6)位變量 bit 型位變量只能是全局的或靜態(tài)的。picc將把定位在同一bank內(nèi)的8個位變量合并成1個字節(jié)存放于一個固定
20、地址。因此,所有針對位變量的操作將直接使用pic單片機(jī)的位操作匯編指令高效實現(xiàn)?;诖?,位變量不能是局部自動型變量,也無法將其組合成復(fù)合型號高級變量。1.2.5 運算符和表達(dá)式數(shù)據(jù)處理是程序的核心部分。在數(shù)據(jù)處理中,各種運算又是最主要的部分。c語言不僅數(shù)據(jù)類型豐富,而且運算符也十分豐富,幾乎所有的操作都可以用運算符來處理。由運算符加適當(dāng)?shù)倪\算對象(常量、變量、函數(shù)等)可構(gòu)成表達(dá)式,而表達(dá)式是c語言的重要要素之一,因此掌握好運算符的使用對編寫程序十分重要。對于每一個運算符,要注意從兩個方面去把握:運算符的優(yōu)先級和運算符的結(jié)合性。運算符的優(yōu)先級指多個運算符用在同一個表達(dá)式中時先進(jìn)行什么運算,后進(jìn)行
21、什么運算;而運算的結(jié)合性是指運算符所需要的數(shù)據(jù)是從左邊開始取還是從右邊開始取,因而有所謂“左結(jié)合性”和“右結(jié)合性”之說。c語言提供了豐富的運算符,它們能構(gòu)成多種表達(dá)式,處理不同的問題,從而使c語言的運算功能十分強大。另外c語言的運算符可以分為12類,如表1-2-3所示。表1-2-3 c語言的運算符運算符名運算符算術(shù)運算符+ - * / % + -關(guān)系運算符 = = != 邏輯運算符! & |位運算符 & |賦值運算符=條件運算符? :逗號運算符,指針運算符* &求字節(jié)數(shù)運算符sizeof強制類型轉(zhuǎn)換運算符(類型)下標(biāo)運算符 函數(shù)調(diào)用運算符( )表達(dá)式是由運算符及運算對象組成的、具有特定含義的式
22、子。c語言是一種表達(dá)式語言,表達(dá)式后面加上分號“;”就構(gòu)成了表達(dá)式語句。這里我們主要介紹在hitech-picc編程中經(jīng)常用到的算術(shù)運算、賦值運算、關(guān)系運算、邏輯運算、位運算、逗號運算及其表達(dá)式。1運算符的優(yōu)先級和結(jié)合性學(xué)習(xí)c語言的運算符,不僅要掌握各種運算符的功能,以及它各自可連接的運算對象個數(shù),而且還要了解各種運算符彼此之間的優(yōu)先級和結(jié)合性,運算符可按其優(yōu)先級從高到低分為15個等級,如表1-2-4所示。表1-2-4 運算符的優(yōu)先級和結(jié)合性優(yōu)先級運算符含 義運算量個數(shù)結(jié)合性1() -.括號運算符下標(biāo)運算符指向結(jié)構(gòu)體成員運算符成員運算符自左至右2!+ -(類型)* &sizeof邏輯非運算符按
23、位取反運算符自加、自減運算符負(fù)號運算符強制類型轉(zhuǎn)換運算符指針和地址運算符取長度運算符單目運算符右結(jié)合3* / %乘、除、求余運算符雙目運算符自左至右4+ -算術(shù)加、減運算符雙目運算符自左至右5位左移、右移運算符雙目運算符自左至右6 = 關(guān)系運算符雙目運算符自左至右7= !=關(guān)系運算符雙目運算符自左至右8&按位與運算符雙目運算符自左至右9位異或運算符雙目運算符自左至右10|位或運算符雙目運算符自左至右11&邏輯與運算符雙目運算符自左至右12|邏輯或運算符雙目運算符自左至右13?:條件運算符三目運算符右結(jié)合14= += -= *= /= %= &= |= =組合算術(shù)運算符組合運算符雙目運算符右結(jié)合
24、15,逗號運算符自左至右(1)優(yōu)先級求解表達(dá)式時,總是先按運算符的優(yōu)先次序由高到低進(jìn)行操作。優(yōu)先級是用來標(biāo)志運算符在表達(dá)式中的運算順序的。相當(dāng)于加括號,運算時進(jìn)行脫括號運算。(2)結(jié)合性當(dāng)一個運算對象兩側(cè)的運算符優(yōu)先級相同時,則按運算符的結(jié)合性確定表達(dá)式的運算順序。它分為兩類:一類是運算符的結(jié)合性為“從左到右”(大多數(shù)運算符是這樣的),另一類運算符的結(jié)合性為“從右到左”。例如:3-5*2,按運算符的優(yōu)后次先乘后減,表達(dá)式的值為了-7;3*5/2,5的兩側(cè)是“*”和“/”優(yōu)先級相同,則按結(jié)合性處理,算術(shù)運算符的結(jié)合性為“從左到右”,則先乘后除,表達(dá)式的值為7。c語言規(guī)定了各種運算符的結(jié)合方向(結(jié)
25、合性),關(guān)于結(jié)合性的概念在其他高級語言中是沒有的,這是c語言的特點之一。2算術(shù)運算符與算術(shù)表達(dá)式hitech-picc中的算術(shù)運算符如表1-2-5所示。表1-2-5 算術(shù)運算符運算符名稱功能+ 加法 求兩個數(shù)的和,例如8+9=17-減法求兩個數(shù)的差,例如20-7=13*乘法求兩個數(shù)的積,例如20*5=100/除法求兩個數(shù)的商,例如20/5=4%取余求兩個數(shù)的余數(shù),例如20%9=2+自增1變量自動加1-自減1變量自動減1在使用上述運算符時,應(yīng)注意以下幾點: 要注意除法運算符在進(jìn)行浮點數(shù)相除時,其結(jié)果為浮點數(shù),如20.0/5所得值為4.0;而進(jìn)行兩個整數(shù)相除時,所得值是整數(shù),如7/3,值為2。 取
26、余運算符(模運算符)“%”要求參與運算的量均為整型,其結(jié)果等于兩數(shù)相除后的余數(shù)。 hitech-picc提供的自增運算符“+”和自減運算符“-”,作用是使變量值自動加1或減1。自增運算和自減運算只能用于變量而不能用于常量表達(dá)式,運算符放在變量前和變量后是不同的。后置運算:i+(或i-)是先使用i的值,再執(zhí)行i+1(或i-1)。前置運算:+i(或-i)是先執(zhí)行i+1(或i-1),再使用i的值。對自增、自減運算的理解和使用是比較容易出錯的,應(yīng)仔細(xì)地分析,例如:int i=100,j;j=+i;/j=101,i=101j=i+;/j=101,i=102j=-i;/j=101,i=101j=i-;/j
27、=101,i=100編程時常將“+”、“-”這兩個運算符用于循環(huán)語句中,使循環(huán)變量自動1;也常用于指針變量,使指針自動加1指向下一個地址。3賦值運算符與賦值表達(dá)式賦值運算符“=”的作用變是給變量賦值,如“x=10;”。用賦值運算符將一個變量與一個表達(dá)式連接起來 的式子稱為賦值表達(dá)式,在表達(dá)式后面加“;”便構(gòu)成了賦值語句。賦值勤語句的格式如下。變量 = 表達(dá)式;例如:k=0xff;/將十六進(jìn)制數(shù)ffh賦予變量kb=c=33;/將33同時賦予變量b和cd=e;/將變量e的值賦予變量df=a+b; /將表達(dá)式a+b的值賦予變量f由此可見,賦值表達(dá)式的功能是計算表達(dá)式的值再賦予左邊的變量。賦值運算符具
28、有右結(jié)合性,因此有下面的語句:a=b=c=5;可以理解為:a=(b=(c=5);按照c語言的規(guī)定上,任何表達(dá)式在其末尾加上分號就構(gòu)成語句。因此“x=8;”和“a=b=c=5;”都是賦值語句。如果賦值運算符兩過的數(shù)據(jù)類型號不相同,系統(tǒng)將自動進(jìn)行類型轉(zhuǎn)換,即把賦值右邊的類型換成左邊的類型。具體規(guī)定如下: 實型賦給整型,舍去小數(shù)部分。 整型賦給實型,數(shù)值不變,但將以浮點開式存放,即增加小數(shù)部分(小數(shù)部分的值為0)。 字符型賦給整型,由于字符型為1字節(jié),而整型2字節(jié),故將字符ascii碼值放到整型量的低8位中,高8位為0。 整型賦給字符型,只把低8位賦給字符量。圖1-2-4表示了各數(shù)據(jù)類型自動轉(zhuǎn)換的規(guī)
29、則。低intunsigned longdoubleunsigned longshor、char float高圖1-2-4 各種數(shù)據(jù)類型的高低順序在c語言程序設(shè)計中,經(jīng)常使用復(fù)合賦值運算符對變量進(jìn)行賦值。復(fù)合賦值運算符就是在賦值符“=”之前加上其他運算符,表1-2-4中優(yōu)先級14就是復(fù)合賦值運算符。構(gòu)成復(fù)合賦值表達(dá)式的一般形式為:變量 雙目運算符 = 表達(dá)式;它等效于:變量 = 變量 運算符 表達(dá)式;例如:a+=5;/相當(dāng)于a=a+5;x*=y+7;/相當(dāng)于x=x*(y+7);r%=p;/相當(dāng)于r=r%p;在程序中使用復(fù)合賦值運算符,可以簡化程序,有利于編譯處理,提高編譯效率并產(chǎn)生質(zhì)量較高的目標(biāo)
30、代碼。4關(guān)系運算符與賦值表達(dá)式在前面介紹過的分支選擇程序結(jié)構(gòu)中,經(jīng)常需要比較兩個變量的大小關(guān)系,以決定程序下一步的操作。比較兩個數(shù)據(jù)量的運算符稱為關(guān)系運算符。c語言提供了6種關(guān)系運算符: 大于運算符:; 大于等于運算符:=; 小于運算符:; 小于等于運算符:=; 等于運算符:=; 不等于運算符:!=;在關(guān)系運算符中,、=的優(yōu)先級相同,=和!=優(yōu)先級相同;前者優(yōu)先級高于后者。例如:“a=bc;”應(yīng)理解為“a=(bc);”。關(guān)系運算符優(yōu)先級低于算術(shù)運算符,高于賦值運算符。例如:“a+bc+d;”應(yīng)理解為“(a+b)(c+d);”。關(guān)系表達(dá)式是用關(guān)系運算符連接的兩個表達(dá)式。它綿一般形式為:表達(dá)式 關(guān)
31、系運算符 表達(dá)式關(guān)系表達(dá)式的值只有0和1兩種,即邏輯的“真”與“假”。當(dāng)指定的條件滿足時,結(jié)果為1,不滿足時結(jié)果為0。例如表達(dá)式“50;”的值為“真”,即結(jié)果為1;而表達(dá)式“(a=3)(b=5);”由于35不成立,故其值為“假”,即結(jié)果為0。a+bc/若a=1,b=2,c=3,則表達(dá)式的值為0(假)a3/2/若x=2,則表達(dá)式的值為1(真)c=5/若c=1,則表達(dá)式的值為0(假)5關(guān)系運算符與賦值表達(dá)式c語言中提供了三種邏輯運算符,一般形式有以下三種。 邏輯與運算符:&; 邏輯或運算符:|; 邏輯非運算符:!;邏輯表達(dá)式的一般形式有以下三種。邏輯與:條件式1&條件式2邏輯或:條件式1|條件式2
32、邏輯非:!條件式“&”和“|”是雙目運算符,要求有兩個運算對象,結(jié)合方向是從左到右?!?”是單目運算符,只要求一個運算對象,結(jié)合方向是從右至左。(1)邏輯與:a&b,當(dāng)且僅當(dāng)兩個運算量的值都為“真”時,運算結(jié)果為“真”,否則為“假”。(2)邏輯或:a|b,當(dāng)且僅當(dāng)兩個運算量的值都為“假”時,運算結(jié)果為“假”,否則為“真”。(3)邏輯非:!a,當(dāng)運算量的值為“真”時,運算結(jié)果為“假”;當(dāng)運算量的值為“假”時,運算結(jié)果為“真”。表1-2-6給出了執(zhí)行邏輯運算的結(jié)果條件1條件2邏輯運算ab!aa&ba|b11011100010110100100表1-2-6 執(zhí)行邏輯運算的結(jié)果例如:設(shè)x=3,則(x0
33、)&(x6)的值為“真”(即為“1”),而(x6)的值為“假”(即為“0”),!x的值為“假”。邏輯運算符“!”的優(yōu)先級最高,其次為“&”,最低為“|”。具體請讀者見表1-2-4 運算符的優(yōu)先級和結(jié)合性。6位運算符與位運算表達(dá)式 在pic系列單片機(jī)應(yīng)用系統(tǒng)設(shè)計中,對io端口的操作是非常頻繁的,因此往往要求程序在位(bit)一級進(jìn)行運算或處理,因此,匯編語言具有強大靈活的位處理能力。hitech-picc語言直接面對:pic系列單片機(jī)硬件,也提供了強大靈活的位運算功能,使得c語言也能像匯編語言一樣對硬件直接進(jìn)行操作。 hitech-picc提供了6種位運算符: 按位與運算符:&; 按位或運算符:
34、|; 按位異或運算符:; 按位取反運算符:; 右移運算符:; 左移運算符:; 位運算符的作用是按二進(jìn)制位對變量進(jìn)行運算,表1-2-7 是位運算符的真值表。表1-2-7 位運算符的真值表條件1條件2邏輯運算ab!aa&ba|b11011100010110100100位變量1位變量2位 運 算ababa&ba|bab0011000011001110010111100110 左移運算符“”的功能,是把“”左邊的操作數(shù)的各二進(jìn)制位全部左移若干位,移動的位數(shù)由“”右邊的常數(shù)指定,高位丟棄,低位補o。例如:“a”的功能,是把“”左邊的操作數(shù)的各二進(jìn)制位全部右移若干位,移動的位數(shù)由“”右邊的常數(shù)指定。進(jìn)行右
35、移運算時,如果是無符號數(shù),則總是在其左端補“0”;對于有符號數(shù),在右移時,符號位將隨同移動。當(dāng)為正數(shù)時,最高位補o,而為負(fù)數(shù)時,符號位為1,最高位是補0還是補1取決于編譯系統(tǒng)的規(guī)定。例如:設(shè)a=ox98,如果a為無符號數(shù),則“a2”表示把10011000b右移為001001lob;如果a為有符號數(shù),則“a2表示把10011000b右移為11 100110b。 在使用位運算符時,有如下技巧:按位與運算通常用來對某些位清零或保留某些位。例如,要保留從portb端口的rb0和rb1讀入的兩位數(shù)據(jù),可以執(zhí)行control=portb&0x03;操作(0x03的二進(jìn)制數(shù)為00000011b);而要清除p
36、ortb端口的rb4rb7為0,可以執(zhí)行“portb=portb&oxof;”操作(0x0f的二進(jìn)制數(shù)為00001111b。同樣,按位或運算經(jīng)常用于把指定位置1、其余位不變的操作。 流水燈控制程序leds.c就是采用移位運算來實現(xiàn)的發(fā)光二極管點亮位置的移動。 用位運算符“|”改寫的流水燈控制程序如下。1#includepic.h2int a;/定義整型變量a3void main( )4trisb=0x00;/定義端口b為輸出模式5while(1)/while循環(huán)語句6portb= portb|0xfe;/1111 1110 7for(a=1000;a0;a-);/for循環(huán)語句8portb=
37、portb|0xfd;/1111 11019for(a=1000;a0;a-);/for循環(huán)語句10portb= portb|0xfb;/1111 101111for(a=1000;a0;a-);/for循環(huán)語句12portb= portb|0xf7;/1111 011113for(a=1000;a0;a-);/for循環(huán)語句14portb= portb|0xef;/1110 111115for(a=1000;a0;a-);/for循環(huán)語句16portb= portb|0xdf; /1101 111117for(a=1000;a0;a-);/for循環(huán)語句18portb= portb|0xbf
38、;/1011 111119for(a=1000;a0;a-);/for循環(huán)語句20portb= portb|0x7f;/0111 111121for(a=1000;a0;a-);/for循環(huán)語句22 23分析上面程序可知,該程序?qū)崿F(xiàn)的流水燈效果。7逗號運算符與逗號運算表達(dá)式 在c語言中逗號“,”也是一種運算符,稱為逗號運算符,其功能是把兩個表達(dá)式連接起來組成一個表達(dá)式,稱為逗號表達(dá)式,其一般形式為:表達(dá)式1,表達(dá)式2,表達(dá)式n 逗號表達(dá)式的求值過程是:從左軍右分別求出各個表達(dá)式的值,并以最右邊的表達(dá)式n的值作為整個逗號表達(dá)式的值。 程序中使用逗號表達(dá)式的目的,通常是要分別求逗號表達(dá)式內(nèi)各表達(dá)式
39、的值,并不一定要求整個逗號表達(dá)式的值。例如:x=(y=10,y+5); 上面括號內(nèi)的逗號表達(dá)式,逗號左邊的表達(dá)式是將10賦給y,逗號右邊的表達(dá)式進(jìn)行y+5的計算,逗號表達(dá)式的結(jié)果是最右邊的表達(dá)式“y+5”的結(jié)果15賦給x。 并不是在所有出現(xiàn)逗號的地方都組成逗號表達(dá)式,如在變量說明、函數(shù)參數(shù)表中的逗號只是用做各變量之間的間隔符,例如:unsigned int i, j; 1.2.6基本語句c語言程序的執(zhí)行部分由語句組成。c語言提供了豐富的程序控制語句,按照結(jié)構(gòu)化程序設(shè)計的基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu),組成各種復(fù)雜程序。這些語句主要包括表達(dá)式語句、復(fù)合語句、選擇語句和循環(huán)語句等。1表達(dá)式
40、語句表達(dá)式語句是最基本的c語言語句。表達(dá)式語句由表達(dá)式加上分號“;”組成,其一般形式如下:表達(dá)式;執(zhí)行表達(dá)式語句就是計算表達(dá)式的值。例如:portb=0xfd;/賦值語句,在程序leds.c中將端口b賦值為0xfdx=y+z; / y和z進(jìn)行加法運算后賦值給變量xi+; /自增1語句,i增加1后,再賦給變量i在c語言中有一個特殊的表達(dá)式語句,稱為空語句??照Z句中只有一個分號“;”,程序執(zhí)行空語句時需要占用一條指令的執(zhí)行時間,但是什么也不做。在程序中常常把空語句作為循環(huán)體,用于消耗cpu時間等待事件發(fā)生的場合。例如,在leds.c函數(shù)中,有下面語句:for(a=1000;a0;a-);/for循
41、環(huán)語句上面的for語句后面的“;”是一條空語句,作為循環(huán)體出現(xiàn)。在使用“;”時的小技巧: 表達(dá)式是由運算及運算對象所組成的、具有特定含義的式子,例如“y+z”。c語言是一種表達(dá)式語言,表達(dá)式后面加上分號“;”就構(gòu)成了表達(dá)語句,例如“y+z”。c語言中的表達(dá)式與表達(dá)式語句的區(qū)別就是前者沒有分號“;”,而后者有“;”。 在while或for構(gòu)成的循環(huán)語句后面加一個分號,構(gòu)成一個不執(zhí)行其他操作的空循環(huán)體。例如:while(1);上面語句循環(huán)條件永遠(yuǎn)為真,是無限循環(huán);循環(huán)體為空,什么也不做。程序設(shè)計時,通常把該語句作為停機(jī)語句使用。2復(fù)合語句把多個語句用大括號括起來,組合在一起形成具有一定功能的模塊,
42、這種由若干條語句組合而成的語句稱為復(fù)合語句。在程序中應(yīng)把復(fù)合語句看在是單條語句,而不是多條語句。復(fù)合語句在程序運行時,中的各行單語句是依次順序執(zhí)行的。在c語言的函數(shù)中,函數(shù)體是一個復(fù)合語句,例如程序led.c的主函數(shù)中包含兩個復(fù)合語句:void main( )trisb=0x00;/定義端口b為輸出模式while(1)/while循環(huán)語句portb= portb|0xfe;/1111 1110 for(a=1000;a0;a-);/for循環(huán)語句portb= portb|0xfd;/1111 1101 portb= portb|0x7f;/0111 1111for(a=1000;a0;a-);/for循環(huán)語句 在上面的這段程序中,組成函數(shù)體的復(fù)合語句內(nèi)還嵌套了組成while()循環(huán)體的復(fù)合語句。復(fù)合語句允許嵌套,也就是在中的也是復(fù)合語句。復(fù)合語句內(nèi)的各條語句都必須以分號“;”結(jié)尾,復(fù)合語句之間有分隔,在括號“”外,不能家分號。復(fù)合語句不僅可由可執(zhí)行語句組成,還可由變量定義語句組成。在復(fù)合語句中所定義的變量,稱為局部變量,它的有效范圍只在復(fù)合語句中。函數(shù)體是復(fù)合語句,所以函數(shù)體內(nèi)定義的變量,其有效范圍也只在函數(shù)內(nèi)部。前面的main()函數(shù)體內(nèi)定義的位變量left和right的有效使用范圍局限在main()函數(shù)內(nèi)部,與其他函數(shù)無關(guān)。3選擇語句
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度重型機(jī)械搬運裝卸安全協(xié)議3篇
- 二零二五年度個人工資收入證明出具與員工離職待遇協(xié)議合同3篇
- 二零二五年個人無形資產(chǎn)抵押借款合同范本3篇
- 酒吧承包經(jīng)營合同
- 裝修合同范本
- 平面設(shè)計作品委托合同
- 北京信息職業(yè)技術(shù)學(xué)院《影視編輯與制作》2023-2024學(xué)年第一學(xué)期期末試卷
- 建筑工程施工機(jī)械設(shè)備租賃合同
- 2025年城市綠地樹木安全隱患修剪與生態(tài)恢復(fù)服務(wù)合同
- 車輛質(zhì)押合同范本
- 感恩節(jié)英文課件
- 慈溪市2024-2025學(xué)年四上數(shù)學(xué)期末教學(xué)質(zhì)量檢測模擬試題含解析
- T-CECS120-2021套接緊定式鋼導(dǎo)管施工及驗收規(guī)程
- 2024年浙江省單獨考試招生文化課考試數(shù)學(xué)試卷真題(含答案詳解)
- 2025年高考化學(xué)二、三輪復(fù)習(xí)策略講座
- 2022年高考數(shù)學(xué)試卷(上海)(秋考)(空白卷)
- 山東省濟(jì)南市語文小升初2024年模擬試題與參考答案
- 裝配式建筑復(fù)習(xí)試題及答案
- 空氣動力學(xué)仿真技術(shù):湍流模型:k-ε湍流模型原理與應(yīng)用
- 高中期末考試考風(fēng)考紀(jì)及誠信教育
- 2025屆廣東省深圳市深圳外國語九年級物理第一學(xué)期期末經(jīng)典試題含解析
評論
0/150
提交評論