《單片機(jī)原理與應(yīng)用技術(shù)》課件第4章_第1頁(yè)
《單片機(jī)原理與應(yīng)用技術(shù)》課件第4章_第2頁(yè)
《單片機(jī)原理與應(yīng)用技術(shù)》課件第4章_第3頁(yè)
《單片機(jī)原理與應(yīng)用技術(shù)》課件第4章_第4頁(yè)
《單片機(jī)原理與應(yīng)用技術(shù)》課件第4章_第5頁(yè)
已閱讀5頁(yè),還剩136頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第四章MCS-51單片機(jī)Cx51語(yǔ)言概述和程序設(shè)計(jì)4.1C與80C51

4.2Cx51數(shù)據(jù)與運(yùn)算

4.3Cx51流程控制語(yǔ)句

4.4Cx51構(gòu)造數(shù)據(jù)類型

4.5Cx51的函數(shù)、變量的作用域和存儲(chǔ)類型

4.6Cx51語(yǔ)言程序設(shè)計(jì)

4.7程序設(shè)計(jì)舉例

4.8習(xí)題實(shí)訓(xùn)四簡(jiǎn)單的單片機(jī)Cx51語(yǔ)言程序設(shè)計(jì)

4.1C與80C51

4.1.180C51的編程語(yǔ)言

程序設(shè)計(jì)語(yǔ)言經(jīng)歷了機(jī)器語(yǔ)言、匯編語(yǔ)言、高級(jí)語(yǔ)言三個(gè)階段,機(jī)器語(yǔ)言和匯編語(yǔ)言是面向機(jī)器的語(yǔ)言,高級(jí)語(yǔ)言又分為面向過(guò)程和面向?qū)ο髢煞N。機(jī)器語(yǔ)言就是計(jì)算機(jī)能識(shí)別的二進(jìn)制數(shù)據(jù)碼。匯編語(yǔ)言是用助記符號(hào)描述的指令系統(tǒng)。它們都屬于計(jì)算機(jī)的低級(jí)語(yǔ)言。標(biāo)準(zhǔn)的C語(yǔ)言和單片機(jī)的Cx51語(yǔ)言都屬于高級(jí)語(yǔ)言,它們都遵循著模塊化程序設(shè)計(jì)思想進(jìn)行編程。對(duì)于MCS-51系列的單片機(jī),現(xiàn)有4種語(yǔ)言可以支持,即匯編、PL/M、C和BASIC語(yǔ)言。標(biāo)準(zhǔn)的C語(yǔ)言是一種專門用來(lái)編寫(xiě)計(jì)算機(jī)操作系統(tǒng)的語(yǔ)言,TurboC是標(biāo)準(zhǔn)的C語(yǔ)言,在微機(jī)上廣泛使用的編譯軟件。KeilCx51是用來(lái)在MCS-51系列單片機(jī)上使用的編譯程序軟件。Cx51語(yǔ)言又可以像匯編語(yǔ)言那樣對(duì)位、字節(jié)和地址進(jìn)行操作,它把高級(jí)語(yǔ)言的結(jié)構(gòu)化程序設(shè)計(jì)思想和編輯軟件的語(yǔ)句與低級(jí)語(yǔ)言的實(shí)用性結(jié)合起來(lái)。與匯編語(yǔ)言相比,Cx51語(yǔ)言具有如下優(yōu)點(diǎn):

(1)?Cx51語(yǔ)言是一種結(jié)構(gòu)化的高級(jí)語(yǔ)言,其可讀性好,可移植性強(qiáng),更貼近人的思維;

(2)編程者對(duì)單片機(jī)的指令系統(tǒng)不要求了解,僅要求對(duì)8051的存儲(chǔ)器有初步了解;

(3)Cx51語(yǔ)言有功能豐富的庫(kù)函數(shù),運(yùn)算速度快、編譯效率高,可以實(shí)現(xiàn)對(duì)單片機(jī)系統(tǒng)硬件的控制;

(4)Cx51語(yǔ)言因?yàn)榫哂型暾某绦蚰K結(jié)構(gòu),可以滿足較大規(guī)模的軟件系統(tǒng)的開(kāi)發(fā),提高了開(kāi)發(fā)軟件的效率。

Cx51語(yǔ)言與匯編語(yǔ)言相比,缺點(diǎn)是占用資源較多,執(zhí)行效率沒(méi)有匯編語(yǔ)言高。同時(shí),對(duì)于普遍采用的RISC架構(gòu)的MCS-51系列單片機(jī)來(lái)說(shuō),內(nèi)部的ROM、RAM、STACK等資源都有限,一條Cx51語(yǔ)言指令編譯后,會(huì)轉(zhuǎn)換為很多機(jī)器碼,很容易出現(xiàn)ROM空間不夠,堆棧溢出等問(wèn)題。而一條匯編語(yǔ)言的指令對(duì)應(yīng)一條機(jī)器碼,每一步的執(zhí)行動(dòng)作都很清楚,并且程序大小和堆棧調(diào)用情況都容易控制,調(diào)試起來(lái)也比較方便。4.1.2Cx51程序結(jié)構(gòu)

Cx51程序結(jié)構(gòu)與標(biāo)準(zhǔn)C語(yǔ)言的語(yǔ)法規(guī)則基本一致,都是由函數(shù)構(gòu)成的。也就是說(shuō),函數(shù)是Cx51程序的基本單位。下面從以下幾個(gè)方面介紹Cx51程序的結(jié)構(gòu)特點(diǎn):

(1)一個(gè)Cx51源程序至少包含一個(gè)main函數(shù),也可以包含一個(gè)main函數(shù)和若干個(gè)其它函數(shù)。

(2)?main函數(shù)是每個(gè)程序執(zhí)行的起始點(diǎn)。

(3)函數(shù)定義由類型、函數(shù)名、參數(shù)表和函數(shù)體4個(gè)部分組成。Cx51函數(shù)的定義格式如下:

類型函數(shù)名(數(shù)據(jù)類型形式參數(shù),數(shù)據(jù)類型形式參數(shù)…)

{定義數(shù)據(jù)變量部分;可執(zhí)行語(yǔ)句部分;}

(4)函數(shù)定義相當(dāng)于匯編語(yǔ)言中的一般子程序。函數(shù)的調(diào)用相當(dāng)于調(diào)用子程序的CALL語(yǔ)句。函數(shù)定義和函數(shù)調(diào)用不分先后,但是如果調(diào)用在定義之前,那么在調(diào)用前必須先進(jìn)行函數(shù)說(shuō)明。函數(shù)說(shuō)明是一個(gè)沒(méi)有函數(shù)體的函數(shù)定義,而函數(shù)調(diào)用則要求有函數(shù)名和實(shí)參數(shù)表。

(5)Cx51程序書(shū)寫(xiě)格式自由,一行可以寫(xiě)幾個(gè)語(yǔ)句,一個(gè)語(yǔ)句也可以寫(xiě)在多行上。Cx51程序沒(méi)有行號(hào),也沒(méi)有像FORTRAN、COBOL那樣嚴(yán)格規(guī)定書(shū)寫(xiě)格式(語(yǔ)句必須從某一列開(kāi)始)。每條語(yǔ)句的最后必須有一個(gè)分號(hào)“;”表示語(yǔ)句的結(jié)束。

(6)可以使用/**/對(duì)Cx51程序中的任何部分作注釋。注釋可以提高程序可讀性,使用注釋是編程人員的良好習(xí)慣。

(7)??Cx51語(yǔ)言本身沒(méi)有輸入/輸出語(yǔ)句,輸入和輸出的操作是由scanf和printf等庫(kù)函數(shù)來(lái)完成的,也就是說(shuō)Cx51語(yǔ)言對(duì)輸入/輸出實(shí)行“函數(shù)化”。

4.1.3KeilCx51編程實(shí)例

【例4-1】

由單片機(jī)80C51的P1口控制8個(gè)發(fā)光二極管的動(dòng)作,動(dòng)作要求如下:

(1)開(kāi)始8個(gè)發(fā)光二極管全暗;

(2)延時(shí)1?s后,按D0→D1→D2→D3→D4→D5→D6→D7的順序依次點(diǎn)亮8個(gè)發(fā)光二極管;

(3)延時(shí)1?s后,按D7→D6→D5→D4→D3→D2→D1→D0的順序依次點(diǎn)亮8個(gè)發(fā)光二極管;

(4)延時(shí)1?s后,按D0→D2→D4→D6→D1→D3→D5→D7的順序依次點(diǎn)亮8個(gè)發(fā)光二極管;

(5)延時(shí)1s后,按D1→D3→D5→D7→D0→D2→D4→D6的順序依次點(diǎn)亮8個(gè)發(fā)光二極管;

(6)重復(fù)步驟(1)~(5)。

硬件電路設(shè)計(jì)如圖4-1所示。圖4-180C51控制8個(gè)發(fā)光二極管的電路圖

4.2Cx51數(shù)據(jù)與運(yùn)算

4.2.1數(shù)據(jù)與數(shù)據(jù)類型

1.?dāng)?shù)據(jù)

具有某種特定格式的數(shù)字或數(shù)值稱為數(shù)據(jù)。不同的數(shù)據(jù)之間通常還存在著某些聯(lián)系。

數(shù)據(jù)的特點(diǎn)為:數(shù)據(jù)是計(jì)算機(jī)操作的對(duì)象,不管使用何種語(yǔ)言、何種算法進(jìn)行程序設(shè)計(jì),最終在計(jì)算機(jī)中運(yùn)行的只有特定格式的數(shù)據(jù)流。計(jì)算機(jī)能夠識(shí)別的數(shù)據(jù)流就是二進(jìn)制數(shù)據(jù)。

2.Cx51的數(shù)據(jù)類型

數(shù)據(jù)的不同格式就稱為數(shù)據(jù)類型。Cx51支持的數(shù)據(jù)類型如圖4-2所示。圖4-2Cx51的數(shù)據(jù)類型

MCS-51系列單片機(jī)是8位機(jī),用戶進(jìn)行Cx51程序編寫(xiě)時(shí),經(jīng)常會(huì)出現(xiàn)數(shù)據(jù)類型不匹配的情況,當(dāng)計(jì)算結(jié)果隱含著另外一種數(shù)據(jù)類型時(shí),數(shù)據(jù)類型可以自動(dòng)進(jìn)行轉(zhuǎn)換,也可以利用Cx51的標(biāo)準(zhǔn)指令函數(shù)進(jìn)行人工轉(zhuǎn)換。

例如將一個(gè)位變量賦給一個(gè)整型變量時(shí),位型值自動(dòng)會(huì)轉(zhuǎn)換為整型值,有符號(hào)變量的符號(hào)也能自動(dòng)進(jìn)行處理。表4-1列出了所有Cx51能夠識(shí)別的數(shù)據(jù)類型的長(zhǎng)度和值域。表4-1Cx51的數(shù)據(jù)類型

3.?dāng)?shù)據(jù)結(jié)構(gòu)

所謂數(shù)據(jù)結(jié)構(gòu)就是指數(shù)據(jù)的組織形式。數(shù)據(jù)按照一定的數(shù)據(jù)類型進(jìn)行的排列、組合及其架構(gòu)稱為數(shù)據(jù)結(jié)構(gòu)。

4.2.2常量與變量

Cx51語(yǔ)言中的數(shù)據(jù)也有常量和變量之分。

1.常量

1)符號(hào)常量

符號(hào)常量就是用標(biāo)識(shí)符代表的常量,即標(biāo)識(shí)符形式的常量。雖然符號(hào)常量用標(biāo)識(shí)符來(lái)定義,但它是不同于變量的,它的值在其作用域內(nèi)不能改變,也不能再被賦值。符號(hào)常量一般用大寫(xiě)字母表示,其定義語(yǔ)句是宏定義預(yù)處理命令,不是C語(yǔ)句。定義格式:

#define符號(hào)常量常量

2)整型常量

整型常量分為以下三種形式:

(1)十進(jìn)制整數(shù):由數(shù)字0~9和正負(fù)號(hào)表示,例如123,-456,0。

(2)八進(jìn)制整數(shù):由數(shù)字0開(kāi)頭,后跟數(shù)字0~7表示,例如0123,011。

(3)十六進(jìn)制整數(shù):由0x開(kāi)頭,后跟0~9,a~f,A~F表示,例如0x123,0xff。

整型常量的類型是根據(jù)其值所在范圍來(lái)確定的。在整型常量后面加字母L或l,表明它是longint型常量。

3)實(shí)型常量

實(shí)數(shù)又稱為浮點(diǎn)數(shù)。實(shí)數(shù)有兩種表示形式:

(1)十進(jìn)制小數(shù)表示形式:如0.1234、12、789。

(2)指數(shù)形式:如12.3E3、124E5、14.3E-5。字母E(e)之前必須有數(shù)字,而且E(e)后面的指數(shù)必須是整數(shù),否則都是不合法的。

實(shí)型常量的類型分為float浮點(diǎn)型和double雙精度型兩種,默認(rèn)為double型。如果在實(shí)型常量后加字母f或F,表明它是浮點(diǎn)型實(shí)型常量。

4)字符常量

字符常量的長(zhǎng)度為8位,1個(gè)字節(jié)。字符常量的值就是該字符的ASCII碼值,它是用單引號(hào)括起來(lái)的單個(gè)普通字符或轉(zhuǎn)義字符,如?'a'、'A'、'?'、'n'、'\101'?等。其中,反斜杠為轉(zhuǎn)義字符,反斜杠后面可以跟一個(gè)字符和一個(gè)代碼值。

【例4-3】

轉(zhuǎn)義字符舉例。4.2.3Cx51數(shù)據(jù)的存儲(chǔ)類型與8051存儲(chǔ)器結(jié)構(gòu)

KeilCx51編譯器的特點(diǎn)如下:

(1)完全支持8051單片機(jī)的硬件結(jié)構(gòu),可完全訪問(wèn)8051硬件系統(tǒng)的所有部分。

(2)該編譯器通過(guò)將變量、常量定義成不同的存儲(chǔ)類型(data、bdata、idata、pdata、xdata、code)的方法,將它們定位在不同的存儲(chǔ)區(qū)域中。

Cx51存儲(chǔ)類型與8051存儲(chǔ)空間的對(duì)應(yīng)關(guān)系如表4-2所示。表4-2Cx51存儲(chǔ)類型與8051存儲(chǔ)空間的對(duì)應(yīng)關(guān)系帶存儲(chǔ)類型的變量定義的一般格式為

[存儲(chǔ)種類]數(shù)據(jù)類型[存儲(chǔ)器類型]變量名表4.2.4Cx51對(duì)8051系列特殊功能寄存器、并行接口、位變量的定義

1.特殊功能寄存器的Cx51定義

MCS-51單片機(jī)中特殊功能寄存器(SFR)分散在片內(nèi)RAM區(qū)的高128字節(jié)中,地址范圍為80H~0FFH。SFR中有11個(gè)寄存器,具有位尋址能力,它們的字節(jié)地址都能被8整除,即字節(jié)地址是以8或0為尾數(shù)的。

為了能直接訪問(wèn)這些SFR,KeilCx51提供了一種自主形式的定義方法,這種定義方法與標(biāo)準(zhǔn)C語(yǔ)言不兼容,只適用于對(duì)MCS-51系列單片機(jī)進(jìn)行Cx51語(yǔ)言編程。Cx51定義特殊功能寄存器的一般語(yǔ)法格式如下:

sfrsfr_名稱=int常量;“sfr”是定義語(yǔ)句的關(guān)鍵字,其后必須跟一個(gè)MSC-51單片機(jī)真實(shí)存在的特殊功能寄存器名,“=”后面必須是一個(gè)整型常量,不允許是帶有運(yùn)算符的表達(dá)式,這個(gè)常量是特殊功能寄存器“sfr_name”的字節(jié)地址,這個(gè)常量值的范圍必須在SFR地址范圍內(nèi),位于0x80H~0xFFH之間。

MCS-51系列單片機(jī)的特殊功能寄存器的數(shù)量與類型不盡相同,因此建議將所有特殊功能寄存器的“sfr”定義語(yǔ)句放入一個(gè)頭文件中,該文件應(yīng)包括MCS-51單片機(jī)系列機(jī)型中的所有SFR定義。C51編譯器的reg51.h頭文件就是這樣一個(gè)文件。

在新的MCS-51系列產(chǎn)品中,SFR在功能上經(jīng)常組合為16位值。當(dāng)SFR的高字節(jié)地址直接位于低端地址之后時(shí),對(duì)16位SFR的值可以直接進(jìn)行訪問(wèn)。例如MCS-51單片機(jī)系列的定時(shí)器/計(jì)數(shù)器2就是這種情況。為了有效地訪問(wèn)這類SFR,可使用關(guān)鍵字“sfr16”來(lái)定義,其定義語(yǔ)句的語(yǔ)法格式與8位SFR相同,只是“=”后面的地址必須用16位SFR的低字節(jié)地址,即低字節(jié)地址作為“sfr16”的定義地址。

1)第一種格式

sbitbit_名稱=sfr_名稱^int常量;

“sbit”是定義語(yǔ)句的關(guān)鍵字,后跟一個(gè)尋址位符號(hào)名(該位符號(hào)名必須是MCS-51單片機(jī)中規(guī)定的位名稱),“=”后的“sfr_name”必須是已定義過(guò)的SFR的名字,“^”后的整常量是尋址位在特殊功能寄存器“sfr_name”中的位號(hào),必須是0~7范圍中的數(shù)。

2)第二種格式

sbitbit_名稱=int常量^int常量;

“=”后的int常量為尋址地址位所在的特殊功能寄存器的字節(jié)地址,“^”符號(hào)后的int常量為尋址位在特殊功能寄存器中的位號(hào)。

3)第三種格式:

sbitbit_名稱=int_常量

這種格式將位的絕對(duì)地址賦給變量,地址必須位于0x80H~0xFFH之間。

2.8051并行接口的Cx51定義

在Cx51語(yǔ)言中,可以在頭文件中定義8051片內(nèi)外擴(kuò)展的I/O口,也可以在程序設(shè)計(jì)的過(guò)程中(一般在開(kāi)始的位置)進(jìn)行定義。只有先定義這些I/O口,才能在Cx51程序中自由使用。

(1)對(duì)于MCS-51系列單片機(jī),用關(guān)鍵字sfr來(lái)定義片內(nèi)I/O口。

(2)對(duì)于片外擴(kuò)展的I/O口,根據(jù)其設(shè)計(jì)的硬件譯碼地址,使用#define語(yǔ)句進(jìn)行定義。

3.位變量(BIT)的Cx51定義

Cx51編譯器支持以下幾種方式定義bit數(shù)據(jù)類型。

(1)位變量的定義。

(2)在函數(shù)的定義過(guò)程中也可包含類型為bit的參數(shù),也可以將其作為返回值。

(3)位變量不能定義成一個(gè)指針或數(shù)組。4.2.5Cx51運(yùn)算符、表達(dá)式及其規(guī)則

運(yùn)算符:表示各種運(yùn)算的符號(hào)。運(yùn)算符的種類有算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符、條件運(yùn)算符、逗號(hào)運(yùn)算符、指針運(yùn)算符、求字節(jié)數(shù)運(yùn)算符、強(qiáng)制類型轉(zhuǎn)換運(yùn)算符、分量運(yùn)算符、下標(biāo)運(yùn)算符、函數(shù)調(diào)用運(yùn)算符等。

表達(dá)式:使用運(yùn)算符將常量、變量、函數(shù)連接起來(lái),構(gòu)成的式子。

算術(shù)表達(dá)式:用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象(包括常量、變量、函數(shù)、數(shù)組和結(jié)構(gòu)等)連接起來(lái)的式子。

1.Cx51算術(shù)運(yùn)算符及其表達(dá)式

1)算術(shù)運(yùn)算符的種類

+ (加法運(yùn)算符,如3+5)

- (減法運(yùn)算符或負(fù)值運(yùn)算符。如5-2,-3)

* (乘法運(yùn)算符,如3*5)

/ (除法運(yùn)算符,如5/3,5.0/3)

% (模運(yùn)算符或求余運(yùn)算符,%要求兩側(cè)均為整型數(shù)據(jù),如7%4的值為3)。

除了負(fù)值運(yùn)算符為單目運(yùn)算符外,其它都是雙目運(yùn)算符。

2)算術(shù)運(yùn)算符的優(yōu)先級(jí)與結(jié)合性

在進(jìn)行表達(dá)式求值過(guò)程中,C語(yǔ)言規(guī)定了各運(yùn)算符的“優(yōu)先級(jí)”和“結(jié)合性”。

(1)優(yōu)先級(jí)——指當(dāng)運(yùn)算對(duì)象兩側(cè)都有運(yùn)算符時(shí),執(zhí)行運(yùn)算的先后次序。按運(yùn)算符優(yōu)先級(jí)別的高低順序執(zhí)行運(yùn)算。

算術(shù)運(yùn)算符的優(yōu)先級(jí)規(guī)定為先乘、除、模,后加、減,括號(hào)最優(yōu)先。

說(shuō)明:在算術(shù)運(yùn)算符中,乘、除、模運(yùn)算符的優(yōu)先級(jí)相同,并高于加、減運(yùn)算符。在表達(dá)式中若出現(xiàn)括號(hào),則括號(hào)中的內(nèi)容優(yōu)先級(jí)最高。

(2)結(jié)合性——指當(dāng)一個(gè)運(yùn)算對(duì)象兩側(cè)的運(yùn)算符的優(yōu)先級(jí)別相同時(shí)的運(yùn)算順序。

2.強(qiáng)制類型轉(zhuǎn)換運(yùn)算符

在Cx51語(yǔ)言中,整型、實(shí)型和字符型數(shù)據(jù)間與標(biāo)準(zhǔn)的C語(yǔ)言一樣,可以混合運(yùn)算(因?yàn)樽址麛?shù)據(jù)與整型數(shù)據(jù)可以通用)。如果一個(gè)運(yùn)算符兩側(cè)的操作數(shù)的數(shù)據(jù)類型不同,則系統(tǒng)按“先轉(zhuǎn)換,后運(yùn)算”的原則,首先將數(shù)據(jù)自動(dòng)轉(zhuǎn)換成同一類型,然后在同一類型數(shù)據(jù)間進(jìn)行運(yùn)算。

數(shù)據(jù)類型轉(zhuǎn)換規(guī)則如圖4-3所示。

類型轉(zhuǎn)換的方式有兩種:

1)自動(dòng)轉(zhuǎn)換

(1)橫向向左的箭頭,表示必須的轉(zhuǎn)換。char和short型必須轉(zhuǎn)換成int型,float型必須轉(zhuǎn)換成double型。

(2)縱向向上的箭頭,表示不同類型的轉(zhuǎn)換方向。圖4-3數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換規(guī)則

2)強(qiáng)制類型轉(zhuǎn)換

除自動(dòng)轉(zhuǎn)換外,Cx51語(yǔ)言也同樣允許強(qiáng)制轉(zhuǎn)換。數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換的一般格式為

(要轉(zhuǎn)換成的數(shù)據(jù)類型)(被轉(zhuǎn)換的表達(dá)式)

使用強(qiáng)制轉(zhuǎn)換類型運(yùn)算符后,運(yùn)算結(jié)果被強(qiáng)制轉(zhuǎn)換成規(guī)定的類型。轉(zhuǎn)換規(guī)則為:

(1)當(dāng)char和int變量同時(shí)存在時(shí),必定將char轉(zhuǎn)換成int類型;

(2)當(dāng)float和double類型共存時(shí),在運(yùn)算時(shí)一律先轉(zhuǎn)換成double類型,以提高運(yùn)算精度。

(3)圖4-3中的縱向箭頭表示當(dāng)運(yùn)算對(duì)象為不同類型時(shí)的轉(zhuǎn)換方向。例如int型和long型數(shù)據(jù)進(jìn)行運(yùn)算時(shí),先將較低類型int轉(zhuǎn)換成較高的類型long,然后再進(jìn)行運(yùn)算,結(jié)果是long類型。

3.Cx51關(guān)系運(yùn)算符、表達(dá)式及優(yōu)先級(jí)

所謂關(guān)系運(yùn)算,實(shí)際上是比較運(yùn)算。關(guān)系運(yùn)算是將兩個(gè)數(shù)值進(jìn)行比較,并判斷比較的結(jié)果是否符合規(guī)定的條件。

(1)?Cx51提供了六種關(guān)系運(yùn)算符:

(2)關(guān)系運(yùn)算符中前四種運(yùn)算符的優(yōu)先級(jí)相同,后兩種也相同,但前四種高于后兩種。關(guān)系運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符,高于賦值運(yùn)算符,并采用“從左至右”的結(jié)合方向。

(3)關(guān)系表達(dá)式。用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式(算術(shù)表達(dá)式、關(guān)系表達(dá)式、邏輯表達(dá)式及字符表達(dá)式等)連接起來(lái)的式子,稱為關(guān)系表達(dá)式。其一般形式如下:

表達(dá)式1關(guān)系運(yùn)算符表達(dá)式2

其中,表達(dá)式可以是算術(shù)表達(dá)式、關(guān)系表達(dá)式、邏輯表達(dá)式、賦值表達(dá)式和字符表達(dá)式。同算術(shù)表達(dá)式一樣,關(guān)系表達(dá)式也是有值的,這個(gè)值反映了兩個(gè)表達(dá)式比較的結(jié)果。比較的結(jié)果有兩種可能:一種是判斷條件正確,命名為“真”;另一種是判斷條件不正確,命名為“假”。Cx51語(yǔ)言以“1”表示“真”;以“0”表示“假”。

4.Cx51邏輯運(yùn)算符、表達(dá)式及優(yōu)先級(jí)

(1)?Cx51提供了三種邏輯運(yùn)算符:

&& 邏輯“與”(AND);

|| 邏輯“或”(OR);

! 邏輯“非”(NOT);圖4-4Cx51中的運(yùn)算符的優(yōu)先級(jí)

“&&”和“‖”是雙目運(yùn)算符,要求有兩個(gè)運(yùn)算對(duì)象,而“!”是單目運(yùn)算符,只要求有一個(gè)運(yùn)算對(duì)象。

(2)邏輯運(yùn)算符的優(yōu)先級(jí)(由高到低排列)是:

!?(非)→&&(與)→‖(或)。

(3)?Cx51中的運(yùn)算符的優(yōu)先級(jí)如圖4-4所示。

(4)邏輯表達(dá)式就是用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來(lái)的式子。圖4-4Cx51中的運(yùn)算符的優(yōu)先級(jí)

5.Cx51位操作及其表達(dá)式

Cx51提供了六種位操作運(yùn)算符:

(1)?&:按位與(雙目運(yùn)算符);

(2)?|:按位或(雙目運(yùn)算符);

(3)?^:按位異或(雙目運(yùn)算符);

(4)?~:按位取反(單目運(yùn)算符);

(5)?<<:位左移(雙目運(yùn)算符);

(6)?>>:位右移(雙目運(yùn)算符)。

位操作運(yùn)算符只能是整型或字符型數(shù)據(jù),不能為實(shí)型數(shù)據(jù)。

雙目運(yùn)算符:要求運(yùn)算符兩側(cè)各有一個(gè)運(yùn)算對(duì)象。因此,如果只要求有一個(gè)運(yùn)算對(duì)象的運(yùn)算符稱為單目運(yùn)算符。

6.賦值運(yùn)算符及其表達(dá)式

賦值運(yùn)算符為“=”。由賦值運(yùn)算符組成的表達(dá)式稱為賦值表達(dá)式。賦值表達(dá)式的一般格式為

<變量><賦值符><表達(dá)式>

賦值表達(dá)式的求解過(guò)程:將賦值運(yùn)算符右側(cè)的表達(dá)式的值賦給左側(cè)的變量。

賦值的含義:將賦值運(yùn)算符右邊的表達(dá)式的值存放到左邊變量名標(biāo)識(shí)的存儲(chǔ)單元中。

7.自增減運(yùn)算符

自增減運(yùn)算符是一種單目運(yùn)算符,它的作用就是使變量值自動(dòng)加1或減1。自增減運(yùn)算只能用于變量,而不能用于常量表達(dá)式。(++)和(--)的結(jié)合方向是“自右向左”。

自增減運(yùn)算符放在變量的前面和后面是有區(qū)別的:++i和i++?的作用都相當(dāng)于i=i+1,但是兩者的區(qū)別在于?++i是先執(zhí)行i=i+1,再使用i的值;而i++?則是先使用i的值,再執(zhí)行i=i+1。

8.復(fù)合運(yùn)算符及其表達(dá)式

Cx51提供了十種復(fù)合賦值運(yùn)算符,即

+=、-=、*=、/=、%=、<<=、>>=、&=、^=、!=。

Cx51采用這種復(fù)合運(yùn)算符運(yùn)算的目的是為了簡(jiǎn)化程序,提高Cx51程序編譯效率。

a+=b 相當(dāng)于a=a+b

a-=b 相當(dāng)于a=a-b

a*=b 相當(dāng)于a=a*b

a/=b 相當(dāng)于a=a/b

a%=b 相當(dāng)于a=a%b

a<<=7 相當(dāng)于a=a<<7

a>>=7 相當(dāng)于a=a>>7

9.逗號(hào)運(yùn)算符及其表達(dá)式

逗號(hào)運(yùn)算符為“,”。逗號(hào)表達(dá)式的一般形式:表達(dá)式1,表達(dá)式2,…,表達(dá)式n。

逗號(hào)表達(dá)式的求解過(guò)程為自左向右,求解表達(dá)式1,求解表達(dá)式2,…,求解表達(dá)式n。整個(gè)逗號(hào)表達(dá)式的值是表達(dá)式n的值。例如:逗號(hào)表達(dá)式3+5,6+8的值為14。

【例4-7】

分析程序的運(yùn)行結(jié)果。

4.3Cx51流程控制語(yǔ)句

4.3.1Cx51語(yǔ)言程序的順序結(jié)構(gòu)及其流程圖

在程序設(shè)計(jì)過(guò)程中,按照由低地址向高地址順序執(zhí)行指令代碼的結(jié)構(gòu),我們稱為順序結(jié)構(gòu)程序設(shè)計(jì)。順序結(jié)構(gòu)是一種最基本、最簡(jiǎn)單的編程結(jié)構(gòu)。如圖4-5所示,程序先執(zhí)行A操作,再執(zhí)行B操作,兩者是順序結(jié)構(gòu)關(guān)系。圖4-5順序結(jié)構(gòu)流程圖4.3.2Cx51語(yǔ)言程序的選擇結(jié)構(gòu)及其流程圖

單片機(jī)就像人類的大腦,具有一定的邏輯分析能力和選擇決策能力,在很多情況下都能判斷條件是否成立,然后再作出相應(yīng)的操作(如圖4-6所示)。圖4-6選擇結(jié)構(gòu)流程圖

1.選擇語(yǔ)句if

Cx51語(yǔ)言的一個(gè)基本判定語(yǔ)句就是if語(yǔ)句。基本結(jié)構(gòu)是:

if(表達(dá)式){語(yǔ)句};如果表達(dá)式成立(為真),則程序執(zhí)行花括號(hào)中的語(yǔ)句,否則程序跳過(guò)花括號(hào)中的語(yǔ)句部分,執(zhí)行下面的其他語(yǔ)句。Cx51語(yǔ)言中提供了三種形式的if語(yǔ)句。

形式一:

if(表達(dá)式){語(yǔ)句}

形式二:

if(表達(dá)式){語(yǔ)句1}else{語(yǔ)句2}

2.if語(yǔ)句的嵌套

在if語(yǔ)句中又包含有一個(gè)或多個(gè)if語(yǔ)句,這種情況稱為if語(yǔ)句的嵌套。基本格式如下:4.3.3Cx51語(yǔ)言程序的循環(huán)結(jié)構(gòu)及其流程圖

在Cx51語(yǔ)言中用來(lái)實(shí)現(xiàn)循環(huán)的語(yǔ)句有三種:while語(yǔ)句、dowhile語(yǔ)句、for語(yǔ)句。

1.while語(yǔ)句

while語(yǔ)句用來(lái)實(shí)現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu),其一般形式為

while(表達(dá)式){語(yǔ)句/*循環(huán)體*/}

表達(dá)式是while循環(huán)能夠繼續(xù)的條件,而語(yǔ)句部分則是循環(huán)體,是執(zhí)行重復(fù)操作的部分。只要表達(dá)式為真,就重復(fù)執(zhí)行循環(huán)體內(nèi)的語(yǔ)句;反之,則終止while循環(huán),執(zhí)行循環(huán)之外的下一行語(yǔ)句。具體過(guò)程(如圖4-7所示)就是先判斷表達(dá)式,當(dāng)表達(dá)式的值為假時(shí),退出while循環(huán),執(zhí)行循環(huán)體外的后續(xù)語(yǔ)句;否則,當(dāng)表達(dá)式的值為真時(shí),便執(zhí)行循環(huán)體,再次執(zhí)行該while語(yǔ)句。圖4-7while循環(huán)的過(guò)程語(yǔ)句

2.dowhile語(yǔ)句

在程序設(shè)計(jì)的過(guò)程中有時(shí)需要在循環(huán)體的結(jié)尾處,而不是在循環(huán)體的開(kāi)始處檢測(cè)循環(huán)結(jié)束條件。dowhile循環(huán)語(yǔ)句可以滿足這種要求。dowhile語(yǔ)句的格式為

do

{語(yǔ)句;}/*循環(huán)體*/

while(表達(dá)式);

dowhile語(yǔ)句用來(lái)實(shí)現(xiàn)“直到型”循環(huán)結(jié)構(gòu)。執(zhí)行過(guò)程如圖4-8所示。圖4-8dowhile的程序流程

3.for循環(huán)語(yǔ)句

在Cx51語(yǔ)言中,for循環(huán)語(yǔ)句是循環(huán)語(yǔ)句中最為靈活也是最為復(fù)雜的一種。它不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定但已經(jīng)給出循環(huán)條件的情況。

for循環(huán)語(yǔ)句的一般形式為

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

{語(yǔ)句;}/*循環(huán)體*/

for循環(huán)的語(yǔ)句執(zhí)行過(guò)程如下:

(1)先對(duì)表達(dá)式1賦初值,進(jìn)行初始化。

(2)判斷表達(dá)式2是否滿足給定的循環(huán)條件,若滿足循環(huán)條件,則執(zhí)行循環(huán)體內(nèi)的語(yǔ)句然后執(zhí)行第(3)步;若不滿足循環(huán)條件,則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。

(3)若表達(dá)式2為真,則在執(zhí)行指定的循環(huán)語(yǔ)句后,求解表達(dá)式3。

(4)回到第(2)步繼續(xù)執(zhí)行。

(5)退出for循環(huán),執(zhí)行下面一條語(yǔ)句。

4.三種循環(huán)語(yǔ)句的比較

在上述三種循環(huán)語(yǔ)句中,while循環(huán)是最基本的,凡是能用dowhile語(yǔ)句和for語(yǔ)句編寫(xiě)的程序,都能用while語(yǔ)句編寫(xiě)出來(lái),但對(duì)某些應(yīng)用場(chǎng)合來(lái)說(shuō),使用dowhile語(yǔ)句和for語(yǔ)句編寫(xiě)程序更簡(jiǎn)單。

一般來(lái)說(shuō),在不知道數(shù)據(jù)的數(shù)量或不知道重復(fù)計(jì)算的次數(shù),如用迭代法對(duì)非線性方程求解時(shí),應(yīng)使用while語(yǔ)句和dowhile語(yǔ)句。與上述情況相反,如果知道數(shù)據(jù)的數(shù)量或知道重復(fù)計(jì)算的次數(shù),例如對(duì)數(shù)組進(jìn)行處理時(shí),一般用for語(yǔ)句,并且用循環(huán)控制變量作為數(shù)組的下標(biāo)有很強(qiáng)的表達(dá)能力。 4.4Cx51構(gòu)造數(shù)據(jù)類型

4.4.1數(shù)組

1.一維數(shù)組

(1)一維數(shù)組的定義方式:

類型說(shuō)明符數(shù)組名[整型表達(dá)式]

這條語(yǔ)句定義了一個(gè)一維字符型數(shù)組,有10個(gè)元素,每個(gè)元素由不同的下標(biāo)表示,分別為a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]。

在數(shù)組定義的時(shí)候,數(shù)組的第一個(gè)元素的下標(biāo)為0而不是1,即數(shù)組的第一個(gè)元素是a[0]而不是a[1],而數(shù)組的第10個(gè)元素應(yīng)為a[9]。每個(gè)分量都相當(dāng)于一個(gè)整型變量。一維數(shù)組的存儲(chǔ)結(jié)構(gòu)與邏輯結(jié)構(gòu)如下:

(2)一維數(shù)組的引用。數(shù)組是一種構(gòu)造類型,它由若干個(gè)元素組成,C語(yǔ)言規(guī)定只能依次引用數(shù)組的每一個(gè)元素,而不能一次引用數(shù)組這個(gè)整體的10個(gè)元素,即不能直接對(duì)數(shù)組名操作。

一維數(shù)組的元素引用形式為

數(shù)組名[整型表達(dá)式]

(3)數(shù)組的初始化。數(shù)組中的值可以在程序運(yùn)行期間用循環(huán)和鍵盤(pán)輸入語(yǔ)句進(jìn)行賦值。但這樣做將耗費(fèi)許多機(jī)器運(yùn)行時(shí)間。對(duì)大型數(shù)組而言,這種情況更加突出。對(duì)此可以用數(shù)組初始化的方法加以解決。

2.二維數(shù)組

(1)二維數(shù)組的定義方式:

數(shù)據(jù)類型說(shuō)明符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]

二維數(shù)組的定義類似于一維數(shù)組的定義,只是多了一個(gè)下標(biāo),第一個(gè)中括號(hào)中的常量表達(dá)式1的值為數(shù)組的行數(shù),第二個(gè)中括號(hào)中的常量表達(dá)式2的值為數(shù)組的列數(shù)。

這條語(yǔ)句定義了一個(gè)2行3列的二維數(shù)組,有6個(gè)元素,每個(gè)元素由不同的下標(biāo)表示,分別為b[0][0]、b[0][1]、b[0][2]、b[1][0]、b[1][1]、b[1][2]。注意,在數(shù)組定義的時(shí)候,數(shù)組的行和列的第一個(gè)元素的下標(biāo)都是從0而不是從1開(kāi)始,即數(shù)組的第一個(gè)元素是b[0][0]而不是b[1][1],而數(shù)組的第6個(gè)元素應(yīng)為b[1][2]而不是b[6]。每個(gè)分量都相當(dāng)于一個(gè)整型變量。二維數(shù)組的所有元素在計(jì)算機(jī)內(nèi)存中占有一片連續(xù)的存儲(chǔ)空間。C語(yǔ)言中二維數(shù)組b在內(nèi)存中是按行存放的,二維數(shù)組的存儲(chǔ)結(jié)構(gòu)如下:

對(duì)于一維數(shù)組來(lái)說(shuō),它的邏輯結(jié)構(gòu)與存儲(chǔ)結(jié)構(gòu)是相同的,一維數(shù)組的下標(biāo)值與一維數(shù)組在內(nèi)存中元素排列位置的序號(hào)是一致的。而對(duì)于二維數(shù)組來(lái)說(shuō),兩者卻是完全不同的。數(shù)組b的邏輯結(jié)構(gòu)如下:

(2)二維數(shù)組的引用。二維數(shù)組的元素引用形式為

數(shù)組名[整型表達(dá)式1][整型表達(dá)式2]

(3)二維數(shù)組的初始化。對(duì)數(shù)組的全部元素賦初值可以用下面兩種方法進(jìn)行:

①分行給二維數(shù)組的全部元素賦初值。

②也可以將所有數(shù)據(jù)寫(xiě)在一個(gè)花括號(hào)內(nèi),按數(shù)組的排列順序?qū)Ω髟刭x初值。

3.字符數(shù)組

1)字符數(shù)組的定義、引用和初始化

字符數(shù)組的定義方式為

char數(shù)組名[常量表達(dá)式];

2)字符串和字符串結(jié)束標(biāo)志

字符串是用一對(duì)雙引號(hào)括起來(lái)的字符序列,這些字符可以是一般的可顯示字符,也可以是某些特殊的控制字符。C語(yǔ)言不提供字符串變量,規(guī)定字符串只能用字符數(shù)組來(lái)處理。將字符串存儲(chǔ)到內(nèi)存中時(shí),除了要將字符串中的每一個(gè)字符存入內(nèi)存中,還要在字符串的最后加一個(gè)?'\0'?字符存入內(nèi)存。這個(gè)?'\0'?字符就是字符串的結(jié)束標(biāo)志。

3)用字符串給字符數(shù)組初始化

charst[8]="welcome";

4)字符串的長(zhǎng)度

若有“charch[]="Good";”,則數(shù)組ch的元素個(gè)數(shù)是5,而不是4,也就是說(shuō),字符串的長(zhǎng)度是雙引號(hào)中所包括的字符個(gè)數(shù)加1。

若干個(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'。比如語(yǔ)句charb[60][34];定義了一個(gè)二維字符數(shù)組b,可容納60個(gè)字符串,每串最長(zhǎng)可達(dá)34個(gè)字符。

4.?dāng)?shù)組的應(yīng)用

數(shù)組是一種很重要的數(shù)據(jù)結(jié)構(gòu),應(yīng)掌握一維和二維數(shù)組的應(yīng)用,熟練掌握排序、查找、刪除、插入等基本算法,運(yùn)用二維數(shù)組完成一些基本算法和應(yīng)用。

4.4.2指針

1.基本概念

(1)地址。內(nèi)存中每一個(gè)字節(jié)都有一個(gè)唯一的編號(hào),這個(gè)編號(hào)就是地址。

(2)指針。指針就是地址。

(3)指針變量。指針變量是專門用來(lái)存放地址值的一種變量。

(4)直接訪問(wèn)方式。先根據(jù)變量名與內(nèi)存單元地址的對(duì)應(yīng)關(guān)系,找到變量在內(nèi)存中的位置,然后從該地址中取出變量的值,這種方式就是直接訪問(wèn)方式。

(5)間接訪問(wèn)方式。如果要存取變量的值,可以將變量的地址放在另一個(gè)內(nèi)存單元中,訪問(wèn)時(shí)先找到存放變量的地址的內(nèi)存單元地址,從中取出該變量的地址,然后從該地址的內(nèi)存單元中取出變量的值,這種訪問(wèn)方式就是間接訪問(wèn)方式。在這種訪問(wèn)方式中就會(huì)用到指針。

2.指針與變量

(1)指針變量定義的一般形式為

類型說(shuō)明符*指針變量名;

在上述語(yǔ)句中的*表示“指向”;指針變量名即為標(biāo)識(shí)符,必須是一個(gè)合法的標(biāo)識(shí)符;類型說(shuō)明符表示該指針變量所能指向的對(duì)象的數(shù)據(jù)類型。

(2)指針變量的引用。弄清指針和指針變量的概念,掌握了指針變量的定義后,就可以使用指針來(lái)進(jìn)行間接訪問(wèn)了。有關(guān)指針的運(yùn)算符有兩個(gè):

&——取變量地址的運(yùn)算符;

*?——指針運(yùn)算符或稱“間接訪問(wèn)”運(yùn)算符。

(3)指針變量作為函數(shù)的參數(shù)。函數(shù)的形參不僅可以是整型、實(shí)型、字符型,還可以是指針類型。指針變量存放的是地址,同樣可以作為函數(shù)的參數(shù)來(lái)進(jìn)行“地址傳送”,實(shí)際參數(shù)可以是地址常量或指針變量,形式參數(shù)則為指針變量。

3.指針變量的運(yùn)算

若先使指針變量p指向數(shù)組a[](即p=a;),則變量中的運(yùn)算如下:

(1)?p++(或p+=1)。該操作將使指針變量p指向下一個(gè)數(shù)組元素,即a[1]。若再執(zhí)行x=*p,則將取出a[1]的值,將其賦給變量x。

(2)?*p++。由于++與*運(yùn)算符優(yōu)先級(jí)相同,而結(jié)合方向?yàn)樽杂蚁蜃?,?*p++?等價(jià)于*(p++)。其作用是先得到p指向的變量的值(即?*p),然后再執(zhí)行p自加運(yùn)算。

(3)?(*p)++。該運(yùn)算表示p所指向的元素值加1。要注意的是,這里是元素值加1而不是指針變量值加1。若指針變量p指向&a[0],且a[0]=3,則(*p)++?等價(jià)于(a[0])++,此時(shí)a[0]?值增為4。

若p當(dāng)前指向數(shù)組中第i個(gè)元素,則

*(p--)與a[i--]?等價(jià),相當(dāng)于先執(zhí)行*p,然后再使p自減;

*(++p)與a[++i]?等價(jià),相當(dāng)于先執(zhí)行p自加,再執(zhí)行?*p運(yùn)算;

*(--p)與a[--i]等價(jià),相當(dāng)于先執(zhí)行p自減,再執(zhí)行?*p運(yùn)算。

4.KeilCx51的指針類型

KeilCx51支持“基于存儲(chǔ)器的指針”和“一般指針”兩種指針類型。

1)基于存儲(chǔ)器的指針

2)一般指針

一般指針包含3個(gè)字節(jié),其中2個(gè)字節(jié)是偏移,1個(gè)字節(jié)為存儲(chǔ)器類型。第一個(gè)字節(jié)代表了指針的存儲(chǔ)器類型。存儲(chǔ)器類型有四種:0x00代表idata、data、bdata;0x01代表xdata;0xfe代表pdata;0xff代表code。

例如:表示xdata類型的0x23fe地址作為指針可以表示成如表4-3所示的形式。表4-3一般指針的定義方法4.5Cx51的函數(shù)、變量的作用域和存儲(chǔ)類型

在Cx51語(yǔ)言程序設(shè)計(jì)過(guò)程中,一般都采用模塊化程序設(shè)計(jì)方法,也就是說(shuō)一個(gè)比較大的程序都是由一個(gè)個(gè)函數(shù)構(gòu)成的,函數(shù)就是匯編語(yǔ)言程序設(shè)計(jì)中所說(shuō)的“子程序”或“過(guò)程”。本節(jié)要求學(xué)會(huì)設(shè)計(jì)并使用(調(diào)用)函數(shù),同時(shí)通過(guò)程序設(shè)計(jì)的練習(xí),要求進(jìn)一步掌握“自頂向下,逐步求精”的結(jié)構(gòu)化程序設(shè)計(jì)方法。在Cx51中,同樣也采用函數(shù)來(lái)實(shí)現(xiàn)重復(fù)地去做某件事的過(guò)程。主程序(main())可以根據(jù)需要來(lái)調(diào)用其他函數(shù)。當(dāng)函數(shù)執(zhí)行完畢后,就可以發(fā)出返回指令,而主程序main()用后面的指令來(lái)恢復(fù)主程序流的執(zhí)行。同一個(gè)函數(shù)可以在不同的地方被調(diào)用,并且函數(shù)可以重復(fù)使用。也就是說(shuō)Cx51語(yǔ)言程序是由一個(gè)個(gè)函數(shù)構(gòu)成的,在構(gòu)成Cx51語(yǔ)言程序的若干個(gè)函數(shù)中,必有一個(gè)是主函數(shù)main()。下面所示為Cx51語(yǔ)言程序的一般組成結(jié)構(gòu):

1.函數(shù)的分類

Cx51語(yǔ)言函數(shù)分為主函數(shù)main()和普通函數(shù)兩種。而從用戶的角度劃分,普通函數(shù)又可分為兩種:一種是標(biāo)準(zhǔn)庫(kù)函數(shù);一種是用戶自定義函數(shù)。

1)標(biāo)準(zhǔn)庫(kù)函數(shù)

標(biāo)準(zhǔn)庫(kù)函數(shù)是由Cx51編譯系統(tǒng)的函數(shù)庫(kù)提供的。Cx51語(yǔ)言系統(tǒng)一般都具有功能強(qiáng)大、資源豐富的標(biāo)準(zhǔn)函數(shù)庫(kù)。因此,作為系統(tǒng)的使用者,在進(jìn)行程序設(shè)計(jì)時(shí),應(yīng)該善于充分利用這些標(biāo)準(zhǔn)庫(kù)函數(shù)資源,以提高效率,節(jié)省時(shí)間。

2)用戶自定義函數(shù)

用戶自定義函數(shù)就是用戶根據(jù)自己的需要編寫(xiě)的函數(shù)。

從函數(shù)定義的形式上劃分,用戶自定義函數(shù)可以有三種形式:無(wú)參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)。

2.函數(shù)的定義

函數(shù)定義是一個(gè)完整的構(gòu)造。在編譯時(shí),編譯程序根據(jù)函數(shù)定義為函數(shù)分配存儲(chǔ)空間。

(1)無(wú)參數(shù)函數(shù)的定義形式:

返回值類型標(biāo)識(shí)符函數(shù)名(){函數(shù)體語(yǔ)句}

(2)有參數(shù)函數(shù)的定義形式:

返回值類型標(biāo)識(shí)符函數(shù)名{數(shù)據(jù)類型形式參數(shù),數(shù)據(jù)類型形式參數(shù)…}

{函數(shù)體語(yǔ)句}

(3)空函數(shù)的定義方法:

返回值類型說(shuō)明符函數(shù)名(){}

3.函數(shù)的參數(shù)和函數(shù)值

Cx51語(yǔ)言采用函數(shù)之間的參數(shù)傳遞方式,使一個(gè)函數(shù)能對(duì)不同的變量進(jìn)行功能相同的處理,從而提高了函數(shù)的通用性與靈活性。

函數(shù)之間的參數(shù)傳遞,通過(guò)主調(diào)用函數(shù)的實(shí)際參數(shù)與被調(diào)用函數(shù)的形式參數(shù)之間進(jìn)行數(shù)據(jù)傳遞來(lái)實(shí)現(xiàn)。被調(diào)用函數(shù)的最后結(jié)果由被調(diào)用函數(shù)的return語(yǔ)句返回給主調(diào)用函數(shù)。

1)形式參數(shù)和實(shí)際參數(shù)

(1)形式參數(shù)。在定義函數(shù)時(shí),函數(shù)名后面括號(hào)中的變量名稱為“形式參數(shù)”,簡(jiǎn)稱形參。

(2)實(shí)際參數(shù)。在函數(shù)調(diào)用時(shí),主調(diào)用函數(shù)名后面括號(hào)中的變量名稱為“實(shí)際參數(shù)”,簡(jiǎn)稱實(shí)參。

2)函數(shù)的返回值

主調(diào)函數(shù)用main()在調(diào)用有參數(shù)函數(shù)時(shí),將實(shí)際參數(shù)傳遞給被調(diào)用函數(shù)的形式參數(shù)。然后,被調(diào)用函數(shù)使用形式參數(shù)作為輸入變量進(jìn)行運(yùn)算,所得結(jié)果通過(guò)返回語(yǔ)句returnu返回給主函數(shù),并在主函數(shù)的語(yǔ)句中通過(guò)等號(hào)賦值給變量。這個(gè)變量u就是被調(diào)用函數(shù)的返回值,簡(jiǎn)稱函數(shù)的返回值。

4.函數(shù)的調(diào)用

函數(shù)調(diào)用的一般形式為

函數(shù)名(實(shí)際參數(shù)表列);

對(duì)于有參數(shù)型函數(shù),若包含多個(gè)實(shí)際參數(shù),則應(yīng)將各參數(shù)之間用逗號(hào)分隔開(kāi)。主調(diào)用函數(shù)的實(shí)際參數(shù)的數(shù)目與被調(diào)用函數(shù)的形式參數(shù)的數(shù)目應(yīng)該相等。實(shí)際參數(shù)與形式參數(shù)按實(shí)際順序一一對(duì)應(yīng)傳遞數(shù)據(jù)。如果調(diào)用的是無(wú)參數(shù)函數(shù),則實(shí)際參數(shù)表可以省略,但函數(shù)名后面必須有一對(duì)空括號(hào)。函數(shù)調(diào)用包括以下幾個(gè)步驟:

(1)在程序源文件的開(kāi)頭以包含的方式指明函數(shù)(標(biāo)準(zhǔn)模塊)所屬函數(shù)庫(kù)名,或者是函數(shù)(與主調(diào)函數(shù)不在同一文件)所屬的文件名稱,格式為

#include<函數(shù)庫(kù)名?.h>

#include<文件名稱?.c>

(2)為了在程序中使用函數(shù)調(diào)用語(yǔ)句,調(diào)用一個(gè)在其后定義的函數(shù),一般應(yīng)該在該函數(shù)調(diào)用語(yǔ)句之前,使用函數(shù)說(shuō)明語(yǔ)句對(duì)該被調(diào)用函數(shù)做說(shuō)明,以確保函數(shù)被正常調(diào)用,其格式為

類型標(biāo)識(shí)符被調(diào)用函數(shù)的函數(shù)名(形參類型序列);

(3)調(diào)用函數(shù)的形式為

函數(shù)名(實(shí)參序列)

(4)函數(shù)調(diào)用的執(zhí)行過(guò)程就是首先把實(shí)參傳遞給被調(diào)用函數(shù)的形參,這個(gè)過(guò)程稱為形參和實(shí)參的結(jié)合。然后,程序控制轉(zhuǎn)移到被調(diào)用函數(shù)的第一個(gè)語(yǔ)句開(kāi)始執(zhí)行,執(zhí)行完被調(diào)用函數(shù)的最后一條語(yǔ)句或者執(zhí)行到被調(diào)用函數(shù)中的return語(yǔ)句時(shí),就從被調(diào)用函數(shù)返回主調(diào)用函數(shù)繼續(xù)執(zhí)行。

(5)主調(diào)用函數(shù)對(duì)被調(diào)用函數(shù)的調(diào)用可以有以下三種方式:

①函數(shù)調(diào)用語(yǔ)句。把被調(diào)用函數(shù)名作為主調(diào)用函數(shù)中的一條語(yǔ)句。②函數(shù)結(jié)果作為表達(dá)式的一個(gè)運(yùn)算對(duì)象。此時(shí)被調(diào)用函數(shù)以一個(gè)運(yùn)算對(duì)象的身份出現(xiàn)在一個(gè)表達(dá)式中。這就要求被調(diào)用函數(shù)帶有return語(yǔ)句,以便返回一個(gè)明確的數(shù)值參加表達(dá)式的運(yùn)算。被調(diào)用函數(shù)只能作為表達(dá)式的一部分。

③函數(shù)參數(shù)。被調(diào)用函數(shù)作為另一個(gè)函數(shù)的實(shí)際參數(shù)。

4.6Cx51語(yǔ)言程序設(shè)計(jì)

1.模塊化程序設(shè)計(jì)

模塊化程序設(shè)計(jì)就是遵循一定的模塊分解和組織原則,把一個(gè)大程序分解為多個(gè)容易理解和實(shí)現(xiàn)的大小適當(dāng)、功能明確、具有一定獨(dú)立性的程序模塊的過(guò)程。結(jié)構(gòu)化編程是把任何程序的結(jié)構(gòu)都限制為順序、選擇和循環(huán)三種基本結(jié)構(gòu),以提高程序的可讀性和可靠性。

一個(gè)結(jié)構(gòu)化程序應(yīng)當(dāng)具有以下特點(diǎn):

(1)有一個(gè)入口、一個(gè)出口;

(2)沒(méi)有死語(yǔ)句(永遠(yuǎn)執(zhí)行不到的語(yǔ)句),每一個(gè)語(yǔ)句應(yīng)當(dāng)至少有一條從入口到出口的路徑通過(guò)它;

(3)沒(méi)有死循環(huán)(無(wú)限制的循環(huán))。

2.文件命名規(guī)則

程序文件有幾個(gè)常用的擴(kuò)展名:

(1)?.asm是匯編語(yǔ)言源文件;

(2)?.a51是匯編語(yǔ)言源文件;

(3)?.p51是PL/M語(yǔ)言源文件;

(4)?.c51是Cx51語(yǔ)言源文件;

(5)?.c是C語(yǔ)言源文件;

(6)?.LST包含匯編、編譯的程序和錯(cuò)誤的列表文件;

(7)?.OBJ文件為可重新定位的目標(biāo)模塊;

(8)?.HEX文件為轉(zhuǎn)換成Intel的目標(biāo)文件格式;

(9)?.lib為庫(kù)文件;

(10)?.m51/.map為連接/定位后的映像文件;

(11)?.lnk為連接器、定位器使用的文件;

(12)?.h為源文件的頭文件。

4.7程序設(shè)計(jì)舉例

4.7.1順序程序

為了將匯編語(yǔ)言與Cx51語(yǔ)言進(jìn)行對(duì)比,我們將上一章的例題3-49進(jìn)行Cx51語(yǔ)言的改寫(xiě)。

4.7.2選擇程序

【例4-12】

已知X、Y均為8位二進(jìn)制有符號(hào)數(shù),分別存在30H、31H中,試編寫(xiě)能實(shí)現(xiàn)下列符號(hào)函數(shù)的程序:

4.7.3循環(huán)程序

【例4-13】

編寫(xiě)一段程序,采用冒泡排序法,將內(nèi)存地址為50H~57H中的無(wú)符號(hào)數(shù),從小到大排序。

使用Cx51語(yǔ)言編寫(xiě)程序如下:

4.8習(xí)題

1.單片機(jī)識(shí)別的語(yǔ)言有幾種,各有什么優(yōu)缺點(diǎn)?

2.Cx51語(yǔ)言能識(shí)別的數(shù)據(jù)類型有哪幾種?

3.如何在Cx51中定義變量?變量分為幾種?

4.Cx51語(yǔ)言中能識(shí)別的數(shù)據(jù)存儲(chǔ)類型有幾種?分別有什么區(qū)別?

5.Cx51如何定義80C51特殊功能寄存器和80C51并行接口?

6.Cx51有幾種運(yùn)算符?它們的優(yōu)先級(jí)是如何排列的?

7.Cx51有幾種基本結(jié)構(gòu)?如何畫(huà)流程圖?

8.在Cx51中如何使用數(shù)組?字符數(shù)組如何定義和使用?

9.什么是指針?基于KeilCx51有幾種指針類型,如何定義和使用?

10.Cx51語(yǔ)言中函數(shù)是如何定義和使用的?函數(shù)分為幾種?

11.在Cx51語(yǔ)言中有幾種常見(jiàn)的文件擴(kuò)展名?

12.什么是算法?

13.什么是結(jié)構(gòu)化的算法?有什么優(yōu)點(diǎn)?

14.字符常量與字符串常量有什么區(qū)別?

15.填空。

(1)若有以下定義():

chara;intb;

floatc;doubled;

則表達(dá)式a*b+d-c值的類型為

A.float B.int

C.cha D.double

(2)表示關(guān)系x≤y≤z的C語(yǔ)言表達(dá)式為()。

A.(X<=Y)&&(Y<=Z) B.(X<=Y)AND(Y<=Z)

C.(X<=Y<=Z) D.(X<=Y)&(Y<=Z)

(10)單片機(jī)片內(nèi)RAM的低128字節(jié)可以分為_(kāi)_____個(gè)區(qū)域,第一區(qū)域安排了______組工作寄存器,每組占用_______個(gè)RAM字節(jié),工作寄存器組的選擇由________中的兩位來(lái)確定。

(11)?KeilCx51編譯器將變量、常量定義成不同存儲(chǔ)類型,分別為_(kāi)________、__________、___________、___________、___________、___________,將它們定位在不同存儲(chǔ)區(qū)中。

(12)關(guān)鍵字“sfr”是對(duì)特殊功能寄存器的定義,定義特殊功能寄存器地址范圍位于__________之間。

(13)已知a=30H,b=4DH,則a&b的值為_(kāi)___________。

(14)已知PSW的字節(jié)地址為0xd0H,字節(jié)分配如下:

試用三種方法對(duì)CY進(jìn)行位聲明____________、____________和____________。

(15)設(shè)i,j,k均為int型變量,則執(zhí)行完下面的for循環(huán)后,k的值為

。

for(i=0,j=10;i<=j;i++,j--)k=i+j;

(16)若函數(shù)fun的類型為void,且有以下定義和調(diào)用語(yǔ)句:

16.將下列條件寫(xiě)成C語(yǔ)言的關(guān)系表達(dá)式或邏輯表達(dá)式:

(1)?a>d或b>d;

(2)?a不等于b;

(3)?i大于等于15并且j大于等于25;

(4)?h大于等于40?×?b并且m小于12,或者,h小于40?×?b并且m大于等于12;

(5)?a、b、c、d均不為0;

(6)?x、y之一等于9并且s、t之一等于9。

17.已知a=5、b=4,計(jì)算下列表達(dá)式的值:

(1)?4×a>6+b;

(2)?7>5||30==a*b||a>40;

(3)?a>=b&&b*2==a+3&&a<0&&a*a+b*b>=a*b+b*a;

(4)

!a>b&&b<20||a>0。

(6)根據(jù)考試成績(jī),打印等級(jí)分。

(7

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論