C51單片機C語言程序設計_第1頁
C51單片機C語言程序設計_第2頁
C51單片機C語言程序設計_第3頁
C51單片機C語言程序設計_第4頁
C51單片機C語言程序設計_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、嵌 入 式 系 統(tǒng) C51單片機C語言程序設計本章內(nèi)容:C51語言概述C51數(shù)據(jù)類型和數(shù)據(jù)存儲類型C51運算符和表達式C51程序結構C51函數(shù)【任務導入】 基于C51語言的靜態(tài)LED顯示系統(tǒng)的實現(xiàn):利用AT89C51單片機的I/O端口驅(qū)動兩個八段數(shù)碼管從“00”到“99”流水顯示,即通電后,顯示“00”,間隔一段時間后,顯示“01”,再間隔一段時間后,顯示“02”,直到“99”,然后再顯示“00”,往復循環(huán)?!救蝿辗治觥恳獙崿F(xiàn)用兩個數(shù)碼管循環(huán)顯示數(shù)字0099的功能,我們可把兩個數(shù)碼管的段選線分別連接到單片機的兩組I/O口的共16根I/O口線上,再通過程序讓單片機的兩組I/O口分時輸出09對應的

2、段碼就可以了。 C51語言概述1、C語言和C51語言(1)C語言是由早期的BCPL語言發(fā)展而來的。1967年,劍橋大學的理查茲(Martin Richards)在對CPL語言進行簡化的基礎上設計了BCPL(Basic Combined Pogramming Language)語言。 1970年,美國貝爾實驗室的湯普森(Ken Thompson)以BCPL語言為基礎,設計出簡單且接近硬件的B語言 。1972年,美國貝爾實驗室的里奇(D. M. Ritchie)又以B語言為基礎,最終設計出了C的語言 1978年,美國 電報公司(AT&T)貝爾實驗室正式發(fā)表了C語言。 1983年,美國國家標準化協(xié)會

3、制定了一個C語言標準通常稱為ANSI C。ANSI C在被國際標準化組織ISO所接受后,又經(jīng)過多次修正,形成了目前的C語言標準。(2)C51語言 用C51編寫單片機程序時,需要根據(jù)單片機存儲結構及內(nèi)部資源定義相應的數(shù)據(jù)類型和變量,而標準的C語言不需要考慮這些問題。另外,C51包含的數(shù)據(jù)類型、變量存儲模式、輸入輸出處理、函數(shù)等方面與標準的C語言也有一定的區(qū)別。其他的語法規(guī)則、程序結構及程序設計方法則與標準的C語言相同。 C語言編譯調(diào)試工具效率高,數(shù)據(jù)類型及運算符豐富,經(jīng)過不斷完善,能滿足單片機的開發(fā)要求,形成了單片機C語言。為了和ANSI C區(qū)別,把51單片機C語言稱為C51語言。 (3)C51

4、特點 編程者不需要了解單片機的指令系統(tǒng),僅要求對單片 機的存儲器結構 有初步的了解,至于存儲器的分配、尋址方式及數(shù)據(jù)類型等完全由編譯器管理。 程序有規(guī)范化的結構,可以分為不同的函數(shù),這種方式可以使程序結構化,將可變的選擇與特殊操作組合在一起,增強程序的可讀性。 編程和程序的調(diào)試時間顯著縮短,從而提高了編程的效率,提供的庫函數(shù)包含許多標準的子程序,具有較強的數(shù)據(jù)處理能力,可以將編好的程序很容易地移植到新程序。 C51作為一種非常方便的語言得到了廣泛的支持,目前已經(jīng)成為單片機開發(fā)的主要編程語言。簡單C51程序介紹【例1】 如圖1所示,在口上接有一個LED發(fā)光二極管,要求讓發(fā)光二極管發(fā)光。圖1 接有

5、LED的單片機基本電路 #include sbit P1_0=P10;void main( ) P1_0=0;while(1);程序如下:程序的開始是一個文件包含處理。這段程序中包含的是文件,以.h為后綴的稱為頭文件,該頭文件的作用是把特殊功能寄存器中的符號和地址對應起來,這里主要是應用到P1這個符號,如果沒有包含文件,C51編譯器不知道P1具體指什么,在編譯過程中就會發(fā)生錯誤。給取名為P1_0,是通過編譯器中增加的關鍵字sbit來定義的 程序最后是主函數(shù),每一個C51程序有且只有一個主函數(shù),函數(shù)后面使用一對大括號“”,在“”中書寫具體內(nèi)容?!纠?】 如圖1所示,要求口上接的LED發(fā)光二極管能

6、閃爍發(fā)光。#include #define uchar unsigned char#define uint unsigned intsbit P1_0=P10;void Mdelay (uint Delay); /* 被調(diào)函數(shù)申明*/void main(void ) for(;) P1_0=!P1_0; / 對P1_0取反 Mdelay(1000); void Mdelay (uint Delay)/ 延時子程序,由Delay參數(shù)確定延時時間 uchar i; for( ;Delay0; Delay-) for (i=0; i124;i+) ; 與上例相同宏定義,即用一個指定的標識符來代替一個

7、字符串,如第二行用uchar來代替unsigned char; 函數(shù)申明,如果被調(diào)函數(shù)在主調(diào)函數(shù)后面,一般需要聲明 小結(1) C51程序和C程序一樣,也是由函數(shù)構成的。一個C51程序至有且只有一個main函數(shù),可以有零個或多個其他函數(shù),因此函數(shù)是C51程序的基本單位。main函數(shù)可以直接書寫語句或者調(diào)用其他函數(shù)來實現(xiàn)功能,被調(diào)用的函數(shù)可以是編譯器提供的庫函數(shù),也可以是用戶根據(jù)需要編寫的函數(shù)(如例中的Mdelay函數(shù))。使用Keil C編寫的任何程序都可以直接調(diào)用其提供的庫函數(shù),調(diào)用時只需要包含具有該函數(shù)的頭文件即可。Keil C提供了100多個庫函數(shù)供用戶直接使用。(2) 一個函數(shù)由以下兩部

8、分組成。 函數(shù)的首部,包括函數(shù)名、函數(shù)類型、函數(shù)參數(shù)名、參數(shù)類型。如例中Mdelay函數(shù)的首部為void Mdelay (uint Delay) 函數(shù)類型 函數(shù)名 參數(shù)類型 參數(shù)名 函數(shù)體,即函數(shù)首部下面大括號里的內(nèi)容。(3) 一個C51程序從main函數(shù)開始執(zhí)行,不管main函數(shù)在什么位置。(4) C51中字母區(qū)分大小寫,如定義是sbit P1_0=P10,若后面寫成P1_0,在編譯時就會出現(xiàn)錯誤。(5) C51書寫自由,一行可以寫幾個語句,一個語句也能寫在幾行上。(6) 每個語句必須以分號結束。(7) C51中的注釋可以采用兩種符號。第一種是“/*/”符號,從“/*”開始直到“*/”為止,

9、中間的內(nèi)容都是注釋。第二種是“/”引導的注釋語句,這種注釋只對本行有效。2 C51數(shù)據(jù)類型和數(shù)據(jù)存儲類型 2.1 常量與變量1、常量和符號常量 在程序運行過程中,其值不能改變的量稱為常量,如10、0、0 x45等。常量一般從字面形式即可以判斷,這樣的常量稱為字面常量或者直接常量。 常量也可以用一個標識符來表示,稱之為符號常量?!纠?】 如圖1所示,要求點亮口上接的LED燈。程序如下。#define LIGHT 0 xfe#include void main( ) P1=LIGHT;while(1);定義符號常量LIGHT,在以后的程序中出現(xiàn)的所有LIGHT,實際上都是指0 xfe 使用符號常量

10、的優(yōu)點如下: (1) 含義清楚。如上面程序中,從LIGHT就知道它代表燈亮,因此定義符號常量時,應考慮“見名知意”。在一個規(guī)范的C51程序中不提倡使用很多直接常量。如若定義sum=10+20+30,則在檢查程序時往往會搞不清楚各個常數(shù)代表什么含義。(2) 在需要改變一個量時,可以做到一改全改。如#define PORTA 0 x7fff,在程序中要使用端口0 x7fff,可以用PORTA來代替,如果端口地址發(fā)生變化,變成0 x3fff,只要把定義語句改為#define PORTA 0 x3fff就行了。 變量值可以改變的量稱為變量。 圖2 變量2.2 整型數(shù)據(jù)1、整型常量的表示方法2、整型變量

11、 整型常量即整常數(shù),包括正整數(shù)、負整數(shù)和0,不能是小數(shù)。 可以是十進制、八進制(以0開頭)和十六進制(以0 x開頭)。 整型變量的基本類型是int,可以根據(jù)數(shù)值的范圍將變量定義為基本整型、短整型或長整型,在int之前分別加上修飾符:short(短整型)或long(長整型)。在實際應用中,變量的值常常是正的(如年齡、學號等),為了充分利用變量的表數(shù)范圍,可以將上面的三類定義成無符號型,即對以上三類分別加上修飾符unsigned。 表4-1 整型變量的數(shù)據(jù)類型類 型字 節(jié) 數(shù)數(shù)值范圍int2-215215-1unsigned int20216-1short int2-215215-1unsigne

12、d short int20216-1long int4-231231-1unsigned long int40232-1 C51中變量必須先定義才能使用,定義整型變量的方式為 修飾符 變量名 例如:int a; /定義一個整型變量a unsigned int a1,a2;/定義兩個整型變量a1,a2 long b; /定義一個長整型變量b unsigned long b1,b2; /定義兩個長整型變量b1,b22.3 實型數(shù)據(jù)1、實型常量的表示方法2實型變量實數(shù)又稱為浮點數(shù),實數(shù)有以下兩種表示形式。(1)、十進制小數(shù)形式。由數(shù)字和小數(shù)點組成,如、等。(2)、指數(shù)形式。如34e2或34E2都代表

13、34102。 標準C語言中的實型變量分為單精度(float)、雙精度(double)和長雙精度(long double)三種,但Keil C不支持后兩種,所以這里不做介紹。 float型占用4個字節(jié),能提供的有效數(shù)字是有限的,在有效位以外的數(shù)字會被舍去 。C51中實型數(shù)的使用應該注意以下幾點:(1)、在8位單片機中一般不要使用實型數(shù),這樣會降低程序的運行速度,增加程序的長度。(2)、程序中如果確實用到了實型數(shù),一般不是因為要使用小數(shù)點,而是因為用其他類型的變量范圍不夠大。(3)、很多時候,可以用長整型來代替實型。2.4 字符型數(shù)據(jù)1、字符型常量的表示方法 C51中字符型常量是用單引號括起來的一

14、個字符,如a、x、? 等都是字符型常量。C51還允許一些特殊形式的字符型常量,就是以一個“”開頭的字符序列。 表2 轉(zhuǎn)義字符及其含義字符形式含 義ASCII代碼n換行,將當前位置移到下一行開頭10t水平制表,跳到下一個Tab位置9b退格,將當前位置移到前一列8r回車,將當前位置移到本行開頭13f換頁,將當前位置移到下頁開頭12反斜杠符“”92單引號字符39雙引號字符34ddd13位八進制數(shù)代表的字符xhh12位十六進制數(shù)代表的字符2、字符型變量的表示方法 字符型變量用來存放字符常量,一個字符型變量只能存放一個字符。字符型變量的定義形式為: char 變量名 如:char a; 表示定義了一個字

15、符型變量a,a中可以存放一個字符,可以用下面的賦值語句給a賦值: a=c; 定義一個字符型變量,系統(tǒng)會為其分配一個字節(jié)的存儲空間,實際上,給字符型變量賦值后,并不是存儲字符型變量本身,而是存儲該字符型變量的ASCII碼,如上面是將c的ASCII碼99存儲在a中。由于ASCII碼也一定是整數(shù),字符型變量可以和前面所敘述的整型變量一樣,通過整型數(shù)據(jù)來賦值,如: char a=99;2.5 數(shù)組類型1、一維數(shù)組的定義 數(shù)組的維數(shù)是指表示數(shù)組使用的下標個數(shù),如果數(shù)組中每個元素只帶有一個下標,稱這樣的數(shù)組為一維數(shù)組。一維數(shù)組的定義形式為:類型說明符 數(shù)組名常量表達式;如: int a4;2、一維數(shù)組的引

16、用 C51中,一個數(shù)組不能整體應用,數(shù)組名是一個地址常量,不能對其賦值,只能使用數(shù)組中的元素。方法如下: 數(shù)組名下標 下標可以是整型變量或整型表達式,如a0、ai(i是一個整型變量)。3、一維數(shù)組的初始化(1)、在定義數(shù)組時對數(shù)組元素初始化,如: int a4=1,2,3,4; 經(jīng)過初始化后,a0=1、a1=2、a2=3、a3=4。(2)、可以只給一部分元素賦值,如: int a4=1,2; 經(jīng)過初始化后,a0=1、a1=2、a2=0、a3=0。(3)、對全部數(shù)組元素賦值時,可以不指定數(shù)組長度。如: “int a4=1,2,3,4;”可以寫成“int a=1,2,3,4;”。4、字符數(shù)組 字符

17、數(shù)組是指數(shù)組中元素的數(shù)據(jù)類型是字符類型的一維數(shù)組。字符數(shù)組引用、初始化的方法都與一維數(shù)組相同,只是要注意字符數(shù)組的元素是字符,有特殊的字面表示格式。 字符數(shù)組初始化的方法也和一維數(shù)組相同。如: char s5=1, 2, 3, 4, 5; char s5= 1, 2; char s=1, 2, 3, 4, 5; 2.6 指針類型 指針的含義是地址,所謂變量的指針就是指變量的地址,定義指針類型的變量實際上是定義一種用來存儲地址的變量。單片機中存儲器的地址有兩種 一種是由8位二進制數(shù)(1字節(jié))來表示的地址,如內(nèi)部數(shù)據(jù)存儲器 。還有一種是由16位二進制數(shù)(2字節(jié))來表示的地址,如程序存儲器、外部數(shù)據(jù)

18、存儲器等。 1、基于存儲器的指針類型 所謂基于存儲器的指針類型是指在定義指針變量時,就確定好它存儲的是什么地方變量的地址,如是在內(nèi)部數(shù)據(jù)存儲器,還是外部數(shù)據(jù)存儲器,或者是程序存儲器,這樣,這些指針的長度就可以具體確定(1字節(jié)或2字節(jié))。 具體定義為: char xdata *ptr;(1)、定義指針類型變量時,在變量名前加“*”,變量名取名規(guī)則和前面一般變量相同。(2)、xdata 是指ptr里存儲的是定義在外部數(shù)據(jù)存儲器里變量的地址,所以ptr占2個字節(jié)。 2、一般指針類型 一般指針包括3字節(jié),其中的2字節(jié)用于存儲地址,另外1字節(jié)用于存儲類型,如表4-3所示。表3 一般指針構成地 址第1字節(jié)

19、第2字節(jié)第3字節(jié)內(nèi) 容存儲器類型地址高8位地址低8位 其中第1字節(jié)表示存儲器類型,存儲器類型編碼如表4-4所示。 表4 一般指針存儲器類型存儲器類型內(nèi)部數(shù)據(jù)存儲器外部數(shù)據(jù)存儲器外部數(shù)據(jù)存器一個頁面(256字節(jié))內(nèi)部數(shù)據(jù)存儲器程序存儲器值12345 如一個一般指針指向地址為0 x1234的外部數(shù)據(jù)存儲器時,其指針】值如表4-5所示。 表5 指向外部數(shù)據(jù)存儲器的指針值地 址第1字節(jié)第2字節(jié)第3字節(jié)內(nèi) 容0 x020 x120 x342.7 Keil C51中特有的數(shù)據(jù)類型1、位型變量 位型變量實際是定義一個二進制位來存儲數(shù)據(jù),其值有“0”和“1”兩種。定義形式如下: bit 變量名;如: bit

20、flag;/定義一個位變量flag使用位變量時還要注意以下幾點。(1)、不能定義位型數(shù)組。(2)、不能定義位型指針。2、sfr型數(shù)據(jù) 8051單片機內(nèi)部的特殊功能寄存器并不能直接被C51所接受,為了定義這些特殊功能寄存器,增加了sfr、sfr16、sbit這3個關鍵詞。(1)、sfr是定義特殊功能寄存器和其地址的對應關系,其用法為 sfr 變量名=地址值;(2)、在特殊功能寄存器中,有一些是由兩個地址連續(xù)的8位寄存器組成,如DPTR是由DPH和DPL組成,可以分開定義這兩個特殊功能寄存器,也可以用sfr16來定義,如: sfr16 DPTR=0 x82;(3)、sbit是定義特殊功能寄存器中可

21、以位尋址的相應位,sbit的用法有以下三種。 bit 位變量名=地址值; sbit 位變量名=SFR名稱變量位地址值; sbit 位變量名=SFR地址變量位地址值;2.8 數(shù)據(jù)的存儲類型表6 C51存儲類型與8051存儲空間的對應關系存 儲 區(qū)描 述data片內(nèi)RAM的低128字節(jié),可在一個周期內(nèi)直接尋址bdata片內(nèi)RAM的位尋址區(qū),16字節(jié)idata片內(nèi)RAM的256字節(jié),必須采用間接尋址xdata外部數(shù)據(jù)存儲區(qū),使用DPTR間接尋址pdata外部存儲區(qū)的256字節(jié),通過P0口的地址對其尋址。使用MOVX Ri,需要兩個指令周期code程序存儲區(qū),使用DPTR尋址3 運算符和表達式3.1

22、算術運算符和算術表達式 (1)、+ 加法運算符,如4+3。(2)、- 減法運算符,如5-3。(3)、* 乘法運算符,如5*8。(4)、/ 除法運算符,如10/3。(5)、% 求模運算符或取余運算符,“%”兩側應該都為整型數(shù)據(jù),如10%3。 需要說明,基本的算術運算符都是雙目運算符,即需要兩個操作數(shù);對于“/”,若兩個整數(shù)相除,結果為整數(shù),如有小數(shù)自動舍去(注意不是四舍五入),如10/3,結果是3,而不是,如果需要得到真實結果,需要寫成。1、基本的算術運算符(1)、+ 自增運算符。(2)、- 自減運算符。 需要說明,+和-是單目運算符;+和-只能用于變量,不能用與常量和表達式;+j 先自增,再使

23、用,j+ 先使用,后自增,如: a=2;b=+a; 結果是b=3,a=3。 a=2;b=a+; 結果是b=2,a=3。2、自增/自減運算符 用算術運算符和括號將操作數(shù)(運算對象)連接起來,形成符合C51語法規(guī)則的表達式,稱為算術表達式,操作數(shù)包括常量、變量、函數(shù)等,如a*b+(5-c/3)。 C51規(guī)定了運算符的優(yōu)先性和結合性,在表達式求值的時候,先按運算符的優(yōu)先性運算,如先乘除求余,再運算加減,如a-b*c,b的左側是減號,右側是乘號,乘號的優(yōu)先性大于減號,因此,相當于a-(b*c)。如果在一個表達式中前后運算符的優(yōu)先性相同,則按規(guī)定的結合方向處理,C51規(guī)定了算術運算符的方向是自左向右,如

24、a+b-c,應先執(zhí)行a+b的運算,再與c相減。3、算術表達式和運算符的優(yōu)先性與結合性4、各類數(shù)值性數(shù)據(jù)間的混合運算 C51中,整型數(shù)據(jù)、字符型數(shù)據(jù)、實型數(shù)據(jù)都可以進行混合運算,轉(zhuǎn)換規(guī)則如圖3所示。圖3 數(shù)據(jù)類型轉(zhuǎn)換3.2 賦值運算符和賦值表達式1、賦值運算符 符號“=”為賦值運算符,其作用是將一個數(shù)據(jù)賦給一個變量,如x=5的作用是將常數(shù)5賦給變量x。也可以將一個表達式的值賦給變量,如x=5+y。2、類型轉(zhuǎn)換 賦值運算符的兩側如果類型不一樣,也是可以賦值的,但賦值時需要進行數(shù)據(jù)類型轉(zhuǎn)換, 3賦值表達式賦值表達式的一般形式為變量 賦值運算符 表達式如a=5、a=5+6、a=b=5等都是賦值表達式。

25、注意:賦值運算符的優(yōu)先性低于算術運算符。3.3 逗號運算符和逗號表達式 在C51中,多個表達式可以用逗號分開,如3+5,5+6,7+8,其中的逗號稱為逗號運算符,由逗號運算符組成的表達式稱為逗號表達式,其一般形式為表達式1,表達式2,表達式n 逗號表達式的求解過程是:先求表達式1,再求表達式2,直到最后一個表達式,但整個表達式的值是最后一個表達式的值。如3+5,5+6,7+8逗號表達式的值為15 注意:逗號運算符的優(yōu)先性低于賦值運算符。3.4 關系運算符和關系表達式1、關系運算符C51中提供了以下6種關系運算符。(1) 小于。(2) 大于。(4)= 大于等于。(5)= 等于。(6)!= 不等于

26、。優(yōu)先性的次序如下:(1)、前4種關系運算符(、=)的優(yōu)先性相同,后2種(=、!=)的優(yōu)先性也相同,前4種的優(yōu)先性高于后2種。(2)、關系運算符的優(yōu)先性低于算術運算符。(3)、關系運算符的優(yōu)先性高于賦值運算符。2、關系表達式 用關系運算符將兩個表達式連接起來的式子稱為關系表達式,如:ab、a+bb+c、a!=b。 關系表達式的值只有兩種:“真”和“假”。在C51中,運算結果如果是“真”,則用數(shù)值“1”表示;運算結果如果是“假”,則用“0”表示。3.5 邏輯運算符和邏輯表達式1邏輯運算符C51提供了以下3種邏輯運算符。(1)& 邏輯與。(2)| 邏輯或。(3)! 邏輯非?!?!”的優(yōu)先性高于算術運

27、算符,而“&”和“|”的優(yōu)先性相同,處于關系運算符和賦值運算符之間。2、邏輯表達式 用邏輯運算符將兩個表達式連接起來的式子稱為邏輯表達式,邏輯表達式的運算結果用“1”表示“真”,用“0”表示“假”。但在判斷一個量是否為“真”時,以0代表“假”,而以非0代表“真”,如(1)若a=5,!a的值為0;若a=-2,結果也一樣。(2)若a=5、b=8,則a&b的值為1;若a=0、b=8,則a&b的值為0。 3.6 位操作運算符和表達式 C51提供了如下的位操作運算符。(1)& 按位與。(2)| 按位或。(3) 按位異或。(4) 按位取反。(5) 位右移。 4 C51程序結構 在結構上可以把C51程序分為

28、3類,即順序結構、選擇結構和循環(huán)結構。4.1 順序結構 順序結構是一種最基本、最簡單的編程結構,在這種結構下,程序按低地址向高地址順序執(zhí)行指令代碼,下面通過一個例子來熟悉C51的順序結構?!纠?】 求兩個數(shù)的和。 定義兩個變量,先對其進行賦值,再求出兩個數(shù)的和,程序代碼如下。 main( ) int a, b, sum; a=3; b=2;sum=a+b;4.2 選擇結構1、if語句(1)if(表達式) 語句如果表達式為“真”,則執(zhí)行語句,否則執(zhí)行if語句后面的語句,如: if (a5) b=3;(2)if(表達式) 語句1 else 語句2 如果表達式為“真”,則執(zhí)行語句1,否則執(zhí)行語句2,

29、如: if (a10) b=1;else if (a6) b=2;else if (a2) b=3;else b=4;【例6】 電路如圖5所示。要求:通電初始,燈全滅;按住K1,8個LED燈全亮;松開K1,燈全滅。圖5 帶8個LED燈和2個按鈕的單片機電路程序如下:#include reg51.hvoid main( ) P1=0 xff; / 把P1口全部置1,8個燈滅 for(; ;) P3=P3|0 x01; / 把口置1 if (P3&0 x01)=0) / 判斷K1是否按下 P1=0 x00; / K1按下后,點亮全部燈 else P1=0 xff; / K1松開后,熄滅全部燈 2、

30、if語句的嵌套if(表達式1) if (表達式2) 語句1 else 語句2else if (表達式3) 語句3 else 語句4使用if嵌套語句特別要注意if和else配對,else總是和最近的if配對 3、條件運算符 可以用max=(ab)? a:b來表示。其中(ab)? a:b為條件表達式,執(zhí)行過程是:如果(ab)為“真”,表達式的值為a;如果(ab)為“假”,表達式的值為b。條件運算符的一般格式為:表達式1?表達式2:表達式3如:if (ab) max=a; else max=b;4、switch語句 實際問題中,往往遇到以一個變量或表達式的值為判斷條件,將此變量或表達式的值分成幾段,

31、每一段對應一種選擇或操作,這種情況用if語句來嵌套非常麻煩,于是,C51提供了switch語句。 switch語句的一般結構如下:switch (表達式) case 常量表達式1:語句1,break; case 常量表達式2:語句2,break; case 常量表達式n:語句n,break; default:語句n+1,break;說明:(1)、switch語句后面的表達式可以是任何類型。 、若表達式的值與某一個case后面的常量表達式值相同,就 開始執(zhí)行其后面的語句;如果沒有一個case后面的常量表 達式值與表達式值相同,則執(zhí)行default后面的語句。(3)、每一個case后面的常量表達式

32、值必須不同。、執(zhí)行完一個case后面的語句后,系統(tǒng)并不跳出,而是執(zhí)行 后面的case語句,直到結束。如果需要執(zhí)行完當前case語 句后,系統(tǒng)就跳出,需要在后面加break,如: case 常量表達式:語句;break;4.3 循環(huán)結構構成循環(huán)結構的主要有while、do-while和for等語句。 1、while 循環(huán)語句while語句的一般表達形式為:while (表達式) 語句當表達式的判斷為“真”時,執(zhí)行大括號內(nèi)的語句,否則不執(zhí)行。2、do-while 循環(huán)語句 do-while語句是先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立,其一般形式為: do 語句 while(表達式); while和

33、do-while語句雖然都是循環(huán)語句,但是兩者是有區(qū)別的,do-while語句不管條件是否成立,至少都會執(zhí)行一次循環(huán)體;而while語句,如果條件不成立,則不會執(zhí)行循環(huán)體。 3、for 循環(huán)語句for語句的一般形式為:for(表達式1;表達式2;表達式3)語句for循環(huán)語句的執(zhí)行過程如下。(1)先求解表達式1。(2)求解表達式2,如果結果為“真”,即條件成立,則執(zhí)行循環(huán)體語句;如果結果為“假”,轉(zhuǎn)到第(5)步。(3)求解表達式3。(4)轉(zhuǎn)回第(2)步。(5)退出for循環(huán)語句,執(zhí)行下面的語句。for循環(huán)中有幾種特例,分析如下。(1)表達式1可以沒有,但其分號不能省略。(2)表達式2也可以沒有,

34、同樣分號不能省略,這樣認為條件永遠滿足。(3)表達式3也可以省略。(4)如果三個表達式都省略,即for(; ;),它的作用相當于while(1),構成了一個無限循環(huán)的過程。4、break語句和continue語句 在一個循環(huán)語句中,可以通過判斷條件來退出循環(huán),也可以通過break語句來強制退出循環(huán)。 continue語句用于結束本次循環(huán),即跳過循環(huán)體下面的語句,而直接進行下一次是否循環(huán)的判斷。【例11】 電路如圖5所示。要求:開機后,全部燈不亮;按下K1后,則從VD1開始依次點亮,至VD8后停止并全部熄滅;待再次按下K1,重復上面過程;如果中間K2被按下,則燈立即全部熄滅,并返回初始狀態(tài)。#i

35、nclude reg51.h#include intrins.hvoid Delay( unsigned int delaytime)/ 延時子程序 unsigned char i; for( ; delaytime0;delaytime-) for( i=0; i=124; i+);void main( )unsigned char light=0 xfe; unsigned char i; for(;) P3=P3|0 x03; if (P3&0 x01)= =0) for(i=0;i=7;i+) light=0 xfe; Delay(1000); if (P3&0 x02)= =0) b

36、reak; light=_crol_(light, i); P1=light; P1=0 xff;5 C51函數(shù)5.1 函數(shù)的定義 一個完整的C51程序可由一個主函數(shù)和若干個子函數(shù)組成,由主函數(shù)調(diào)用子函數(shù),子函數(shù)之間也可以互相調(diào)用,同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意次。 從函數(shù)的形式上劃分,函數(shù)有無參函數(shù)和有參函數(shù)兩種形式,下面分別討論兩種函數(shù)的定義方法。1、無參函數(shù)的定義 無參函數(shù)的定義形式為: 類型標識符 函數(shù)名(void) 函數(shù)體 類型標識符是指定函數(shù)返回值的類型,如果函數(shù)沒有返回值,則可以定義“void”類型,函數(shù)名的取名規(guī)則和變量的取名規(guī)則一樣。2、有參函數(shù)的定義有參函數(shù)的定義形

37、式為類型標識符 函數(shù)名(形式參數(shù)列表) 函數(shù)體 3、函數(shù)參數(shù)傳遞 函數(shù)之間參數(shù)的傳遞由函數(shù)調(diào)用時主調(diào)函數(shù)的實際參數(shù)(簡稱實參)和被調(diào)函數(shù)的形式參數(shù)(簡稱形參)之間的數(shù)據(jù)傳遞完成。所謂的實際參數(shù)是指調(diào)用時函數(shù)名后面括號里的表達式,其個數(shù)和被調(diào)函數(shù)的形式參數(shù)個數(shù)一致,以int max (int x, int y)為例,定義的形式參數(shù)有x和y兩個,當主調(diào)函數(shù)調(diào)用時,將會寫成如下形式: a=max(5,9); a是假設主調(diào)函數(shù)中的一個變量,5和9是實際參數(shù),在調(diào)用時,把5賦給x、9賦給y。5.2 函數(shù)的調(diào)用1、函數(shù)的調(diào)用形式函數(shù)調(diào)用的一般形式為函數(shù)名(實參列表)函數(shù)在調(diào)用時一般有三種調(diào)用方式。(1)、

38、把函數(shù)作為一個語句,如: Delay(); 這時不要求函數(shù)有返回值,只要求函數(shù)完成一定的功能操作。、函數(shù)在一個表達式中,出現(xiàn)函數(shù)表達式,這要求函數(shù)帶回 一個確定的值以參加表達式的運算。(3)、函數(shù)作為參數(shù)調(diào)用,如: c=max(a,max(b,c); max(b,c)的返回值是作為外部max的一個參數(shù)。2調(diào)用函數(shù)的聲明和函數(shù)原型在一個函數(shù)中調(diào)用另一個函數(shù)必須同時具備以下一些條件。(1)、被調(diào)函數(shù)一定存在,可以自己編寫,也可以是庫函數(shù)。(2)、如果是庫函數(shù),一般應在文件開頭用#include命令將調(diào)用庫函數(shù)時所用到的信息包含到文件中。(3)、如果使用用戶自定義的函數(shù),而且該函數(shù)與調(diào)用它的函數(shù)(主

39、調(diào)函數(shù))在同一文件中,一般還應該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)做聲明。函數(shù)原型的一般形式有以下兩種。(1)、函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2,)(2)、函數(shù)類型 函數(shù)名(參數(shù)類型1 參數(shù)名1,參數(shù)類型2 參數(shù)名2,)注意:如果被調(diào)函數(shù)在主調(diào)函數(shù)的后面,可以不用聲明。 5.3 局部變量和全局變量 一個C51程序中的變量可以僅在一個函數(shù)中使用,也可以在所有的函數(shù)中使用,這就要引入局部變量和全局變量的概念。1局部變量 在一個函數(shù)內(nèi)部定義的變量稱為局部變量,它只在這個函數(shù)內(nèi)有效。 2全局變量 一個源文件可以包含一個函數(shù)或若干個函數(shù),在函數(shù)之外定義的變量稱為全局變量,全局變量在本文件的任何函數(shù)中都可以使用 。庫函數(shù)介紹1函數(shù)名_crol_2函數(shù)名_cror_3函數(shù)名_irol_4函數(shù)名_iror_5函數(shù)名_lrol_6函數(shù)名_lror_7函數(shù)名_nop_8函數(shù)名 _testbit_5.5 中斷程序

溫馨提示

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

評論

0/150

提交評論