51單片機_高級語言(C語言)程序設計_第1頁
51單片機_高級語言(C語言)程序設計_第2頁
51單片機_高級語言(C語言)程序設計_第3頁
51單片機_高級語言(C語言)程序設計_第4頁
51單片機_高級語言(C語言)程序設計_第5頁
已閱讀5頁,還剩73頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第4章 C51高級語言程序設計 4.1 C語言高級編程4.1.1 C語言的特點 C語言功能豐富,表達能力強,使用靈活方便,應用面廣,目標程序效率高,可移植性好,能直接對計算機硬件進行操作。既有高級語言的特點,也具有匯編語言的特點。語言簡潔、緊湊,使用方便、靈活。 運算符豐富。數據結構豐富,擁有現代語言的各種數據結構。 可進行結構化程序設計。可以直接對計算機硬件進行操作。生成的目標代碼質量高,程序執行效率高。 可移植性好。4.1.2 C語言與MCS-51單片機 匯編語言優點:執行效率高、速度快、與硬件結合緊密;I/O端口操作時,使用匯編語言快捷、直觀。 缺點:編程難度大,可讀性差,不便于移植,開

2、發周期長。 C語言優點:程序設計相比照較容易,支持多種數據類型,可移植性強,也能夠對硬件直接訪問,能夠按地址方式訪問存儲器或I/O端口。 故目前有較多的開發者用C語言開發單機應用系統軟件。4.1.3 C51編譯器 C51編譯器的作用是將C語言源程序翻譯成51系列單片機可執行的代碼,并且為程序調試提供必要的符號信息。目前使用最廣泛的是德國Keil公司的Keil Vision C51編譯器 Keil C51 編譯器在代碼生成方面領先,可產生最少的代碼。它支持浮點數和長整型、重入和遞歸。4.1.4 keil 8051開發工具 采用C51編寫的應用程序結構清楚、模塊化程度高、可讀性強。 應用C51進行

3、軟件開發,用戶可以不必具體考慮存放器、存儲器的分配等工作,而把這局部工作交給編譯、連接軟件,用戶只需了解MCS-51的存儲器結構。 C51開發環境一般都提供了數學計算等子程序庫,為程序開發帶來方便。 對于相對復雜的系統開發或復雜運算,比用匯編語言容易的多,有利于系統的維護和升級。 在實時要求較高的場合,可采用C51匯編混合編程。4.1.5 C51程序結構 C51程序結構與標準的C語言程序結構相同,采用函數結構,一個程序由一個或多個函數組成。 有一個且只有一個為main()函數。 在main( )函數中可調用庫函數和用戶定義的函數。 程序的開始局部一般是預處理命令、函數說明和變量定義等。預處理命

4、令 #include函數說明 long fun1( ) ; float fun2( );變量定義int x ,y; float z;主函數 main( ) fun1( ); /*調用功能函數 1*/ fun2( ); /*調用功能函數 2*/ 功能函數1 fun1( ); 函數體1 功能函數2 fun2( ); 函數體2 C51程序的結構實例:4.2 C51對標準C語言的擴展4.2.1 存儲區域 51系列單片機的內存區域被分為兩大類。一類是程序存儲區,即ROM;另一類是數據存儲區,包括內部數據存儲區和外部數據存儲區。內部數據存儲區中又包含了51的特殊功能存放器。 1.程序存儲區 程序存儲區由關

5、鍵字code進行說明。 2.內部數據存儲區在C51中可以用以下關鍵字對變量進行內部存儲區的定位。 Data:直接尋址區,內部RAM的低128B,即00H7FH Idata:間接尋址區,整個RAM區,即00H0FFH Bdata:可位尋址區,從20H開始的16個可以位尋址的字節,即20H2FH4.2.1 存儲區域 3.外部數據存儲區 C51中,可以用以下關鍵字對變量進行內部存儲區的訪問。 xdata:可指定多達64KB的外部直接尋址區,地址范圍0000H0FFFFH pdata:能訪問1頁256B的外部RAM,主要用在緊湊模式Compact Modle4.2.1 存儲區域4.2.2 C51的數據

6、類型 1字符型char char有signed char和unsigned char之分,默認為signed char。 2整型int int有signed int和unsigned int之分,默認為signed int。 3長整型long long有signed long和unsigned long之分,默認為signed long。 4浮點型float float型數據的長度為4個字節,包含指數和尾數兩局部,最高位為符號位,“1表示負數,“0表示正數,其余8位為階碼,最后23位為尾數的有效數位,由于尾數的整數局部隱含為“1,所以尾數的精度為24位。格式似Pentium CPU 浮點數格式

7、符號位+8位階碼+1隱含.23位尾數 5指針型(*) 指針型本身就是一個變量,在這個變量中存放著指向另一個數據的地址。這個指針變量要占用一定的內存單元。對于不同的處理器其長度不一樣,在C51中它的長度一般為13個字節。6特殊功能存放器型 這是C51擴充的數據類型,用于訪問MCS-51單片機中的特殊功能存放器數據。它分為sfr和sfr16兩種類型,其中sfr占一個字節單元,利用它可以訪問MCS-51內部的所有特殊功能存放器;sfr16占用兩個字節單元,利用它可以訪問MCS-51內部所有兩個字節的特殊功能存放器。在C51中對特殊功能存放器的訪問必須先用sfr和sfr16進行聲明。4.2.2 C51

8、的數據類型 7位類型 除了這些標準數據類型外,為了智能儀器儀表和工業自動化系統的需要,C51增加了一種位數據類型,用于訪問MCS-51單片機中可尋址的位單元。 在C51中支持兩種位類型:bit型和sbit型。其中用bit定義的位變量在C51編譯器編譯時,在不同的時候位地址是可以變化的。而用sbit定義的位變量必須與MCS-51單片機的一個可以尋址位單元或可位尋址的字節單元中的某一位聯系在一起,在C51編譯器編譯時,其對應的位地址是不可變化的。如:bit lock_pt ; /*將lock_pt定義為位變量*/ 4.2.2 C51的數據類型 特殊功能存放器用sfr 來定義,而sfr16 用來定義

9、16 位的特殊功能存放器如DPTR。通過名字或地址來引用特殊功能存放器,地址必須高于80H 。可位尋址的特殊功能存放器的位變量定義用關鍵字sbit。 SFR 的定義如下所示:sfr SCON=0X98; /定義 SCONsbit SM0=0X9F; /定義 SCON 的各位sbit SM1=0X9E; sbit SM2=0X9D;sbit REN=0 x9C; sbit TB8=0X9B; sbit RB8=0X9A; sbit TI=0X99;sbit RI=0X98;7位類型4.2.3 C51的常量和變量一、常量 常量是指在程序執行過程中其值不能改變的量。在C51中支持整型常量、浮點型常量

10、、字符型常量和字符串型常量。1整型常量整型常量也就是整型常數,根據其值范圍在計算機中分配不同的字節數來存放。 2浮點型常量浮點型常量也就是實型常數,有十進制表示形式和指數表示形式兩種。 3字符型常量 字符型常量是用單引號括起的字符,如a、1、F等。它可以是可顯示的ASCII字符,也可以是不可顯示的控制字符。對不可顯示的控制字符,需在前面加反斜杠“組成轉義字符。4字符串型常量 字符串型常量由雙引號括起的字符組成,如“D、“1234、“ABCD等。注意:一個字符常量在內存中只用一個字節存放,而一個字符串常量在內存中存放時,不僅僅引號內的字符一個要占一個字節,而且系統會自動在后面加一個轉義字符“0作

11、為字符串結束符。因此不要將字符常量和字符串常量混淆,如字符常量A和字符串常量A是不一樣的。一、常量二、變量1數據類型說明符 在定義變量時,必須通過數據類型說明符指明變量的數據類型,指明變量在存儲器中占用的字節數。 2變量名 變量名是C51為了區分不同變量,為變量取的名稱。在C51中規定變量名可以由3種字符組成字母、數字和下畫線,且第一個字母必須是字母或下畫線。變量名有兩種:普通變量名和指針變量名。它們的區別是指針變量名前面要帶“*號。3存儲種類 存儲種類是指變量在程序執行過程中的作用范圍。C51變量的存儲種類有4種,分別是自動(auto)、外部(extern)、靜態(static)和存放器(r

12、egister)。4存儲器類型 存儲器類型是用于指明變量所處單片機的存儲器區域情況。存儲器類型與存儲種類完全不同。 5特殊功能存放器變量 MCS-51系列單片機片內有許多特殊功能存放器,通過這些特殊功能存放器可以控制MCS-51系列單片機的定時器、計數器、串口、I/O及其他功能部件,每一個特殊功能存放器在片內RAM中都對應于一個字節單元或兩個字節單元。 6位變量 在C51中,允許用戶通過位類型符定義變量。位類型符有兩個:bit和sbit。可以定義兩種位變量。bit位類型符用于定義一般的可進行位處理的位變量。二、變量4.2.4 存儲模式 C51編譯器支持3種存儲模式:SMALL模式、COMPAC

13、T模式和LARGE模式。不同的存儲模式對變量默認的存儲器類型不一樣。(1)SMALL模式。SMALL模式稱為小編譯模式,在SMALL模式下,編譯時函數參數和變量被默認在片內RAM中,存儲器類型為data。(2)COMPACT模式。COMPACT模式稱為緊湊編譯模式,在COMPACT模式下編譯時,函數參數被默認在片外RAM的低256B空間,存儲器類型為pdata。(3)LARGE模式。LARGE模式稱為大編譯模式,在LARGE模式下,編譯時函數參數和變量被默認在片外RAM的64B空間,存儲器類型為xdata。4.2.5 絕對地址的訪問1使用C51運行庫中預定義宏 C51編譯器提供了一組宏定義來對

14、MCS-51系列單片機的code、data、pdata和xdata空間進行絕對尋址。 2通過指針訪問 采用指針的方法,可以實現在C51程序中對任意指定的存儲器單元進行訪問。3使用C51擴展關鍵字_at_ 使用_at_是對指定的存儲器空間的絕對地址進行訪問,一般格式如下:存儲器類型 數據類型說明符 變量名 _at_ 地址常數4.3 C51的運算符及表達式 C51有很強的數據處理能力,具有十分豐富的運算符,利用這些運算符可以組成各種表達式及語句。在C51中,運算符按其在表達式所起的作用,可分為賦值運算符、算術運算符、自增與自減運算符、關系運算符、邏輯運算符、位運算符、復合賦值運算符、逗號運算符、條

15、件運算符、指針和地址運算符以及強制類型轉換運算符等。另外,運算符按其在表達式中與運算對象的關系,又可分為單目運算符、雙目運算符和三目運算符等。表達式那么是由運算符及運算對象所組成的具有特定含義的式子。 4.3.1 算術運算符 C51中支持的算術運算符有:+ 加或取正值運算符; 減或取負值運算符;* 乘運算符;/ 除運算符;% 取余數運算符 加、減、乘運算相比照較簡單,而對于除運算,如果相除的兩個數為浮點數,那么運算的結果也為浮點數;如果相除的兩個數為整數,即為整除。例如,25.0/20.0的結果為1.25,而25/20的結果為1。 對于取余運算,那么要求參加運算的兩個數必須為整數,運算結果為它

16、們的余數。例如,x=5%3,結果x的值為2。4.3.2 關系和邏輯運算符 C51中有6種關系運算符,分別如下: 大于;= 大于等于; 3,結果為真(1),而10=100,結果為假(0)。 C51有3種邏輯運算符: 邏輯或;& 邏輯與;! 邏輯非 關系運算符用于反映兩個表達式之間的大小關系,邏輯運算符那么用于求條件式的邏輯值,用邏輯運算符將關系表達式或邏輯量連接起來的式子就是邏輯表達式。邏輯“與的格式為:條件式1&條件式2邏輯“或的格式為:條件式1條件式2邏輯“非的格式為:! 條件式4.3.2 關系和邏輯運算符4.3.3 位運算符 C51語言能對運算對象按位進行操作,它與匯編語言使用一樣方便。位

17、運算是按位對變量進行運算的,但并不改變參與運算的變量的值。如果要求按位改變變量的值,那么要利用相應的賦值運算。C51中位運算符只能對整數進行操作,不能對浮點數進行操作。C51中的位運算符有: & 按位與; 按位或; 按位異或; 按位取反; 右移4.3.4 逗號運算符 在C51語言中,逗號“,是一個特殊的運算符,可以用它將兩個或兩個以上的表達式連接起來,稱為逗號表達式。逗號表達式的一般格式為: 表達式1,表達式2,表達式n 程序執行時對逗號表達式的處理:按從左至右的順序依次計算出各個表達式的值,而整個逗號表達式的值是最右邊的表達式(表達式n)的值。 例如: x=(a=3,6*3) 結果x的值為1

18、8。4.3.5 賦值運算符 在C51中,賦值運算符“=的功能是將一個數據的值賦給一個變量,如x=10。利用賦值運算符將一個變量與一個表達式連接起來的式子稱為賦值表達式。在賦值表達式的后面加一個分號“;就構成了賦值語句,一個賦值語句的格式為:變量=表達式; 執行時先計算出右邊表達式的值,然后賦值給左邊的變量。例如: x=8+9; /* 將8+9的值賦給變量x */ x=y=5; /* 將常數5同時賦值給變量x和y */ 在C51中,允許在一個語句中同時給多個變量賦值,賦值順序自右向左。 C51語言中支持在賦值運算符“=的前面加上其他運算符,組成復合賦值運算符。下面是C51中支持的復合賦值運算符:

19、 += 加法賦值;= 減法賦值; *= 乘法賦值;/= 除法賦值; %= 取模賦值;&= 邏輯與賦值; = 邏輯或賦值; = 邏輯異或賦值; = 邏輯非賦值;= 右移位賦值; b)?a:b的執行結果是將a和b中較大的數賦給變量max。4.3.7 指針與地址運算符指針是C51語言中一個十分重要的概念,在C51中的數據類型中專門有一種指針類型。 指針為變量的訪問提供了另一種方式,變量的指針就是該變量的地址,還可以定義一個專門指向某個變量的地址指針變量。為了表示指針變量和它所指向的變量地址之間的關系,C51中提供了兩個專門的運算符:* 指針運算符;& 取地址運算符指針運算符“*放在指針變量前面,通過

20、它可以訪問以指針變量的內容為地址所指向的存儲單元。取地址運算符“&放在變量的前面,通過它取得變量的地址,變量的地址通常送給指針變量。 4.3.8 表達式和表達式語句 C51語言是一種結構化的程序設計語言,它提供了十分豐富的程序控制語句,表達式語句是最根本的一種語句。在表達式的后邊加一個分號“;就構成了表達式語句,下面的語句都是合法的表達式語句: a=+b*3;x=4;y=7;+k;復合語句是由假設干條語句組合而成的一種語句。在C51中,用一個大括號“ 將假設干條語句括在一起就形成了一個復合語句。復合語句最后不需要以分號“;結束,但它內部的各條語句仍需以分號“;結束。復合語句的一般形式為:局部變

21、量定義;語句1;語句2;4.3.8 表達式和表達式語句4.4 C51函數在程序設計過程中,對于較大的程序一般采用模塊化結構。通常將其分成假設干個子程序模塊,每個子程序模塊完成一種特定的功能。在C51中,子程序模塊是用函數來實現的。在前面介紹C51的程序結構中,C51的程序是由一個主函數和假設干個子函數組成的,每個子函數完成一定的功能。在一個程序中只能有一個主函數,主函數不能被調用。程序執行時從主函數開始,到主函數最后一條語句結束。子函數可以被主函數調用,也可以被其他子函數或其本身調用形成子程序嵌套。在C51中,系統提供了豐富的功能函數放于標準函數庫中,以供用戶調用。如果用戶需要的函數沒有包含在

22、函數庫中,用戶也可以根據需要自己定義函數以便使用。從C51程序結構上劃分主函數main( )和普通函數兩種。一個程序只需要一個主函數,可以有很多個普通函數。1對于普通函數,從用戶的角度看,有兩種類型:標準庫函數標準庫函數由C51編譯系統提供,用戶不必自己定義,可以直接使用。一般庫函數都是具有一定獨立功能的公用函數,在編譯系統設計時,設計者將它們放在系統的庫函數中,所以稱作庫函數。不同系統提供的庫函數的數量和功能都有所不同,作為用戶,在進行程序設計時應該善于使用這些資源,以便提高效率,節省開發時間。用戶自定義函數用戶自定義函數是用戶根據自己的需要在程序中自己編寫的函數。一、函數的分類2從函數定義

23、形式劃分 對于普通函數,從函數定義的形式上,可劃分為:無參數函數 該函數在調用時沒有參數,主調函數并不將數據傳送給被調用函數,一般用來執行指定的一組操作。無參數函數可以帶回也可以不帶回函數值。有參數函數 調用該函數時,在主調函數和被調函數之間有參數傳遞,主調用函數名后面括號中的變量稱為“實際參數簡稱實參。 實參和形參的類型必須一致,否那么會發生錯誤,形參在被調用之前,并不占用實際內存單元。只有當函數被調用后,被調用函數的形參才被分配給內存單元。 空函數該函數沒有語句,調用該函數,什么工作也不做。二、函數的定義 用戶用C51進行程序設計的過程中,既可以用系統提供的標準庫函數,也可以使用用戶自己定

24、義的函數。對于系統提供的標準庫函數,用戶使用時需在之前通過預處理命令#include將對應的標準函數庫包含到程序開始。而對于用戶自定義函數,在使用之前必須對它進行定義,定義之后才能調用。函數定義的一般格式如下:函數類型 函數名(形式參數表) reentrantinterrupt musing n形式參數說明局部變量定義;函數體;三、函數的調用與聲明1函數的調用 函數調用的一般形式為:函數名;2自定義函數的聲明 在C51程序設計中,如果一個自定義函數的調用在函數的定義之后,在使用函數時可以不對函數進行說明;如果一個函數的調用在定義之前,或調用的函數不在本文件內部,而是在另一個文件中,那么在調用之

25、前需對函數進行聲明,指明所調用的函數在程序中有定義或在另一個文件中,并將函數的相關信息通知編譯系統。函數的聲明是通過函數的原型來指明的。四、函數的嵌套與遞歸1函數的嵌套 在C51語言中,函數的定義是相互平行、獨立的。在函數定義時,一個函數體內不能包含另一個函數,即函數不能嵌套定義。但是在一個函數的調用過程中可以調用另一個函數,即允許嵌套調用函數。C51編譯器通常依靠堆棧來進行參數傳遞,由于C51的堆棧設在片內RAM中,而片內RAM的空間有限,因而嵌套的深度比較有限,一般在幾層以內。如果層數過多,就會導致堆棧空間不夠而出錯。2函數的遞歸 遞歸調用是嵌套調用的一個特殊情況。如果在調用一個函數過程中

26、又出現了直接或間接調用該函數本身,那么稱為函數的遞歸調用。 在函數的遞歸調用中要防止出現無終止的自身調用,應通過條件控制結束遞歸調用,使得遞歸的次數有限。四、函數的嵌套與遞歸4.5 C51構造數據類型 前面介紹了C51語言中字符型、整型、浮點型、位型和存放器型等根本數據類型。另外,C51中還提供指針類型和由根本數據類型構造的組合數據類型,組合數據類型主要有數組、指針、結構、聯合和枚舉。4.5.1 數組和指針一、數組 數組是一個由假設干同類型變量組成的集合,數組中的各個元素可以用數組名和下標來唯一確定。數組在使用之前必須先對其進行定義。1一維數組 一維數組只有一個下標,定義的形式如下: 數據類型

27、說明符 數組名常量表達式=初值1,初值2,2字符數組 用來存放字符數據的數組稱為字符數組。字符數組中的每一個元素都用來存放一個字符,也可用字符數組來存放字符串。在定義時把數據類型定義為char型。二、指針1指針的概念指針就是數據在內存單元的地址。要理解指針,先要了解數據在內存中的存儲和讀取方法。2指針變量的定義在C51語言中,指針變量使用之前必須對它進行定義,指針變量的定義與一般變量的定義類似,定義的一般形式為:數據類型說明符 存儲器類型 *指針變量名;3指針變量的引用 指針變量是存放另一變量地址的特殊變量的,指針變量只能存放地址。指針變量在使用時應注意兩個運算符:&和*。這兩個運算符在前面已

28、經介紹,其中,“&是取地址運算符,“*是指針運算符。通過“&取地址運算符可以把一個變量的地址送給指針變量,使指針變量指向該變量;通過“*指針運算符可以實現通過指針變量訪問它所指向的變量的值。4.5.2 結構、共同體和枚舉一、結構1結構與結構變量的定義 結構與結構變量是兩個不同的概念,結構是一種組合數據類型,結構變量是取值為結構這種組合數據類型的變量,相當于整型數據類型與整型變量的關系。對于結構與結構變量的定義有兩種方法。2結構變量的引用 在定義一個結構變量之后,就可以對它進行引用,即可以進行賦值、存取和運算。一般情況下,結構變量的引用是通過對其結構元素的引用來實現的,結構元素引用的一般格式如下

29、:結構變量名.結構元素名 或 結構變量名-結構元素名二、結構數組 C51允許將具有相同結構類型的變量定義為結構數組,結構數組與一般變量數組的不同在于結構數組的每一個元素都具有同一個結構類型的變量,它們具有同一個結構類型,含有相同的成員項。例 結構數組的定義和引用struct document unsigned int number; unsigned int age; bit sex; ; /*定義document的結構類型*/struct document student20; /*定義20個數組元素的結構數組*/ /* student,每個數組元素都是document結構類型*/stude

30、nt5.age =18; /*對結構數組成員進行賦值*/三、共同體1共同體的定義 共同體的定義與結構的定義類似,可以先定義共同體類型再定義共同體變量,也可以在定義共同體類型的同時定義共同體變量。(1) 先定義共同體類型再定義共同體變量。 定義共同體類型的格式如下: union共同體類型名 成員列表; 定義共同體變量的格式如下: union共同體類型名 變量列表 2共同體變量的引用 與結構變量一樣,在定義了一個共同體變量之后,就可以對它進行引用,可以對它進行賦值、存取和運算。同樣,共同體變量的引用是通過對其元素的引用來實現的,共同體變量中元素的引用與結構變量中元素的引用格式相同,格式如下: 共同

31、體變量名.共同體元素 或 共同體變量名-共同體元素三、共同體四、枚舉 枚舉數據類型是一個有名字的某些整型常量的集合。這些整型常量是該類型變量可取的所有合法值。枚舉定義時應當列出該類型變量的所有可取值。 枚舉定義的格式與結構和聯合根本相同,也有兩種方法。先定義枚舉類型再定義枚舉變量,格式如下: enum 枚舉名 枚舉值列表; enum 枚舉名 枚舉變量列表;或在定義枚舉類型的同時定義枚舉變量,格式如下: enum 枚舉名 枚舉值列表枚舉變量列表;4.6 C51庫函數 C51強大功能及其高效率的重要表達之一在于其豐富的可直接調用的庫函數,多使用庫函數使程序代碼簡單,結構清晰,易于調試和維護,提高編

32、程效率。由于mcs-51系列本身的特點,某些庫函數的參數和調用格式與標準的C有所不同,例如函數isdigit返回的類型就是bit,而不是其它類型。每個庫函數都在相應的頭文件中給出了函數原型說明,用戶如果需要使用庫函數,必須在源程序的開始處采用預處理器指令include將有關的頭文件包含其中。如果省略了頭文件,將不能保證函數的正常運行。C51庫函數中,類型的選擇考慮到了mcs-51系列單片機的結構特征,用戶在自己的應用程序中應盡可能的使用最小的數據類型,以最大限度地發揮mcs-51系列單片機的性能。同時可以減少應用程序的代碼長度。4.6.1 本征庫函數和非本征證庫函數 C51提供的本征函數是指編

33、譯時不用調用,直接將固定的代碼插入當前行,就可以實現其固有的功能。從而大大提供了函數訪問的效率,而非本征函數必須通過調用才能夠使用。 C51的本征庫函數只有9個,除此之外都為非本征庫函數。本征庫函數數目雖少,但都非常有用,見表4-10所示。使用時,必須在源程序的開始處采用預處理器指令include將頭文件包含其中。例如:#inclucle 4.6 C51庫函數4.6.2 訪問SFR和位地址的REGxxx.H文件 頭文件REGxxx.H 定義了多種mcs-51單片機中所有的特殊功能存放器SFR名,從而可以簡化用戶的程序,使用時用預處理器指令include將頭文件包含其中即可,例如:#includ

34、e /*包含特殊功能存放器庫*/4.6.3 C51庫函數 C51軟件包的庫內有標準的應用程序,每個函數在相應的頭文件.h中有原型說明。如果要使用庫函數,只需在源程序的開始處采用預處理器指令include定義與該函數有關的頭文件。例如:#include #include 4.6 C51庫函數4.7 C51程序編寫4.7.1 C51的根本結構 C51語言是一種結構化設計語言,程序由假設干模塊組成,每個模塊包含假設干根本結構,每個根本結構中可以有假設干語句。C51語言有3種根本結構:順序結構、選擇結構和循環結構。1、if語句 if語句C51中的一個根本條件選擇語句,它通常有以下3種格式:(1)if(

35、表達式) 語句; (2)if(表達式) 語句1; else 語句2;(3)if(表達式1) 語句1; esle if(表達式2) 語句2; else if(表達式3)語句3; else if(表達式n-1) 語句n-1; else 語句n; 2、switch/case語句 if語句通過嵌套可以實現多分支結構,但結構復雜。Switch是C51中提供的專門處理多分支結構的多分支選擇語句。它的格式如下:switch (表達式) case 常量表達式1: 語句1;break; case 常量表達式2: 語句2;break; . case 常量表達式n: 語句n;break; default: 語句n+

36、1; 3、while語句 while語句在C51中用于實現當型循環結構,它的格式如下: while(表達式) 語句; /* 循環體 */4、do-while語句 do-whil語句在C51中用于實現直到型循環結構,它的格式如下: do 語句; /* 循環體 */ while(表達式);5、for語句 在C51語言中,for語句是使用最靈活、用得最多的循環控制語句,同時也最為復雜。它可以用于循環次數已經確定的情況,也可以用于循環次數不確定的情況。它完全可以代替while語句,功能最強大。它的格式如下: for(表達式1;表達式2;表達式3) 語句; /*循環體*/例:分別利用while , do

37、-while, for語句編程實現 1100 的累加和,并輸出結果。#include /*包含特殊功能存放器庫*/ #include /*包含 I/O 函數庫*/ void main(void) /*主函數*/ int i,j=0; /*定義整型變量 i和 j*/i=1; SCON=0 x52; /*串口初始化*/TMOD=0 x20; TH1=0 xF3; TR1=1;while (i=100) /*累加 1100 之和在 j 中*/j=j+i; i+;printf(1100 的累加和為:%dn,j); while(1); 一、利用while 語句編程實現二、利用do-while語句編程實現

38、 #include /*包含特殊功能存放器庫*/ #include /*包含 I/O 函數庫*/void main(void) /*主函數*/ int i,j=0; /*定義整型變量 i 和 j*/i=1; SCON=0 x52; /*串口初始化*/TMOD=0 x20; TH1=0 xF3; TR1=1; do /*累加 1100 之和在 j中*/ j=j+i; i+; while (i=100); printf(1100 的累加和為:%dn,j); while(1); 三、利用for 語句編程實現 #include /*包含特殊功能存放器庫*/ #include /*包含I/O 函數庫*/

39、 void main(void) /*主函數*/ int i,j=0; /*定義整型變量i和j*/i=1; SCON=0 x52; /*串口初始化*/ TMOD=0 x20; TH1=0 xF3; TR1=1;for(i=1;i=100;i+) j=j+i; /*累加 1100 之和在 j中*/ printf(1100 的累加和為:%dn,j); while(1); 6、循環的嵌套 在一個循環的循環體中允許又包含一個完整的循環結構,這種結構稱為循環的嵌套。外面的循環稱為外循環,里面的循環稱為內循環,如果在內循環的循環體內又包含循環結構,就構成了多重循環。在C51中,允許三種循環結構相互嵌套。7

40、、break和continue語句1break語句 用break語句可以跳出switch結構,使程序繼續執行switch結構后面的一個語句。使用break語句還可以從循環體中跳出循環,提前結束循環而接著執行循環結構下面的語句。它不能用在除了循環語句和switch語句之外的任何其他語句中。2continue語句 continue語句用在循環體結構中,用于結束本次循環,跳過循環體中continue下面尚未執行的語句,直接進行下一次是否執行循環的判斷。 continue語句和break語句的區別在于:continue語句只是結束本次循環,而不是終止整個循環;break語句那么是結束循環,不再進行條件

41、判斷。8、return語句 return語句一般放在函數的最后位置,用于終止函數的執行,并控制程序返回調用該函數時所處的位置。返回時還可以通過return語句帶回返回值。return語句的格式有以下兩種: (1)return; (2)return (表達式)。 如果return后面帶有表達式,那么要計算表達式的值,并將表達式的值作為數的返回值;假設不帶表達式,那么函數返回時將返回一個不確定的值。通常用return語句把調用函數取得的值返回給主調用函數。4.8 C51語言與匯編語言接口 匯編語言代碼執行效率高,運行速度快,非常適合于編寫實時性高的控制程序。但其開發的工作量大,可讀性差。相比之下,

42、C51具有可讀性強、編程簡單和調試方便等特點。C51除具有高級語言使用方便靈活、數據處理能力強、編程簡單等優點外,還可實現匯編語言的大局部功能,如可直接對硬件進行操作、生成的目標代碼質量較高且執行的速度較快等。所以在工程上對硬件處理速度要求不很高的情況下,根本可以用C51代替匯編語言編寫。但C51也不能完全取代匯編語言,如在一些對速度要求很高的實時控制系統中,以及對硬件的特殊控制方面,C51就不能完全勝任,還需要匯編語言。因為匯編語言目標代碼更精練,對硬件直接控制能力更強且執行速度更快,但匯編語言編程較繁瑣、表達能力較差。比較好的解決方法是C51與匯編語言混合編程。4.8.1 C51與匯編語言

43、的接口 如果要用兩種語言混合編寫程序,首先要解決的是接口問題。C51與匯編語言之間有以下二種接口方式:1.模塊內接口 模塊內接口指在C程序中嵌入匯編程序。使用#pragma語句來實現,其格式如下: #pragma ASM ;匯編程序 #pragma ENDASM 由編譯控制指令SRC來控制將這些匯編程序存入其中。但使用這種方法,在KeilC51中要做以下設置: 1)將嵌有匯編語句的源文件參加到要編譯的工程文件中,然后右擊該文件,選擇“Option for File name.C,并將“Properties選項卡中的“Generate Asswmbler SRCFile和“Asswmbler S

44、RCFile兩項設置為有效, 2)將“Link PubiC Only項設置為無效。這樣就可以在C51源代碼中任意位置嵌入匯編語言。1.模塊內接口2.模塊間接口 模塊間接口方式是將C和匯編源程序各自編輯、調試,并用各自的語言編譯器進行編譯,生成obj文件即目標文件,然后用連接程序將obj文件連接起來,在這種接口方式下,最困難的就是如何平安有效的傳遞參數。否那么在調用匯編子程序時就會從堆棧中取出錯誤的參數。為保證模塊之間的數據交換。C51中提供兩種參數的傳遞方式:1通過存放器進行參數傳遞 為了能夠產生高效代碼,C51函數最多可以通過CPU傳遞三個參數,匯編函數要得到參數值就必須訪問這些存放器,如果

45、這些存放器值正被使用或保存在其它地方或已經不再需要了,這些存放器可以用作其它用途。 存放器傳遞參數的規那么參數數目charintLong,float通用指針1個參數R7R6,R7R4R7R1R32個參數R5R4,R5R4R7R1R33個參數R3R2,R3R1R3例:#include unsigned char val50=0; unsigned char a;unsigned char func(unsigned char n) a=valn; a+=2; return a;main() unsigned char a; while(1) a=func(3); #pragma ASM MOV P1,R7 /參數傳遞給了R7 NOP NOP NOP MOV P1,#0 #pragma ENDASM 2通過固定存儲區進行參數傳遞 假設在源程序中選了編譯控制命令“#pragma NOREGPARMS,那么所有參數的傳遞都發生在固定的存儲器區域。這樣參數傳遞途徑非常清楚,但代

溫馨提示

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

評論

0/150

提交評論