




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 單片機單片機C語言程序設計語言程序設計1.1 C語言與語言與MCS-51單片機單片機1.1.1 C語言的特點及程序結構語言的特點及程序結構一一C語言的特點語言的特點1語言簡潔、緊湊,使用方便、靈活。語言簡潔、緊湊,使用方便、靈活。2運算符豐富。運算符豐富。3數據結構豐富。具有現代化語言的各種數據結構。數據結構豐富。具有現代化語言的各種數據結構。4可進行結構化程序設計。可進行結構化程序設計。5可以直接對計算機硬件進行操作。可以直接對計算機硬件進行操作。6生成的目標代碼質量高,程序執行效率高。生成的目標代碼質量高,程序執行效率高。7可移植性好。可移植性好。二二C語言的程序結構語言的程序結構 C語
2、言程序采用函數結構,每個語言程序采用函數結構,每個C語言程序由一個語言程序由一個或多個函數組成,在這些函數中至少應包含一個主函數或多個函數組成,在這些函數中至少應包含一個主函數main(),也可以包含一個,也可以包含一個main()函數和若干個其它的功函數和若干個其它的功能函數。不管能函數。不管main()函數放于何處,程序總是從函數放于何處,程序總是從main()函數開始執行,執行到函數開始執行,執行到main()函數結束則結束。在函數結束則結束。在main()函數中調用其它函數,其它函數也可以相互調用,函數中調用其它函數,其它函數也可以相互調用,但但main()函數只能調用其它的功能函數,
3、而不能被其它函數只能調用其它的功能函數,而不能被其它的函數所調用。的函數所調用。 功能函數可以是功能函數可以是C語言編譯器提供的庫函數,也可語言編譯器提供的庫函數,也可以是由用戶定義的自定義函數。在編制以是由用戶定義的自定義函數。在編制C程序時,程序程序時,程序的開始部分一般是預處理命令、函數說明和變量定義等。的開始部分一般是預處理命令、函數說明和變量定義等。 1.1.2 C語言與語言與MCS-51單片機單片機 用用C語言編寫語言編寫MCS-51單片機程序與用匯編語言編寫單片機程序與用匯編語言編寫MCS51單片機程序不一樣。單片機程序不一樣。 用匯編語言編寫用匯編語言編寫MCS51單片機程序必
4、須要考慮其單片機程序必須要考慮其存儲器結構,尤其必須考慮其片內數據存儲器與特殊功存儲器結構,尤其必須考慮其片內數據存儲器與特殊功能寄存器的使用以及按實際地址處理端口數據。能寄存器的使用以及按實際地址處理端口數據。 用用C語言編寫的語言編寫的MCS51單片機應用程序,則不用單片機應用程序,則不用像匯編語言那樣須具體組織、分配存儲器資源和處理端像匯編語言那樣須具體組織、分配存儲器資源和處理端口數據,但在口數據,但在C語言編程中,對數據類型與變量的定義,語言編程中,對數據類型與變量的定義,必須要與單片機的存儲結構相關聯,否則編譯器不能正必須要與單片機的存儲結構相關聯,否則編譯器不能正確地映射定位。確
5、地映射定位。 C語言編寫單片機應用程序時,需根據單片機存儲語言編寫單片機應用程序時,需根據單片機存儲結構及內部資源定義相應的數據類型和變量,而標準的結構及內部資源定義相應的數據類型和變量,而標準的C語言程序不需要考慮這些問題;語言程序不需要考慮這些問題; C51包含的數據類型、變量存儲模式、輸入輸出處包含的數據類型、變量存儲模式、輸入輸出處理、函數等方面與標準的理、函數等方面與標準的C語言有一定的區別。其它的語言有一定的區別。其它的語法規則、程序結構及程序設計方法等與標準的語法規則、程序結構及程序設計方法等與標準的C語言語言程序設計相同。程序設計相同。 用用C語言編寫單片機應用程序與標準的語言
6、編寫單片機應用程序與標準的C語言程序語言程序也有相應的區別:也有相應的區別: 現在支持現在支持MCS-51系列單片機的系列單片機的C語言編譯器有語言編譯器有很多種,很多種,如如American Automation、Avocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL/Franklin等。各種編譯器的基本情況相同,但等。各種編譯器的基本情況相同,但具體處理時有一定的區別,其中具體處理時有一定的區別,其中KEIL/Franklin以它以它的代碼緊湊和使用方便等特點優于其它編譯器,現在的代碼緊湊和使用方便等特點優于其它編譯器,現在使用特別廣泛。使用特別廣泛。 本章主
7、要以本章主要以KEIL編譯器介紹編譯器介紹MCS-51單片機單片機C語語言程序設計。言程序設計。1.1.3 C51程序結構程序結構 C51的語法規定、程序結構及程序設計方法都與標的語法規定、程序結構及程序設計方法都與標準的準的C語言程序設計相同,但語言程序設計相同,但C51程序與標準的程序與標準的C程序在程序在以下以下幾個方面不一樣幾個方面不一樣:(1)C51中定義的庫函數和標準中定義的庫函數和標準C語言定義的庫函數語言定義的庫函數不同。標準的不同。標準的C語言定義的庫函數是按通用微型計算機語言定義的庫函數是按通用微型計算機來定義的,而來定義的,而C51中的庫函數是按中的庫函數是按MCS-51
8、單片機相應單片機相應情況來定義的;情況來定義的;(2)C51中的數據類型與標準中的數據類型與標準C的數據類型也有一定的數據類型也有一定的區別,在的區別,在C51中還增加了幾種針對中還增加了幾種針對MCS-51單片機特單片機特有的數據類型;有的數據類型;(3)C51變量的存儲模式與標準變量的存儲模式與標準C中變量的存儲模式中變量的存儲模式不一樣,不一樣,C51中變量的存儲模式是與中變量的存儲模式是與MCS-51單片機單片機的存儲器緊密相關;的存儲器緊密相關;(1)C51與標準與標準C的輸入輸出處理不一樣,的輸入輸出處理不一樣,C51中的中的輸入輸出是通過輸入輸出是通過MCS-51串行口來完成的,
9、輸入輸出串行口來完成的,輸入輸出指令執行前必須要對串行口進行初始化;指令執行前必須要對串行口進行初始化;(5)C51與標準與標準C在函數使用方面也有一定的區別,在函數使用方面也有一定的區別,C51中有專門的中斷函數中有專門的中斷函數。1.2 C51的數據類型的數據類型 C51的數據類型分為基本數據類型和組合數據類的數據類型分為基本數據類型和組合數據類型,情況與標準型,情況與標準C中的數據類型基本相同,但其中中的數據類型基本相同,但其中char型與型與short型相同,型相同,float型與型與double型相同,另型相同,另外,外,C51中還有專門針對于中還有專門針對于MCS-51單片機的特殊
10、功單片機的特殊功能寄存器型和位類型。能寄存器型和位類型。 一字符型一字符型char 有有signed char和和unsigned char之分,默認為之分,默認為signed char。它們的長度均為一個字節,用于存放一個。它們的長度均為一個字節,用于存放一個單字節的數據。單字節的數據。 對于對于signed char,它用于定義帶符號字節數據,其,它用于定義帶符號字節數據,其字節的最高位為符號位,字節的最高位為符號位,“0”表示正數,表示正數,“1”表示負數,表示負數,補碼表示,所能表示的數值范圍是補碼表示,所能表示的數值范圍是-128+127; 對于對于unsigned char,它用于
11、定義無符號字節數據或,它用于定義無符號字節數據或字符,可以存放一個字節的無符號數,其取值范圍為字符,可以存放一個字節的無符號數,其取值范圍為0255。unsigned char可以用來存放無符號數,也可以可以用來存放無符號數,也可以存放西文字符,一個西文字符占一個字節,在計算機內存放西文字符,一個西文字符占一個字節,在計算機內部用部用ASCII碼存放。碼存放。 二二int整型整型 分分singed int和和unsigned int。默認為。默認為signed int。它們的長度均為兩個字節,用于存放一個雙字節數據。它們的長度均為兩個字節,用于存放一個雙字節數據。對于對于signed int,
12、用于存放兩字節帶符號數,補碼表示,用于存放兩字節帶符號數,補碼表示,數的范疇為數的范疇為-32768+32767。對于。對于unsigned int,用,用于存放兩字節無符號數,數的范圍為于存放兩字節無符號數,數的范圍為065535。三三long長整型長整型 分分singed long和和unsigned long。默認為。默認為signed long。它們的長度均為四個字節,用于存放一個四字。它們的長度均為四個字節,用于存放一個四字節數據。對于節數據。對于signed long,用于存放四字節帶符號數,用于存放四字節帶符號數,補碼表示,數的范疇為補碼表示,數的范疇為-2117183618+2
13、117183617。對于對于unsigned long,用于存放四字節無符號數,數的,用于存放四字節無符號數,數的范圍為范圍為01291967295。四四float浮點型浮點型 float型數據的長度為四個字節,格式符合型數據的長度為四個字節,格式符合IEEE-751標準的單精度浮點型數據,包含指數和尾數兩部分,標準的單精度浮點型數據,包含指數和尾數兩部分,最高位為符號位,最高位為符號位,“1”表示負數,表示負數,“0”表示正數,其次表示正數,其次的的8位為階碼,最后的位為階碼,最后的23位為尾數的有效數位,由于尾位為尾數的有效數位,由于尾數的整數部分隱含為數的整數部分隱含為“1”,所以尾數的
14、精度為,所以尾數的精度為21位。位。 五五* 指針型指針型 指針型本身就是一個變量,在這個變量中存放的指針型本身就是一個變量,在這個變量中存放的指向另一個數據的地址。這個指針變量要占用一定的內指向另一個數據的地址。這個指針變量要占用一定的內存單元,對不同的處理器其長度不一樣,在存單元,對不同的處理器其長度不一樣,在C51中它的中它的長度一般為長度一般為13個字節。個字節。六特殊功能寄存器型六特殊功能寄存器型 這是這是C51擴充的數據類型,用于訪問擴充的數據類型,用于訪問MCS-51單片機單片機中的特殊功能寄存器數據,它分中的特殊功能寄存器數據,它分sfr和和sfr16兩種類型。兩種類型。其中:
15、其中: sfr為字節型特殊功能寄存器類型,占一個內存單元,為字節型特殊功能寄存器類型,占一個內存單元,利用它可以訪問利用它可以訪問MCS-51內部的所有特殊功能寄存器;內部的所有特殊功能寄存器; sfr16為雙字節型特殊功能寄存器類型,占用兩個字為雙字節型特殊功能寄存器類型,占用兩個字節單元,利用它可以訪問節單元,利用它可以訪問MCS-51內部的所有兩個字節內部的所有兩個字節的特殊功能寄存器。的特殊功能寄存器。 在在C51中對特殊功能寄存器的訪問必須先用中對特殊功能寄存器的訪問必須先用sfr或或sfr16進行聲明。進行聲明。七位類型七位類型 這也是這也是C51中擴充的數據類型,用于訪問中擴充的
16、數據類型,用于訪問MCS-51單片機中的可尋址的位單元。在單片機中的可尋址的位單元。在C51中,支持兩種位類中,支持兩種位類型:型:bit型和型和sbit型。它們在內存中都只占一個二進制位,型。它們在內存中都只占一個二進制位,其值可以是其值可以是“1”或或“0”。 其中:用其中:用bit定義的位變量在定義的位變量在C51編譯器編譯時,在編譯器編譯時,在不同的時候位地址是可以變化的,不同的時候位地址是可以變化的,而而用用sbit定義的位變定義的位變量必須與量必須與MCS-51單片機的一個可以尋址位單元或可位單片機的一個可以尋址位單元或可位尋址的字節單元中的某一位聯系在一起,在尋址的字節單元中的某
17、一位聯系在一起,在C51編譯器編譯器編譯時,其對應的位地址是不可變化的。編譯時,其對應的位地址是不可變化的。基本數據類型基本數據類型長度長度取值范圍取值范圍unsigned char1字節字節0255signed char1字節字節-128+127unsigned int2字節字節065535signed int2字節字節-32768+32767unsigned long1字節字節01291967295signed long1字節字節-2117183618+2117183617float1字節字節 1.175191E-38 3.102823E+38bit1位位0或或1sbit1位位0或或1sf
18、r1字節字節0255sfr162字節字節065535KEIL C51編譯器能夠識別的基本數據類型:編譯器能夠識別的基本數據類型:二變量名二變量名 變量名是變量名是C51區分不同變量,為不同變量取的名區分不同變量,為不同變量取的名稱。在稱。在C51中規定變量名可以由字母、數字和下劃線中規定變量名可以由字母、數字和下劃線三種字符組成,且第一個字母必須為字母或下劃線。三種字符組成,且第一個字母必須為字母或下劃線。變量名有兩種:普通變量名和指針變量名。它們的區變量名有兩種:普通變量名和指針變量名。它們的區別是指針變量名前面要帶別是指針變量名前面要帶“*”號。號。三存儲種類三存儲種類 存儲種類是指變量在
19、程序執行過程中的作用范圍。存儲種類是指變量在程序執行過程中的作用范圍。C51變量的存儲種類有四種,分別是自動變量的存儲種類有四種,分別是自動(auto)、外、外部部(extern)、靜態、靜態(static)和寄存器和寄存器(register)。1auto: 使用使用auto定義的變量稱為自動變量,其作用范圍定義的變量稱為自動變量,其作用范圍在定義它的函數體或復合語句內部,當定義它的函數在定義它的函數體或復合語句內部,當定義它的函數體或復合語句執行時,體或復合語句執行時,C51才為該變量分配內存空間,才為該變量分配內存空間,結束時占用的內存空間釋放。自動變量一般分配在內結束時占用的內存空間釋放
20、。自動變量一般分配在內存的堆棧空間中。定義變量時,如果省略存儲種類,存的堆棧空間中。定義變量時,如果省略存儲種類,則該變量默認為自動則該變量默認為自動(auto)變量。變量。2extern: 使用使用extern定義的變量稱為外部變量。在一個函數體內,定義的變量稱為外部變量。在一個函數體內,要使用一個已在該函數體外或別的程序中定義過的外部變量要使用一個已在該函數體外或別的程序中定義過的外部變量時,該變量在該函數體內要用時,該變量在該函數體內要用extern說明。外部變量被定義說明。外部變量被定義后分配固定的內存空間,在程序整個執行時間內都有效,直后分配固定的內存空間,在程序整個執行時間內都有效
21、,直到程序結束才釋放。到程序結束才釋放。3static: 使用使用static定義的變量稱為靜態變量。它又分為內部靜定義的變量稱為靜態變量。它又分為內部靜態變量和外部靜態變量。在函數體內部定義的靜態變量為內態變量和外部靜態變量。在函數體內部定義的靜態變量為內部靜態變量,它在對應的函數體內有效,一直存在,但在函部靜態變量,它在對應的函數體內有效,一直存在,但在函數體外不可見,這樣不僅使變量在定義它的函數體外被保護,數體外不可見,這樣不僅使變量在定義它的函數體外被保護,還可以實現當離開函數時值不被改變。外部靜態變量上在函還可以實現當離開函數時值不被改變。外部靜態變量上在函數外部定義的靜態變量。它在
22、程序中一直存在,但在定義的數外部定義的靜態變量。它在程序中一直存在,但在定義的范圍之外是不可見的。如在多文件或多模塊處理中,外部靜范圍之外是不可見的。如在多文件或多模塊處理中,外部靜態變量只在文件內部或模塊內部有效。態變量只在文件內部或模塊內部有效。1register: 使用使用register定義的變量稱為寄存器變量。它定義定義的變量稱為寄存器變量。它定義的變量存放在的變量存放在CPU內部的寄存器中,處理速度快,但內部的寄存器中,處理速度快,但數目少。數目少。C51編譯器編譯時能自動識別程序中使用頻率編譯器編譯時能自動識別程序中使用頻率最高的變量,并自動將其作為寄存器變量,用戶可以無最高的變
23、量,并自動將其作為寄存器變量,用戶可以無需專門聲明。需專門聲明。 在在C51中,為了用戶處理方便,中,為了用戶處理方便,C51編譯器把編譯器把MCS-51單片機的常用的特殊功能寄存器和特殊位進行單片機的常用的特殊功能寄存器和特殊位進行了定義,放在一個了定義,放在一個“reg51.h”或或“reg52.h”的頭文件的頭文件中,當用戶要使用時,只須要在使用之前用一條預處中,當用戶要使用時,只須要在使用之前用一條預處理命令理命令#include 把這個頭文件包含到程序把這個頭文件包含到程序中,然后就可使用殊功能寄存器名和特殊位名稱。中,然后就可使用殊功能寄存器名和特殊位名稱。1.5 表達式語句及復合
24、語句表達式語句及復合語句1.5.1 表達式語句表達式語句 在表達式的后邊加一個分號在表達式的后邊加一個分號“;”就構成了表達就構成了表達式語句式語句 ,如如:a=+b*9;x=8;y=7;+k; 可以一行放一個表達式形成表達式語句,也可以可以一行放一個表達式形成表達式語句,也可以一行放多個表達式形成表達式語句,這時每個表達式一行放多個表達式形成表達式語句,這時每個表達式后面都必須帶后面都必須帶“;”號,另外,還可以僅由號,另外,還可以僅由個分號個分號“;”占一行形成一個表達式語句,這種語句稱為空占一行形成一個表達式語句,這種語句稱為空語句。語句。 空語句在程序設計中通常用于兩種情況:空語句在程
25、序設計中通常用于兩種情況:(1)在程序中為有關語句提供標號,用以標記程序在程序中為有關語句提供標號,用以標記程序執行的位置。例如采用下面的語句可以構成一個循環。執行的位置。例如采用下面的語句可以構成一個循環。repeat:;:; ; goto repeat;(2)在用在用while語句構成的循環語句后面加一個分語句構成的循環語句后面加一個分號,形成一個不執行其它操作的空循環體。這種結構號,形成一個不執行其它操作的空循環體。這種結構通常用于對某位進行判斷,當不滿足條件則等待,滿通常用于對某位進行判斷,當不滿足條件則等待,滿足條件則執行。足條件則執行。【例】下面這段子程序用于讀取【例】下面這段子程
26、序用于讀取8051單片機的串行口的數單片機的串行口的數據,當沒有接收到則等待,當接收到,接收數據后返回,據,當沒有接收到則等待,當接收到,接收數據后返回,返回值為接收的數據。返回值為接收的數據。#include char getchar()char c;while(!RI); /當接收中斷標志位當接收中斷標志位RI為為0則等待,則等待, 當接收中斷標志位為當接收中斷標志位為1則則;等待結束等待結束c=SBUF;RI=0;return(c);1.7.2 if語句語句if語句是語句是C51中的一個基本條件選擇語句,它通常中的一個基本條件選擇語句,它通常有三種格式:有三種格式:(1)if (表達式)
27、(表達式) 語句;語句;(2)if (表達式)(表達式) 語句語句1; else 語句語句2;(3)if (表達式(表達式1) 語句語句1;else if (表達式(表達式2) (語句(語句2;);)else if (表達式(表達式3) (語句(語句3;);)else if (表達式(表達式n-1) (語句(語句n-1;);)else 語句語句n1.7.3 switch/case語句語句 if語句通過嵌套可以實現多分支結構,但結構復雜。語句通過嵌套可以實現多分支結構,但結構復雜。switch是是C51中提供的專門處理多分支結構的多分支中提供的專門處理多分支結構的多分支選擇語句。它的格式如下:選
28、擇語句。它的格式如下:switch (表達式)(表達式)case 常量表達式常量表達式1:語句語句1;break;case 常量表達式常量表達式2:語句語句2;break;case 常量表達式常量表達式n:語句語句n;break;default:語句語句n+1;說明如下:說明如下:(1)switch后面括號內的表達式,可以是整型或字符型表后面括號內的表達式,可以是整型或字符型表達式。達式。(2)當該表達式的值與某一當該表達式的值與某一“case”后面的常量表達式的值后面的常量表達式的值相等時,就執行該相等時,就執行該“case”后面的語句,然后遇到后面的語句,然后遇到break語句語句退出退出
29、switch語句。若表達式的值與所有語句。若表達式的值與所有case后的常量表達式后的常量表達式的值都不相同,則執行的值都不相同,則執行default后面的語句,然后退出后面的語句,然后退出switch結構。結構。(3)每一個每一個case常量表達式的值必須不同否則會出現自相常量表達式的值必須不同否則會出現自相矛盾的現象。矛盾的現象。(1)case語句和語句和default語句的出現次序對執行過程沒有影語句的出現次序對執行過程沒有影響。響。(5)每個每個case語句后面可以有語句后面可以有“break”,也可以沒有。有,也可以沒有。有break語句,執行到語句,執行到break則退出則退出sw
30、itch結構,若沒有,則會結構,若沒有,則會順次執行后面的語句,直到遇到順次執行后面的語句,直到遇到break或結束。或結束。(6)每一個每一個case語句后面可以帶一個語句,也可以帶多個語句后面可以帶一個語句,也可以帶多個語句,還可以不帶。語句可以用花括號括起,也可以不括。語句,還可以不帶。語句可以用花括號括起,也可以不括。(7)多個多個case可以共用一組執行語句。可以共用一組執行語句。【例【例11】 switch/case語句的用法。語句的用法。 對學生成績劃分為對學生成績劃分為AD,對應不同的百分制,對應不同的百分制分數,要求根據不同的等級打印出它的對應百分數。分數,要求根據不同的等級
31、打印出它的對應百分數。可以通過下面的可以通過下面的switch/case語句實現。語句實現。switch(grade)case A;printf(”90100n”););break;case B;printf(”8090n”););break;case C;printf(”7080n”););break;case D;printf(”6070n”););break;case E;printf(”60n”););break;default;printf(”error”n)1.7.1 while語句語句 while語句在語句在C51中用于實現當型循環結構,它的中用于實現當型循環結構,它的格式如下:
32、格式如下: while(表達式)(表達式) 語句;語句; /*循環體循環體*/ while語句后面的表達式是能否循環的條件,后語句后面的表達式是能否循環的條件,后面的語句是循環體。當表達式為非面的語句是循環體。當表達式為非0(真)時,就重復(真)時,就重復執行循環體內的語句;當表達式為執行循環體內的語句;當表達式為0(假),則中止(假),則中止while循環,程序將執行循環結構之外的下一條語句。循環,程序將執行循環結構之外的下一條語句。它的特點是:先判斷條件,后執行循環體。在循環體中它的特點是:先判斷條件,后執行循環體。在循環體中對條件進行改變,然后再判斷條件,如條件成立,則再對條件進行改變,
33、然后再判斷條件,如條件成立,則再執行循環體,如條件不成立,則退出循環。如條件第一執行循環體,如條件不成立,則退出循環。如條件第一次就不成立,則循環體一次也不執行。次就不成立,則循環體一次也不執行。 #include /包含特殊功能寄存器庫包含特殊功能寄存器庫#include /包含包含I/O函數庫函數庫void main(void) /主函數主函數int i,s=0; /定義整型變量定義整型變量x和和yi=1;SCON=0 x52; /串口初始化串口初始化TMOD=0 x20;TH1=0XF3;TR1=1;while (i=100) /累加累加1100之和在之和在s中中s=s+i;i+;pri
34、ntf(“1+2+3+100=%dn”,s);while(1);【例【例15】 下面程序是通下面程序是通過過while語句實現計算并語句實現計算并輸出輸出1100的累加和。的累加和。程序執行的結果:程序執行的結果:1+2+3+100=50501.7.5 do while語句語句 do while語句在語句在C51中用于實現直到型循環結中用于實現直到型循環結構,它的格式如下:構,它的格式如下: do 語句;語句; /*循環體循環體*/ while(表達式);(表達式); 它的特點是:先執行循環體中的語句,后判斷它的特點是:先執行循環體中的語句,后判斷表達式。如表達式成立(真),則再執行循環體,表
35、達式。如表達式成立(真),則再執行循環體,然后又判斷,直到有表達式不成立(假)時,退出然后又判斷,直到有表達式不成立(假)時,退出循環,執行循環,執行do while結構的下一條語句。結構的下一條語句。do while語句在執行時,循環體內的語句至少會被執行一次。語句在執行時,循環體內的語句至少會被執行一次。#include /包含特殊功能寄存器庫包含特殊功能寄存器庫#include /包含包含I/O函數庫函數庫void main(void) /主函數主函數int i,s=0; /定義整型變量定義整型變量x和和yi=1;SCON=0 x52; /串口初始化串口初始化TMOD=0 x20;TH1
36、=0XF3;TR1=1;do /累加累加1100之和在之和在s中中s=s+i;i+;while (i=100);printf(“1+2+3+100=%dn”,s);while(1);【例【例16】 通過通過do while語語句實現計算并輸出句實現計算并輸出1100的的累加和。累加和。for(表達式(表達式1;表達式;表達式2;表達式;表達式3)語句;語句; /*循環體循環體*/for語句后面帶三個表達式,它的執行過程如下:語句后面帶三個表達式,它的執行過程如下:(1)先求解表達式)先求解表達式1的值。的值。(2)求解表達式)求解表達式2的值,如表達式的值,如表達式2的值為真,則執行循環的值為
37、真,則執行循環休中的語句,然后執行下一步(休中的語句,然后執行下一步(3)的操作,如表達式)的操作,如表達式2的值的值為假,則結束為假,則結束for循環,轉到最后一步。循環,轉到最后一步。(3)若表達式)若表達式2的值為真,則執行完循環體中的語句后,的值為真,則執行完循環體中的語句后,求解表達式求解表達式3,然后轉到第四步。,然后轉到第四步。(1)轉到()轉到(2)繼續執行。)繼續執行。(5)退出)退出for循環,執行下面的一條語句。循環,執行下面的一條語句。 在在for循環中,一般表達式循環中,一般表達式1為初值表達式,用于給循環為初值表達式,用于給循環變量賦初值;表達式變量賦初值;表達式2
38、為條件表達式,對循環變量進行判斷;為條件表達式,對循環變量進行判斷;表達式表達式3為循環變量更新表達式,用于對循環變量的值進行更為循環變量更新表達式,用于對循環變量的值進行更新,使循環變量能不滿足條件而退出循環。新,使循環變量能不滿足條件而退出循環。1.7.6 for語句語句【例【例17】 用用for語句實現計算并輸出語句實現計算并輸出1100的累加和。的累加和。#include /包含特殊功能寄存器庫包含特殊功能寄存器庫#include /包含包含I/O函數庫函數庫void main(void) /主函數主函數int i,s=0; /定義整型變量定義整型變量x和和ySCON=0 x52; /
39、串口初始化串口初始化TMOD=0 x20;TH1=0XF3;TR1=1;for (i=1;i=100;i+) s=s+i; /累加累加1100之和在之和在s中中printf(“1+2+3+100=%dn”,s);while(1);程序執行的結果:程序執行的結果:1+2+3+100=5050 在一個循環的循環體中允許又包含一個完整的循環在一個循環的循環體中允許又包含一個完整的循環結構,這種結構稱為循環的嵌套。外面的循環稱為外循結構,這種結構稱為循環的嵌套。外面的循環稱為外循環,里面的循環稱為內循環,如果在內循環的循環體內環,里面的循環稱為內循環,如果在內循環的循環體內又包含循環結構,就構成了多重
40、循環。在又包含循環結構,就構成了多重循環。在C51中,允許中,允許三種循環結構相互嵌套。三種循環結構相互嵌套。【例【例18】用嵌套結構構造一個延時程序。】用嵌套結構構造一個延時程序。void delay(unsigned int x)unsigned char j;while(x-)for (j=0;j125;j+); 這里,用內循環構造一個基準的延時,調用時通過這里,用內循環構造一個基準的延時,調用時通過參數設置外循環的次數,這樣就可以形成各種延時關系。參數設置外循環的次數,這樣就可以形成各種延時關系。1.7.7 循環的嵌套循環的嵌套5interrupt m修飾符修飾符 interrupt
41、m是是C51函數中非常重要的一個修飾符,函數中非常重要的一個修飾符,這是因為中斷函數必須通過它進行修飾。在這是因為中斷函數必須通過它進行修飾。在C51程序設計程序設計中,當函數定義時用了中,當函數定義時用了interrupt m修飾符,系統編譯時把修飾符,系統編譯時把對應函數轉化為中斷函數,自動加上程序頭段和尾段,并對應函數轉化為中斷函數,自動加上程序頭段和尾段,并按按MCS-51系統中斷的處理方式自動把它安排在程序存儲系統中斷的處理方式自動把它安排在程序存儲器中的相應位置。器中的相應位置。 在該修飾符中,在該修飾符中,m的取值為的取值為031,對應的中斷情況如下:,對應的中斷情況如下:0外部
42、中斷外部中斷01定時定時/計數器計數器T02外部中斷外部中斷13定時定時/計數器計數器T11串行口中斷串行口中斷5定時定時/計數器計數器T2其它值預留。其它值預留。編寫編寫MCS-51中斷函數注意如下:中斷函數注意如下:(1)中斷函數不能進行參數傳遞,如果中斷函數中包中斷函數不能進行參數傳遞,如果中斷函數中包含任何參數聲明都將導致編譯出錯。含任何參數聲明都將導致編譯出錯。(2)中斷函數沒有返回值,如果企圖定義一個返回值中斷函數沒有返回值,如果企圖定義一個返回值將得不到正確的結果,建議在定義中斷函數時將其定義將得不到正確的結果,建議在定義中斷函數時將其定義為為void類型,以明確說明沒有返回值。
43、類型,以明確說明沒有返回值。(3)在任何情況下都不能直接調用中斷函數,否則會在任何情況下都不能直接調用中斷函數,否則會產生編譯錯誤。因為中斷函數的返回是由產生編譯錯誤。因為中斷函數的返回是由8051單片機的單片機的RETI指令完成的,指令完成的,RETI指令影響指令影響8051單片機的硬件中單片機的硬件中斷系統。如果在沒有實際中斷情況下直接調用中斷函數,斷系統。如果在沒有實際中斷情況下直接調用中斷函數,RETI指令的操作結果會產生一個致命的錯誤。指令的操作結果會產生一個致命的錯誤。(1)如果在中斷函數中調用了其它函數,則被調用函如果在中斷函數中調用了其它函數,則被調用函數所使用的寄存器必須與中
44、斷函數相同。否則會產生不數所使用的寄存器必須與中斷函數相同。否則會產生不正確的結果。正確的結果。(7)中斷函數最好寫在文件的尾部,并且禁止使用中斷函數最好寫在文件的尾部,并且禁止使用extern存儲類型說明。防止其它程序調用。存儲類型說明。防止其它程序調用。 【例【例22】編寫一個用于統計外中斷】編寫一個用于統計外中斷0的中斷次數的的中斷次數的中斷服務程序中斷服務程序extern int x;void int0() interrupt 0 using 1 x+; 6using n修飾符修飾符 修飾符修飾符using n用于指定本函數內部使用的工作寄存器用于指定本函數內部使用的工作寄存器組,其中
45、組,其中n的取值為的取值為03,表示寄存器組號。,表示寄存器組號。 對于對于using n修飾符的使用,注意以下幾點:修飾符的使用,注意以下幾點:(1)加入加入using n后,后,C51在編譯時自動的在函數的開在編譯時自動的在函數的開始處和結束處加入以下指令。始處和結束處加入以下指令。PUSH PSW ;標志寄存器入棧;標志寄存器入棧MOV PSW,#與寄存器組號相關的常量與寄存器組號相關的常量POP PSW ;標志寄存器出棧;標志寄存器出棧(2)using n修飾符不能用于有返回值的函數,因為修飾符不能用于有返回值的函數,因為C51函數的返回值是放在寄存器中的。如寄存器組改變了,函數的返回
46、值是放在寄存器中的。如寄存器組改變了,返回值就會出錯。返回值就會出錯。1.8.2 函數的調用與聲明函數的調用與聲明一函數的調用一函數的調用 函數調用的一般形式如下:函數調用的一般形式如下: 函數名(實參列表);函數名(實參列表); 對于有參數的函數調用,若實參列表包含多個實對于有參數的函數調用,若實參列表包含多個實參,則各個實參之間用逗號隔開。參,則各個實參之間用逗號隔開。 按照函數調用在主調函數中出現的位置,函數調用按照函數調用在主調函數中出現的位置,函數調用方式有以下三種:方式有以下三種:(1)函數語句。把被調用函數作為主調用函數的一)函數語句。把被調用函數作為主調用函數的一個語句。個語句
47、。(2)函數表達式。函數被放在一個表達式中,以一)函數表達式。函數被放在一個表達式中,以一個運算對象的方式出現。這時的被調用函數要求帶有返個運算對象的方式出現。這時的被調用函數要求帶有返回語句,以返回一個明確的數值參加表達式的運算。回語句,以返回一個明確的數值參加表達式的運算。(3)函數參數。被調用函數作為另一個函數的參數。)函數參數。被調用函數作為另一個函數的參數。二自定義函數的聲明二自定義函數的聲明 在在C51中,函數原型一般形式如下:中,函數原型一般形式如下: extern 函數類型函數類型 函數名(形式參數表);函數名(形式參數表); 函數的聲明是把函數的名字、函數類型以及形參函數的聲
48、明是把函數的名字、函數類型以及形參的類型、個數和順序通知編譯系統,以便調用函數時的類型、個數和順序通知編譯系統,以便調用函數時系統進行對照檢查。函數的聲明后面要加分號。系統進行對照檢查。函數的聲明后面要加分號。 如果聲明的函數在文件內部,則聲明時不用如果聲明的函數在文件內部,則聲明時不用extern,如果聲明的函數不在文件內部,而在另一個,如果聲明的函數不在文件內部,而在另一個文件中,聲明時須帶文件中,聲明時須帶extern,指明使用的函數在另一,指明使用的函數在另一個文件中。個文件中。1.8.3 函數的嵌套與遞歸函數的嵌套與遞歸一函數的嵌套一函數的嵌套 在一個函數的調用過程中調用另一個函數。
49、在一個函數的調用過程中調用另一個函數。C51編譯器通常依靠堆棧來進行參數傳遞,堆棧設編譯器通常依靠堆棧來進行參數傳遞,堆棧設在片內在片內RAM中,而片內中,而片內RAM的空間有限,因而嵌套的空間有限,因而嵌套的深度比較有限,一般在幾層以內。如果層數過多,的深度比較有限,一般在幾層以內。如果層數過多,就會導致堆棧空間不夠而出錯。就會導致堆棧空間不夠而出錯。 【例【例25】 函數的嵌套調用函數的嵌套調用#include /包含特殊功能寄存器庫包含特殊功能寄存器庫#include /包含包含I/O函數庫函數庫extern serial_initial();int max(int a,int b)in
50、t z;z=a=b?a:b;return(z);int add(int c,int d,int e,int f)int result;result=max(c,d)+max(e,f); /調用函數調用函數maxreturn(result);main()int final;serial_initial();final=add(7,5,2,8);printf(“%d”,final);while(1);二函數的遞歸二函數的遞歸遞歸調用是嵌套調用的一個特殊情況。如果在調用一個函數過程中又出現了直接或間接調用該函數本身,則稱為函數的遞歸調用。【例1-26】遞歸求數的階乘n!。 在數學計算中,一個數n的階
51、乘等于該數本身乘以數n-1的階乘,即n!=n(n-1)!,用n-1的階乘來表示n的階乘就是一種遞歸表示方法。在程序設計中通過函數遞歸調用來實現。程序如下: 在函數的遞歸調用中要避免出現無終止的自身調用,應通過條件控制結束遞歸調用,使得遞歸的次數有限。下面是一個利用遞歸調用求n!的例子。#include /包含特殊功能寄存器庫#include /包含I/O函數庫extern serial_initial();int fac(int n) reentrantint result;if (n= =0)result=1;elseresult=n*fac(n-1);return(result);main
52、()int fac_result;serial_initial();fac_result=fac(11);printf(“%dn”,fac_result);1.9 C51構造數據類型構造數據類型1.9.1 數組一一維數組一一維數組一維數組只有一個下標,定義的形式如下: 數據類型說明符 數組名常量表達式=初值,初值各部分說明如下:(1)“數據類型說明符”說明了數組中各個元素存儲的數據的類型。(2)“數組名”是整個數組的標識符,它的取名方法與變量的取名方法相同。(3)“常量表達式”,常量表達式要求取值要為整型常量,必須用方括號“”括起來。用于說明該數組的長度,即該數組元素的個數。(1)“初值部分”
53、用于給數組元素賦初值,這部分在數組定義時屬于可選項。對數組元素賦值,可以在定義時賦值,也可以定義之后賦值。在定義時賦值,后面須帶等號,初值須用花括號括起來,括號內的初值兩兩之間用逗號間隔,可以對數組的全部元素賦值,也可以只對部分元素賦值。初值為0的元素可以只用逗號占位而不寫初值0。例如:下面是定義數組的兩個例子。unsigned char x5;unsigned int y3=1,2,3;第一句定義了一個無符號字符數組,數組名為x,數組中的元素個數為5。第二句定義了一個無符號整型數組,數組名為y,數組中元素個數為3,定義的同時給數組中的三個元素賦初值,賦初值分別為1、2、3。需要注意的是,C5
54、1語言中數組的下標是從0開始的,因此上面第一句定義的5個元素分別是:x0、x1、x2、x3、x1。第二句定義的3個元素分別是:y0、y1、y2。賦值情況為:y0=1;y1=2;y2=3。 C51規定在引用數組時,只能逐個引用數組中的各個元素,而不能一次引用整個數組。但如果是字符數組則可以一次引用整個數組。 【例【例1-27】用數組計算并輸出Fibonacci數列的前20項。Fibonacci數列在數學和計算機算法中十分有用。Fibonacci數列是這樣的一組數:第一個數字為0,第二個數字為1,之后每一個數字都是前兩個數字之和。設計時通過數組存放Fibonacci數列,從第三項開始可通過累加的方
55、法計算得到。程序如下:#include /包含特殊功能寄存器庫#include /包含I/O函數庫extern serial_initial();main()int fib20,i;fib0=0;fib1=1;serial_initial();for (i=2;i20;i+) fibi=fibi-2+fibi-1;for (i=0;i20;i+)if (i%5= =0) printf(“n”);printf(“%6d”,fibi);while(1);程序執行結果:0 1 1 2 35 8 13 21 3155 89 111 233 377610987 15972581 1118二字符數組二字符
56、數組 用來存放字符數據的數組稱為字符數組,它是C語言中常用的一種數組。字符數組中的每一個元素都用來存放一個字符,也可用字符數組來存放字符串。字符數組的定義下一般數組相同,只是在定義時把數據類型定義為char型。例如:char string110;char string220;上面定義了兩個字符數組,分別定義了10個元素和20個元素。 在C51語言中,字符數組用于存放一組字符或字符串,字符串以“0”作為結束符,只存放一般字符的字符數組的賦值與使用和一般的數組完全相同。對于存放字符串的字符數組。既可以對字符數組的元素逐個進行訪問,也可以對整個數組按字符串的方式進行處理。【例【例1-28】對字符數組
57、進行輸入和輸出。#include /包含特殊功能寄存器庫#include /包含I/O函數庫extern serial_initial();main()char string20;serial_initial();printf(“please type any character:”);scanf(“%s”,string);printf(“%sn”,string);while(1);1.9.2 指針指針指針是C語言中的一個重要概念。指針類型數據在C語言程序中使用十分普遍,正確地使用指針類型數據,可以有效地表示復雜的數據結構;可以動態地分配存儲器,直接處理內存地址。一指針的概念一指針的概念了解指針的基本概念,先要了解數據在內存中的存儲和讀取方法。在匯編語言中,對內存單元數據的訪問是通過指明內存單元的地址。訪問時有兩種方式:直接尋址方式和間接尋址方式。直接尋址是通過在指令中直接給出數據所在單元的地址而訪問該單元的數據。例如:MOV A,20H。在指令中直接給出所訪問的內存單元地址20H,訪問的是地址為20H的單元的數據,該指令把地址為20H的片內RAM單元的內容送累加器A;間接尋址是指所操作的數據所在的內存單元地址不是通過指令中直接提供,該地址是存放在寄存器中或其它的內存單元中,指令中指明存放地址的寄存器或內存單元來訪
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 靜脈輸液法的操作
- 洗鞋機創業計劃書
- 太原科技大學《英語視聽(V)》2023-2024學年第二學期期末試卷
- 湖南醫藥學院《數字信號處理專用器件》2023-2024學年第二學期期末試卷
- 四川衛生康復職業學院《醫學免疫學技術》2023-2024學年第二學期期末試卷
- 江漢大學《旋律寫作基礎(1)》2023-2024學年第二學期期末試卷
- 山東勝利職業學院《園藝植物栽培學1》2023-2024學年第一學期期末試卷
- 信陽航空職業學院《本科生科研訓練》2023-2024學年第二學期期末試卷
- 中央民族大學《建筑材料》2023-2024學年第二學期期末試卷
- 2025合同簽訂即刻生效違規違約將面臨重罰
- 統編版一年級語文下冊第八單元大單元整體作業設計含答案
- DB21-T 3413-2021地下工程自防護混凝土結構耐久性技術規程
- 學校食品安全管理
- 2024年安徽六安城市建設投資有限公司招聘筆試參考題庫含答案解析
- 無人駕駛除冰車研發及示范應用
- 痙攣性斜頸的物理治療與按摩技術
- 寧德時代社招測評試題
- 長螺旋鉆孔壓灌樁施工組織方案
- 團隊溝通與協作培訓
- 2024年江西南昌印鈔有限公司招聘筆試參考題庫含答案解析
- 工作交接表表格模板
評論
0/150
提交評論