PIC單片機(jī)C語(yǔ)言入門實(shí)例_第1頁(yè)
PIC單片機(jī)C語(yǔ)言入門實(shí)例_第2頁(yè)
PIC單片機(jī)C語(yǔ)言入門實(shí)例_第3頁(yè)
PIC單片機(jī)C語(yǔ)言入門實(shí)例_第4頁(yè)
PIC單片機(jī)C語(yǔ)言入門實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、PIC單片機(jī)C語(yǔ)言入門 1.2.1認(rèn)識(shí)PIC單片機(jī)C語(yǔ)言 用C語(yǔ)言來開發(fā)單片機(jī)系統(tǒng)軟件最大的好處是編寫代碼效率高。軟件調(diào)試直觀、維護(hù) 升級(jí)方便、代碼的重復(fù)利用率高、便于跨平臺(tái)的代碼移植等等,因此C語(yǔ)編程在單片機(jī)系 統(tǒng)設(shè)計(jì)中已得到越來越廣泛的應(yīng)用。 但在單片機(jī)上用C語(yǔ)言寫程序和在PC機(jī)上寫程序絕對(duì)不能簡(jiǎn)單等同。珊在的PC機(jī)資 源十分豐富,運(yùn)算能力強(qiáng)大,因此,程序員在寫PC機(jī)的應(yīng)用程序時(shí),幾乎不用關(guān)心編譯后 的可執(zhí)行代碼在運(yùn)行過程中需要占用多少系統(tǒng)資源,也基本不用擔(dān)心運(yùn)行效率有多高。寫 單片機(jī)的C語(yǔ)言程序最關(guān)鍵的一點(diǎn)是單片機(jī)內(nèi)的資源非常有限,控制的實(shí)時(shí)性要求又很高, 因此,如果沒有對(duì)單片機(jī)體系結(jié)構(gòu)

2、和硬件資源作詳盡的了解,以筆者的愚見認(rèn)為是無(wú)法寫 出高質(zhì)量實(shí)用性很高的C語(yǔ)程序。 本書圍繞PIC中檔系統(tǒng)單機(jī)來展開討論的,Microchip公司自己沒有針對(duì)PIC中檔系 列單片機(jī)的C語(yǔ)言編譯器,但很多專業(yè)的第三方公司有眾多支持PIC單片機(jī)的C語(yǔ)言編譯 器提供,常見的有Hitech、CCS IAR、Bytecraft等公司。其中筆者最常用的是 Hitech公 司的PICC編譯器,它穩(wěn)定可靠,編譯生成的代碼效率高,在用PIC單片機(jī)進(jìn)行系統(tǒng)設(shè)計(jì)和 開發(fā)的工程師群體中得到廣泛認(rèn)可。其正式完全版軟件需要購(gòu)置,但在其網(wǎng)站上有限時(shí)的 試用版供用戶評(píng)估。另外,Hitech公司針對(duì)廣大PIC的業(yè)余愛好者和初學(xué)者

3、,還提供了完 全免費(fèi)的學(xué)習(xí)版PICC-Lite編譯器套件。它的使用方式與完全版相同,只是支持的PIC單 片機(jī)型號(hào)限制在PIC16F84 PIC16F877和PIC16F628等幾款。這幾款Flash型的單片機(jī)因 其所具備的豐富的片上資源而最適用于單片機(jī)學(xué)習(xí)入門,因此,筆者建議感興趣的讀者可 以從PICC-Lite入手掌握PIC單片機(jī)的C語(yǔ)言編程。 我們一起來認(rèn)識(shí)訓(xùn)練項(xiàng)目2跑馬燈的仿真與演示的程序 1#in elude 2 int a; 7F1.2.2 )1-2-11-2-11-2-11-2-1 廣整型J (. 基本類型Y 實(shí)型 3 (浮點(diǎn)V * 單精度型 X雙 精 度 型 1字 (枚 符型 舉

4、類型號(hào) 數(shù)據(jù)類型 構(gòu)造類型s 數(shù)組 類型 指針類型 結(jié) (共 構(gòu)體類型 用體類型 空類型(void ) 1.2.3 1-2-2 =32 符號(hào) =65 表示數(shù) 據(jù)的最 1-2-21-2-3 134638 2 符號(hào)小數(shù)部分 圖1峯數(shù)實(shí)數(shù)在內(nèi)存中的存放形式 (5)字符型變量 字符型變量用來存放字符常量,注意只能存放一個(gè)字符。例如: char c1,c2,c3,c4,c5; 1.2.5 1-2-31-2-3 1-2-41-2-4 括號(hào)運(yùn)算符 下標(biāo)運(yùn)算符 指向結(jié)構(gòu)體成員運(yùn) 算符 成員運(yùn)算符 自左至右 2 ! + + - 邏輯非運(yùn)算符 按位取反運(yùn)算符 自加、自減運(yùn)算符 單目運(yùn)算符 右結(jié)合 (類型) * j

5、=+i; j=101,i=101 j=i+; j=101,i=102 j=-i; j=101,i=101 j=i-; j=101,i=100 編程時(shí)常將“ +”、“ - ”這兩個(gè)運(yùn)算符用于循環(huán)語(yǔ)句中,使循環(huán)變量自動(dòng)1;也常用于 指針變量,使指針自動(dòng)加1指向下一個(gè)地址。 3 賦值運(yùn)算符與賦值表達(dá)式 賦值運(yùn)算符“二”的作用變是給變量賦值,如“ x=10;”。用賦值運(yùn)算符將一個(gè)變量與一 個(gè)表達(dá)式連接起來 的式子稱為賦值表達(dá)式,在表達(dá)式后面加“;”便構(gòu)成了賦值語(yǔ)句。賦 值勤語(yǔ)句的格式如下。 變量=表達(dá)式; 例如: k=0 xff; /將十六進(jìn)制數(shù)FFH賦予變量k b=c=33; /將33同時(shí)賦予變量b

6、和c d=e; /將變量e的值賦予變量d f=a+b; /將表達(dá)式a+b的值賦予變量f 由此可見,賦值表達(dá)式的功能是計(jì)算表達(dá)式的值再賦予左邊的變量。賦值運(yùn)算符具有 右結(jié)合性,因此有下面的語(yǔ)句: a=b=c=5; 可以理解為: a=(b=(c=5); 按照C語(yǔ)言的規(guī)定上,任何表達(dá)式在其末尾加上分號(hào)就構(gòu)成語(yǔ)句。因此“ x=8; ”和 a=b=c=5; ”都是賦值語(yǔ)句 如果賦值運(yùn)算符兩過的數(shù)據(jù)類型號(hào)不相同,系統(tǒng)將自動(dòng)進(jìn)行類型轉(zhuǎn)換,即把賦值右邊 的類型換成左邊的類型。具體規(guī)定如下: 實(shí)型賦給整型,舍去小數(shù)部分。 整型賦給實(shí)型,數(shù)值不變,但將以浮點(diǎn)開式存放,即增加小數(shù)部分(小數(shù)部分的值 為0)。 字符型

7、賦給整型,由于字符型為1字節(jié),而整型2字節(jié),故將字符ASCII碼值放到 整型量的低8位中,高8位為0 整型賦給字符型,只把低8位賦給字符量。 圖1-2-4表示了各數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換的規(guī)則 低高 int unsgn* ionunsigneddouble T圖1-2-4各種數(shù)據(jù)類型的高低順序T shor 、float 在C語(yǔ)言程序設(shè)計(jì)中,經(jīng)常使用復(fù)合賦值運(yùn)算符對(duì)變量進(jìn)行賦值。復(fù)合賦值運(yùn)算符就 是在賦值符“=”之前加上其他運(yùn)算符,表1-2-4中優(yōu)先級(jí)14就是復(fù)合賦值運(yùn)算符。 構(gòu)成復(fù)合賦值表達(dá)式的一般形式為: 變量 雙目運(yùn)算符=表達(dá)式; 它等效于: 變量=變量運(yùn)算符表達(dá)式; 例如: a+=5; /相當(dāng)于

8、a=a+5; x*=y+7; / 相當(dāng)于 x=x*(y+7); r%=p; /相當(dāng)于r=r%p; 在程序中使用復(fù)合賦值運(yùn)算符,可以簡(jiǎn)化程序,有利于編譯處理,提高編譯效率并產(chǎn) 生質(zhì)量較高的目標(biāo)代碼。 4.關(guān)系運(yùn)算符與賦值表達(dá)式 在前面介紹過的分支選擇程序結(jié)構(gòu)中,經(jīng)常需要比較兩個(gè)變量的大小關(guān)系,以決定程 序下一步的操作。比較兩個(gè)數(shù)據(jù)量的運(yùn)算符稱為關(guān)系運(yùn)算符。C語(yǔ)言提供了 6種關(guān)系運(yùn)算 符: 大于運(yùn)算符:; 大于等于運(yùn)算符:=; 小于運(yùn)算符:; 小于等于運(yùn)算符:=; 等于運(yùn)算符:=; 不等于運(yùn)算符:!=; 在關(guān)系運(yùn)算符中,、=的優(yōu)先級(jí)相同,=和 !=優(yōu)先級(jí)相同;前者優(yōu)先級(jí)高于 后者。 例如:“a=b

9、c; ”應(yīng)理解為“ a=(bc); ”。 關(guān)系運(yùn)算符優(yōu)先級(jí)低于算術(shù)運(yùn)算符,高于賦值運(yùn)算符。 例如:“a+bc+d; ”應(yīng)理解為“(a+b)(c+d); ”。 關(guān)系表達(dá)式是用關(guān)系運(yùn)算符連接的兩個(gè)表達(dá)式。它綿一般形式為: 表達(dá)式關(guān)系運(yùn)算符表達(dá)式 關(guān)系表達(dá)式的值只有0和1兩種,即邏輯的“真”與“假”。當(dāng)指定的條件滿足時(shí),結(jié) 果為1,不滿足時(shí)結(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

10、/若c=1,則表達(dá)式的值為0 (假) 5 關(guān)系運(yùn)算符與賦值表達(dá)式 C語(yǔ)言中提供了三種邏輯運(yùn)算符,一般形式有以下三種。 邏輯與運(yùn)算符:當(dāng)運(yùn)算 運(yùn)算結(jié)果為 執(zhí)行邏輯運(yùn)算的 表1-2-6執(zhí)行邏輯運(yùn)算的結(jié)果 例如:設(shè) x=3,貝U(x0) 如果a為有符號(hào)數(shù),則“ a2 表示把 B 右移為 11 100110B。 在使用位運(yùn)算符時(shí),有如下技巧: 按位與運(yùn)算通常用來對(duì)某些位清零或保留某些位。例如,要保留從PORTB端口的RB0 和 RB1 讀入的兩位數(shù)據(jù),可以執(zhí)行 controI=PORTB而要清除 PORT歸口的 RB4RB7為 0,可以執(zhí)行“ PORTB=PORTB/ 定義整型變量a 3 void m

11、ai n() 4 TRISB=0X00; /定義端口 B為輸出模式 5 while(1) /while循環(huán)語(yǔ)句 6 PORTB= PORTB|OXFE; /1111 1110 7 for(a=1000;a0;a-); /for循環(huán)語(yǔ)句 8 PORTB= PORTB|0XFD; /1111 1101 9 for(a=1000;a0;a-); /for循環(huán)語(yǔ)句 10 PORTB= PORTB|0XFB; /1111 1011 11 for(a=1000;a0;a-); /for循環(huán)語(yǔ)句 12 PORTB= PORTB|0XF7; /1111 0111 13 for(a=1000;a0;a-); /

12、for循環(huán)語(yǔ)句 14 PORTB= PORTB|0XEF; /1110 1111 15 for(a=1000;a0;a-); /for循環(huán)語(yǔ)句 16 PORTB= PORTB|OXDF; /1101 1111 17 for(a=1000;a0;a-); /for循環(huán)語(yǔ)句 18 PORTB= PORTB|0XBF; /1011 1111 19 for(a=1000;a0;a-); /for循環(huán)語(yǔ)句 20 PORTB= PORTB|0X7F; /0111 1111 21 for(a=1000;a0;a-); /for循環(huán)語(yǔ)句 22 23 分析上面程序可知,該程序?qū)崿F(xiàn)的流水燈效果。 7.逗號(hào)運(yùn)算符與

13、逗號(hào)運(yùn)算表達(dá)式 在c語(yǔ)言中逗號(hào)“,”也是一種運(yùn)算符,稱為逗號(hào)運(yùn)算符,其功能是把兩個(gè)表達(dá)式連接 起來組成一個(gè)表達(dá)式,稱為逗號(hào)表達(dá)式,其一般形式為: 表達(dá)式1,表達(dá)式2,表達(dá)式n 逗號(hào)表達(dá)式的求值過程是:從左軍右分別求出各個(gè)表達(dá)式的值,并以最右邊的表達(dá)式 n 的值作為整個(gè)逗號(hào)表達(dá)式的值。 程序中使用逗號(hào)表達(dá)式的目的,通常是要分別求逗號(hào)表達(dá)式內(nèi)各表達(dá)式的值,并不一 要求整個(gè)逗號(hào)表達(dá)式的值。例如: x=(y=10,y+5); 上面括號(hào)內(nèi)的逗號(hào)表達(dá)式,逗號(hào)左邊的表達(dá)式是將10賦給y,逗號(hào)右邊的表達(dá)式進(jìn)行 y+5的計(jì)算,逗號(hào)表達(dá)式的結(jié)果是最右邊的表達(dá)式“ y+5”的結(jié)果15賦給x。 并不是在所有出現(xiàn)逗號(hào)的

14、地方都組成逗號(hào)表達(dá)式,如在變量說明、函數(shù)參數(shù)表中的逗 號(hào) 只是用做各變量之間的間隔符,例如: un sig ned int i, j; 1.2.6基本語(yǔ)句 C語(yǔ)言程序的執(zhí)行部分由語(yǔ)句組成。C語(yǔ)言提供了豐富的程序控制語(yǔ)句,按照結(jié)構(gòu)化程 序設(shè)計(jì)的基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu),組成各種復(fù)雜程序。這些語(yǔ)句主要 包括表達(dá)式語(yǔ)句、復(fù)合語(yǔ)句、選擇語(yǔ)句和循環(huán)語(yǔ)句等。 1 .表達(dá)式語(yǔ)句 表達(dá)式語(yǔ)句是最基本的C語(yǔ)言語(yǔ)句。表達(dá)式語(yǔ)句由表達(dá)式加上分號(hào)“;”組成,其一般 形式如下: 表達(dá)式; 執(zhí)行表達(dá)式語(yǔ)句就是計(jì)算表達(dá)式的值。例如: PORTB=OXFD;賦值語(yǔ)句,在程序中將端口 B賦值為OXFD x=y+z

15、;/ y 和z進(jìn)行加法運(yùn)算后賦值給變量x i+;/自增1語(yǔ)句,i增加1后,再賦給變量i 在C語(yǔ)言中有一個(gè)特殊的表達(dá)式語(yǔ)句,稱為空語(yǔ)句??照Z(yǔ)句中只有一個(gè)分號(hào)“;”,程 序執(zhí)行空語(yǔ)句時(shí)需要占用一條指令的執(zhí)行時(shí)間,但是什么也不做。在程序中常常把空語(yǔ)句 作為循環(huán)體,用于消耗CPU時(shí)間等待事件發(fā)生的場(chǎng)合。例如,在函數(shù)中,有下面語(yǔ)句: for(a=1000;a0;a-); /for循環(huán)語(yǔ)句 上面的for語(yǔ)句后面的“;”是一條空語(yǔ)句,作為循環(huán)體出現(xiàn)。 在使用“;”時(shí)的小技巧: 表達(dá)式是由運(yùn)算及運(yùn)算對(duì)象所組成的、具有特定含義的式子,例如“ y+z”。C語(yǔ)言 是一種表達(dá)式語(yǔ)言,表達(dá)式后面加上分號(hào)“;”就構(gòu)成了表

16、達(dá)語(yǔ)句,例如“ y+z”。C語(yǔ)言中 的表達(dá)式與表達(dá)式語(yǔ)句的區(qū)別就是前者沒有分號(hào)“;”,而后者有“;”。 在while或for構(gòu)成的循環(huán)語(yǔ)句后面加一個(gè)分號(hào),構(gòu)成一個(gè)不執(zhí)行其他操作的空循 環(huán)體。例如: While(1); 上面語(yǔ)句循環(huán)條件永遠(yuǎn)為真,是無(wú)限循環(huán);循環(huán)體為空,什么也不做。程序設(shè)計(jì)時(shí), 通常把該語(yǔ)句作為停機(jī)語(yǔ)句使用 2 復(fù)合語(yǔ)句 把多個(gè)語(yǔ)句用大括號(hào)括起來,組合在一起形成具有一定功能的模塊,這種由若干條 語(yǔ)句組合而成的語(yǔ)句稱為復(fù)合語(yǔ)句。在程序中應(yīng)把復(fù)合語(yǔ)句看在是單條語(yǔ)句,而不是多條 語(yǔ)句。 復(fù)合語(yǔ)句在程序運(yùn)行時(shí),中的各行單語(yǔ)句是依次順序執(zhí)行的。在 C語(yǔ)言的函數(shù)中, 函數(shù)體是一個(gè)復(fù)合語(yǔ)句,例

17、如程序的主函數(shù)中包含兩個(gè)復(fù)合語(yǔ)句: void mai n() TRISB=0X00; while(1) PORTB= PORTB|0XFE; for(a=1000;a0;a-); PORTB= PORTB|0XFD; /定義端口 B為輸出模式 /while循環(huán)語(yǔ)句 /1111 1110 /for循環(huán)語(yǔ)句 /1111 1101 /0111 1111 /for循環(huán)語(yǔ)句 PORTB= PORTB|0X7F; for(a=1000;a0;a-); 在上面的這段程序中,組成函數(shù)體的復(fù)合語(yǔ)句內(nèi)還嵌套了組成 while()循環(huán)體的復(fù)合語(yǔ) 句。復(fù)合語(yǔ)句允許嵌套,也就是在中的也是復(fù)合語(yǔ)句。 復(fù)合語(yǔ)句內(nèi)的各條語(yǔ)句

18、都必須以分號(hào)“;”結(jié)尾,復(fù)合語(yǔ)句之間有分隔,在括號(hào)“ 外,不能家分號(hào) 復(fù)合語(yǔ)句不僅可由可執(zhí)行語(yǔ)句組成,還可由變量定義語(yǔ)句組成。在復(fù)合語(yǔ)句中所定義 的變量,稱為局部變量,它的有效范圍只在復(fù)合語(yǔ)句中。函數(shù)體是復(fù)合語(yǔ)句,所以函數(shù)體 內(nèi)定義的變量,其有效范圍也只在函數(shù)內(nèi)部。前面的 main()函數(shù)體內(nèi)定義的位變量left 和right的有效使用范圍局限在 main()函數(shù)內(nèi)部,與其他函數(shù)無(wú)關(guān)。 3 選擇語(yǔ)句 跑馬燈的C程序可以用以下程序代碼來實(shí)現(xiàn),即跑馬燈先從上到下循環(huán)進(jìn)行 #i nclude un sig ned char temp=OxO1; /* *fun ctio n: main() *功能描

19、述:主函數(shù) * void mai n() INTCON=OXOO; /設(shè)置INTCON勺bit7bit0 為零:關(guān)總中斷 TRISB=0X00; /設(shè)置端口 B為輸出方式 PORTB=OXff; /使端口 B輸出低電平 while(1) PORTB=temp; /按位取反 for(a=1000;a0;a-); /for循環(huán)語(yǔ)句,起延時(shí)作用 if(temp=0 x00) /判斷變量temp是否等0 x00 temp=0 x01; /if 語(yǔ)句成立,給變量temp賦0 x01 else /if 語(yǔ)句不成立 temp=temp1; / 變量 temp 左移 1 位 我們看到,在上述程序中使用了如下i

20、f語(yǔ)句: if(temp=0 x00) /判斷變量temp是否等0 x00 temp=0 x01; /if 語(yǔ)句成立,給變量temp賦0 x01 else /if 語(yǔ)句不成立 temp=temp1; / 變量 temp 左移 1 位 執(zhí)行這些語(yǔ)句時(shí),先判斷“temp=OxO0是否成立,如果條件滿足,則執(zhí)行“temp=OxO1; ” 后,回到“ PORTB=temp;語(yǔ)句,執(zhí)行該條語(yǔ)句,temp變量按位取反之后,變?yōu)镺xFE(即 B),則PORT為OxFE (即RBO引腳為低電平,其余引腳為高電平),所以第一個(gè)發(fā)光二極 管亮,其它都不亮。如果條件不成立,則執(zhí)行“ temp=tempO;a-);

21、else if(RDO=O) RBO=O;/ for(a=5OOO;aO;a-); else if(RD1=O) RB1=O;/ for(a=5OOO;aO;a-); else ; / /則點(diǎn)亮左轉(zhuǎn)燈和右轉(zhuǎn)燈 /for循環(huán)語(yǔ)句,起延時(shí)作用 /如果RDO為低電平狀態(tài) 則點(diǎn)亮左轉(zhuǎn)燈 /for循環(huán)語(yǔ)句,起延時(shí)作用 /如果RD1為低電平狀態(tài) 則點(diǎn)亮右轉(zhuǎn)燈 /for循環(huán)語(yǔ)句,起延時(shí)作用 空語(yǔ)句 RB0=1; / 熄火左轉(zhuǎn)燈 RB1=1; /熄火右轉(zhuǎn)燈 for(a=5000;a0;a-); /for循環(huán)語(yǔ)句,起延時(shí)作用 選擇【程序】?【Proteus 7 Professional 】?【ISIS 7 Pr

22、ofessional 】命令,啟動(dòng) PROTEUS 仿真軟件,在ISIS 7 professional圖形編輯窗口,繪制汽車轉(zhuǎn)向燈仿真電路。并選擇【程 序】?【Microchip】?【MPLABDE】?【MPLABDE】命令,啟動(dòng)MPLABDE集成開發(fā)環(huán)境; 新建工程。選擇菜單欄中的【Project】?【Build All】命令或直接點(diǎn)擊工具欄中的“固” 圖標(biāo),對(duì)程序進(jìn)行編譯、修改,直到“Out put ”窗口沒有錯(cuò)誤為止。再把文件添加到Proteus 中,會(huì)出現(xiàn)如圖1-2-9所示的汽車轉(zhuǎn)向燈仿真效果。 圖1-2-9汽車轉(zhuǎn)向燈仿真效果 if語(yǔ)句使用過程中的注意事項(xiàng) else語(yǔ)句是if語(yǔ)句的子句

23、,它是if語(yǔ)句的一部分,不能單獨(dú)使用。 else語(yǔ)句總是與在它上面跟它最近的if語(yǔ)句相配對(duì)。 表達(dá)式“ RDO=O unsigned char contr_led;/定義轉(zhuǎn)向燈控制變量 /* * mia n() * / main() TRISB=OXOO; /設(shè)置端口 B為輸出方式 PORTB=OXFF; / 設(shè)置端口 B為高電平輸出 TRISD=OXFF; / 設(shè)置端口 D為輸入方式 while(1) /while 循環(huán) contr_led=PORTD; /讀PORT的狀態(tài)送到contr_led 變量 con tr_led= con tr_led /與操作,屏蔽掉咼6位無(wú)關(guān)位,取 出RDO

24、switch(co ntr_led) /和RD1狀態(tài) 燈 case 0: RB0=0; RB1=0;break; / 如果RD0與RD1都為0,則點(diǎn)亮左、右 轉(zhuǎn)燈 case 1: RB1=0; break; /如果RD1為低電平狀態(tài),貝U點(diǎn)亮右 轉(zhuǎn)燈 case 2: RB0=0; break; /如果RD0為低電平狀態(tài),則點(diǎn)亮左 default: /空語(yǔ)句,什么都不做 for(a=5000;a0;a-); /for循環(huán)語(yǔ)句,起延時(shí)作用 RB0=1;/熄滅左轉(zhuǎn)燈 RB1=1; /熄火右轉(zhuǎn)燈 for(a=5000;a0;a-); /for循環(huán)語(yǔ)句,起延時(shí)作用 在上述程序中,定義了一個(gè)無(wú)符號(hào)字符變量

25、contr_led,長(zhǎng)度為1個(gè)字節(jié),其最低兩位 用來表示RD0和RD1引腳對(duì)左、右轉(zhuǎn)向燈的控制狀態(tài)。 語(yǔ)句“ contr_led=PORTD;”將PORTDq的8個(gè)引腳狀態(tài)保存到變量 contr_led 中,再 執(zhí)行“與”操作語(yǔ)句“ contr_led= contr_led ”,把無(wú)關(guān)位清零,一般稱之屏蔽。然 后,采用switch(contr_led)語(yǔ)句來判斷變量contr_led的值與哪個(gè)case語(yǔ)句中的常量表 達(dá)式的值相同,點(diǎn)亮相應(yīng)的轉(zhuǎn)向燈;如果都不相等,貝U執(zhí)行default后的語(yǔ)句。 case語(yǔ)句使用過程中的注意事項(xiàng) 在case后的各常量表達(dá)式的值不能相同,否則會(huì)出現(xiàn)同一個(gè)條件有多種

26、執(zhí)行方案 的矛盾。 在case語(yǔ)句后,允許有多個(gè)語(yǔ)句,可以不用括起來。例如: case 0: RBO=O; RB1=0;break; case和default語(yǔ)句的先后順序可以改變,不會(huì)影響程序的執(zhí)行結(jié)果。 “case常量表達(dá)式”只相當(dāng)于一個(gè)語(yǔ)句標(biāo)號(hào),表達(dá)式的值和某標(biāo)號(hào)相等則轉(zhuǎn)向該標(biāo) 號(hào)執(zhí)行,但在執(zhí)行完該標(biāo)號(hào)的語(yǔ)句后,不會(huì)自動(dòng)跳出整個(gè)switch語(yǔ)句,加break語(yǔ)句,使 得執(zhí)行完該case語(yǔ)句后可以跳出整個(gè)switch語(yǔ)句的執(zhí)行。 default語(yǔ)句是在不滿足case語(yǔ)句情況下的一個(gè)默認(rèn)執(zhí)行語(yǔ)句。如default語(yǔ)句后 面是空語(yǔ)句,表示不做任何處理,可以省略。 4 循環(huán)語(yǔ)句 在結(jié)構(gòu)化程序設(shè)計(jì)

27、中,循環(huán)程序結(jié)構(gòu)是一種很重要的程序結(jié)構(gòu),幾乎所有的應(yīng)用程序 都包含循環(huán)結(jié)構(gòu)。循環(huán)程序的作用是:對(duì)給定的條件進(jìn)行判斷,當(dāng)給定的條件成立時(shí),重 復(fù)執(zhí)行給定的程序段,直到條件不成立時(shí)為止。給定的條件稱為循環(huán)條件,需要重復(fù)執(zhí)行 的程序段稱為循環(huán)體。 前面介紹的函數(shù)中使用了 for循環(huán),其循環(huán)體為空語(yǔ)句,用來消耗 CPU時(shí)間來產(chǎn)生延 時(shí)效果,這種延時(shí)方法稱為軟件延時(shí)。軟件延時(shí)的缺點(diǎn)是占用 CPU寸間,使得CPU在延時(shí) 過程中不能做其他事情。解決的方法是使用單片機(jī)中的硬件定時(shí)器實(shí)現(xiàn)延時(shí)功能。 在C語(yǔ)言中,可以用下面三個(gè)語(yǔ)句來實(shí)現(xiàn)循環(huán)程序結(jié)構(gòu):while語(yǔ)句、do-while語(yǔ)句 和for語(yǔ)句,下面分別對(duì)它

28、們加以介紹。 語(yǔ)句纟日 (1) while 語(yǔ)句 while語(yǔ)句用來實(shí)現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu),即當(dāng)條件為“真 就執(zhí)行循環(huán)體。while語(yǔ)句的一般形式為: while(表達(dá)式) 語(yǔ)句組;循環(huán)體 其中,“表達(dá)式”通常是邏輯表達(dá)式或關(guān)系表達(dá)式,為循環(huán)條件,“語(yǔ)句組”是循環(huán)體, 即被重復(fù)執(zhí)行的程序段。該語(yǔ)句的執(zhí)行過程是:首先計(jì)算機(jī)“表達(dá)式”的值勤,當(dāng)值為“真” (即非0)時(shí),執(zhí)行循環(huán)體“語(yǔ)句組”,流程圖如1-2-10所示。圖 1-2-10 while 語(yǔ)句流程 在循環(huán)程序設(shè)計(jì)中,要特別注意循環(huán)的邊界問題,即循環(huán)的初值和終值要非常明確。 例如:下面的程序段是求整數(shù) 1100的累加和,變是i的取值范圍為110

29、0,所以,初值 沒有為1, while語(yǔ)句的條件為“ i=100; ”,符號(hào)“ =”為關(guān)系運(yùn)算符“小于等于”。 main () int i,sum; /循環(huán)控制變量i初始值為1 /累加和變量sum初始值為0 /累加和 /自增1,修改循環(huán)控制變量 i=1; sum=0; while(i=100) sum=sum+i; i+; while語(yǔ)句使用過程中的注意事項(xiàng) 使用while語(yǔ)句時(shí)要注意,當(dāng)表達(dá)式的值為“真”時(shí),執(zhí)行循環(huán)體,循環(huán)體執(zhí)行一 次完成后,再次回到while,進(jìn)行循環(huán)條件判斷,如果仍然為“真”,則重復(fù)執(zhí)行循環(huán)體程 序;為“假”則退出整個(gè) while循環(huán)語(yǔ)句。 如果循環(huán)條件一開始就為“假”

30、,那么while后面的循環(huán)體一次都不會(huì)執(zhí)行。 如果循環(huán)條件總為真,例如:while( 1),表達(dá)式為常量“1”,非“0”即為“真”, 循環(huán)條件永遠(yuǎn)成立,則為無(wú)限循環(huán),即死循環(huán)。在單片機(jī)C語(yǔ)言程序設(shè)計(jì)中,無(wú)限循環(huán)是 一個(gè)非常有用的語(yǔ)句,在上述程序示例中都使用了該語(yǔ)句。 除非特殊應(yīng)用的情況,在使用 while語(yǔ)句進(jìn)行循環(huán)程序設(shè)計(jì)時(shí),通常循環(huán)體包含修 改循環(huán)條件的語(yǔ)句,以使循環(huán)逐漸趨于結(jié)束,避免出現(xiàn)死循環(huán)。 (2) do-while 語(yǔ)句 前面所述的while語(yǔ)句是在執(zhí)行循環(huán)體之前判斷循環(huán)條件,如條件不成立,則該循環(huán) 不會(huì)初執(zhí)行。實(shí)際情況往往需要先執(zhí)行一次循環(huán)體后,再進(jìn)行循環(huán)條件的判斷,“直到型”

31、do-while語(yǔ)句可以滿足這種要求。 do-while語(yǔ)句的一般格式如下: do 語(yǔ)句組; /循環(huán)體 while(表達(dá)式); 該語(yǔ)句的執(zhí)行過程是:先執(zhí)行循環(huán)體“語(yǔ)句組”一次,再計(jì)算“表達(dá)式”的值,如果 “表達(dá)式”為“真” (非 0),繼續(xù)執(zhí)行循環(huán)體“語(yǔ)句組”,直到表達(dá)式為“假” (0)為止 do-while語(yǔ)句流程如圖1-2-11所示。 do-while N 在使用if語(yǔ)句、while語(yǔ)句時(shí),表達(dá)式括號(hào)后面都不能加分號(hào)“;”,但在do-while 語(yǔ)句的表達(dá)式括號(hào)后必須加分號(hào)“; do-while語(yǔ)句與while語(yǔ)句相比,更適合于處理不論條件是否成立,都需先執(zhí)行 次的循環(huán)體的情況。 (3)

32、for語(yǔ)句 在上述程序中,我們使用了 for語(yǔ)句,實(shí)現(xiàn)了循環(huán),重復(fù)執(zhí)行若干次空語(yǔ)句循環(huán)體, 以達(dá)到延時(shí)的目的。在C語(yǔ)言中,當(dāng)循環(huán)次數(shù)明確時(shí)候,使用for語(yǔ)名比while和do-while 語(yǔ)句更為方便。For語(yǔ)句一般格式如下: for(循環(huán)變量賦值;循環(huán)條件;修改循環(huán)變量) 語(yǔ)句組;循環(huán)體 關(guān)鍵字for后面的圓括號(hào)內(nèi)通常包括三個(gè)表達(dá)式:循環(huán)變量賦值、循環(huán)條件和修改循 環(huán)變量,三個(gè)表達(dá)式之間用“;”隔開?;ɡㄌ?hào)內(nèi)是循環(huán)體“語(yǔ)句組”。 for執(zhí)行過程如下: 先執(zhí)行第一個(gè)表達(dá)式,給循環(huán)變量賦值,通常這里是一個(gè)賦值表達(dá)式。 利用第二個(gè)表達(dá)式判斷循環(huán)條件是否滿足,通常是關(guān)系表達(dá)式或邏輯表達(dá)式,若其 值為

33、“真”(非0),則執(zhí)行循環(huán)體“語(yǔ)句組” 一次,再執(zhí)行下面第步;若其值為“假”(0), 則轉(zhuǎn)到第步循環(huán)結(jié)束。 計(jì)算機(jī)第三個(gè)表達(dá)式,修改循環(huán)控制變量,一般也是賦值語(yǔ)句。 跳到上面第步繼續(xù)執(zhí)行。 循環(huán)結(jié)束,執(zhí)行for語(yǔ)句下面的語(yǔ)句。圖1-2-12 for 語(yǔ)句流程 以上過程流程圖如圖1-2-12所示。 舉例:用for語(yǔ)句求1100累加和,程序如下: mai n() int i; int sum=0;/定義累加和變量 for(i=1;i=100;i+) sum=sum+i; 上述for語(yǔ)句的執(zhí)行過程如下:先給i賦值為1,判斷i是否小于等于100,若是,則 執(zhí)行循環(huán)體“sum=sum+i”語(yǔ)句一次,然后i增1,再重新判斷,直到i=101時(shí),條件i=100 不成立,循環(huán)結(jié)束。該語(yǔ)句相當(dāng)于如下while語(yǔ)句: i=1; while(i=100) sum=sum

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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)論