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

下載本文檔

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

文檔簡介

1、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è)計(jì)中已得到越來越廣泛的應(yīng)用。 但在單片機(jī)上用C語言寫程序和在PC機(jī)上寫程序絕對不能簡單等同。珊在的PC機(jī)資 源十分豐富,運(yùn)算能力強(qiáng)大,因此,程序員在寫PC機(jī)的應(yīng)用程序時(shí),幾乎不用關(guān)心編譯后 的可執(zhí)行代碼在運(yùn)行過程中需要占用多少系統(tǒng)資源,也基本不用擔(dān)心運(yùn)行效率有多高。寫 單片機(jī)的C語言程序最關(guān)鍵的一點(diǎn)是單片機(jī)內(nèi)的資源非常有限,控制的實(shí)時(shí)性要求又很高, 因此,如果沒有對單片機(jī)體系結(jié)構(gòu)

2、和硬件資源作詳盡的了解,以筆者的愚見認(rèn)為是無法寫 出高質(zhì)量實(shí)用性很高的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è)計(jì)和 開發(fā)的工程師群體中得到廣泛認(rèn)可。其正式完全版軟件需要購置,但在其網(wǎng)站上有限時(shí)的 試用版供用戶評估。另外,Hitech公司針對廣大PIC的業(yè)余愛好者和初學(xué)者

3、,還提供了完 全免費(fèi)的學(xué)習(xí)版PICC-Lite編譯器套件。它的使用方式與完全版相同,只是支持的PIC單 片機(jī)型號限制在PIC16F84 PIC16F877和PIC16F628等幾款。這幾款Flash型的單片機(jī)因 其所具備的豐富的片上資源而最適用于單片機(jī)學(xué)習(xí)入門,因此,筆者建議感興趣的讀者可 以從PICC-Lite入手掌握PIC單片機(jī)的C語言編程。 我們一起來認(rèn)識訓(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、類型號 數(shù)據(jù)類型 構(gòu)造類型s 數(shù)組 類型 指針類型 結(jié) (共 構(gòu)體類型 用體類型 空類型(void ) 1.2.3 1-2-2 =32 符號 =65 表示數(shù) 據(jù)的最 1-2-21-2-3 134638 2 符號小數(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 括號運(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)語句中,使循環(huán)變量自動1;也常用于 指針變量,使指針自動加1指向下一個(gè)地址。 3 賦值運(yùn)算符與賦值表達(dá)式 賦值運(yùn)算符“二”的作用變是給變量賦值,如“ x=10;”。用賦值運(yùn)算符將一個(gè)變量與一 個(gè)表達(dá)式連接起來 的式子稱為賦值表達(dá)式,在表達(dá)式后面加“;”便構(gòu)成了賦值語句。賦 值勤語句的格式如下。 變量=表達(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é)合性,因此有下面的語句: a=b=c=5; 可以理解為: a=(b=(c=5); 按照C語言的規(guī)定上,任何表達(dá)式在其末尾加上分號就構(gòu)成語句。因此“ x=8; ”和 a=b=c=5; ”都是賦值語句 如果賦值運(yùn)算符兩過的數(shù)據(jù)類型號不相同,系統(tǒ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ù)類型自動轉(zhuǎn)換的規(guī)則 低高 int unsgn* ionunsigneddouble T圖1-2-4各種數(shù)據(jù)類型的高低順序T shor 、float 在C語言程序設(shè)計(jì)中,經(jīng)常使用復(fù)合賦值運(yùn)算符對變量進(jìn)行賦值。復(fù)合賦值運(yùn)算符就 是在賦值符“=”之前加上其他運(yùn)算符,表1-2-4中優(yōu)先級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)算符,可以簡化程序,有利于編譯處理,提高編譯效率并產(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語言提供了 6種關(guān)系運(yùn)算 符: 大于運(yùn)算符:; 大于等于運(yùn)算符:=; 小于運(yùn)算符:; 小于等于運(yùn)算符:=; 等于運(yùn)算符:=; 不等于運(yùn)算符:!=; 在關(guān)系運(yùn)算符中,、=的優(yōu)先級相同,=和 !=優(yōu)先級相同;前者優(yōu)先級高于 后者。 例如:“a=b

9、c; ”應(yīng)理解為“ a=(bc); ”。 關(guān)系運(yùn)算符優(yōu)先級低于算術(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ù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為有符號數(shù),則“ a2 表示把 B 右移為 11 100110B。 在使用位運(yùn)算符時(shí),有如下技巧: 按位與運(yùn)算通常用來對某些位清零或保留某些位。例如,要保留從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)語句 6 PORTB= PORTB|OXFE; /1111 1110 7 for(a=1000;a0;a-); /for循環(huán)語句 8 PORTB= PORTB|0XFD; /1111 1101 9 for(a=1000;a0;a-); /for循環(huán)語句 10 PORTB= PORTB|0XFB; /1111 1011 11 for(a=1000;a0;a-); /for循環(huán)語句 12 PORTB= PORTB|0XF7; /1111 0111 13 for(a=1000;a0;a-); /

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

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

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

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

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

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

18、都必須以分號“;”結(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 選擇語句 跑馬燈的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)語句,起延時(shí)作用 if(temp=0 x00) /判斷變量temp是否等0 x00 temp=0 x01; /if 語句成立,給變量temp賦0 x01 else /if 語句不成立 temp=temp1; / 變量 temp 左移 1 位 我們看到,在上述程序中使用了如下i

20、f語句: if(temp=0 x00) /判斷變量temp是否等0 x00 temp=0 x01; /if 語句成立,給變量temp賦0 x01 else /if 語句不成立 temp=temp1; / 變量 temp 左移 1 位 執(zhí)行這些語句時(shí),先判斷“temp=OxO0是否成立,如果條件滿足,則執(zhí)行“temp=OxO1; ” 后,回到“ PORTB=temp;語句,執(zhí)行該條語句,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)語句,起延時(shí)作用 /如果RDO為低電平狀態(tài) 則點(diǎn)亮左轉(zhuǎn)燈 /for循環(huán)語句,起延時(shí)作用 /如果RD1為低電平狀態(tài) 則點(diǎn)亮右轉(zhuǎn)燈 /for循環(huán)語句,起延時(shí)作用 空語句 RB0=1; / 熄火左轉(zhuǎn)燈 RB1=1; /熄火右轉(zhuǎn)燈 for(a=5000;a0;a-); /for循環(huán)語句,起延時(shí)作用 選擇【程序】?【Proteus 7 Professional 】?【ISIS 7 Pr

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

23、,它是if語句的一部分,不能單獨(dú)使用。 else語句總是與在它上面跟它最近的if語句相配對。 表達(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位無關(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: /空語句,什么都不做 for(a=5000;a0;a-); /for循環(huán)語句,起延時(shí)作用 RB0=1;/熄滅左轉(zhuǎn)燈 RB1=1; /熄火右轉(zhuǎn)燈 for(a=5000;a0;a-); /for循環(huán)語句,起延時(shí)作用 在上述程序中,定義了一個(gè)無符號字符變量

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

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

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

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

29、0,所以,初值 沒有為1, while語句的條件為“ i=100; ”,符號“ =”為關(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語句使用過程中的注意事項(xiàng) 使用while語句時(shí)要注意,當(dāng)表達(dá)式的值為“真”時(shí),執(zhí)行循環(huán)體,循環(huán)體執(zhí)行一 次完成后,再次回到while,進(jìn)行循環(huán)條件判斷,如果仍然為“真”,則重復(fù)執(zhí)行循環(huán)體程 序;為“假”則退出整個(gè) while循環(huán)語句。 如果循環(huán)條件一開始就為“假”

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

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

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

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

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論