第2章(3)C51程序設(shè)計語言_第1頁
第2章(3)C51程序設(shè)計語言_第2頁
第2章(3)C51程序設(shè)計語言_第3頁
第2章(3)C51程序設(shè)計語言_第4頁
第2章(3)C51程序設(shè)計語言_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、KEIL C編譯器所支持的數(shù)據(jù)類型編譯器所支持的數(shù)據(jù)類型數(shù)據(jù)類型數(shù)據(jù)類型長長 度度值值 域域unsigned char單字節(jié)單字節(jié)0255signed char單字節(jié)單字節(jié)-128+127unsigned int雙字節(jié)雙字節(jié)065535signed int雙字節(jié)雙字節(jié)-32768+32767unsigned long四字節(jié)四字節(jié)04294967295signed long四字節(jié)四字節(jié)-2147483648+2147483647float四字節(jié)四字節(jié)1.175494E-383.402823E+38*13 字節(jié)字節(jié)對象的地址對象的地址bit位位0 或或 1sfr單字節(jié)單字節(jié)0255sfr16雙字節(jié)

2、雙字節(jié)065535sbit位位0 或或 12.3.1.2 2.3.1.2 數(shù)據(jù)類型數(shù)據(jù)類型一一字符型字符型charchar有有signed charsigned char和和unsigned charunsigned char之分,默認為之分,默認為signed charsigned char。它們的長度均為它們的長度均為一個字節(jié)一個字節(jié),用于存放一個單字節(jié)的數(shù)據(jù)。對,用于存放一個單字節(jié)的數(shù)據(jù)。對于于signed charsigned char,它用于定義帶符號字節(jié)數(shù)據(jù),其字節(jié)的最高,它用于定義帶符號字節(jié)數(shù)據(jù),其字節(jié)的最高位為符號位,位為符號位,“0”0”表示正數(shù),表示正數(shù),“1”1”表示負數(shù)

3、,補碼表示,表示負數(shù),補碼表示,所能表示的數(shù)值范圍是所能表示的數(shù)值范圍是-128+127;對于;對于unsigned charunsigned char,它,它用于定義無符號字節(jié)數(shù)據(jù)或字符,可以存放一個字節(jié)的無符用于定義無符號字節(jié)數(shù)據(jù)或字符,可以存放一個字節(jié)的無符號數(shù),其取值范圍為號數(shù),其取值范圍為0255。unsigned charunsigned char可以用來存放無可以用來存放無符號數(shù),也可以存放西文字符,一個西文字符占一個字節(jié),符號數(shù),也可以存放西文字符,一個西文字符占一個字節(jié),在計算機內(nèi)部用在計算機內(nèi)部用ASCIIASCII碼存放。碼存放。 二二int整型整型分分singed in

4、t和和unsigned int。默認為。默認為signed int。它們的長度均。它們的長度均為兩個字節(jié),用于存放一個雙字節(jié)數(shù)據(jù)。對于為兩個字節(jié),用于存放一個雙字節(jié)數(shù)據(jù)。對于signed int,用于,用于存放兩字節(jié)帶符號數(shù),補碼表示,數(shù)的范疇為存放兩字節(jié)帶符號數(shù),補碼表示,數(shù)的范疇為-32768+32767。對于對于unsigned int,用于存放兩字節(jié)無符號數(shù),數(shù)的范圍為,用于存放兩字節(jié)無符號數(shù),數(shù)的范圍為065535。三三long長整型長整型 分分singed long和和unsigned long。默認為。默認為signed long。它們。它們的長度均為四個字節(jié),用于存放一個四字節(jié)

5、數(shù)據(jù)。對于的長度均為四個字節(jié),用于存放一個四字節(jié)數(shù)據(jù)。對于signed long,用于存放四字節(jié)帶符號數(shù),補碼表示,數(shù)的范疇為,用于存放四字節(jié)帶符號數(shù),補碼表示,數(shù)的范疇為-2147483648+2147483647。對于。對于unsigned long,用于存放四字,用于存放四字節(jié)無符號數(shù),數(shù)的范圍為節(jié)無符號數(shù),數(shù)的范圍為04294967295。四四floatfloat浮點型浮點型 floatfloat型數(shù)據(jù)的長度為四個字節(jié),包含指數(shù)和尾數(shù)兩部分,型數(shù)據(jù)的長度為四個字節(jié),包含指數(shù)和尾數(shù)兩部分,最高位為符號位,最高位為符號位,“1”1”表示負數(shù),表示負數(shù),“0”0”表示正數(shù),其次的表示正數(shù),其

6、次的8 8位為階碼,最后的位為階碼,最后的2323位為尾數(shù)的有效數(shù)位。位為尾數(shù)的有效數(shù)位。 五五* * 指針型指針型 指針型變量中存放的是指向另一個數(shù)據(jù)的地址。這個指針指針型變量中存放的是指向另一個數(shù)據(jù)的地址。這個指針變量要占用一定的內(nèi)存單元,一般為變量要占用一定的內(nèi)存單元,一般為1313個字節(jié)。個字節(jié)。六六位類型位類型是是C51C51中擴充的數(shù)據(jù)類型,用于訪問中擴充的數(shù)據(jù)類型,用于訪問5151單片機中的可尋址的位單單片機中的可尋址的位單元。在元。在C51C51中,支持兩種位類型:中,支持兩種位類型:bitbit型和型和sbitsbit型。它們在內(nèi)存型。它們在內(nèi)存中都只占一個二進制位,其值可以

7、是中都只占一個二進制位,其值可以是“1”1”或或“0”0”。其中用。其中用bitbit定義的位變量在定義的位變量在C51C51編譯器編譯時,在不同的時候位地址是可以編譯器編譯時,在不同的時候位地址是可以變化的,而用變化的,而用sbitsbit定義的位變量必須與定義的位變量必須與5151單片機的一個可以位單片機的一個可以位尋址的字節(jié)單元中的某一位聯(lián)系在一起,在尋址的字節(jié)單元中的某一位聯(lián)系在一起,在C51C51編譯器編譯時,編譯器編譯時,其對應(yīng)的位地址是不可變化的。其對應(yīng)的位地址是不可變化的。bit位類型符用于定義一般的位變量。它的格式如下: bit 位變量名;在格式中可以加上各種修飾,但注意存儲

8、器類型只能是在格式中可以加上各種修飾,但注意存儲器類型只能是bdata、data、idata。只能是片內(nèi)。只能是片內(nèi)RAM的可位尋址區(qū),嚴格來說只能是的可位尋址區(qū),嚴格來說只能是bdata。七七特殊功能寄存器型特殊功能寄存器型 這是這是C51擴充的數(shù)據(jù)類型,用于訪問擴充的數(shù)據(jù)類型,用于訪問51單片機中的特殊功能單片機中的特殊功能寄存器數(shù)據(jù),它分寄存器數(shù)據(jù),它分sfr和和sfr16兩種類型,其中兩種類型,其中sfr為字節(jié)型特殊功能為字節(jié)型特殊功能寄存器類型,占一個內(nèi)存單元,利用它可以訪問寄存器類型,占一個內(nèi)存單元,利用它可以訪問51內(nèi)部的所有特內(nèi)部的所有特殊功能寄存器;殊功能寄存器;sfr16為

9、雙字節(jié)型特殊功能寄存器類型,占用兩個為雙字節(jié)型特殊功能寄存器類型,占用兩個字節(jié)單元,利用它可以訪問字節(jié)單元,利用它可以訪問51內(nèi)部的所有兩個字節(jié)的特殊功能寄內(nèi)部的所有兩個字節(jié)的特殊功能寄存器。在存器。在C51中對特殊功能寄存器的訪問必須先用中對特殊功能寄存器的訪問必須先用sfr或或sfr16進行進行聲明。聲明。2.3.1.4 變量及其存儲模式變量及其存儲模式 變量是在程序運行過程中其值可以改變的量。一個變量變量是在程序運行過程中其值可以改變的量。一個變量由兩部分組成:變量名和變量值。在由兩部分組成:變量名和變量值。在C51中,變量在使用前必中,變量在使用前必須對變量進行定義,定義的格式如下:須

10、對變量進行定義,定義的格式如下: 存儲種類存儲種類 數(shù)據(jù)類型數(shù)據(jù)類型 存儲器類型存儲器類型 變量名表;變量名表;一數(shù)據(jù)類型說明符一數(shù)據(jù)類型說明符 在定義變量時,必須通過數(shù)據(jù)類型說明符指明變量的數(shù)據(jù)在定義變量時,必須通過數(shù)據(jù)類型說明符指明變量的數(shù)據(jù)類型,指明變量在存儲器中占用的字節(jié)數(shù)。可以是基本數(shù)據(jù)類類型,指明變量在存儲器中占用的字節(jié)數(shù)??梢允腔緮?shù)據(jù)類型說明符,也可以是組合數(shù)據(jù)類型說明符,還可以是用型說明符,也可以是組合數(shù)據(jù)類型說明符,還可以是用typedef定義的類型別名。定義的類型別名。 在在C51C51中,為了增加程序的可讀性,允許用戶為系統(tǒng)固有的數(shù)中,為了增加程序的可讀性,允許用戶為系

11、統(tǒng)固有的數(shù)據(jù)類型說明符用據(jù)類型說明符用typedeftypedef起別名,格式如下:起別名,格式如下: typedeftypedef c51 c51固有的數(shù)據(jù)類型說明符固有的數(shù)據(jù)類型說明符 別名;別名;【例【例3-2】 typedef的使用。的使用。typedef unsigned int WORD;typedef unsigned char BYTE;BYTE a1=0 x12;WORD a2=0 x1234;三、存儲器類型三、存儲器類型存儲器類型是用于指明變量所處的單片機的存儲器區(qū)域情況存儲器類型是用于指明變量所處的單片機的存儲器區(qū)域情況存儲器類型與存儲種類完全不同。存儲器類型與存儲種類完

12、全不同。C51C51編譯器能識別的存儲器編譯器能識別的存儲器類型有:類型有:存儲器類型存儲器類型說說 明明datadata直接訪問內(nèi)部數(shù)據(jù)存儲器(直接訪問內(nèi)部數(shù)據(jù)存儲器(128128字節(jié)字節(jié)),),訪問速度最快訪問速度最快bdatabdata可位尋址內(nèi)部數(shù)據(jù)存儲器(可位尋址內(nèi)部數(shù)據(jù)存儲器(1616字節(jié)),允許位與字節(jié)混合訪問字節(jié)),允許位與字節(jié)混合訪問idataidata間接訪問內(nèi)部數(shù)據(jù)存儲器(間接訪問內(nèi)部數(shù)據(jù)存儲器(256256字節(jié)),對于字節(jié)),對于5151子系列,只允許子系列,只允許訪問低訪問低128B128B,對于,對于5252子系列,允許訪問全部子系列,允許訪問全部256B256B地

13、址地址pdatapdata分頁訪問外部數(shù)據(jù)存儲器(分頁訪問外部數(shù)據(jù)存儲器(256256字節(jié)),相當于用字節(jié)),相當于用MOVX RiMOVX Ri指令指令訪問訪問xdataxdata外部數(shù)據(jù)存儲器外部數(shù)據(jù)存儲器(64KB)(64KB),相當于用,相當于用MOVX DPTRMOVX DPTR指令訪問指令訪問codecode程序存儲器(程序存儲器(64KB64KB), ,相當于用相當于用MOVC A+DPTRMOVC A+DPTR指令訪問指令訪問例:數(shù)據(jù)類型例:數(shù)據(jù)類型 存儲器類型存儲器類型 變量變量 char data var1; bit bdata flags;unsigned char xd

14、ata vextor; 定義變量時如果省略存儲器類型,系統(tǒng)則會按編譯定義變量時如果省略存儲器類型,系統(tǒng)則會按編譯模式模式SMALLSMALL、COMPACTCOMPACT或或LARGELARGE所規(guī)定的默認存儲器類所規(guī)定的默認存儲器類型去指定變量的存儲區(qū)域。型去指定變量的存儲區(qū)域。 2.3.1.5 C51定義特殊功能寄存器定義特殊功能寄存器 對對SFRSFR的操作,只能采用直接尋址方式。為了能直接訪問這的操作,只能采用直接尋址方式。為了能直接訪問這些特殊功能寄存器,些特殊功能寄存器,Keil C51Keil C51擴充了兩個關(guān)鍵字擴充了兩個關(guān)鍵字“sfrsfr”、“sfr16”sfr16”,可

15、以直接對,可以直接對5151單片機的特殊寄存器進行定義。單片機的特殊寄存器進行定義。一、一、 使用關(guān)鍵字使用關(guān)鍵字sfr、sfr16定義特殊功能寄存器定義特殊功能寄存器 sfr 特殊功能寄存器名特殊功能寄存器名= 特殊功能寄存器地址常數(shù)特殊功能寄存器地址常數(shù);如:對于如:對于8051片內(nèi)片內(nèi)I/O口,定義方法如下:口,定義方法如下:sfr P1 = 0 x90; /定義定義P1口,地址口,地址90H sfr后面是一個要定義的名字,要符合標識符的命名規(guī)則,名后面是一個要定義的名字,要符合標識符的命名規(guī)則,名字最好有一定的含義字最好有一定的含義 等號后面必須是常數(shù),不允許有帶運算符的表達式,而且該

16、等號后面必須是常數(shù),不允許有帶運算符的表達式,而且該常數(shù)必須在特殊功能寄存器的地址范圍之內(nèi)(常數(shù)必須在特殊功能寄存器的地址范圍之內(nèi)(80H-FFH)。)。Sfr16 特殊功能寄存器名特殊功能寄存器名= 特殊功能寄存器地址常數(shù)特殊功能寄存器地址常數(shù);如:數(shù)據(jù)指針如:數(shù)據(jù)指針DPTR,可以定義為:,可以定義為:sfr16 DPTR = 0 x82; /這里定義數(shù)據(jù)指針這里定義數(shù)據(jù)指針DPTR,地址為,地址為DPL=82H,DPH=83H 用用sfr16定義定義16位特殊功能寄存器時,等號后面是它的低位地址,位特殊功能寄存器時,等號后面是它的低位地址,高位地址一定要位于物理低位地址之上。高位地址一定

17、要位于物理低位地址之上。二、用二、用sbit定義特殊功能寄存器的特殊位定義特殊功能寄存器的特殊位1)sbit 位變量名位地址位變量名位地址sbit P1_1 = 0 x91;這樣是把位的絕對地址賦給位變量。這樣是把位的絕對地址賦給位變量。同同sfr一樣,一樣,sbit的位地址必須位于的位地址必須位于80HFFH之間。之間。2)Sbit 位變量名特殊功能寄存器名位變量名特殊功能寄存器名位地址位地址sfr P3 = 0 xB0;sbit P3_1 = P3 1; /先定義一個特殊功能寄存器名,先定義一個特殊功能寄存器名,再指定位變量名所在的位置。再指定位變量名所在的位置。當可尋址位位于特殊功能寄存

18、器中時可采用這種方當可尋址位位于特殊功能寄存器中時可采用這種方法。法。3)sbit 位變量名字節(jié)地址位變量名字節(jié)地址位地址位地址sbit P3_1 = 0 xB01; 三、三、 通過頭文件訪問通過頭文件訪問SFRSFR編譯器給出的頭文件已經(jīng)給出了常用編譯器給出的頭文件已經(jīng)給出了常用51 51 單片機中的單片機中的SFR SFR 及及其可位尋址位的定義。比如其可位尋址位的定義。比如KeilKeil C C 將這些頭文件按單片機的將這些頭文件按單片機的不同生產(chǎn)公司、不同型號分別存在不同生產(chǎn)公司、不同型號分別存在KeilKeil C C 的的INC INC 子目錄下,子目錄下,在程序中只需直接引用這

19、些頭文件即可實現(xiàn)對在程序中只需直接引用這些頭文件即可實現(xiàn)對SFR SFR 的訪問和的訪問和控制??刂啤!纠纠?-33-3】頭文件引用實例?!款^文件引用實例。#include /#include /單片機為單片機為atmelatmel 公司的公司的AT89C51AT89C51main()main() TL0=0 xb0; /TL0=0 xb0; /訪問定時器訪問定時器0 0,設(shè)置時間常數(shù),設(shè)置時間常數(shù)TH0=0 x3c;TH0=0 x3c;TR0=1; /TR0=1; /啟動定時器啟動定時器0 0 C51C51包含的頭文件包含的頭文件reg51.hreg51.h, reg52.hreg52.h

20、, Reg51.h Reg51.h 定義定義5151子系列單片機的特殊功能寄存器和部分子系列單片機的特殊功能寄存器和部分位寄存器位寄存器 Reg52.h Reg52.h 定義定義5252子系列單片機的特殊功能寄存器和部分子系列單片機的特殊功能寄存器和部分位寄存器位寄存器 在程序開始部分使用語句在程序開始部分使用語句 #include #include 即可直接使用特殊功能寄存器及其部分位單元,不需要再即可直接使用特殊功能寄存器及其部分位單元,不需要再作定義。作定義。2.3.1.5 指針指針一指針的概念一指針的概念在在C語言中,數(shù)據(jù)通常是以變量的形式進行存放和訪問的。變語言中,數(shù)據(jù)通常是以變量的

21、形式進行存放和訪問的。變量在使用時分清兩個概念量在使用時分清兩個概念:變量名和變量的值。:變量名和變量的值。變量名變量名是數(shù)據(jù)的標識符,相當于內(nèi)存單元的地址是數(shù)據(jù)的標識符,相當于內(nèi)存單元的地址變量的值變量的值是數(shù)據(jù)的內(nèi)容,變量的值相當于內(nèi)存單元的內(nèi)容。是數(shù)據(jù)的內(nèi)容,變量的值相當于內(nèi)存單元的內(nèi)容。對于變量有兩種訪問方式:對于變量有兩種訪問方式:直接訪問方式和間接訪問方式直接訪問方式和間接訪問方式。直接訪問方式。直接訪問方式。對于變量的訪問,我們大多數(shù)時候是直接給對于變量的訪問,我們大多數(shù)時候是直接給出變量名。出變量名。間接訪問方式。間接訪問方式。例如要存取變量例如要存取變量a中的值時,可以先將變

22、量中的值時,可以先將變量a的地址放在另一個變量的地址放在另一個變量b中,訪問時先找到變量中,訪問時先找到變量b,從變量,從變量b中取出變量中取出變量a的地址,然后根據(jù)這個地址從內(nèi)存單元中取出變的地址,然后根據(jù)這個地址從內(nèi)存單元中取出變量量a的值。這就是間接訪問。在這里,從變量的值。這就是間接訪問。在這里,從變量b中取出的不是中取出的不是所訪問的數(shù)據(jù),而是訪問的數(shù)據(jù)(變量所訪問的數(shù)據(jù),而是訪問的數(shù)據(jù)(變量a的值)的地址,這就的值)的地址,這就是指針,變量是指針,變量b稱為指針變量。稱為指針變量。 變量的指針和指向變量的指針變量。變量的指針和指向變量的指針變量。變量的指針就是變量變量的指針就是變量

23、的地址。對于變量的地址。對于變量a,如果它所對應(yīng)的內(nèi)存單元地址為,如果它所對應(yīng)的內(nèi)存單元地址為2000H,它的指針就是,它的指針就是2000H。指針變量是指一個專門用。指針變量是指一個專門用來存放另一個變量地址的變量,它的值是指針。上面變量來存放另一個變量地址的變量,它的值是指針。上面變量b中存放的是變量中存放的是變量a的地址,變量的地址,變量b中的值是變量中的值是變量a的指針,變的指針,變量量b就是一個指向變量就是一個指向變量a的指針變量。的指針變量。二指針變量的定義二指針變量的定義指針變量的定義與一般變量的定義類似,定義的一般形式為:指針變量的定義與一般變量的定義類似,定義的一般形式為:數(shù)

24、據(jù)類型說明符數(shù)據(jù)類型說明符 存儲器類型存儲器類型1 *【存儲器類型【存儲器類型2 】指針變量名;】指針變量名;其中:其中:“數(shù)據(jù)類型說明符數(shù)據(jù)類型說明符”說明了該指針變量所指向的變量的類型。說明了該指針變量所指向的變量的類型。 “存儲器類型存儲器類型”是可選項,如果帶有此選項,指針被定義是可選項,如果帶有此選項,指針被定義為基于存儲器的指針。無此選項時,被定義為一般指針。為基于存儲器的指針。無此選項時,被定義為一般指針。 下面是幾個指針變量定義的例子:下面是幾個指針變量定義的例子:int * p1; /*定義一個指向整型變量的指針變量定義一個指向整型變量的指針變量p1*/char data *

25、 p3; /*定義一個指向字符變量的指針變量定義一個指向字符變量的指針變量p3,該指針訪問的數(shù)據(jù)在片內(nèi)數(shù)據(jù)存儲器中,該指針在內(nèi)存中占一該指針訪問的數(shù)據(jù)在片內(nèi)數(shù)據(jù)存儲器中,該指針在內(nèi)存中占一個字節(jié)個字節(jié)*/float xdata * p4; /*定義一個指向浮點型變量的指針變量定義一個指向浮點型變量的指針變量p4,該指針訪問的數(shù)據(jù)在片外數(shù)據(jù)存儲器中,該指針在內(nèi)存中,該指針訪問的數(shù)據(jù)在片外數(shù)據(jù)存儲器中,該指針在內(nèi)存中占兩個字節(jié)占兩個字節(jié)*/Float *xdata p4; /*定義一個指向浮點型變量的指針變量定義一個指向浮點型變量的指針變量p4,該指針存放在片外數(shù)據(jù)存儲器中,該指針在內(nèi)存中占三個字

26、節(jié)該指針存放在片外數(shù)據(jù)存儲器中,該指針在內(nèi)存中占三個字節(jié)*/三指針變量的引用三指針變量的引用 指針變量是存放另一變量地址的特殊變量,指針變量只能指針變量是存放另一變量地址的特殊變量,指針變量只能存放地址。指針變量使用時注意兩個運算符:存放地址。指針變量使用時注意兩個運算符:&和和*。&”是取地址運算符,是取地址運算符,“*”是指針運算符。是指針運算符。通過通過“&”取地址運算符可以把一個變量的地址送給指針變量,取地址運算符可以把一個變量的地址送給指針變量,使指針變量指向該變量;通過使指針變量指向該變量;通過“*”指針運算符可以實現(xiàn)通過指指針運算符可以實現(xiàn)通過指針變量訪問

27、它所指向的變量的值。針變量訪問它所指向的變量的值。 例如例如:int x,* px,* py;/*變量及指針變量定義變量及指針變量定義*/px=&x; /*將變量將變量x的地址賦給指針變量的地址賦給指針變量px,使,使px指向變量指向變量x*/* px=5; /*等價于等價于x=5*/py=px; /*將指針變量將指針變量px中的地址賦給指針變量中的地址賦給指針變量py,使指針變量,使指針變量py也指向也指向x*/2.3.2 C51的運算符及表達式的運算符及表達式1 賦值運算符賦值運算符 賦值運算符賦值運算符“=”,在,在C51中,它的功能是將一個數(shù)據(jù)的值賦中,它的功能是將一個數(shù)據(jù)的值

28、賦給一個變量,如給一個變量,如x=10。一個賦值語句的格式如下:。一個賦值語句的格式如下: 變量變量=表達式表達式;執(zhí)行時先計算出右邊表達式的值,然后賦給左邊的變量。例如:執(zhí)行時先計算出右邊表達式的值,然后賦給左邊的變量。例如: x=8+9; /*將將8+9的值賦紿變量的值賦紿變量x*/ x=y=5; /*將常數(shù)將常數(shù)5同時賦給變量同時賦給變量x和和y*注意:注意: 在賦值運算中,當在賦值運算中,當“=”兩側(cè)的類型不一致時,要將數(shù)據(jù)轉(zhuǎn)兩側(cè)的類型不一致時,要將數(shù)據(jù)轉(zhuǎn)換成同一數(shù)據(jù)類型,轉(zhuǎn)換的方式有兩種。換成同一數(shù)據(jù)類型,轉(zhuǎn)換的方式有兩種。1系統(tǒng)自動轉(zhuǎn)換系統(tǒng)自動轉(zhuǎn)換 編譯時,將右邊表達式的值轉(zhuǎn)換成左

29、側(cè)變量的類型,再賦編譯時,將右邊表達式的值轉(zhuǎn)換成左側(cè)變量的類型,再賦給該變量。給該變量。2.強制轉(zhuǎn)換強制轉(zhuǎn)換 使用強制類型轉(zhuǎn)換運算符轉(zhuǎn)換使用強制類型轉(zhuǎn)換運算符轉(zhuǎn)換: (類型名類型名) (表達式),將(表達式),將表達式的數(shù)據(jù)類型轉(zhuǎn)換為前面要求的類型名。表達式的數(shù)據(jù)類型轉(zhuǎn)換為前面要求的類型名。 【例【例3-8】類型轉(zhuǎn)換應(yīng)用。】類型轉(zhuǎn)換應(yīng)用。 unsigned char x,y; unsigned int z,a; x=(float)a; y=(int)(x+y); z=x+(unsigned int)y;2 算術(shù)運算符算術(shù)運算符+ 加或取正值運算符加或取正值運算符- 減或取負值運算符減或取負值運

30、算符 * 乘運算符乘運算符/ 除運算符除運算符% 取余運算符取余運算符加、減、乘運算相對比較簡單,而對于除運算,如相除的兩加、減、乘運算相對比較簡單,而對于除運算,如相除的兩個數(shù)為浮點數(shù),則運算的結(jié)果也為浮點數(shù),如相除的兩個數(shù)為個數(shù)為浮點數(shù),則運算的結(jié)果也為浮點數(shù),如相除的兩個數(shù)為整數(shù),則運算的結(jié)果也為整數(shù),即為整除。如整數(shù),則運算的結(jié)果也為整數(shù),即為整除。如25.0/20.0結(jié)果為結(jié)果為1.25,而,而25/20結(jié)果為結(jié)果為1。對于取余運算,則要求參加運算的兩個數(shù)必須為整數(shù),運算對于取余運算,則要求參加運算的兩個數(shù)必須為整數(shù),運算結(jié)果為它們的余數(shù)。例如:結(jié)果為它們的余數(shù)。例如:x=5%3,結(jié)

31、果,結(jié)果x的值為的值為2。3 關(guān)系運算符關(guān)系運算符C51中有中有6種關(guān)系運算符:種關(guān)系運算符: 大于大于= 大于等于大于等于3,結(jié)果為真(結(jié)果為真(1),而),而10= =100,結(jié)果為假(,結(jié)果為假(0)。)。 4 邏輯運算符邏輯運算符C51有有3種邏輯運算符:種邏輯運算符:| 邏輯或邏輯或& 邏輯與邏輯與! 邏輯非邏輯非邏輯運算符用于求條件式的邏輯值,用邏輯運算符將關(guān)系表達式或邏輯運算符用于求條件式的邏輯值,用邏輯運算符將關(guān)系表達式或邏輯量連接起來的式子就是邏輯表達式。邏輯量連接起來的式子就是邏輯表達式。 邏輯與,格式:邏輯與,格式: 條件式條件式1 & 條件式條件式2當條

32、件式當條件式1與條件式與條件式2都為真時結(jié)果為真(非都為真時結(jié)果為真(非0),否則為假(),否則為假(0) 邏輯或,格式:邏輯或,格式: 條件式條件式1 | 條件式條件式2 當條件式當條件式1與條件式與條件式2都為假時結(jié)果為假(都為假時結(jié)果為假(0),否則為真(非),否則為真(非0) 邏輯非,格式:邏輯非,格式: !條件式!條件式 當條件式原來為真(非當條件式原來為真(非0),邏輯非后結(jié)果為假(),邏輯非后結(jié)果為假(0)。當條件)。當條件式原來為假(式原來為假(0),邏輯非后結(jié)果為真(非),邏輯非后結(jié)果為真(非0)。)。例如:若例如:若a=8,b=3,c=0,則!,則!a為假,為假,a &am

33、p; b為真,為真,b & c為假。為假。5 位運算符位運算符位運算是按位對變量進行運算,但并不改變參與運算的變量的位運算是按位對變量進行運算,但并不改變參與運算的變量的值。值。C51中位運算符只能對整數(shù)進行操作,不能對浮點數(shù)進行操中位運算符只能對整數(shù)進行操作,不能對浮點數(shù)進行操作。作。C51中的位運算符有:中的位運算符有:& 按位與按位與| 按位或按位或 按位異或按位異或 按位取反按位取反 右移右移【例】設(shè)【例】設(shè)a=0 x45=01000101B,b=0 x3b=00111011B,則,則a&b、a|b、ab、a、a2分別為多少?分別為多少?a&b=0000

34、0001b=0 x01。a|b=01111111B=0 x7f。ab=01111110B=0 x7e。a=10111010B=0 xba。a2=00001110B=0 x0e。6 復(fù)合賦值運算符復(fù)合賦值運算符C51中支持的復(fù)合賦值運算符:中支持的復(fù)合賦值運算符:+= 加法賦值加法賦值 - = 減法賦值減法賦值*= 乘法賦值乘法賦值 /= 除法賦值除法賦值 %= 取模賦值取模賦值 &= 邏輯與賦值邏輯與賦值 |= 邏輯或賦值邏輯或賦值 = 邏輯異或賦值邏輯異或賦值 = 邏輯非賦值邏輯非賦值 = 右移位賦值右移位賦值 b)?a:b的執(zhí)行結(jié)果是將的執(zhí)行結(jié)果是將a和和b中較中較大的數(shù)賦值給變量

35、大的數(shù)賦值給變量max。9 指針與地址運算符指針與地址運算符* 指針運算符指針運算符& 取地址運算符取地址運算符指針運算符指針運算符“*”放在指針變量前面,通過它實現(xiàn)訪問以指針變放在指針變量前面,通過它實現(xiàn)訪問以指針變量的內(nèi)容為地址所指向的存儲單元。例如:指針變量量的內(nèi)容為地址所指向的存儲單元。例如:指針變量p中的地址中的地址為為2000H,則,則*p所訪問的是地址為所訪問的是地址為2000H的存儲單元,的存儲單元,x=*p,實,實現(xiàn)把地址為現(xiàn)把地址為2000H的存儲單元的內(nèi)容送給變量的存儲單元的內(nèi)容送給變量x。取地址運算符取地址運算符“&”放在變量的前面,通過它取得變量的地址

36、,放在變量的前面,通過它取得變量的地址,變量的地址通常送給指針變量。例如:設(shè)變量變量的地址通常送給指針變量。例如:設(shè)變量x的內(nèi)容為的內(nèi)容為12H,地址為地址為2000H,則,則&x的值為的值為2000H,如有一指針變量,如有一指針變量p,則通常,則通常用用p=&x,實現(xiàn)將,實現(xiàn)將x變量的地址送給指針變量變量的地址送給指針變量p,指針變量,指針變量p指向指向變量變量x,以后可以通過,以后可以通過*p訪問變量訪問變量x。2.3.3.2 選擇控制語句選擇控制語句一、一、if語句語句if語句是語句是C51中的一個基本條件選擇語句,它通常有三種格式:中的一個基本條件選擇語句,它通常有三種

37、格式:(1)if (表達式)(表達式) 語句;語句;(2)if (表達式)(表達式) 語句語句1; else 語句語句2;(3)if (表達式(表達式1) 語句語句1;else if (表達式(表達式2) 語句語句2;else if (表達式(表達式3) 語句語句3;else if (表達式(表達式n-1) 語句語句n-1;else 語句語句n二、二、switch/case語句語句if語句通過嵌套可以實現(xiàn)多分支結(jié)構(gòu),但結(jié)構(gòu)復(fù)雜。語句通過嵌套可以實現(xiàn)多分支結(jié)構(gòu),但結(jié)構(gòu)復(fù)雜。switch是是C51中提供的專門處理多分支結(jié)構(gòu)的多分支選擇語句。它的中提供的專門處理多分支結(jié)構(gòu)的多分支選擇語句。它的格式如

38、下:格式如下:switch (表達式)(表達式)case 常量表達式常量表達式1:語句語句1;break;case 常量表達式常量表達式2:語句語句2;break;case 常量表達式常量表達式n:語句語句n;break;default:語句語句n+1;【例【例2-12】 STC89C51 單片機的單片機的P1.0 和和P1.1 引腳接有兩只按鍵,其引腳接有兩只按鍵,其4 種種邏輯組合分別點亮由邏輯組合分別點亮由P2.0P2.3 控制的控制的4 只只LED(高電平點亮),試編程(高電平點亮),試編程實現(xiàn)此功能。實現(xiàn)此功能。解:解: #include void main()data unsign

39、ed char a;doa=P1;a=a&0 x03; /,讀低,讀低2位位 P2=P2&0 xf0;switch (a)case 0:P2=P2|0 x01;break;case 1:P2=P2|0 x02;break;case 2:P2=P2|0 x04;break;case 3:P2=P2|0 x08;while(1);2.3.3.3 循環(huán)語句循環(huán)語句一、一、 基于基于 if if 和和gotogoto 構(gòu)成的循環(huán)構(gòu)成的循環(huán)采用采用if if 和和gotogoto 可以構(gòu)成可以構(gòu)成“當型當型”循環(huán)程序,其格式如下:循環(huán)程序,其格式如下:looploop:ifif(表達式)

40、(表達式) 語句;語句;gotogoto loop loop; 采用采用if if 和和gotogoto 也可以構(gòu)成也可以構(gòu)成“直到型直到型”循環(huán)程序,其格式如循環(huán)程序,其格式如下:下:looploop: 語句;語句;ifif(表達式)(表達式)gotogoto loop loop; gotogoto 語句為無條件轉(zhuǎn)向語句,它的一般形式是:語句為無條件轉(zhuǎn)向語句,它的一般形式是:gotogoto 語句標號;語句標號;二、二、while語句語句while語句在語句在C51中用于實現(xiàn)當型循環(huán)結(jié)構(gòu),它的格式如下:中用于實現(xiàn)當型循環(huán)結(jié)構(gòu),它的格式如下: while(表達式)(表達式) 語句;語句; /*

41、循環(huán)體循環(huán)體*/當表達式為非當表達式為非0(真)時,就重復(fù)執(zhí)行循環(huán)體內(nèi)的語句;當(真)時,就重復(fù)執(zhí)行循環(huán)體內(nèi)的語句;當表達式為表達式為0(假),則中止(假),則中止while循環(huán),程序?qū)?zhí)行循環(huán)結(jié)構(gòu)之循環(huán),程序?qū)?zhí)行循環(huán)結(jié)構(gòu)之外的下一條語句。外的下一條語句。三、三、 基于基于do-while 語句構(gòu)成的循環(huán)語句構(gòu)成的循環(huán)do-while 語句只能用來實現(xiàn)語句只能用來實現(xiàn)“直到型直到型”循環(huán),其一循環(huán),其一般格式是:般格式是:do語句;語句;/可以是復(fù)合語句可以是復(fù)合語句 while (表達式);(表達式);do-while 語句的特點是先執(zhí)行內(nèi)嵌的語句;再計算語句的特點是先執(zhí)行內(nèi)嵌的語句;再計

42、算表達式,如果表達式的值為非表達式,如果表達式的值為非0,則繼續(xù)執(zhí)行內(nèi)嵌的語,則繼續(xù)執(zhí)行內(nèi)嵌的語句,直到表達式的值為句,直到表達式的值為0 時結(jié)束循環(huán)。時結(jié)束循環(huán)。 四、基于四、基于for 語句構(gòu)成的循環(huán)語句構(gòu)成的循環(huán)for 語句的一般形式為:語句的一般形式為:for (表達式(表達式1;表達式;表達式2;表達式;表達式3)語句;語句;它的執(zhí)行過程是:它的執(zhí)行過程是:首先求解初始化表達式首先求解初始化表達式1;其次求解表達式;其次求解表達式2,判斷是否滿,判斷是否滿足循環(huán)條件,若其值非足循環(huán)條件,若其值非0,則執(zhí)行內(nèi)嵌語句;否則退出循環(huán);,則執(zhí)行內(nèi)嵌語句;否則退出循環(huán);最后求解尺度增量表達式最

43、后求解尺度增量表達式3,并回到第,并回到第2 步。步。在在for 語句中,可以沒有表達式語句中,可以沒有表達式1、表達式、表達式2 或表達式或表達式3,若,若三個表達式都沒有,則相當于一個死循環(huán)。如果其后緊跟一三個表達式都沒有,則相當于一個死循環(huán)。如果其后緊跟一個個“;”,則為空循環(huán),常用于延時;,則為空循環(huán),常用于延時;1break語句語句使用使用break語句可以從循環(huán)體中跳出循環(huán),提前結(jié)束循環(huán)而接語句可以從循環(huán)體中跳出循環(huán),提前結(jié)束循環(huán)而接著執(zhí)行循環(huán)結(jié)構(gòu)下面的語句。著執(zhí)行循環(huán)結(jié)構(gòu)下面的語句。它不能用在除了循環(huán)語句和它不能用在除了循環(huán)語句和switch語句之外的任何其它語句中語句之外的任何

44、其它語句中【例】下面一段程序用于計算圓的面積,當計算到面積大于【例】下面一段程序用于計算圓的面積,當計算到面積大于100時,由時,由break語句跳出循環(huán)。語句跳出循環(huán)。for (r=1;r100) break;五、五、break和和continue語句語句continue語句用在循環(huán)結(jié)構(gòu)中,用于結(jié)束本次循環(huán),跳語句用在循環(huán)結(jié)構(gòu)中,用于結(jié)束本次循環(huán),跳過循環(huán)體中過循環(huán)體中continue下面尚未執(zhí)行的語句,直接進行下一下面尚未執(zhí)行的語句,直接進行下一次是否執(zhí)行循環(huán)的判定。次是否執(zhí)行循環(huán)的判定。【例】【例】 輸出輸出100200間不能被間不能被3整除的數(shù)。整除的數(shù)。for (i=100;i=20

45、0;i+)if (i%3= =0) continue;printf(“%d ”;i); 2continue語句語句return語句一般放在函數(shù)的最后位置,用于終止函數(shù)的執(zhí)行,語句一般放在函數(shù)的最后位置,用于終止函數(shù)的執(zhí)行,并控制程序返回調(diào)用該函數(shù)時所處的位置。返回時還可以通過并控制程序返回調(diào)用該函數(shù)時所處的位置。返回時還可以通過return語句帶回返回值。語句帶回返回值。return語句格式有兩種:語句格式有兩種:(1)return;(2)return (表達式表達式); 六、六、return語句語句2.3.4 函數(shù)函數(shù)2.3.4.1 函數(shù)的分類與定義函數(shù)的分類與定義一、函數(shù)的分類一、函數(shù)的分

46、類C 語言函數(shù)分為語言函數(shù)分為主函數(shù)主函數(shù)main( )和和普通函數(shù)普通函數(shù)兩種,而對于普通兩種,而對于普通函數(shù),又可以分為函數(shù),又可以分為標準庫函數(shù)標準庫函數(shù)和和用戶自定義函數(shù)用戶自定義函數(shù)。1)標準庫函數(shù))標準庫函數(shù)標準庫函數(shù)是由標準庫函數(shù)是由C 編譯系統(tǒng)提供的,在編譯系統(tǒng)提供的,在C 編譯系統(tǒng)中將一些編譯系統(tǒng)中將一些獨立的功能模塊編寫成公用函數(shù),并將它們集中存放在系統(tǒng)的獨立的功能模塊編寫成公用函數(shù),并將它們集中存放在系統(tǒng)的函數(shù)庫中,供程序設(shè)計時使用,稱之為標準庫函數(shù)。函數(shù)庫中,供程序設(shè)計時使用,稱之為標準庫函數(shù)。字符串操作函數(shù)位于字符串操作函數(shù)位于“string.h”中。中。包括拷貝、比

47、較、移動等包括拷貝、比較、移動等函數(shù)如函數(shù)如memcpy、memcmp、memmove、memset,這些函數(shù),這些函數(shù)對緩沖區(qū)進行處理很方便。對緩沖區(qū)進行處理很方便。流函數(shù)輸入輸出,位于流函數(shù)輸入輸出,位于“stdio.h”中中。流函數(shù)缺省為。流函數(shù)缺省為8051串口。串口。2)用戶自定義函數(shù))用戶自定義函數(shù)用戶自定義函數(shù)是用戶根據(jù)自己的需要而編寫的函數(shù)。從函用戶自定義函數(shù)是用戶根據(jù)自己的需要而編寫的函數(shù)。從函數(shù)定義的形式上可以將其劃分無參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)定義的形式上可以將其劃分無參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)。數(shù)。二、函數(shù)的定義二、函數(shù)的定義函數(shù)定義的完整形式如下:函數(shù)定義的完整形

48、式如下:返回數(shù)據(jù)類型返回數(shù)據(jù)類型 函數(shù)名函數(shù)名(形式參數(shù)列表形式參數(shù)列表) reentrant interrupt n using m 局部變量定義;局部變量定義; 函數(shù)體;函數(shù)體;1)函數(shù)返回值與數(shù)據(jù)類型)函數(shù)返回值與數(shù)據(jù)類型如果返回數(shù)據(jù),進行說明;如果不返回,一般用如果返回數(shù)據(jù),進行說明;如果不返回,一般用void說明,說明,也可以不說明。函數(shù)返回值通過也可以不說明。函數(shù)返回值通過return x返回,返回值是通過返回,返回值是通過函數(shù)名帶回的,一個函數(shù)只能有一個返回值。函數(shù)名帶回的,一個函數(shù)只能有一個返回值。2) reentrant修飾符修飾符 這個修飾符用于把函數(shù)定義為可重入函數(shù)。所謂

49、可這個修飾符用于把函數(shù)定義為可重入函數(shù)。所謂可重入函數(shù)就是允許被遞歸調(diào)用的函數(shù)。函數(shù)的遞歸調(diào)用重入函數(shù)就是允許被遞歸調(diào)用的函數(shù)。函數(shù)的遞歸調(diào)用是指當一個函數(shù)正被調(diào)用尚未返回時,又直接或間接調(diào)是指當一個函數(shù)正被調(diào)用尚未返回時,又直接或間接調(diào)用函數(shù)本身。用函數(shù)本身。3) interrupt m修飾符修飾符在在C51程序設(shè)計中,當函數(shù)定義時用了程序設(shè)計中,當函數(shù)定義時用了interrupt m修飾符,系修飾符,系統(tǒng)編譯時把對應(yīng)函數(shù)轉(zhuǎn)化為中斷函數(shù),按統(tǒng)編譯時把對應(yīng)函數(shù)轉(zhuǎn)化為中斷函數(shù),按MCS-51系統(tǒng)中斷的系統(tǒng)中斷的處理方式自動把它安排在程序存儲器中的相應(yīng)位置。處理方式自動把它安排在程序存儲器中的相應(yīng)

50、位置。 在該修飾符中,在該修飾符中,m的取值為的取值為031,對應(yīng)的中斷情況如下:,對應(yīng)的中斷情況如下:0外部中斷外部中斷01定時定時/計數(shù)器計數(shù)器T02外部中斷外部中斷13定時定時/計數(shù)器計數(shù)器T14串行口中斷串行口中斷5定時定時/計數(shù)器計數(shù)器T2其它值預(yù)留。其它值預(yù)留。4) using n修飾符修飾符修飾符修飾符using n用于指定本函數(shù)內(nèi)部使用的工作寄存器組,用于指定本函數(shù)內(nèi)部使用的工作寄存器組,其中其中n的取值為的取值為03,表示寄存器組號。,表示寄存器組號。對于對于using n修飾符的使用,注意以下幾點:修飾符的使用,注意以下幾點:(1)加入)加入using n后,后,C51在編

51、譯時自動的在函數(shù)的開始處在編譯時自動的在函數(shù)的開始處和結(jié)束處加入以下指令。和結(jié)束處加入以下指令。PUSH PSW ;標志寄存器入棧;標志寄存器入棧MOV PSW,#與寄存器組號相關(guān)的常量與寄存器組號相關(guān)的常量POP PSW ;標志寄存器出棧;標志寄存器出棧(2)using n修飾符不能用于有返回值的函數(shù),因為修飾符不能用于有返回值的函數(shù),因為C51函函數(shù)的返回值是放在寄存器中的。如寄存器組改變了,返回值就數(shù)的返回值是放在寄存器中的。如寄存器組改變了,返回值就會出錯。會出錯。3.5 絕對地址的訪問絕對地址的訪問一使用一使用C51運行庫中預(yù)定義宏運行庫中預(yù)定義宏C51編譯器提供了一組宏定義來對編譯器提供了一組宏定義來對51系列單片機的系列單片機的code、data、pdata和和xdata空間進行絕對尋址??臻g進行絕對尋址。這些函數(shù)原型放在這些函數(shù)原型放在absacc.h文件中。使用時須用預(yù)處理命令把該文件中。使用時須用預(yù)處理命令把該頭文件包含到文件中,形式為:頭文件包含到文件中,形式為:#include CBYTE以字節(jié)形式對以字節(jié)形式對code區(qū)尋址,區(qū)尋址,DBYTE以字節(jié)形式對以字節(jié)形式對data區(qū)尋址,區(qū)尋址,PBYTE以

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論