51單片機(jī)C語言應(yīng)用與開發(fā)()_第1頁(yè)
51單片機(jī)C語言應(yīng)用與開發(fā)()_第2頁(yè)
51單片機(jī)C語言應(yīng)用與開發(fā)()_第3頁(yè)
51單片機(jī)C語言應(yīng)用與開發(fā)()_第4頁(yè)
51單片機(jī)C語言應(yīng)用與開發(fā)()_第5頁(yè)
已閱讀5頁(yè),還剩78頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、51單片機(jī)C語言應(yīng)用與開發(fā)第2章 C51程序設(shè)計(jì) 第2章 C51程序設(shè)計(jì)C51程序設(shè)計(jì)語言是一種編譯型程序設(shè)計(jì)語言,兼顧了許多高級(jí)語言的特點(diǎn)和一定的匯編語言功能。書寫格式比較自由,具有完善的模塊化程序結(jié)構(gòu),語言中含有功能豐富的庫(kù)函數(shù)。具有運(yùn)算速度快,編譯效率高,可移植性好等優(yōu)點(diǎn),而且可以實(shí)現(xiàn)對(duì)系統(tǒng)硬件的直接控制。使用C語言進(jìn)行程序設(shè)計(jì)已成為目前單片機(jī)及嵌入式系統(tǒng)開發(fā)的主流。本章主要介紹C51程序設(shè)計(jì)的根本方法,意在將C語言程序設(shè)計(jì)與單片機(jī)控制結(jié)合起來,為后面學(xué)習(xí)單片機(jī)控制系統(tǒng)的開發(fā)打下一定的根底。本章重點(diǎn)C51的數(shù)據(jù)類型位標(biāo)量和可尋址位變量、特殊功能存放器型數(shù)據(jù)變量的存儲(chǔ)類型及定義指針的定義和

2、使用結(jié)構(gòu)的定義和使用C51的運(yùn)算符與表達(dá)式中斷效勞函數(shù)的定義和使用編譯預(yù)處理C語言與匯編語言的混合編程第2章 C51程序設(shè)計(jì)本章難點(diǎn)位標(biāo)量的定義和可尋址位重命名的區(qū)別特殊功能存放器型數(shù)據(jù)的定義和特點(diǎn)變量的存儲(chǔ)類型及定義結(jié)構(gòu)體和聯(lián)合體的定義和使用C51的特殊運(yùn)算符中斷效勞函數(shù)的定義和使用編譯預(yù)處理C語言和匯編語言的混合編程第2章 C51程序設(shè)計(jì)本章各章節(jié)安排2.1 Keil C512.2 C51的數(shù)據(jù)類型2.3 運(yùn)算符與表達(dá)式2.4 流程控制語句2.5 函數(shù)2.6 編譯預(yù)處理2.7 C語言和匯編語言混合編程第2章 C51程序設(shè)計(jì)第2章 C51程序設(shè)計(jì) 2. 1 Keil C51 2.1.1 Ke

3、il C51的主要功能模塊C51優(yōu)化C編譯器;A51宏匯編器;80C51工具連接器、目標(biāo)文件轉(zhuǎn)換器、庫(kù)管理器 ;Windows版dScope源程序調(diào)試器/模擬器; Windows版Vision集成開發(fā)環(huán)境。 第2章 C51程序設(shè)計(jì)2. 1.2 Keil C51的編程步驟使用Keil C51編程和用其他軟件開發(fā)工程時(shí)大致一樣,按以下步驟編程:創(chuàng)立C或匯編語言源程序; 編譯或匯編源文件運(yùn)算符; 糾正源文件中的錯(cuò)誤; 連接產(chǎn)生目標(biāo)文件; 模擬調(diào)試用戶程序。 第2章 C51程序設(shè)計(jì)Keil C51編譯器在遵循ANSI標(biāo)準(zhǔn)的同時(shí),也專為8051系列微控制器進(jìn)行了特別的設(shè)計(jì)。Keil C51編譯器與標(biāo)準(zhǔn)的

4、ANSI C語言編譯器相比,主要區(qū)別在于前者對(duì)C語言的擴(kuò)展能讓用戶充分使用51單片機(jī)的所有資源。這些差異主要表現(xiàn)在以下幾個(gè)方面:8051的存儲(chǔ)類型; 存儲(chǔ)模式; 數(shù)據(jù)類型; C51指針; 函數(shù)。相對(duì)于ANSI 的C編譯器而言,Keil C51編譯器的大多數(shù)擴(kuò)展功能都是直接針對(duì)8051系列微處理器的。充分理解其區(qū)別和特點(diǎn)、深入理解并應(yīng)用C51對(duì)標(biāo)準(zhǔn)ANSI C的擴(kuò)展,是學(xué)習(xí)C51的關(guān)鍵之一。有關(guān)Keil C51集成開發(fā)環(huán)境的具體使用將在第五章詳細(xì)介紹。 第2章 C51程序設(shè)計(jì) 2. 2 C51的數(shù)據(jù)類型 數(shù)據(jù):具有一定格式的數(shù)字或數(shù)值 。數(shù)據(jù)是計(jì)算機(jī)操作的對(duì)象,任何程序設(shè)計(jì)都離不開對(duì)于數(shù)據(jù)的處理

5、。數(shù)據(jù)類型 :數(shù)據(jù)的不同存儲(chǔ)格式 。數(shù)據(jù)結(jié)構(gòu) :數(shù)據(jù)按一定的數(shù)據(jù)類型進(jìn)行排列、組合、架構(gòu) ,數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中的存放情況由數(shù)據(jù)結(jié)構(gòu)決定 。 C語言的數(shù)據(jù)結(jié)構(gòu)是以數(shù)據(jù)類型出現(xiàn)的 :包括根本類型、構(gòu)造類型、指針類型以及空類型等 。根本類型有位(bit)、字符(char)、整型(int)、短整型(short)、長(zhǎng)整型(1ong)、浮點(diǎn)型(float)以及雙精度浮點(diǎn)型(double)等;構(gòu)造類型包括數(shù)組(array)、結(jié)構(gòu)體(struct)、共用體(union)以及枚舉類型(enum)等。第2章 C51程序設(shè)計(jì)對(duì)于單片機(jī)編程而言,支持的數(shù)據(jù)類型和編譯器有關(guān),比方在C51編譯器中整型(int)和短整型(

6、short)相同,浮點(diǎn)型(float)和雙精度浮點(diǎn)型(double)相同。表2-1列出了C51的數(shù)據(jù)類型。第2章 C51程序設(shè)計(jì)char字符類型字符型char分為有符號(hào)字符型signed char和無符號(hào)字符型unsigned char兩種,默認(rèn)值為有符號(hào)型。字符型數(shù)據(jù)長(zhǎng)度為一個(gè)字節(jié)。有符號(hào)字符型數(shù)據(jù)字節(jié)中的最高位為符號(hào)位,“0表示正數(shù),“1表示負(fù)數(shù),負(fù)數(shù)用補(bǔ)碼表示。無符號(hào)字符型數(shù)據(jù)字節(jié)中的位均用來表示數(shù)本身,而不包括符號(hào),其數(shù)值范圍為0255。int整型整型int同樣分為有符號(hào)整型(signed int)和無符號(hào)整型(unsigned int)兩種,默認(rèn)值為有符號(hào)整型。整型數(shù)據(jù)長(zhǎng)度為兩個(gè)字節(jié)

7、。 long長(zhǎng)整型長(zhǎng)整型(long)也分為有符號(hào)長(zhǎng)整型(signed long)和無符號(hào)長(zhǎng)整型(unsigned long)兩種,默認(rèn)值為有符號(hào)長(zhǎng)整型。長(zhǎng)整型數(shù)據(jù)長(zhǎng)度為四個(gè)字節(jié)。第2章 C51程序設(shè)計(jì)float浮點(diǎn)型單精度浮點(diǎn)型 (float)數(shù)據(jù)占用四個(gè)字節(jié)32位二進(jìn)制數(shù),在內(nèi)存中的存放格式如下: 其中,S為符號(hào)位,位于最高字節(jié)的最高位?!?表示負(fù)數(shù),“O表示正數(shù)。E為階碼,占用8位二進(jìn)制數(shù),存放在兩個(gè)高字節(jié)中。為了防止出現(xiàn)負(fù)的階碼值,階碼E值是以2為底的指數(shù)再加上偏移量127,指數(shù)可正可負(fù)。階碼E的正常取值范圍為1254,那么實(shí)際指數(shù)的取值范圍為-126+127。M為尾數(shù)的小數(shù)局部,用23

8、位二進(jìn)制數(shù)表示,存放在三個(gè)低字節(jié)中。尾數(shù)的整數(shù)局部永遠(yuǎn)為l,因此尾數(shù)隱含存在,不予保存。小數(shù)點(diǎn)位于隱含的整數(shù)位“1后面。一個(gè)浮點(diǎn)數(shù)的數(shù)值范圍是(-1)S2E-127(1.M)。例如: 第2章 C51程序設(shè)計(jì)浮點(diǎn)數(shù)124.75=42F94000H,在內(nèi)存中的存放格式為: 需要指出的是,浮點(diǎn)型數(shù)據(jù)除了有正常數(shù)值之外,還可能出現(xiàn)非正常數(shù)值。根據(jù)IEEE標(biāo)準(zhǔn),當(dāng)浮點(diǎn)型數(shù)據(jù)取以下數(shù)值(16進(jìn)制數(shù))時(shí)即為非正常值: FFFFFFFFH 非數(shù)(NaN) 7F800000H 正溢出(+INF) FF800000H 負(fù)溢出(-INF)另外,8051單片機(jī)不包括捕獲浮點(diǎn)運(yùn)算錯(cuò)誤的中斷向量,需要用戶依據(jù)可能出現(xiàn)的錯(cuò)

9、誤條件用軟件方法進(jìn)行相應(yīng)的處理。 第2章 C51程序設(shè)計(jì)* 指針型在C51中指針變量的長(zhǎng)度一般為13個(gè)字節(jié)。指針變量也具有類型,其表示方法是在指針符號(hào)“*的前面冠以數(shù)據(jù)類型符號(hào)。如:char *point1,表示point1是一個(gè)字符型的指針變量;float *point2,表示point2是一個(gè)浮點(diǎn)型的指針變量 。指針變量的類型表示該指針?biāo)赶虻刂分袛?shù)據(jù)的類型,使用指針型變量可以方便地對(duì)8051單片機(jī)的各局部物理地址直接進(jìn)行操作。bit位標(biāo)量位標(biāo)量bit是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可定義一個(gè)位變量,但不能定義位指針,也不能定義位數(shù)組。第2章 C51程序設(shè)計(jì)位標(biāo)量用關(guān)鍵字“bit定

10、義,是一個(gè)二進(jìn)制位。函數(shù)中可以包含bit類型的參數(shù),函數(shù)的返回值也可以為bit型。位標(biāo)量用于定義一個(gè)標(biāo)量,表示某個(gè)二進(jìn)制位的值,這對(duì)能直接進(jìn)行位操作的80C51來說,很有實(shí)用價(jià)值。它的語法結(jié)構(gòu)是: bit 標(biāo)量名; 例如: bit flag; /定義一個(gè)位標(biāo)量flag,作為程序中的一個(gè)標(biāo)志位sfr特殊功能存放器特殊功能存放器型數(shù)據(jù)sfr是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可以訪問8051單片機(jī)內(nèi)的所有特殊功能存放器。sfr型數(shù)據(jù)占用一個(gè)字節(jié)內(nèi)存單元,取值范圍為0255。第2章 C51程序設(shè)計(jì)sfrl616位特殊功能存放器型數(shù)據(jù)sfr16,占用兩個(gè)字節(jié)的內(nèi)存單元,取值范圍為065535。 s

11、bit可尋址位 可尋址位(sbit)是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可以訪問8051單片機(jī)內(nèi)部RAM中的可尋址位或特殊功能存放器中的可尋址位。例如: sfr P0=0 x80; /將8051單片機(jī)的P0的口地址定義為0 x80 sbit FLAG1=P01; /將PO.1位定義為FLAG1 bit和sbit的主要區(qū)別是 :bit定義的是一個(gè)標(biāo)量 而sbit是將一個(gè)的位重命名 第2章 C51程序設(shè)計(jì)2.2.1 常量 在程序運(yùn)行過程中,其值不能被改變的量稱為常量。常量的數(shù)據(jù)類型有整型、浮點(diǎn)型、字符型和字符串型等。 1整型常量整型常量就是整型常數(shù),可表示為以下幾種形式:十進(jìn)制整數(shù):如1234

12、、-5678、0等。十六進(jìn)制整數(shù):以0 x開頭的數(shù)是十六進(jìn)制數(shù),如0 x123表示十六進(jìn)制數(shù)123H,相當(dāng)于十進(jìn)制數(shù)291。-Ox1a表示十六進(jìn)制數(shù)-1aH,相當(dāng)于十進(jìn)制數(shù)-26。ANSI C標(biāo)準(zhǔn)規(guī)定十六進(jìn)制數(shù)的數(shù)字為09,再加字母af。長(zhǎng)整數(shù):在數(shù)字后面加一個(gè)字母L就構(gòu)成了長(zhǎng)整數(shù),如2048L、0123L、0 xffOOL等。 第2章 C51程序設(shè)計(jì)2. 浮點(diǎn)型常量浮點(diǎn)型常量有十進(jìn)制數(shù)和指數(shù)兩種表示形式。十進(jìn)制數(shù)表示形式又稱定點(diǎn)表示形式,由數(shù)字和小數(shù)點(diǎn)組成。如 :0.3141、.3141、314.1、3141.及0.0都是十進(jìn)制數(shù)表示形式的浮點(diǎn)型常量。在這種表示形式中,如果整數(shù)或小數(shù)局部為0

13、可以省略不寫,但必須有小數(shù)點(diǎn)。指數(shù)表示形式為; 數(shù)字.數(shù)字e數(shù)字 其中,為可選項(xiàng),其中的內(nèi)容根據(jù)具體情況可有可無,其它局部為必須項(xiàng)。如123e4.5e6、-7.0e-8等都是合法的指數(shù)形式的浮點(diǎn)型常量;而e9、5e4.3和e都是不合法的表示形式。 第2章 C51程序設(shè)計(jì)3. 字符型常量在C語言中,字符常量是用單引號(hào)括起來的單個(gè)字符。例如a,b等。對(duì)不可顯示的控制字符,可以在該字符前面加一反斜杠“構(gòu)成專用轉(zhuǎn)義字符。轉(zhuǎn)義字符可以完成一些特殊功能和輸出時(shí)的格式控制。常用轉(zhuǎn)義字符如表2-2所示。第2章 C51程序設(shè)計(jì)4字符串常量字符串型常量是由一對(duì)雙引號(hào)“括起的字符序列,如“ABCD、“$1234等都

14、是字符串常量。當(dāng)雙引號(hào)內(nèi)的字符個(gè)數(shù)為0時(shí),稱為空串常量。需要注意的是,字符串常量首尾的雙引號(hào)是界限符,當(dāng)需要表示雙引號(hào)字符串時(shí),要使用轉(zhuǎn)義字符“。 如printf(“He said I am a studentn)。 第2章 C51程序設(shè)計(jì)2.2.3 數(shù)組數(shù)組是一組具有固定數(shù)目和相同類型數(shù)組元素的有序集合,其數(shù)組元素的類型為該數(shù)組的根本類型。構(gòu)成一個(gè)數(shù)組的各元素必須是同一類型的變量,不允許在同一數(shù)組中出現(xiàn)不同類型的變量。 數(shù)組數(shù)據(jù)是用同一個(gè)名字的不同下標(biāo)訪問的,例如數(shù)組ai,當(dāng)i0,1,2,n時(shí)a0,a1,an分別是數(shù)組ai的元素(或成員)。數(shù)組有一維、二維、三維、多維數(shù)組之分。常用的有一維、

15、二維數(shù)組和字符數(shù)組。第2章 C51程序設(shè)計(jì)變量的存儲(chǔ)種類有四種: 自動(dòng)(auto) 外部(extern) 靜態(tài)(static) 存放器(register 在定義一個(gè)變量時(shí)如果省略存儲(chǔ)種類選項(xiàng),那么該變量將為自動(dòng)(auto)變量。變量的數(shù)據(jù)類型有 :位變量 字符型變量 整型變量 浮點(diǎn)型變量 第2章 C51程序設(shè)計(jì)變量的存儲(chǔ)器類型定義一個(gè)變量時(shí)除了需要說明其存儲(chǔ)種類、數(shù)據(jù)類型之外,C51編譯器還允許說明變量的存儲(chǔ)器類型。Keil C51編譯器完全支持8051系列單片機(jī)的硬件結(jié)構(gòu),可以訪問其硬件系統(tǒng)的所有局部。對(duì)每個(gè)變量可以準(zhǔn)確地賦予其存儲(chǔ)器類型,從而可使其能在單片機(jī)系統(tǒng)內(nèi)準(zhǔn)確地定位。存儲(chǔ)類型與80

16、51單片機(jī)實(shí)際存儲(chǔ)空間的對(duì)應(yīng)關(guān)系如表2-3所示。第2章 C51程序設(shè)計(jì)code存儲(chǔ)器類型對(duì)應(yīng)64KB程序存儲(chǔ)器空間。程序存儲(chǔ)器是只讀不寫的,如果將變量定義成code存儲(chǔ)器類型,那么這個(gè)變量的值只能允許訪問和引用,不能修改。該存儲(chǔ)空間除存放程序語句的機(jī)器碼外,還可存儲(chǔ)各種查尋表。C51程序中將變量定義為code存儲(chǔ)器類型,可以完成與匯編語言相同的功能。data存儲(chǔ)器類型定義的變量存儲(chǔ)在內(nèi)部RAM的低128字節(jié)地址空間。data存儲(chǔ)器類型對(duì)應(yīng)的空間主要用作數(shù)據(jù)區(qū)。該存儲(chǔ)區(qū)內(nèi),指令用一個(gè)或兩個(gè)周期來訪問數(shù)據(jù),在所有區(qū)內(nèi)訪問中速度最快。通常將使用較頻繁的變量、局部變量或用戶自定義變量存儲(chǔ)在data區(qū)。

17、 bdata存儲(chǔ)器類型對(duì)應(yīng)的空間稱為位尋址區(qū),即bdata區(qū)。該區(qū)的范圍是從片內(nèi)RAM地址20H開始到2FH結(jié)束,包括16字節(jié),共128個(gè)可以尋址的位,每一位都可單獨(dú)操作。80C51有17條位操作指令,程序控制非常方便,并且有助于軟件代替外部組合邏輯。位尋址區(qū)的這16字節(jié)也可以進(jìn)行字節(jié)尋址。 第2章 C51程序設(shè)計(jì)使用xdata存儲(chǔ)類型定義常量、變量時(shí),C51編譯器會(huì)將其定位在外部數(shù)據(jù)存儲(chǔ)空間(片外RAM),該空間位于片外附加的8K、16K,32K或64K RAM芯片中,其最大尋址范圍為64K。要使用外部數(shù)據(jù)區(qū)信息時(shí),需用指令將其移動(dòng)到內(nèi)部數(shù)據(jù)區(qū),數(shù)據(jù)處理完成后,結(jié)果再返回到片外數(shù)據(jù)存儲(chǔ)區(qū)。片

18、外數(shù)據(jù)存儲(chǔ)區(qū)主要用于存放不經(jīng)常使用的變量,或收集等待處理的數(shù)據(jù),或存放要被發(fā)往另一臺(tái)計(jì)算機(jī)的數(shù)據(jù)。 pdata存儲(chǔ)類型屬于xdata類型,它的一字節(jié)地址(高8位)被妥善保存在P2口中,用于I/O操作。idata存儲(chǔ)類型可以間接尋址全部?jī)?nèi)部數(shù)據(jù)存儲(chǔ)器空間(可以超過127個(gè)字節(jié))。 第2章 C51程序設(shè)計(jì)存儲(chǔ)器模式存儲(chǔ)模式?jīng)Q定了變量的默認(rèn)存儲(chǔ)類型,C51提供了3種存儲(chǔ)器模式來存儲(chǔ)變量。定義變量時(shí)如果省略“存儲(chǔ)器類型選項(xiàng),系統(tǒng)那么會(huì)按編譯模式SMALL、COMPACT或LARGE所規(guī)定的默認(rèn)存儲(chǔ)器類型確定變量的存儲(chǔ)區(qū)域,不能位于存放器中的參數(shù)傳遞變量和過程變量也保存在默認(rèn)的存儲(chǔ)器區(qū)域。無論什么存儲(chǔ)模

19、式都可以聲明變量在任何的80C51存儲(chǔ)區(qū)范圍,而把最常用的命令如循環(huán)計(jì)數(shù)器和隊(duì)列索引放在內(nèi)部數(shù)據(jù)區(qū),可以顯著地提高系統(tǒng)性能。需要特別指出的是,變量的存儲(chǔ)種類與存儲(chǔ)器類型是完全無關(guān)的。 C51系統(tǒng)的存儲(chǔ)模式,可以在源程序中用語句直接定義,也可以在C51的源程序調(diào)試集成軟件環(huán)境中,通過對(duì)某個(gè)工程文件的選項(xiàng)來設(shè)置。 第2章 C51程序設(shè)計(jì)SMALL存儲(chǔ)模式 SMALL存儲(chǔ)模式也叫小模式,該模式中,C51把所有函數(shù)變量和局部數(shù)據(jù)段,以及所有參數(shù)傳遞,都放在內(nèi)部數(shù)據(jù)存儲(chǔ)器data區(qū),因此這種存儲(chǔ)模式的優(yōu)勢(shì)為數(shù)據(jù)存取速度很快,但small存儲(chǔ)模式的地址空間受限,因?yàn)樵L問速度快,在寫小型應(yīng)用程序時(shí),變量和數(shù)

20、據(jù)應(yīng)放在data內(nèi)部數(shù)據(jù)存儲(chǔ)器。而在較大的應(yīng)用程序中data區(qū)最好只存放小的變量、數(shù)據(jù)或常用的變量(如循環(huán)計(jì)數(shù)、數(shù)據(jù)索引),而大的數(shù)據(jù)應(yīng)放置在其他存儲(chǔ)區(qū)域。 COMPACT存儲(chǔ)模式 COMPACT存儲(chǔ)模式又稱為壓縮的存儲(chǔ)模式,該模式下,所有的函數(shù)、程序變量和局部數(shù)據(jù)段定位在80C51嵌入式系統(tǒng)的pdata區(qū)。外部數(shù)據(jù)存儲(chǔ)區(qū)采用分頁(yè)訪問,每頁(yè)256字節(jié),最多256頁(yè),通過存放器R0和R1對(duì)pdata區(qū)的數(shù)據(jù)進(jìn)行間接尋址,比使用DPTR要快一些。第2章 C51程序設(shè)計(jì)LARGE存儲(chǔ)模式 LARGE存儲(chǔ)模式也叫大模式,該模式中,所有函數(shù)和過程的變量和局部數(shù)據(jù)段都定位在80C51的外部數(shù)據(jù)存儲(chǔ)器中,容

21、量最多可支持64 KB,要求使用DPTR數(shù)據(jù)指針訪問數(shù)據(jù)或定義成xdada的存儲(chǔ)器類型。 關(guān)于存儲(chǔ)模式的設(shè)置,要注意以下兩點(diǎn) 如果用參數(shù)傳遞和分配再入函數(shù)的堆棧,應(yīng)盡量使用SMALL存儲(chǔ)模式。Keil C51盡量使用內(nèi)部存放器組進(jìn)行參數(shù)傳遞,在存放器組中可以傳遞參數(shù)的數(shù)量和壓縮存儲(chǔ)模式一樣,再入函數(shù)的模擬棧將在xdata中,由于對(duì)xdata區(qū)數(shù)據(jù)的訪問最慢,所以要仔細(xì)考慮變量應(yīng)存儲(chǔ)的位置,使數(shù)據(jù)的存儲(chǔ)速度得到優(yōu)化。 第2章 C51程序設(shè)計(jì)可以使用混合存儲(chǔ)模式。Keil允許使用混合的存儲(chǔ)模式,這點(diǎn)在大存儲(chǔ)模式中是非常有用的。在大存儲(chǔ)器模式下,有些過程對(duì)數(shù)據(jù)傳遞的速度要求很高,就把過程定義在小存儲(chǔ)

22、模式存放器中,這使得編譯器為該過程的局部變量在內(nèi)部RAM中分配存儲(chǔ)空間并保證所有參數(shù)都通過內(nèi)部RAM進(jìn)行傳遞。在小模式下,有些過程需要大量存儲(chǔ)空間,可以把過程聲明為壓縮模式或大模式,這種過程中的局部變量將被存儲(chǔ)在外部存儲(chǔ)區(qū)中,也可以通過過程中的變量聲明,把變量分配在xdata段中。 重新定義數(shù)據(jù)類型C語言程序中,除了可以采用以上介紹的數(shù)據(jù)類型外,用戶還可以根據(jù)需要對(duì)數(shù)據(jù)類型重新定義。重新定義時(shí)需用到關(guān)鍵字typedef,定義方法如下: typedef 已有的數(shù)據(jù)類型 新的數(shù)據(jù)類型名;第2章 C51程序設(shè)計(jì)其中“已有的數(shù)據(jù)類型是指C語言中所有的數(shù)據(jù)類型,包括結(jié)構(gòu)、指針和數(shù)組等,“新的數(shù)據(jù)類型名可

23、按用戶習(xí)慣或需要決定。關(guān)鍵字typedef的作用是將C語言中已有的數(shù)據(jù)類型作了置換,可用置換后的新數(shù)據(jù)類型名定義變量。例如: typedef int word; /定義word為新的整型數(shù)據(jù)類型名 word i,j; /將i,j定義為int型變量在這個(gè)例子中,先用關(guān)鍵字typedef將word定義為新的整型數(shù)據(jù)類型,定義的過程實(shí)際上是用word置換了int,因此下面就可以直接用word對(duì)變量i,j進(jìn)行定義。而此時(shí)word等效于int,所以i,j被定義成整型變量。一般而言,對(duì)typedef定義的新數(shù)據(jù)類型用大寫字母表示,以便與C語言中原有的數(shù)據(jù)類型相區(qū)別。另外還要注意,用typedef可以定義各

24、種新的數(shù)據(jù)類型名,但不能直接用來定義變量。typedef只是對(duì)已有的數(shù)據(jù)類型作了一個(gè)名字上的置換,并沒有創(chuàng)造出一個(gè)新的數(shù)據(jù)類型,例如前面例子中的word,它只是int類型的一個(gè)新名字而已。第2章 C51程序設(shè)計(jì)2.2.3 數(shù)組數(shù)組是一組具有固定數(shù)目和相同類型數(shù)組元素的有序集合,其數(shù)組元素的類型為該數(shù)組的根本類型。構(gòu)成一個(gè)數(shù)組的各元素必須是同一類型的變量,不允許在同一數(shù)組中出現(xiàn)不同類型的變量。數(shù)組數(shù)據(jù)是用同一個(gè)名字的不同下標(biāo)訪問的,例如數(shù)組ai,當(dāng)i0,1,2,n時(shí)a0,a1,an分別是數(shù)組ai的元素(或成員)。數(shù)組有一維、二維、三維、多維數(shù)組之分。常用的有一維、二維數(shù)組和字符數(shù)組。第2章 C5

25、1程序設(shè)計(jì)數(shù)組的定義和賦值 一維數(shù)組 數(shù)據(jù)類型 數(shù)組名整型表達(dá)式例如char chl0定義了一個(gè)一維字符型數(shù)組,它有10個(gè)元素,每個(gè)元素由不同的下標(biāo)表示,分別為ch0,ch1,ch2,ch9。注意:數(shù)組的第一個(gè)元素的下標(biāo)為0而不是1,即數(shù)組的第一個(gè)元素是ch0而不是chl,而數(shù)組的第十個(gè)元素為ch9。 二維數(shù)組 數(shù)據(jù)類型 數(shù)組名常量表達(dá)式常量表達(dá)式例如int a35定義了3行5列共15個(gè)元素的二維數(shù)組a。二維數(shù)組的存取順序是:按行存取,先存取第一行元素的第0列,1列,2列,直到第一行的最后一列。然后返回到第二行開始,再取第二行的第0列,1列,直到第二行的最后一列。,如此順序下去,直到最后一行的

26、最后一列。第2章 C51程序設(shè)計(jì) C語言允許使用多維數(shù)組,有了二維數(shù)組的根底,理解掌握多維數(shù)組并不困難。例如,float a234定義了一個(gè)類型為浮點(diǎn)數(shù)的三維數(shù)組。 數(shù)組的初始化 所謂數(shù)組初始化,就是在定義說明數(shù)組的同時(shí)給數(shù)組賦新值。這項(xiàng)工作是在程序的編譯中完成的。對(duì)數(shù)組的初始化可用以下方法實(shí)現(xiàn): 在定義數(shù)組時(shí)對(duì)數(shù)組的全部元素賦予初值,例: int idata a60,1,2,3,4,5;int a341,2,3,4,5,6,7,8,9,10,11,12;int a341,2,3,4,5,6,7,8,9,10,11,12;第2章 C51程序設(shè)計(jì) 只對(duì)數(shù)組的局部元素初始化,例: int idat

27、a a10(0,l,2,3,4,5);int a34=1,5,9; 假設(shè)定義數(shù)組時(shí)對(duì)數(shù)組的全部元素均不賦予初值,那么數(shù)組的全部元素被缺省地賦值為0。int idata a10;那么a0a9全部被賦初值0。字符數(shù)組 用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組。在字符數(shù)組中,一個(gè)元素存放一個(gè)字符,因此可以用字符數(shù)組存貯長(zhǎng)度不同的字符串。 字符數(shù)組的定義 字符數(shù)組的定義與前面的數(shù)組定義方法類似。如char a10,定義a為一個(gè)有10字符的一維字符數(shù)組。字符數(shù)組置初值 第2章 C51程序設(shè)計(jì)字符數(shù)組置初值最直接的方法是將各字符逐個(gè)賦給數(shù)組中的各個(gè)元素。如:char a10B,E,I,J,I,N,G,0;定義了一

28、個(gè)字符型數(shù)組a,有10個(gè)數(shù)組元素,并且將9個(gè)字符(其中包括一個(gè)字符串結(jié)束標(biāo)志0)分別賦給了a0a8,剩余的a9被系統(tǒng)自動(dòng)賦予空格字符。其狀態(tài)如下圖:C語言還允許用字符串直接給字符數(shù)組置初值,其方法有以下兩種形式: char a10“BEI JING; char a10“BEI JING用雙引號(hào)“括起來的一串字符,稱為字符串常量。比方“Happy。C編譯器會(huì)自動(dòng)地在字符末尾加上結(jié)束符0(NULL)。用單引號(hào)括起來的字符為字符的ASCII碼值,而不是字符串。比方a表示a的ASCII碼值97,而“a表示一個(gè)字符串,它由兩個(gè)字符a和0組成。 第2章 C51程序設(shè)計(jì)一個(gè)字符串可以用一維數(shù)組來裝入,但數(shù)組

29、的元素?cái)?shù)目一定要比字符多一個(gè),以便C編譯器自動(dòng)在其后面參加結(jié)束符0。假設(shè)干個(gè)字符串可以裝入一個(gè)二維字符數(shù)組中,稱為字符數(shù)組。數(shù)組的第一個(gè)下標(biāo)是字符串的個(gè)數(shù),第二個(gè)下標(biāo)定義每個(gè)字符串的長(zhǎng)度,該長(zhǎng)度應(yīng)當(dāng)比這批字符串中最長(zhǎng)的串多一個(gè)字符,用于裝入字符串的結(jié)束符0。 比方char a6081,定義了一個(gè)二維字符數(shù)組a,它可容納60個(gè)字符串,每串最長(zhǎng)可達(dá)80個(gè)字符。例: uchar code msg17This is a test,n), message 1,n ,message 2,n ; 這是一個(gè)二維數(shù)組,第二個(gè)下標(biāo)必須給定,因?yàn)樗荒軓臄?shù)據(jù)表中得到,第一個(gè)下標(biāo)可缺省由數(shù)據(jù)常量表決定(本例中實(shí)際為3

30、)。第2章 C51程序設(shè)計(jì)指針 指針有兩個(gè)根本概念,即變量的指針和指向變量的指針變量(簡(jiǎn)稱指針變量)。變量的指針就是變量的地址。假設(shè)有一個(gè)變量專門用來存放另一個(gè)變量的地址(即指針),那么該變量稱為指向變量的指針變量(簡(jiǎn)稱指針變量)。指針變量的值是指針。指針變量的定義 指針變量是含有一個(gè)數(shù)據(jù)對(duì)象地址的特殊變量,有關(guān)的運(yùn)算符有兩個(gè),即取地址運(yùn)算符和間接訪問運(yùn)算符*。例如:a為地址,*P為指針變量所指向的變量。指針變量的定義與一般變量的定義類似,其一般形式為: 數(shù)據(jù)類型存儲(chǔ)器類型 *指針變量名; 其中,“數(shù)據(jù)類型說明了該指針變量所指向的變量的類型,存儲(chǔ)器類型為可選項(xiàng),是C51編譯器的一種擴(kuò)展。第2章

31、 C51程序設(shè)計(jì)這里是用&i對(duì)ip初始化,而不是對(duì)*ip初始化。與一般變量一樣,對(duì)外部或靜態(tài)指針變量,在定義中假設(shè)不帶初始化項(xiàng),指針變量被初始化為NULL,其值為0。C51中規(guī)定,當(dāng)指針值為0時(shí),指針不指向任何有效數(shù)據(jù),有時(shí)也稱該類指針為空指針。因此,當(dāng)調(diào)用一個(gè)返回指針的函數(shù)時(shí),常使用返回值為NULL來指示函數(shù)調(diào)用中某些錯(cuò)誤情況的發(fā)生。下面是指針變量定義的例子: char xdata *p1; /在xdata存儲(chǔ)器中定義一個(gè)指向?qū)ο箢愋蜑閏har的基于存儲(chǔ)器的指針 int *p2; /指向一個(gè)指向?qū)ο箢愋蜑閕nt的一般 指針變量的引用 第2章 C51程序設(shè)計(jì)指針變量中只能存放地址,在使用中不要

32、將一個(gè)整數(shù)賦給一指針變量。下面的賦值是不合法的: int *p; p=100;假設(shè) int i=35,x; int *p; 這里定義了兩個(gè)整型變量i、x,還定義了一個(gè)指向整型數(shù)的指針變量p。i、x中可存放整數(shù),而p只能存放整型變量的地址。 變量定義:int i,x,y,*px,*py; 變量賦值: p=i; /將變量i的地址賦給指針變量p,使p指向i *p+=1; /等價(jià)于i+=i; (*p)+; /等價(jià)于i+;指向相同類型數(shù)據(jù)的指針之間可以相互賦值,例如:px=py; 假設(shè)原來指針px指向x、py指向y,經(jīng)上述賦值后,px和py都指向y。第2章 C51程序設(shè)計(jì)指針的地址運(yùn)算賦初值。指針變量的

33、初值可以是NULL(零),也可以是變量、數(shù)組、結(jié)構(gòu)以及函數(shù)等地址。例如:int alO,b5;char *cptr1=NULL;int *iptr1=a6;int *iptr2=b;指針與整數(shù)的加減。指針可以與一個(gè)整數(shù)或整數(shù)表達(dá)式進(jìn)行加減運(yùn)算,從而獲得該指針當(dāng)前所指位置前面或后面某個(gè)數(shù)據(jù)的地址。假設(shè)p為一個(gè)指針變量,n為一個(gè)整數(shù),那么pn表示離開指針p當(dāng)前位置的前面或后面第n個(gè)數(shù)據(jù)的地址。 (3) 指針與指針相減,其結(jié)果為一整數(shù)值,但它并不是地址,而是表示兩個(gè)指針之間的距離或成員的個(gè)數(shù)。這兩個(gè)指針必須指向同一類型的數(shù)據(jù)。第2章 C51程序設(shè)計(jì)指針與指針的比較。指向同一類型數(shù)據(jù)的兩個(gè)指針可以比較

34、運(yùn)算,從而獲得兩指針?biāo)傅刂返拇笮£P(guān)系。在計(jì)算指針地址的同時(shí),還可以間接取值運(yùn)算,間接取值的地址應(yīng)該是地址計(jì)算后的結(jié)果,并且必須注意運(yùn)算符的優(yōu)先級(jí)和結(jié)合規(guī)那么。設(shè)p1、p2都是指針,對(duì)于“a=*p1+;,由于運(yùn)算符*和+具有相同的優(yōu)先級(jí)而指針運(yùn)算具有右結(jié)合性,按左結(jié)合原那么,有+、*的運(yùn)算次序,而運(yùn)算符+在p1的后面。因此,上述賦值運(yùn)算的過程是首先將指針p1所指的內(nèi)容賦值給變量a,然后再指向下一數(shù)據(jù),說明是地址增加而不是內(nèi)容增加。對(duì)于“a=*(-)p1;,按左結(jié)合原那么有-、*的運(yùn)算次序,而運(yùn)算符-在p1的前面,因此首先將p1減1,即指向前面一個(gè)數(shù)據(jù),然后再把p1此時(shí)所指的內(nèi)容賦值給變量a。對(duì)

35、于“a=-(*p2)+;,由于使用括號(hào)()使結(jié)合次序變?yōu)?、+,因此首先將所指的內(nèi)容賦值給變量,然后再把所指的內(nèi)容加1,說明是內(nèi)容增加而不是地址增加。 第2章 C51程序設(shè)計(jì)函數(shù)型指針 函數(shù)不是變量,但它在內(nèi)存中仍然需要占據(jù)一定的存儲(chǔ)空間,如果將函數(shù)的入口地址賦給一個(gè)指針,該指針就是函數(shù)型指針。由于函數(shù)型指針指向的是函數(shù)的入口地址,因此可用指向函數(shù)的指針代替函數(shù)名來調(diào)用該函數(shù)。函數(shù)與變量不同,函數(shù)名不能作為參數(shù)直接傳遞給另一個(gè)函數(shù)。但利用函數(shù)型指針,可將函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù)。此外,還可以將函數(shù)型指針放在一個(gè)指針數(shù)組中,那么該指針數(shù)組的每一個(gè)成員都是指向某個(gè)函數(shù)的指針。定義一個(gè)函數(shù)型指針

36、的一般形式為: 數(shù)據(jù)類型 ( *標(biāo)識(shí)符 ) ( ) 其中,“標(biāo)識(shí)符就是所定義的函數(shù)型指針變量名,“數(shù)據(jù)類型說明了該指針?biāo)赶虻暮瘮?shù)返回值的類型。例如“int(*funcl)();,定義了一個(gè)函數(shù)型指針變量funcl,它所指向的函數(shù)返回整型數(shù)據(jù)。函數(shù)型指針變量專門用來存放函數(shù)入口地址,在程序中把哪個(gè)函數(shù)的地址賦給它,它就指向哪個(gè)函數(shù)。在程序中可以對(duì)一個(gè)函數(shù)型指針屢次賦值,該指針可以先后指向不同的函數(shù)。 第2章 C51程序設(shè)計(jì)給函數(shù)型指針賦值的一般形式為: 函數(shù)型指針變量名=函數(shù)名 如果有一個(gè)函數(shù)max(x,y),那么可以用以下賦值語句將函數(shù)的地址賦給函數(shù)型指針func1,使func1指向函數(shù)ma

37、x:Func1=max。 引入了函數(shù)指針后,對(duì)函數(shù)的調(diào)用可采用兩種方法。例如,程序中要求將函數(shù)max(x,y)的值賦給變量z,可采用以下方法: z=max(x,y); z=(*func1)(x,y); 用這兩種方法實(shí)現(xiàn)函數(shù)調(diào)用的結(jié)果完全一致。如果采用函數(shù)型指針調(diào)用函數(shù),必須預(yù)先對(duì)該函數(shù)指針進(jìn)行賦值,使其指向所需調(diào)用的函數(shù)。函數(shù)型指針通常用來將一個(gè)函數(shù)的地址作為參數(shù)傳遞到另一個(gè)函數(shù)。這種方法在調(diào)用的函數(shù)不是某個(gè)固定函數(shù)的場(chǎng)合特別適用。第2章 C51程序設(shè)計(jì)返回指針型數(shù)據(jù)的函數(shù) 在函數(shù)的調(diào)用過程結(jié)束時(shí),被調(diào)用的函數(shù)可以帶回一個(gè)整型數(shù)據(jù)、字符型數(shù)據(jù)等,也可以帶回一個(gè)指針型數(shù)據(jù),即地址。這種返回指針型

38、數(shù)據(jù)的函數(shù)又稱為指針函數(shù),其一般定義形式為: 數(shù)據(jù)類型 *函數(shù)名(參數(shù)表);其中,“數(shù)據(jù)類型說明了所定義的指針函數(shù)在返回時(shí)帶回的指針?biāo)赶虻臄?shù)據(jù)類型。例如:int *p(a,b),定義了一個(gè)指針函數(shù)*p,調(diào)用它以后可以得到一個(gè)指向整型數(shù)據(jù)的指針,即地址。在指針函數(shù)*p的兩側(cè)沒有括號(hào)(),與函數(shù)型指針是完全不同的,使用時(shí)要注意區(qū)分。指針數(shù)組 由于指針本身也是一個(gè)變量,指針數(shù)組適用于指向假設(shè)干個(gè)字符串,使字符串的處理更為方便。 第2章 C51程序設(shè)計(jì)指針數(shù)組的定義方法與普通數(shù)組完全相同,一般形式為: 數(shù)據(jù)類型 *數(shù)組名數(shù)組長(zhǎng)度 例如:int *b5; /指向整型數(shù)據(jù)的2個(gè)指針 char *sptr

39、5; /指向字符型數(shù)據(jù)的5個(gè)指針 指針數(shù)組在使用前往往需要先賦初值。使用指針數(shù)組最典型的場(chǎng)合是通過對(duì)字符數(shù)組賦初值而實(shí)現(xiàn)各維長(zhǎng)度不一致的多維數(shù)組的定義。指針型指針指針型指針?biāo)赶虻氖橇硪粋€(gè)指針變量的地址,故有時(shí)稱為多級(jí)指針。定義一個(gè)指針型指針變量的一般形式為: 數(shù)據(jù)類型 *指針變量名 其中,“數(shù)據(jù)類型說明一個(gè)被指針型指針指向的指針變量所指向的變量數(shù)據(jù)類型。 第2章 C51程序設(shè)計(jì)2.2.5 結(jié)構(gòu)與聯(lián)合結(jié)構(gòu) 結(jié)構(gòu)是一種構(gòu)造類型的數(shù)據(jù),它是將假設(shè)干個(gè)不同類型的數(shù)據(jù)變量有序地組合在一起形成的一種數(shù)據(jù)集合體,組成該集合體的各個(gè)數(shù)據(jù)變量稱為結(jié)構(gòu)成員,整個(gè)集合體使用一個(gè)獨(dú)立的結(jié)構(gòu)變量名。一般來說,結(jié)構(gòu)中的

40、各個(gè)變量之間存在某些關(guān)系,由于結(jié)構(gòu)是將一組相關(guān)聯(lián)的數(shù)據(jù)變量作為一個(gè)整體來進(jìn)行處理,因此在程序中使用結(jié)構(gòu)將利于對(duì)一些復(fù)雜而又具有內(nèi)在聯(lián)系的數(shù)據(jù)進(jìn)行有效的管理。結(jié)構(gòu)變量的定義 結(jié)構(gòu)也是一種數(shù)據(jù)類型,可以使用結(jié)構(gòu)變量,因此像其他類型的變量一樣,在使用結(jié)構(gòu)變量時(shí)要先對(duì)其定義,其一般形式為:第2章 C51程序設(shè)計(jì)struct 結(jié)構(gòu)名 類型變量名 類型變量名結(jié)構(gòu)變量;結(jié)構(gòu)名是結(jié)構(gòu)的標(biāo)識(shí)符不是變量名,其類型為數(shù)據(jù)類型,包括整型、浮點(diǎn)型、字符型、指針型和無值型。在C51中,為結(jié)構(gòu)提供了連續(xù)的存儲(chǔ)空間,成員名用來對(duì)結(jié)構(gòu)內(nèi)部進(jìn)行尋址。例如,定義一個(gè)日期結(jié)構(gòu)類型date,結(jié)構(gòu)變量d,它由3個(gè)成員組成,定義格式如下:

41、struct date int year; char month,day;d;如果需要定義多個(gè)具有相同形式的結(jié)構(gòu)變量,可以先作結(jié)構(gòu)說明,再用結(jié)構(gòu)名來定義變量。例如:struct date d1,d2,d3;第2章 C51程序設(shè)計(jì)結(jié)構(gòu)類型與結(jié)構(gòu)變量是兩個(gè)不同的概念。定義一個(gè)結(jié)構(gòu)類型時(shí)只是給出了該結(jié)構(gòu)的組織形式,并沒有給出具體的組織成員。因此結(jié)構(gòu)名不占用任何存儲(chǔ)空間,也不能對(duì)一個(gè)結(jié)構(gòu)名進(jìn)行賦值、存取和運(yùn)算。而結(jié)構(gòu)變量是一個(gè)結(jié)構(gòu)中的具體成員,編譯器會(huì)給具體的結(jié)構(gòu)變量名分配確定的存儲(chǔ)空間,因此可以對(duì)結(jié)構(gòu)變量名進(jìn)行賦值、存取和運(yùn)算。 結(jié)構(gòu)變量的引用 結(jié)構(gòu)是一個(gè)新的數(shù)據(jù)類型,因此結(jié)構(gòu)變量也可以像其他類型的

42、變量一樣賦值、運(yùn)算,不同的是結(jié)構(gòu)變量以成員作為根本變量。結(jié)構(gòu)成員的一般形式為: 結(jié)構(gòu)變量.成員名第2章 C51程序設(shè)計(jì)結(jié)構(gòu)變量的初始化 使用結(jié)構(gòu)變量之前,要對(duì)其進(jìn)行初始化。例如:struct long int num; /學(xué)號(hào) char name20; /姓名 char sex; /性別 char addr 25; /地址a=04261,“l(fā)i ming,“w,“333 xiangguang road);應(yīng)注意,不能在結(jié)構(gòu)體內(nèi)部給變量賦初值。聯(lián)合 聯(lián)合也是一種新的數(shù)據(jù)類型。在一個(gè)聯(lián)合中可以包含多個(gè)不同類型的數(shù)據(jù)成員,如可以將一個(gè)float型變量、一個(gè)int型變量、一個(gè)char型變量放在同一個(gè)地

43、址開始的內(nèi)存單元中。以上三個(gè)變量在內(nèi)存中的字節(jié)數(shù)不同,但卻都從一個(gè)地址開始存放,即采用了覆蓋技術(shù)。該技術(shù)可使不同的變量分時(shí)使用同一個(gè)內(nèi)存空間,提高內(nèi)存的利用效率。 第2章 C51程序設(shè)計(jì)聯(lián)合的定義定義聯(lián)合類型變量的一般形式為: union 聯(lián)合類型名 數(shù)據(jù)類型 成員名; 數(shù)據(jù)類型 成員名; 聯(lián)合變量名;聯(lián)合類型與結(jié)構(gòu)類型的定義形式相似,但在內(nèi)存分配上兩者有本質(zhì)區(qū)別。結(jié)構(gòu)變量占用的內(nèi)存長(zhǎng)度是其中各個(gè)成員占用內(nèi)存長(zhǎng)度的總和;而聯(lián)合變量占用的內(nèi)存長(zhǎng)度取決于其中最長(zhǎng)成員的長(zhǎng)度。聯(lián)合變量的引用 引用聯(lián)合成員的一般形式為: 聯(lián)合變量名成員名或聯(lián)合變量名一成員名第2章 C51程序設(shè)計(jì)引用聯(lián)合成員時(shí),要注意聯(lián)

44、合變量用法的一致性。聯(lián)合類型中定義的各個(gè)不同類型的成員可以分時(shí)賦值給變量,而所讀取變量的值是最近放入的某一成員的值。因此,在表達(dá)式中對(duì)它進(jìn)行處理時(shí),必須注意其類型與表達(dá)式所要求的類型保持一致,否那么將導(dǎo)致程序運(yùn)行出錯(cuò)。不能只引用聯(lián)合變量,如“printf(“f,a)是錯(cuò)誤的。因?yàn)樽兞靠赡苁锹?lián)合三種類型,分別占用不同長(zhǎng)度的內(nèi)存空間,假設(shè)在引用時(shí)只寫聯(lián)合變量名,系統(tǒng)難以確定應(yīng)輸出哪一個(gè)聯(lián)合成員的值。應(yīng)該寫為“printf(“f,a.i);。聯(lián)合類型的數(shù)據(jù)可以采用同一個(gè)內(nèi)存段來存放幾種不同類型成員的值。但在每一瞬間只能存放其中一種類型的成員,而不能同時(shí)存幾種,即每一瞬間只有一個(gè)成員起作用。起作用的是

45、聯(lián)合中最后一次存放的成員,如存入了一個(gè)新的成員,那么上次存人的成員就失去作用。例如: a.i=2078: a.j=76; a.k=10:第2章 C51程序設(shè)計(jì)在執(zhí)行以上三條賦值語句后,只有a.k是有效的,而a.i和a.j都已失去作用。因此在引用聯(lián)合變量時(shí),一定要注意當(dāng)前在聯(lián)合變量中存放的究竟是哪一個(gè)成員。不能直接對(duì)聯(lián)合變量進(jìn)行賦值,也不能在定義聯(lián)合變量時(shí)對(duì)它進(jìn)行初始化。聯(lián)合變量不能作函數(shù)的參數(shù),但可以使用指向聯(lián)合變量的指針。聯(lián)合可以出現(xiàn)在結(jié)構(gòu)和數(shù)組中,結(jié)構(gòu)和數(shù)組也可以出現(xiàn)在聯(lián)合中。2.3 運(yùn)算符與表達(dá)式 表達(dá)式由運(yùn)算符及運(yùn)算對(duì)象構(gòu)成,表達(dá)式可以組成C語言程序的各種語句。運(yùn)算符按其在表達(dá)式中的作

46、用可以分為賦值運(yùn)算符、算術(shù)運(yùn)算符、關(guān)系和邏輯運(yùn)算符、自增自減運(yùn)算符和位運(yùn)算符等。2.3.1 賦值運(yùn)算符第2章 C51程序設(shè)計(jì)賦值運(yùn)算符“=的使用形式為“變量或數(shù)組元素=表達(dá)式,表示把表達(dá)式的內(nèi)容寫入到“=左邊的變量或數(shù)組中去。如果“=兩邊數(shù)據(jù)類型不一致那么需要將右側(cè)的數(shù)據(jù)轉(zhuǎn)換為與左側(cè)數(shù)據(jù)類型相同的類型。另外,C51中提供了11種復(fù)合賦值運(yùn)算符“+=、-=、*=、/=、%=、=、|=、&=、=、=。 2.3.2 關(guān)系和邏輯運(yùn)算符關(guān)系運(yùn)算符用來比較和判斷兩個(gè)表達(dá)式或變量之間的關(guān)系,一共分6種關(guān)系運(yùn)算符:“、=、=、!=,用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來的式子稱為關(guān)系表達(dá)式。關(guān)系表達(dá)式的值只能有兩種

47、可能:“1和“0,所以一般用它來判斷是否滿足條件。 第2章 C51程序設(shè)計(jì)邏輯運(yùn)算包括3種:邏輯與運(yùn)算“&,邏輯或運(yùn)算“| 和邏輯非運(yùn)算“!。運(yùn)算結(jié)果也只有“0和“1。例如: a&b /如果a,b都為真,那么(a&b)為真 a|b /如果a,b中有一個(gè)為真,那么(a|b)為真 !a /假設(shè)a為真,!a為假 2.3.3 自增自減運(yùn)算符 自增自減運(yùn)算符可以使變量自動(dòng)加1或減1。例如:+i表示i在使用前先加1,而i+表示i在使用后再加1。自減運(yùn)算符的使用方法和自增運(yùn)算符的使用方法一樣。第2章 C51程序設(shè)計(jì)例如:int a=5; int b,c; b=a+; /a先賦值給b使用再加1,結(jié)果使a等于6

48、,b等于5 c=+a; /a先加1等于7再賦值給c再使用,c等于72.3.4 位運(yùn)算符 由于單片機(jī)可以控制到每個(gè)端口的某一位,所以位的相關(guān)操作就尤為重要。例如,想要控制連接P01口的二極管熄滅,那么需要P0口和 “11111110相“與,即:P0&0 xfe。表2-4列出了Keil C51中的六種位運(yùn)算符。第2章 C51程序設(shè)計(jì)設(shè)“int a=0 x0b,int b=0 x05;,那么有: 位取反運(yùn)算“:每個(gè)二進(jìn)制位1做取反運(yùn)算。a結(jié)果為0 x04。按位與運(yùn)算“&:相“與的兩位都是1結(jié)果為1;否那么結(jié)果為0。a&b結(jié)果為0 x01。按位或運(yùn)算“|:相“或的兩位有一位是1結(jié)果為1;否那么結(jié)果為0

49、。a|b結(jié)果為0 x0f。按位異或運(yùn)算“:相“異或的兩位相同結(jié)果為0,否那么結(jié)果為1。ab結(jié)果為0 x0e。位左移運(yùn)算“:將二進(jìn)制數(shù)左移假設(shè)干位,左邊移出的數(shù)舍棄,右邊補(bǔ)0。a :與左移運(yùn)算相反。b2后b等于0 x01。第2章 C51程序設(shè)計(jì)2.4 流程控制語句 C51是一種結(jié)構(gòu)化的語言,由幾個(gè)根本結(jié)構(gòu)構(gòu)成一個(gè)模塊,又由幾個(gè)模塊構(gòu)成整個(gè)程序。C51的根本流程控制結(jié)構(gòu)分為以下三種 :順序結(jié)構(gòu):最根本、最簡(jiǎn)單的結(jié)構(gòu),程序由上向下順序執(zhí)行代碼。 條件選擇結(jié)構(gòu):根據(jù)條件判斷選擇執(zhí)行語句,可分為if和switch語句。3循環(huán)結(jié)構(gòu):循環(huán)執(zhí)行某一程序,可分為while,do while和for語句三種類型

50、第2章 C51程序設(shè)計(jì)2.4.1 條件語句 條件語句根據(jù)所給條件的成立與否來決定是否執(zhí)行語句,由關(guān)鍵字if和else構(gòu)成。C語言提供3種形式的條件語句: 單分支結(jié)構(gòu): if表達(dá)式語句1; 只有一條語句,表達(dá)式的真值為“1那么執(zhí)行,否那么跳出if語句繼續(xù)向下執(zhí)行。 雙分支選擇結(jié)構(gòu): if表達(dá)式語句1 else語句2; 表達(dá)式的真值為“1那么執(zhí)行語句1,不成立那么執(zhí)行語句2。 多分支選擇結(jié)構(gòu) if表達(dá)式1語句1; else if 表達(dá)式2語句2; else if表達(dá)式n-1語句n-1; else 語句n;第2章 C51程序設(shè)計(jì) 其意義為,先判斷表達(dá)式1的真值,如果其值為“1那么執(zhí)行語句1,執(zhí)行完后

51、跳出該if結(jié)構(gòu);否那么再判斷表達(dá)式2,假設(shè)條件2成立那么執(zhí)行語句2,執(zhí)行完后跳出該if結(jié)構(gòu);否那么再判斷表達(dá)式3。例2-2 判斷數(shù)a是否大于100,如果大于100那么a賦值為100,否那么a賦值0。2.4.2 while語句 C語言程序設(shè)計(jì)中,某段程序常常需要重復(fù)執(zhí)行,這就需要用循環(huán)結(jié)構(gòu),其特點(diǎn)是當(dāng)給定條件成立時(shí)反復(fù)執(zhí)行相應(yīng)程序,直到條件不成立為止。第2章 C51程序設(shè)計(jì)循環(huán)結(jié)構(gòu)一般包括四個(gè)局部:初始化循環(huán)變量的設(shè)置;循環(huán)體程序段;循環(huán)控制通過修改循環(huán)變量來控制是否繼續(xù)循環(huán)判斷不滿足條件時(shí),結(jié)束循環(huán)。While語句就是一種典型的循環(huán)結(jié)構(gòu),while語句的結(jié)構(gòu)形式為: while條件表達(dá)式 循環(huán)

52、體語句;其意義為,首先計(jì)算條件表達(dá)式的值,當(dāng)值為真或“1時(shí),執(zhí)行循環(huán)體語句,執(zhí)行完循環(huán)體語句回到條件表達(dá)式再次判斷,直到不滿足條件跳出此循環(huán)語句。第2章 C51程序設(shè)計(jì)2.4.3 do-while循環(huán)語句Do-while語句與while語句不同的是在while之前添加了do語句,即把執(zhí)行語句提到while之前,它是先執(zhí)行循環(huán)體語句再判斷是否滿足條件,所以循環(huán)體內(nèi)的語句至少會(huì)執(zhí)行一次,do-while語句的結(jié)構(gòu)形式為: do 循環(huán)體語句; while條件表達(dá)式;例2-4 用do-while語句求正數(shù)1100的和。 第2章 C51程序設(shè)計(jì)2.4.4 for循環(huán)For語句使用最為靈活,它可以代替wh

53、ile語句,但實(shí)際上它們的內(nèi)部運(yùn)行過程是相同的,for循環(huán)的結(jié)構(gòu)形式為: for初始化表達(dá)式;條件判斷表達(dá)式;增量表達(dá)式循環(huán)體;執(zhí)行for語句的步驟如下:1執(zhí)行初始化表達(dá)式進(jìn)行變量的初始化;2執(zhí)行條件判斷表達(dá)式,如果滿足條件那么執(zhí)行循環(huán)體語句并跳至3步,不滿足那么跳出for循環(huán);3執(zhí)行增量表達(dá)式,使變量改變并跳至2步。 第2章 C51程序設(shè)計(jì)2.4.5 switch語句Switch語句是一種用來實(shí)現(xiàn)多方向條件分支的語句。雖然采用條件語句也可以實(shí)現(xiàn)多方向條件分支,但是當(dāng)分支較多時(shí)會(huì)使條件語句的嵌套層次太多,程序冗長(zhǎng),可讀性降低。switch語句可直接處理多分支選擇,使程序結(jié)構(gòu)清晰,使用方便,它的

54、一般形式如下: switch(表達(dá)式) case 常量表達(dá)式1:語句1;break; case 常量表達(dá)式2:語句2;break; default:語句n; 第2章 C51程序設(shè)計(jì)Switch語句的執(zhí)行步驟為: 計(jì)算表達(dá)式的值,并逐個(gè)與其后的常量表達(dá)式值相比較,當(dāng)表達(dá)式的值與某個(gè)常量表達(dá)式的值相等時(shí)執(zhí)行其后的語句,不匹配那么不執(zhí)行后面的語句。break語句表示跳出該switch語句,如果沒有一個(gè)滿足條件的話,那么執(zhí)行default語句。另外default語句也可以不寫,表示不匹配任何常量表達(dá)式時(shí)直接跳出switch語句。在實(shí)際應(yīng)用中,常用switch語句來判斷按鍵輸入。 第2章 C51程序設(shè)計(jì)

55、2.4.6 break語句與continue語句Break語句是一種特殊的轉(zhuǎn)移語句,用來終止后面的執(zhí)行語句或立即結(jié)束循環(huán)。它只能跳出所在的那層程序段,一般用于switch語句和循環(huán)語句。Continue語句也是一種跳轉(zhuǎn)語句,一般用在循環(huán)結(jié)構(gòu)中,其功能是結(jié)束本次循環(huán)進(jìn)入下一次循環(huán)。Continue與break語句的區(qū)別在于continue語句只是結(jié)束本次循環(huán)而不會(huì)終止整個(gè)循環(huán)語句,break語句那么是終止整個(gè)循環(huán)。 第2章 C51程序設(shè)計(jì)2.4.7 返回語句returnReturn語句用于終止函數(shù)體的執(zhí)行,返回到調(diào)用函數(shù)的位置,并根據(jù)函數(shù)的類型返回不同的值,return語句的形式為: retur

56、n(表達(dá)式); 或 return;第一種形式表示要計(jì)算表達(dá)式的值,并將表達(dá)式的值作為該函數(shù)的返回值,第二種形式表示返回到主調(diào)用函數(shù)的位置時(shí),返回值不確定,一般用作執(zhí)行完成某個(gè)函數(shù)的功能卻不要求返回值的場(chǎng)合。 第2章 C51程序設(shè)計(jì)2.5 函數(shù) 函數(shù)是C語言中的一種根本模塊,實(shí)際上一個(gè)C語言程序就是由假設(shè)干個(gè)模塊化的函數(shù)所構(gòu)成的。C語言程序總是由主函數(shù)main()開始,main()函數(shù)是一個(gè)控制程序流程的特殊函數(shù),它是程序的起點(diǎn)。在進(jìn)行程序設(shè)計(jì)的過程中,如果所設(shè)計(jì)的程序較大,一般應(yīng)將其分成假設(shè)干個(gè)子程序模塊,每個(gè)子程序模塊完成一種特定的功能。在C語言中,子程序就是用函數(shù)來實(shí)現(xiàn)的。對(duì)于一些需要經(jīng)常

57、使用的子程序可以按函數(shù)來設(shè)計(jì),并且可以將自己所設(shè)計(jì)的功能函數(shù)做成一個(gè)專門的函數(shù)庫(kù),以供反復(fù)調(diào)用。這種模塊化的程序設(shè)計(jì)方法,可以大大提高編程效率。此外,C51編譯器還提供了豐富的運(yùn)行庫(kù)函數(shù),用戶可以根據(jù)需要隨時(shí)調(diào)用。第2章 C51程序設(shè)計(jì)2.5.1 函數(shù)的定義C語言是一種結(jié)構(gòu)化語言,在執(zhí)行程序時(shí),main函數(shù)是程序執(zhí)行的入口。函數(shù)可分為系統(tǒng)函數(shù)和用戶自定義函數(shù)兩種,用戶自己定義函數(shù)時(shí)可以自己命名函數(shù)。系統(tǒng)函數(shù)是系統(tǒng)自帶的函數(shù),用戶調(diào)用的時(shí)候只需要在程序開始中包含相關(guān)的頭文件,程序中可以通過調(diào)用系統(tǒng)函數(shù)或用戶自定義的子函數(shù)來實(shí)現(xiàn)特定功能,用戶定義函數(shù)的一般形式如下: 函數(shù)類型 函數(shù)名形參列表 函數(shù)

58、體程序;函數(shù)必須遵循先定義后使用的原那么,否那么系統(tǒng)不能識(shí)別函數(shù)名。函數(shù)的類型是由函數(shù)的返回值決定的,如果函數(shù)返回整型值,那么函數(shù)的類型為int,如果不返回任何值,那么函數(shù)類型為void。形參列表中列出的是在主調(diào)用函數(shù)與被調(diào)用函數(shù)之間傳遞數(shù)據(jù)的形式參數(shù),形式參數(shù)的類型必須加以說明。第2章 C51程序設(shè)計(jì)2.5.2 函數(shù)的調(diào)用所謂函數(shù)調(diào)用,就是在一個(gè)函數(shù)體中調(diào)用一個(gè)已定義了的函數(shù),前者稱為主調(diào)用函數(shù),后者稱為被調(diào)用函數(shù)。函數(shù)調(diào)用時(shí),只需要寫出被調(diào)函數(shù)的名字,并且在參數(shù)列表里給出具體參數(shù)。函數(shù)的一般調(diào)用形式為: 函數(shù)名實(shí)參列表;函數(shù)名指出調(diào)用了哪個(gè)函數(shù),實(shí)際參數(shù)列表列出了傳遞給被調(diào)函數(shù)的值,多個(gè)參

59、數(shù)間以逗號(hào)分開,在調(diào)用函數(shù)時(shí),實(shí)際參數(shù)會(huì)一一對(duì)應(yīng)地傳給形式參數(shù)。當(dāng)然,參數(shù)列表也可以為空,即不傳遞任何參數(shù)數(shù)據(jù)。第2章 C51程序設(shè)計(jì)2.5.3 中斷效勞函數(shù)當(dāng)計(jì)算機(jī)正常執(zhí)行程序時(shí),由于系統(tǒng)出現(xiàn)了某些需要緊急處理的事務(wù)或特殊請(qǐng)求,計(jì)算機(jī)停止當(dāng)前執(zhí)行的程序轉(zhuǎn)而處理這些緊急情況,處理完畢后再返回到原來程序被停止執(zhí)行的位置繼續(xù)執(zhí)行的過程叫做中斷。在51單片機(jī)中,中斷共分為2個(gè)優(yōu)先級(jí)及5個(gè)中斷源: 外部中斷請(qǐng)求0中斷,由INT0輸入。外部中斷請(qǐng)求1中斷,由INT1輸入。 單片機(jī)內(nèi)定時(shí)器/計(jì)數(shù)器0溢出中斷請(qǐng)求。單片機(jī)內(nèi)定時(shí)器/計(jì)數(shù)器1溢出中斷請(qǐng)求。單片機(jī)內(nèi)串行口發(fā)送/接收中斷請(qǐng)求。第2章 C51程序設(shè)計(jì)

60、在52單片機(jī)中,除了以上五個(gè)中斷外,還增加了一個(gè)片內(nèi)定時(shí)器/計(jì)數(shù)器2溢出中斷 。MCS-52單片機(jī)的中斷向量見表2-5所示:第2章 C51程序設(shè)計(jì)在Keil C51程序中,中斷是以子函數(shù)的形式出現(xiàn)的,其格式如下: void 函數(shù)名 interrupt n using m函數(shù)名可由用戶自己命名,interrupt為關(guān)鍵字,后面跟中斷向量號(hào)(n=05)。8051系列單片機(jī)可以在內(nèi)部RAM中使用4個(gè)不同的工作存放器組,每個(gè)存放器組中包含8個(gè)工作存放器(R0R7)。C5l編譯器擴(kuò)展了一個(gè)關(guān)鍵字using,專門用來選擇805l單片機(jī)中不同的工作存放器組。using關(guān)鍵字后面跟03,表示選擇8051單片機(jī)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論