PIC單片機C語言入門實例_第1頁
PIC單片機C語言入門實例_第2頁
PIC單片機C語言入門實例_第3頁
PIC單片機C語言入門實例_第4頁
PIC單片機C語言入門實例_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、供了完 全免費的學習版PICC-Lite編譯器套件。它的使用方式與完全版相同,只是支持的PIC單片機型號限制在PIC16F84 PIC16F877和PIC16F628等幾款。這幾款Flash型的單片機因 其所具備的豐富的片上資源而最適用于單片機學習入門,因此,筆者建議感興趣的讀者可 以從PICC-Lite入手掌握PIC單片機的C語言編程。我們一起來認識訓練項目2跑馬燈的仿真與演示的程序1 #include""2 int a;7F1.2.2 1-2-11-2-11-2-11-2-1整_在本類型Y實力U (浮點Y單精度型雙 精 度 型1字口枚_符型舉類型號數(shù)據(jù)類型4陶造類型數(shù)4

4、尤什米刑結,共構體類理 用體類用1 |=| k 1 J J 十、仝英型(void )1.2.3 1-2-2 符號二65表示數(shù)據(jù)的最1-2-21-2-3圖1-2-3點實數(shù)在內存中的存放形式指數(shù)(5)字符型變量字符型變量用來存放字符常量,注意只能存放一個字符。例如:char c1,c2,c3,c4,c5;1.2.5 1-2-31-2-31-2-41-2-4括號運算符下標運算符指向結構體成員運算符成員運算符自左至右2!+ -邏輯非運算符按位取反運算符自加、自減運算符單目運算符右結合-(舊)* &sizeof負號運算符強制類型轉換運算符指針和地址運算符取長度運算符3* / %乘、除、求余運算符

5、雙目運算符自左至右4+ -算術加、減運算符雙目運算符自左至右5<< >>位左移、右移運算符雙目運算符自左至右6< <=> >=關系運算符雙目運算符自左至右7=!=關系運算符雙目運算符自左至右8&按位與運算符雙目運算符自左至右9A位異或運算符雙目運算符自左至右101位或運算符雙目運算符自左至右11&&邏輯與運算符雙目運算符自左至右12II邏輯或運算符雙目運算符自左至右13?:條件運算符三目運算符右結合14=+= -= *=/= %=<<=>>=&= |=A=組合算術運算符組合運算符雙目運算符右

6、結合15,逗號運算符自左至右(1)優(yōu)先級求解表達式時,總是先按運算符的優(yōu)先次序由高到低進行操作。優(yōu)先級是用來標志運 算符在表達式中的運算順序的。相當于加括號,運算時進行脫括號運算。(2)結合性當一個運算對象兩側的運算符優(yōu)先級相同時,則按運算符的結合性確定表達式的運算 順序。它分為兩類:一類是運算符的結合性為“從左到右”(大多數(shù)運算符是這樣的),另一類運算符的結 合性為“從右到左”。例如:3-5*2 ,按運算符的優(yōu)后次先乘后減,表達式的值為了 -7 ; 3*5/2 , 5的兩側是和“/”優(yōu)先級相同,則按結合性處理,算術運算符的結合性為“從左到 右”,則先乘后除,表達式的值為7。C語言規(guī)定了各種運

7、算符的結合方向(結合性),關于 結合性的概念在其他高級語言中是沒有的,這是C語言的特點之一。2 .算術運算符與算術表達式Hitech-PICC中的算術運算符如表1-2-5所示。表1-2-5算術運算符運算符名稱功能+加法求兩個數(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在使用上述運算符時,應注意以下幾點:要注意除法運算符在進行浮點數(shù)相除時,其結果為浮點數(shù),如 5所得值為;而進行 兩個整數(shù)相除時,所得值是整數(shù),如 7/3 ,值為

8、2。取余運算符(模運算符)“%要求參與運算的量均為整型,其結果等于兩數(shù)相除后 的余數(shù)。Hitech-PICC提供的自增運算符“ +”和自減運算符“-",作用是使變量值自動加1或減1。自增運算和自減運算只能用于變量而不能用于常量表達式,運算符放在變量前和 變量后是不同的。后置運算:i+ (或i-)是先使用i的值,再執(zhí)行i+1 (或i-1 )。前置運算:+i (或-i )是先執(zhí)行i+1 (或i-1 ),再使用i的值。對自增、自減運算的理解和使用是比較容易出錯的,應仔細地分析,例如:int i=100,j;j=+i;/j=101,i=101j=i+;/j=101,i=102j=-i;/j=

9、101,i=101j=i-;/j=101,i=100編程時常將“ +”、“-”這兩個運算符用于循環(huán)語句中,使循環(huán)變量自動1;也常用于指針變量,使指針自動加1指向下一個地址。3 .賦值運算符與賦值表達式賦值運算符“二”的作用變是給變量賦值,如“ x=10;”。用賦值運算符將一個變量與一 個表達式連接起來 的式子稱為賦值表達式,在表達式后面加“;”便構成了賦值語句。賦 值勤語句的格式如下。變量=表達式;例如:k=0xff;/將十六進制數(shù)FFH賦予變量kb=c=33;/將33同時賦予變量b和cd=e;/將變量e的值賦予變量df=a+b;/將表達式a+b的值賦予變量f由此可見,賦值表達式的功能是計算表

10、達式的值再賦予左邊的變量。賦值運算符具有 右結合性,因此有下面的語句:a=b=c=5;可以理解為:a=(b=(c=5);按照C語言的規(guī)定上,任何表達式在其末尾加上分號就構成語句。因此“ x=8;”和 “a=b=c=5;"都是賦值語句。如果賦值運算符兩過的數(shù)據(jù)類型號不相同,系統(tǒng)將自動進行類型轉換,即把賦值右邊 的類型換成左邊的類型。具體規(guī)定如下:實型賦給整型,舍去小數(shù)部分。 整型賦給實型,數(shù)值不變,但將以浮點開式存放,即增加小數(shù)部分(小數(shù)部分的值 為0)。 字符型賦給整型,由于字符型為1字節(jié),而整型2字節(jié),故將字符ASCII碼值放到 整型量的低8位中,高8位為0。整型賦給字符型,只把低

11、8位賦給字符量。圖1-2-4表示了各數(shù)據(jù)類型自動轉換的規(guī)則低高int -unsgne_>- lon unsigneddoubleI圖1-2-4各種數(shù)據(jù)類型的高低順序Tshor 、float在C語言程序設計中,經常使用復合賦值運算符對變量進行賦值。復合賦值運算符就 是在賦值符“二”之前加上其他運算符,表1-2-4中優(yōu)先級14就是復合賦值運算符。構成復合賦值表達式的一般形式為:變量 雙目運算符=表達式;它等效于:變量=變量運算符表達式;例如:a+=5;/ 相當于 a=a+5;x*=y+7;/ 相當于 x=x*(y+7);r%=p;/ 相當于 r=r%p;在程序中使用復合賦值運算符,可以簡化程

12、序,有利于編譯處理,提高編譯效率并產 生質量較高的目標代碼4 .關系運算符與賦值表達式在前面介紹過的分支選擇程序結構中,經常需要比較兩個變量的大小關系,以決定程序下一步的操作。比較兩個數(shù)據(jù)量的運算符稱為關系運算符。C語言提供了 6種關系運算符:大于運算符::>=:小于運算符::小于等于運算符:二:不等于運算符:在關系運算符中, 、=、=的優(yōu)先級相同,=和!二優(yōu)先級相同;前者優(yōu)先級高于例如:"a=bc;” 應理解為 “ a=(bc);關系運算符優(yōu)先級低于算術運算符,高于賦值運算符。例如:"a+bc+d;” 應理解為 “(a+b)(c+d); ”。關系表達式是用關系運算符

13、連接的兩個表達式。它綿一般形式為:表達式關系運算符表達式關系表達式的值只有0和1兩種,即邏輯的“真”與“假”。當指定的條件滿足時,結 果為1,不滿足時結果為 0o例如表達式“ 50; ”的值為“真”,即結果為1;而表達式(a=3)>(b=5); ”由于3>5不成立,故其值為“假”a+b>c/若a=1,b=2,c=3,則表達式的值為0 (假)a>3/2若x=2,則表達式的值為1 (真)c=5/若c=1,則表達式的值為0 (假)5 .關系運算符與賦值表達式C語言中提供了三種邏輯運算符,一般形式有以下三種邏輯與運算符:&&邏輯或運算符:| ;邏輯非運算符:!;

14、邏輯表達式的一般形式有以下三種邏輯與:條件式1&除件式2邏輯或:條件式1|條件式2邏輯非:!條件式"&&'和“| ”是雙目運算符,要求有兩個運算對象,結合方向是從左到右?!耙皇菃文窟\算符,只要求一個運算對象,結合方向是從右至左。(1)邏輯與:a&&h當且僅當兩個運算量的值都為“真”時,運算結果為“真”,否則為“假”結果(2)邏輯或:條件1條件2邏輯運算ab!aa&&ba|b11011100010110100100兩個運算量的值都當運算量的值為為“假”;當運算運算結果為表1-2-6給出了執(zhí)行邏輯運算的量的值為“假”時,算結

15、果為“假”,否為“假”時,運“真”時,運算結果(3)邏輯非:!a,則為“真”。a|b ,當且僅當表1-2-6執(zhí)行邏輯運算的結果例如:設 x=3,則(x>0) && (x<6)的值為“真”(即為 “1”),而(x<0) && (x>6)的 值為“假”(即為“0”),!x的值為“假”。邏輯運算符1”的優(yōu)先級最高,其次為“&&',最低為“| ”。具體請讀者見表1-2-4運 算符的優(yōu)先級和結合性。6 .位運算符與位運算表達式在PIC系列單片機應用系統(tǒng)設計中,對I /O端口的操作是非常頻繁的,因此往往要求程 序在位(bit)

16、 一級進行運算或處理,因此,匯編語言具有強大靈活的位處理能力。Hitech-PICC語言直接面對:PIC系列單片機硬件,也提供了強大靈活的位運算功能,使得c語言也能像匯編語言一樣對硬件直接進行操作。Hitech-PICC 提供了 6種位運算符:按位與運算按位或運算按位異或運按位取反運右移運算符:左移運算符:位運算符的作用條件1條件2邏輯運算符:&符:I ;算符:八;算符:;>>;<<;是按二進制位對ab!aa&&ba|b11011100010110100100變量進行運算,表1-2-7是位運算符的真值表。表1-2-7位運算符的真值表位及量1位及量

17、2位運算ababa&ba|baAb0011000011001110010111100110左移運算符“ <<”的功能,是把“ <<”左邊的操作數(shù)的各二進制位全部左移若干位,動的位數(shù)由“ <<”右邊的常數(shù)指定,高位丟棄,低位補 Q例如:"a<<4是指把a的各二 進制位向左移動4位。如a=000000llB(十進制數(shù)3),左移4位后為00110000B(十進制數(shù) 48)。右移運算符“>>”的功能,是把“>>”左邊的操作數(shù)的各二進制位全部右移若干位,移動的位數(shù)由“>>”右邊的常數(shù)指定。進行右移運算時

18、,如果是無符號數(shù),則總是在其左端補“0”;對于有符號數(shù),在右移時,符號位將隨同移動。當為正數(shù)時,最高位補O,而為負數(shù)時,符號位為1,最高位是補0還是補1取決于編譯系統(tǒng)的規(guī)定。例如:設 a=Ox98如果a為無符號數(shù),則" a>>2'表示把B右移為0010011OB;如果a為有符號數(shù),則" a>>2''表示把B右移為11 100110B。在使用位運算符時,有如下技巧:按位與運算通常用來對某些位清零或保留某些位。例如,要保留從PORTBS口的RB0和RB1讀入的兩位數(shù)據(jù),可以執(zhí)行"control=PORTB&0x0

19、3;"操作(0x03的二進制數(shù)為00000011B);而要清除 PORT端口的 RBCRB7為 0,可以執(zhí)行 “ PORTB=PORTB&QXO操 彳(0x0f的二進制數(shù)為00001111R同樣,按位或運算經常用于把指定位置1、其余位不變的操作。1234567891011121314流水燈控制程序就是采用移位運算來實現(xiàn)的發(fā)光二極管點亮位置的移動。用位運算符“ |”改寫的流水燈控制程序如下#include""int a;/void main() TRISB=0X00;while(1) PORTB= PORTB|0XFE;for(a=1000;a>0;a

20、-);PORTB= PORTB|0XFD;for(a=1000;a>0;a-);PORTB= PORTB|0XFB;for(a=1000;a>0;a-);PORTB= PORTB|0XF7;for(a=1000;a>0;a-);定義整型變量a/定義端口 B為輸出模式/while循環(huán)語句/1111 1110/for循環(huán)語句/1111 1101/for循環(huán)語句/1111 1011/for循環(huán)語句/1111 0111/for循環(huán)語句/1110 1111PORTB= PORTB|0XEF;15for(a=1000;a>0;a-);/for循環(huán)語句16PORTB= PORTB|0

21、XDF;/1101 111117for(a=1000;a>0;a-);/for循環(huán)語句18PORTB= PORTB|0XBF;/1011 111119for(a=1000;a>0;a-);/for循環(huán)語句20PORTB= PORTB|0X7F;/0111 111121for(a=1000;a>0;a-);/for循環(huán)語句2223 分析上面程序可知,該程序實現(xiàn)的流水燈效果7 .逗號運算符與逗號運算表達式在c語言中逗號”也是一種運算符,稱為逗號運算符,其功能是把兩個表達式連接起來組成一個表達式,稱為逗號表達式,其一般形式為:表達式1,表達式2,表達式n逗號表達式的求值過程是:從左

22、軍右分別求出各個表達式的值,并以最右邊的表達式n的值作為整個逗號表達式的值。程序中使用逗號表達式的目的,通常是要分別求逗號表達式內各表達式的值,并不一止要求整個逗號表達式的值。例如:x=(y=10,y+5);上面括號內的逗號表達式,逗號左邊的表達式是將10賦給y,逗號右邊的表達式進行y+5的計算,逗號表達式的結果是最右邊的表達式“ y+5”的結果15賦給x。并不是在所有出現(xiàn)逗號的地方都組成逗號表達式,如在變量說明、函數(shù)參數(shù)表中的逗 號只是用做各變量之間的間隔符,例如:unsigned int i, j;1.2.6基本語句C語言程序的執(zhí)行部分由語句組成。C語言提供了豐富的程序控制語句,按照結構化

23、程 序設計的基本結構:順序結構、選擇結構和循環(huán)結構,組成各種復雜程序。這些語句主要 包括表達式語句、復合語句、選擇語句和循環(huán)語句等。1 .表達式語句表達式語句是最基本的C語言語句。表達式語句由表達式加上分號“;”組成,其一般 形式如下:表達式;執(zhí)行表達式語句就是計算表達式的值。例如:PORTB=0XFD;/賦值語句,在程序中將端口 B賦值為0XFDx=y+z;/ y和z進行加法運算后賦值給變量xi+;/ 自增1語句,i增加1后,再賦給變量i在C語言中有一個特殊的表達式語句,稱為空語句。空語句中只有一個分號“;”,程序執(zhí)行空語句時需要占用一條指令的執(zhí)行時間,但是什么也不做。在程序中常常把空語句

24、作為循環(huán)體,用于消耗CPU寸間等待事件發(fā)生的場合。例如,在函數(shù)中,有下面語句:for(a=1000;a>0;a-);/for循環(huán)語句上面的for語句后面的“;”是一條空語句,作為循環(huán)體出現(xiàn)。在使用“;”時的小技巧:表達式是由運算及運算對象所組成的、具有特定含義的式子,例如“ y+z”。C語言 是一種表達式語言,表達式后面加上分號“;”就構成了表達語句,例如“ y+z”。C語言中 的表達式與表達式語句的區(qū)別就是前者沒有分號“;”,而后者有“;”。在while或for構成的循環(huán)語句后面加一個分號,構成一個不執(zhí)行其他操作的空循 環(huán)體。例如:While(1);上面語句循環(huán)條件永遠為真,是無限循環(huán)

25、;循環(huán)體為空,什么也不做。程序設計時, 通常把該語句作為停機語句使用。2 .復合語句把多個語句用大括號括起來,組合在一起形成具有一定功能的模塊,這種由若干條 語句組合而成的語句稱為復合語句。在程序中應把復合語句看在是單條語句,而不是多條 語句。復合語句在程序運行時,中的各行單語句是依次順序執(zhí)行的。在 C語言的函數(shù)中, 函數(shù)體是一個復合語句,例如程序的主函數(shù)中包含兩個復合語句:void main() TRISB=0X00;while(1) PORTB= PORTB|0XFE;for(a=1000;a>0;a-);PORTB= PORTB|0XFD;PORTB= PORTB|0X7F;/定義

26、端口 B為輸出模式/while循環(huán)語句/1111 1110/for循環(huán)語句/1111 1101/0111 1111/for循環(huán)語句for(a=1000;a>0;a-);在上面的這段程序中,組成函數(shù)體的復合語句內還嵌套了組成 while()循環(huán)體的復合語 句。復合語句允許嵌套,也就是在中的。也是復合語句。復合語句內的各條語句都必須以分號“;”結尾,復合語句之間有分隔,在括號“ 外,不能家分號。復合語句不僅可由可執(zhí)行語句組成,還可由變量定義語句組成。在復合語句中所定義 的變量,稱為局部變量,它的有效范圍只在復合語句中。函數(shù)體是復合語句,所以函數(shù)體 內定義的變量,其有效范圍也只在函數(shù)內部。前面

27、的 main()函數(shù)體內定義的位變量left 和right的有效使用范圍局限在 main()函數(shù)內部,與其他函數(shù)無關。3 .選擇語句跑馬燈的C程序可以用以下程序代碼來實現(xiàn),即跑馬燈先從上到下循環(huán)進行。#include ""unsigned char temp=0x01;/*function: main()*功能描述:主函數(shù)*void main() INTCON=0X00;/設置INTCON勺bit7bit0 為零:關總中斷TRISB=0X00;設置端口 B為輸出方式PORTB=0Xff;/使端口 B輸出低電平while(1) PORTB=temp;/ 按位取反for(a=1

28、000;a>0;a-);/for循環(huán)語句,起延時作用if(temp=0x00)/ 判斷變量 temp 是否等 0x00temp=0x01;/if 語句成立,給變量temp賦0x01else/if 語句不成立temp=temp<<1;/ 變量 temp 左移 1 位我們看到,在上述程序中使用了如下if語句:if(temp=0x00)/判斷變量temp是否等0x00temp=0x01; /if 語句成立,給變量temp賦0x01else/if 語句不成立temp=temp<<1;/ 變量 temp 左移 1 位執(zhí)行這些語句時,先判斷“temp=0x00是否成立,如果條

29、件滿足,則執(zhí)行“temp=0x01;” 后,回到“ PORTB=tem0;語句,執(zhí)行該條語句,temp變量按位取反之后,變?yōu)?xFE (即 B),則PORT的0xFE (即RB0弓唧為低電平,其余引腳為高電平),所以第一個發(fā)光二極 管亮,其它都不亮。如果條件不成立,則執(zhí)行“ temp=temp<<1;",將變量temp的值左移一 位再賦給變量本身,假設當時temp=0x02 (即00000010B),左移之后變成 0x04 (即00000100B),再回到“ PORTB=tem6;語句,執(zhí)行該條語句,temp變量按位取反之后,變 為0xFB (即00001011B), W

30、J PORT的0xFB (即RB2弓唧為低電平,其余引腳為高電平),所以第一個發(fā)光二極管鳧,其它都不鳧,上述程序的流程如圖1-2-5所示,圖1-2-5跑馬燈程序可以看出,處理實際問 或條件選擇,程序設計時 判斷,從而選擇不同的處 行判斷,并根據(jù)判斷結果 稱為選擇結構程序。流程題時總是伴隨著邏輯判斷 就要根據(jù)給定的條件進行 理路徑。對給定的條件進 選擇應執(zhí)行的操作程序,在C語言中,選擇結構程序設計一般用if語句或switch語句來實現(xiàn)。If語句又有if、if-else 和if-else-if三種不同的形式,下面分別進行介紹。(1)基本if語句基本if語句的格式如下:if(表達式)語句1;語句2;

31、語句n;if語句的執(zhí)行過程:當“表達式”的結果為“真”時,執(zhí)行其后的 中的語句1至語句n,否則跳過該語組,繼續(xù)執(zhí)行下面的語句,執(zhí)行過程如圖1-2-6所示。例如:if(x=3) a=b;b=c;if(x=7) b=c;c=a;如果“x=3”不成立,則跳過“ a=b;b=c; "語句,執(zhí)行下條語句。在使用基本if語句,一定要注意以下幾項:在if語句中,“表達式”必須用括號括起來;在if語句中,花括號“ ”里面的語句組如果只有一條語句,可以省略花括號,如:“ if(temp=0x00) temp=0x01; ”語句。但是為了提高程序的可讀性和防止程序書寫錯 誤,建議大家在任何情境下,都加上

32、花括號。4 2) if-else 語句if-else 語句的一般格式如下:if(表達式) 語句組1; else語句組2;if-else 語句的執(zhí)行過程:當“表達式”的結果為“真”時,執(zhí)行其后的“語句組1”,否則執(zhí)行“語句組2”,執(zhí)行過程如圖EfJ6;ji 流程 丫 (3) if-elsg-if 語斗箱旬if-else-if語句是由 if else一«格式如下:1-2-7 日。iFt-fse>'Yj 執(zhí)行流程語句組1語句組21什語句組成的嵌套,用于實現(xiàn)多個條件分支的選擇,其if(表達式1) 語句組1;else if( 表達式2)語句組2;else if( 表達式n)語句組

33、n;else語句組n+1;執(zhí)行該語句時,依次判斷“表達式i”的值,當“表達式i”值為“真”時,執(zhí)行其對 應用的“語句組i”跳過剩余的if語句組,繼續(xù)執(zhí)行語句下面的一個語句。如果所有表達 式的值均為“假”,則執(zhí)行最后一個else后的“語句組n+1”,然后再繼續(xù)執(zhí)行其下面的一 個語句,執(zhí)行過程如圖1-2-8所示。采用if-else-if語句實現(xiàn)汽車轉向燈控制的 C程序,程序代碼如下:產*note:模擬汽車轉向燈控制程序(用if-else-if語句控制)*#include "" unsigned int a;產*mian()* TRISB=0X00;main()/設置端口 B為輸

34、出方式PORTB=0XFF;/設置端口B為高電平輸出TRISD=0XFF;/設置端口D為輸入方式while(1)/while循環(huán) if(RD0=0&&RD1=0)/如果RD叫 RD1都為低電平狀態(tài) RB0=0;RB1=0;for(a=5000;a>0;a-);else if(RD0=0) RB0=0;/for(a=5000;a>0;a-);else if(RD1=0) RB1=0;/for(a=5000;a>0;a-);else;/則點亮左轉燈和右轉燈/for循環(huán)語句,起延時作用/如果RD0為低電平狀態(tài)則點亮左轉燈/for循環(huán)語句,起延時作用/如果RD1為低電

35、平狀態(tài)則點亮右轉燈/for循環(huán)語句,起延時作用空語句RB0=1;/ 熄滅左轉燈RB1=1;/熄滅右轉燈for(a=5000;a>0;a-);/for 循環(huán)語句,起延時作用選擇【程序】? Proteus 7 Professional 】? ISIS 7 Professional 】命令,啟動 PROTEUS 仿真軟件,在ISIS 7 professional圖形編輯窗口,繪制汽車轉向燈仿真電路。并選擇【程 序】? Microchip ?【MPLABDE ?【MPLABDE】命令,啟動MPLABDE集成開發(fā)環(huán)境; 新建工程。選擇菜單欄中的【Project ? Build All 命令或直接點

36、擊工具欄中的“ I西” 圖標,對程序進行編譯、修改,直到“Out put ”窗口沒有錯誤為止。再把文件添加到Proteus 中,會出現(xiàn)如圖1-2-9所示的汽車轉向燈仿真效果。圖1-2-9汽車轉向燈仿真效果if語句使用過程中的注意事項else語句是if語句的子句,它是if語句的一部分,不能單獨使用else語句總是與在它上面跟它最近的if語句相配對。表達式“ RD0=0&&RD1=01由兩個關系表達式“ RD0=0和"RRD1=0組成的 邏輯表達式,其中符號“ &&'是邏輯運算符,其運算規(guī)則是:當且僅當左右兩過的值都為“真”時,運算結果為“真”,否

37、則為“假”。在上面的表達式中,當且僅當 RD麗RD1都 為“0”時,該表達式的值才為“真”,否則為“假”。關于邏輯表達式的介紹請參見“關系 運算符與賦值表達式”的內容。(4) switch 語句if語句一般用做單一條件或分支數(shù)目較少的場合, 如果使用if語句來編寫超過3個以 上分支的程序,就會降低程序的可讀性。C語言提供了一種用于多分支選擇的 switch語句, 一般形式如下:switch (表達式) case常量表達式1:語句組1; break;case常量表達式2:語句組2; break; case 常量表達式 n: 語句組 n; break;default:語句組 n+1;該語句的執(zhí)行過

38、程是:首先計算表達式的值,并逐個與case后的常量表達式的值相比較,當表達式的值與某個常量表達式的值相等時,則執(zhí)行對應常量表達式后的語句組,再 執(zhí)行break語句,跳出switch語句的執(zhí)行,繼續(xù)執(zhí)行下一語句。如果表達式的值與所有 case后的常量表達式均不相同,則執(zhí)行 default后的語句組。用switch語句改寫汽車轉向燈控制的 C語言源程序,如下所示:產*note:模擬汽車轉向燈控制程序(用 switch語句控制)*/#include ""unsigned int a;unsigned char contr_led;/定義轉向燈控制變量/* *mian()*main

39、()/設置端口 B為輸出方式/設置端口 B為高電平輸出/設置端口 D為輸入方式/while 循環(huán)/讀PORTDJ狀態(tài)送到contr_led 變量/與操作,屏蔽掉高6位無關位,取/和RD1狀態(tài)如果RD0與RD1都為0,則點亮左、右/如果RD1為低電平狀態(tài),則點亮右/如果RD0為低電平狀態(tài),則點亮左 TRISB=0X00;PORTB=0XFF;TRISD=0XFF;while(1) contr_led=PORTD;contr_led= contr_led&0x03;出RD0switch(contr_led) case 0: RB0=0; RB1=0;break; 燈case 1: RB1=

40、0;break;轉燈case 2: RB0=0;break;轉燈default:for(a=5000;a>0;a-);RB0=1;RB1=1;for(a=5000;a>0;a-);/for循環(huán)語句,起延時作用/熄滅左轉燈/熄滅右轉燈/for循環(huán)語句,起延時作用/空語句,什么都不做在上述程序中,定義了一個無符號字符變量contr_led ,長度為1個字節(jié),其最低兩位用來表示RDOffi RD1引腳對左、右轉向燈的控制狀態(tài)。語句“contr_led=PORTD;”將PORTED的8個引腳狀態(tài)保存到變量 contr_led 中,冉 執(zhí)行“與”操作語句“ contr_led= contr_

41、led&0x03; ”,把無關位清零,一般稱之屏蔽。然 后,采用switch(contr_led)語句來判斷變量contr_led的值與哪個case語句中的常量表達式的值相同,點亮相應的轉向燈;如果都不相等,則執(zhí)行 default后的語句。case語句使用過程中的注意事項在case后的各常量表達式的值不能相同,否則會出現(xiàn)同一個條件有多種執(zhí)行方案 的矛盾。在case語句后,允許有多個語句,可以不用括起來。例如:case 0: RB0=0; RB1=0;break;case和default語句的先后順序可以改變,不會影響程序的執(zhí)行結果“case常量表達式”只相當于一個語句標號,表達式的值和

42、某標號相等則轉向該標號執(zhí)行,但在執(zhí)行完該標號的語句后,不會自動跳出整個switch語句,加break語句,使得執(zhí)行完該case語句后可以跳出整個switch語句的執(zhí)行。default語句是在不滿足case語句情況下的一個默認執(zhí)行語句。如default語句后 面是空語句,表示不做任何處理,可以省略。4.循環(huán)語句在結構化程序設計中,循環(huán)程序結構是一種很重要的程序結構,幾乎所有的應用程序 都包含循環(huán)結構。循環(huán)程序的作用是:對給定的條件進行判斷,當給定的條件成立時,重 復執(zhí)行給定的程序段,直到條件不成立時為止。給定的條件稱為循環(huán)條件,需要重復執(zhí)行 的程序段稱為循環(huán)體。前面介紹的函數(shù)中使用了 for循環(huán)

43、,其循環(huán)體為空語句,用來消耗 CPU時間來產生延時效果,這種延時方法稱為軟件延時。軟件延時的缺點是占用CPU寸間,使得CPUft延時過程中不能做其他事情。解決的方法是使用單片機中的硬件定時器實現(xiàn)延時功能。在C語言中,可以用下面三個語句來實現(xiàn)循環(huán)程序結構:while語句、do-while語句和for語句,下面分別對它們加以介紹(1) while 語句while語句用來實現(xiàn)“當型”循環(huán)結構,即當條件為就執(zhí)行循環(huán)體。while語句的一般形式為:while(表達式)語句組;循環(huán)體其中,“表達式”通常是邏輯表達式或關系表達式,為循環(huán)條件,“語句組”是循環(huán)體,即被重復執(zhí)行的程序段。該語句的執(zhí)行過程是:首先

44、計算機“表達式”的值勤,當值為“真”(即非0)時,執(zhí)行循環(huán)體“語句組”,流程圖如1-2-10所示。圖1-2-10 while 語句流程在循環(huán)程序設計中,要特別注意循環(huán)的邊界問題,即循環(huán)的初值和終值要非常明確。例如:下面的程序段是求整數(shù) 1100的累加和,變是i的取值范圍為1100,所以,初值沒有為1, while語句的條件為“ i<=100; ",符號“<二"為關系運算符“小于等于"。main() int i,sum;/循環(huán)控制變量i初始值為1/累加和變量sum初始值為0i=1;sum=0;while(i<=100) sum=sum+i; / 累

45、力口和i+;/自增1,修改循環(huán)控制變量while語句使用過程中的注意事項使用while語句時要注意,當表達式的值為“真”時,執(zhí)行循環(huán)體,循環(huán)體執(zhí)行一 次完成后,再次回到while ,進行循環(huán)條件判斷,如果仍然為“真”,則重復執(zhí)行循環(huán)體程 序;為“假”則退出整個 while循環(huán)語句。如果循環(huán)條件一開始就為“假",那么while后面的循環(huán)體一次都不會執(zhí)行。 如果循環(huán)條件總為真,例如:while (1),表達式為常量“1”,非“0”即為“真”, 循環(huán)條件永遠成立,則為無限循環(huán),即死循環(huán)。在單片機C語言程序設計中,無限循環(huán)是一個非常有用的語句,在上述程序示例中都使用了該語句。 除非特殊應用的

46、情況,在使用 while語句進行循環(huán)程序設計時,通常循環(huán)體包含修 改循環(huán)條件的語句,以使循環(huán)逐漸趨于結束,避免出現(xiàn)死循環(huán)。(2) do-while 語句前面所述的while語句是在執(zhí)行循環(huán)體之前判斷循環(huán)條件,如條件不成立,則該循環(huán) 不會初執(zhí)行。實際情況往往需要先執(zhí)行一次循環(huán)體后,再進行循環(huán)條件的判斷,“直到型”do-while語句可以滿足這種要求。do-while語句的一般格式如下:do語句組;循環(huán)體 while(表達式);該語句的執(zhí)行過程是:先執(zhí)行循環(huán)體“語句組” 一次,再計算“表達式”的值,如果“表達式”為“真”(非0),繼續(xù)執(zhí)行循環(huán)體“語句組”,直到表達式為“假” (0)為止do-whi

47、le語句流程如圖1-2-11所示。do-while在使用if語句、while語句時,表達式括號后面都不能加分號“;”,但在do-while 語句的表達式括號后必須加分號do-while語句與while語句相比,更適合于處理不論條件是否成立,都需先執(zhí)行 次的循環(huán)體的情況(3) for語句在上述程序中,我們使用了 for語句,實現(xiàn)了循環(huán),重復執(zhí)行若干次空語句循環(huán)體, 以達到延時的目的。在C語言中,當循環(huán)次數(shù)明確時候,使用for語名比while和do-while 語句更為方便。For語句一般格式如下:for(循環(huán)變量賦值;循環(huán)條件;修改循環(huán)變量)語句組;循環(huán)體關鍵字for后面的圓括號內通常包括三個表

48、達式:循環(huán)變量賦值、循環(huán)條件和修改循環(huán)變量,三個表達式之間用“;”隔開?;ɡㄌ杻仁茄h(huán)體“語句組”。for執(zhí)行過程如下:先執(zhí)行第一個表達式,給循環(huán)變量賦值,通常這里是一個賦值表達式。利用第二個表達式判斷循環(huán)條件是否滿足,通常是關系表達式或邏輯表達式,若其 值為“真”(非0),則執(zhí)行循環(huán)體“語句組” 一次,再執(zhí)行下面第步;若其值為"假”(0), 則轉到第步循環(huán)結束。 計算機第三個表達式,修改循環(huán)控制變量,一般也是賦值語句。跳到上面第步繼續(xù)執(zhí)行。 循環(huán)結束,執(zhí)行for語句下面的語句。圖1-2-12 for語句流程以上過程流程圖如圖1-2-12所示。舉例:用for語句求1100累加和,程序如下:main() 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時,條件i<=100 不成立,循環(huán)結束。i語句相當于如下 while語句:i=1;while(i<=100) sum=sum+i;i+;因此,for語句的一般形式也可以改寫為:表達式1;循環(huán)變量賦值while(表達 2)語句組;循環(huán)體表達3;修改循環(huán)控制

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論