單片機(jī)技術(shù)及應(yīng)用第九章 c51程序設(shè)計(jì)及應(yīng)用_第1頁(yè)
單片機(jī)技術(shù)及應(yīng)用第九章 c51程序設(shè)計(jì)及應(yīng)用_第2頁(yè)
單片機(jī)技術(shù)及應(yīng)用第九章 c51程序設(shè)計(jì)及應(yīng)用_第3頁(yè)
單片機(jī)技術(shù)及應(yīng)用第九章 c51程序設(shè)計(jì)及應(yīng)用_第4頁(yè)
單片機(jī)技術(shù)及應(yīng)用第九章 c51程序設(shè)計(jì)及應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩82頁(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)介

1、單 片 機(jī) 技 術(shù) 與 應(yīng) 用 實(shí) 踐第9章 C51程序設(shè)計(jì)及應(yīng)用 單片機(jī)技術(shù)與應(yīng)用實(shí)踐教學(xué)提示 本章主要介紹了C51程序設(shè)計(jì)基礎(chǔ)知識(shí),包括C語(yǔ)言的數(shù)據(jù)類(lèi)型、運(yùn)算符、各種語(yǔ)句、數(shù)組與函數(shù)等知識(shí),使大家具有單片機(jī)C語(yǔ)言程序設(shè)計(jì)的能力。教學(xué)目標(biāo)了解C51與ASM51的區(qū)別。掌握C51程序設(shè)計(jì)基礎(chǔ)知識(shí)。掌握C51的函數(shù)與數(shù)組的使用方法。學(xué)會(huì)用C語(yǔ)言編寫(xiě)簡(jiǎn)單單片機(jī)程序。單片機(jī)技術(shù)與應(yīng)用實(shí)踐9.1 C51程序設(shè)計(jì)基礎(chǔ)知識(shí) 9.2 C51的函數(shù)與數(shù)組 9.3 實(shí)踐訓(xùn)練單片機(jī)技術(shù)與應(yīng)用實(shí)踐9.1 C51程序設(shè)計(jì)基礎(chǔ)知識(shí) 9.1.1 C51特點(diǎn)9.1.2 C51編程的例子9.1.3 C51的標(biāo)識(shí)符和保留字 9

2、.1.4 C51的數(shù)據(jù)類(lèi)型9.1.5 C51的常量9.1.6 變量9.1.7 C51的常用運(yùn)算符9.1.8 C51的輸入輸出9.1.9 C51的基本語(yǔ)句單片機(jī)技術(shù)與應(yīng)用實(shí)踐9.1 C51程序設(shè)計(jì)基礎(chǔ)知識(shí) 9.1.1 C51特點(diǎn)(1)對(duì)單片機(jī)的指令系統(tǒng)不要求了解,僅要求對(duì)51系列單片機(jī)的存貯器結(jié)構(gòu)有初步了解;(2)寄存器分配、不同存貯器的尋址及數(shù)據(jù)類(lèi)型等細(xì)節(jié)可由編譯器管理;(3)程序有規(guī)范的結(jié)構(gòu),可分成不同的函數(shù),這種方式可使程序結(jié)構(gòu)化;(4)提供的庫(kù)包含許多標(biāo)準(zhǔn)子程序,具有較強(qiáng)的數(shù)據(jù)處理能力;(5)由于具有方便的模塊化編程技術(shù),使已編好程序可容易地移植;(6)生成的目標(biāo)代碼的效率略低于匯編語(yǔ)言

3、程序。C51與ASM51相比,主要具有如下特點(diǎn):?jiǎn)纹瑱C(jī)技術(shù)與應(yīng)用實(shí)踐9.1.2 C51編程的例子【例9-1】 編程使接在引腳上的LED發(fā)光。#include reg51.hsbit P1_0=P10;void main() P1_0=0; /* P1.0 燈亮*/ 這個(gè)程序的作用是讓接在引腳上的LED點(diǎn)亮單片機(jī)技術(shù)與應(yīng)用實(shí)踐1. 編譯預(yù)處理部分 程序的第一行是一個(gè)“文件包含”處理。程序中包含文件的目的是為了要使用P1這個(gè)符號(hào),即通知C編譯器,程序中所寫(xiě)的P1是指80C51單片機(jī)的P1端口而不是其他變量。 可根據(jù)不同的編程需要選擇不同的頭文件,一般情況下若只用簡(jiǎn)單控制,只需要下面3個(gè)頭文件:#i

4、nclude reg51.h/*寄存器說(shuō)明頭文件*/#include /*輸入/輸出說(shuō)明頭文件*/#include /*部分特殊指令說(shuō)明頭文件*/ 在C語(yǔ)言里,如果直接寫(xiě),C編譯器并不能識(shí)別,而且也不是一個(gè)合法的C語(yǔ)言變量名,所以需給它另起一個(gè)名字,這里使用了Keil C的關(guān)鍵字sbit來(lái)定義。2. 說(shuō)明與定義部分單片機(jī)技術(shù)與應(yīng)用實(shí)踐 函數(shù)是C51程序的基本單位,一個(gè)C51程序至少有一個(gè)主函數(shù)main(),也可以由一個(gè)主函數(shù)main()和若干個(gè)其他函數(shù)構(gòu)成。函數(shù)由函數(shù)說(shuō)明部分和函數(shù)體兩部分構(gòu)成。 (1) 函數(shù)說(shuō)明部分由函數(shù)名、函數(shù)類(lèi)型、函數(shù)屬性、函數(shù)參數(shù)(形參)名和形式參數(shù)類(lèi)型組成。 一個(gè)函數(shù)

5、名后面必須跟一對(duì)圓括號(hào),即便沒(méi)有任何參數(shù)也是如此。 (2) 函數(shù)體,即函數(shù)說(shuō)明部分下面的大括號(hào)“”內(nèi)的部分。函數(shù)體一般包括: 聲明部分:在這部分中定義所用到的變量. 執(zhí)行部分:由若干個(gè)語(yǔ)句組成。說(shuō)明: void Delay() /*這是一個(gè)空函數(shù),什么也不做,但它是合法的*/ 3. 函數(shù)單片機(jī)技術(shù)與應(yīng)用實(shí)踐(1)每個(gè)變量必須先定義后使用。(2)變量名由英文字母、數(shù)字和下劃線構(gòu)成,具體使用細(xì)則見(jiàn)小節(jié)。(3)C語(yǔ)言書(shū)寫(xiě)的格式自由,可以在一行寫(xiě)多個(gè)語(yǔ)句,也可以把一個(gè)語(yǔ)句寫(xiě)在多行。沒(méi)有行號(hào)(但可以有標(biāo)號(hào)),對(duì)書(shū)寫(xiě)的縮進(jìn)沒(méi)有要求。但是建議讀者自己按一定的規(guī)范來(lái)寫(xiě),可以給自己帶來(lái)方便。(4)每個(gè)語(yǔ)句的最后

6、必須有一個(gè)分號(hào)“;”,分號(hào)是C語(yǔ)句的必要組成部分,此點(diǎn)尤其要注意與匯編語(yǔ)言區(qū)分??照Z(yǔ)句可以只用一個(gè)分號(hào)表示,在分號(hào)前什么也不寫(xiě),最好用花括號(hào)把分號(hào)括起來(lái),即;,表示什么也不做但要耗費(fèi)一定的時(shí)間,作用類(lèi)似于匯編語(yǔ)言中的空操作指令NOP。4. 語(yǔ)句組成規(guī)則單片機(jī)技術(shù)與應(yīng)用實(shí)踐 可以用/*.*/的形式為C程序的任何一部分做注釋,在“/*”開(kāi)始后,一直到“*/”為止的中間的任何內(nèi)容都被認(rèn)為是注釋。注意:Keil C也支持C+風(fēng)格的注釋,就是用“/”引導(dǎo)的后面的語(yǔ)句是注釋.例:P1_0=!P1_0; /取反 這種風(fēng)格的注釋只對(duì)本行有效,而且書(shū)寫(xiě)比較方便,所以在只需要一行注釋時(shí),往往采用這種格式。的注釋單

7、片機(jī)技術(shù)與應(yīng)用實(shí)踐C51程序結(jié)構(gòu)如下:譯預(yù)處理部分#include #define 標(biāo)識(shí)符 字符串說(shuō)明與定義部分sbit P1_0=P10; /*變量定義*/void delay(void); /*函數(shù)聲明*/void main() /*主函數(shù)說(shuō)明*/ 聲明部分 執(zhí)行部分void delay(int a) /*子函數(shù)說(shuō)明*/ 聲明部分 執(zhí)行部分譯預(yù)處理部分說(shuō)明與定義部分主函數(shù)定義函數(shù)體子函數(shù)定義函數(shù)體單片機(jī)技術(shù)與應(yīng)用實(shí)踐9.1.3 C51的標(biāo)識(shí)符和保留字 標(biāo)識(shí)符用于標(biāo)識(shí)語(yǔ)句、數(shù)據(jù)類(lèi)型、函數(shù)、變量、數(shù)組、存儲(chǔ)方式等對(duì)象,也就是這些對(duì)象的名字。在C語(yǔ)言中,標(biāo)識(shí)符嚴(yán)格區(qū)分大小寫(xiě)。在C51編譯器中,支

8、持標(biāo)識(shí)符的前32位為有效標(biāo)識(shí),如果超長(zhǎng),則超長(zhǎng)部分被舍棄。注意:變量名只能由字母、數(shù)字、下劃線組成,且只能由字母和下劃線開(kāi)頭。變量不能是C語(yǔ)言的保留字(或稱關(guān)鍵字),即不能使用C語(yǔ)言系統(tǒng)已經(jīng)有固定含義的單詞。單片機(jī)技術(shù)與應(yīng)用實(shí)踐表9-1 C語(yǔ)言32個(gè)保留字表9-2 C51擴(kuò)展13個(gè)保留字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedstaticsizofstructswitchtypedefunionunsignedvoidvola

9、tilewhilebitsbitsfrsfr16databdataxdatacodeinterrupt reentran usingidatapdata單片機(jī)技術(shù)與應(yīng)用實(shí)踐9.1.4 C51的數(shù)據(jù)類(lèi)型 數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中的存放情況由數(shù)據(jù)結(jié)構(gòu)決定。C語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)是由數(shù)據(jù)類(lèi)型決定的,C51的數(shù)據(jù)類(lèi)型分為基本數(shù)據(jù)類(lèi)型和組合數(shù)據(jù)類(lèi)型,組合數(shù)據(jù)類(lèi)型是由基本數(shù)據(jù)類(lèi)型構(gòu)造而成的。情況與標(biāo)準(zhǔn)C中的數(shù)據(jù)類(lèi)型基本相同,標(biāo)準(zhǔn)C語(yǔ)言中基本的數(shù)據(jù)類(lèi)型為char、int、short、long、float和double。組合數(shù)據(jù)類(lèi)型有數(shù)組類(lèi)型、結(jié)構(gòu)體類(lèi)型、共同體類(lèi)型、枚舉類(lèi)型、指針類(lèi)型和空類(lèi)型。注意:在C51編譯器中in

10、t和short相同,float和double相同。另外,C51中還有專門(mén)針對(duì)MCS-51單片機(jī)的特殊功能寄存器類(lèi)型和位類(lèi)型。單片機(jī)技術(shù)與應(yīng)用實(shí)踐表9-3 C51基本數(shù)據(jù)類(lèi)型基本數(shù)據(jù)類(lèi)型長(zhǎng) 度取值范圍unsigned char1B0255signed char1B-128+127unsigned int2B065535signed int2B-32768+32767unsigned long4B04294967295signed long4B-2147483648+2147483647float4B1.175494E-383.402823E+38bit1b0或1sbit1b0或1sfr1B025

11、5sfr162B065535單片機(jī)技術(shù)與應(yīng)用實(shí)踐1字符型char 長(zhǎng)度為一個(gè)字節(jié),用于存放一個(gè)單字節(jié)的數(shù)據(jù)。可以分為以下兩種:(1) signed char:用于定義帶符號(hào)字節(jié)數(shù)據(jù),其字節(jié)的最高位為符號(hào)位,“0”表示正數(shù),“1”表示負(fù)數(shù),用補(bǔ)碼表示,所能表示的數(shù)值范圍是-128+127。(2) unsigned char:用于定義無(wú)符號(hào)字節(jié)數(shù)據(jù)或字符,可以存放一個(gè)字節(jié)的無(wú)符號(hào)數(shù),其取值范圍為0255??梢杂脕?lái)存放無(wú)符號(hào)數(shù),也可以存放西文字符,一個(gè)西文字符占一個(gè)字節(jié),在計(jì)算機(jī)內(nèi)部用ASCII碼存放。 默認(rèn)為signed char。 單片機(jī)技術(shù)與應(yīng)用實(shí)踐2int整型 長(zhǎng)度均為兩個(gè)字節(jié),用于存放一個(gè)

12、雙字節(jié)數(shù)據(jù)。可分兩種:(1) signed int:用于存放兩字節(jié)帶符號(hào)數(shù),用補(bǔ)碼表示,數(shù)的范圍為-32768+32767。(2) unsigned int:用于存放兩字節(jié)無(wú)符號(hào)數(shù),數(shù)的范圍為065535。 默認(rèn)為signed int。 3long長(zhǎng)整型 長(zhǎng)度均為4字節(jié),用于存放一個(gè)4字節(jié)數(shù)據(jù)??煞忠韵聝煞N:(1) signed long:用于存放4字節(jié)帶符號(hào)數(shù),用補(bǔ)碼表示,數(shù)的范圍為-2147483648 +2147483647。(2) unsigned long:用于存放4字節(jié)無(wú)符號(hào)數(shù),數(shù)的范圍為04294967295。 默認(rèn)為signed long。單片機(jī)技術(shù)與應(yīng)用實(shí)踐4 float浮點(diǎn)

13、型 float型數(shù)據(jù)的長(zhǎng)度為4字節(jié),格式符合IEEE754標(biāo)準(zhǔn)的單精度浮點(diǎn)型數(shù)據(jù),包含指數(shù)和尾數(shù)兩部分,最高位為符號(hào)位,“1”表示負(fù)數(shù),“0”表示正數(shù),其次的8位為階碼,最后的23位為尾數(shù)的有效數(shù)位,由于尾數(shù)的整數(shù)部分隱含為“1”,所以尾數(shù)的精度為24位。 5* 指針型 指針變量本身也是一個(gè)變量,在這個(gè)變量中存放的是指向另一個(gè)數(shù)據(jù)的地址。這個(gè)指針變量要占用一定的內(nèi)存單元,對(duì)不同的處理器其長(zhǎng)度不一樣,在C51中它的長(zhǎng)度一般為13個(gè)字節(jié)。單片機(jī)技術(shù)與應(yīng)用實(shí)踐6特殊功能寄存器型 C51提供的一種擴(kuò)展數(shù)據(jù)類(lèi)型,用于訪問(wèn)MCS-51單片機(jī)中的特殊功能寄存器數(shù)據(jù),在C51中對(duì)特殊功能寄存器的訪問(wèn)必須先用s

14、fr或sfr16進(jìn)行聲明??梢苑譃橐韵聝煞N:(1) sfr:sfr為字節(jié)型特殊功能寄存器類(lèi)型,占一個(gè)內(nèi)存單元,利用它可以訪問(wèn)MCS-51內(nèi)部的所有特殊功能寄存器。(2) sfr16:sfr16為雙字節(jié)型特殊功能寄存器類(lèi)型,占用兩個(gè)字節(jié)單元,利用它可以訪問(wèn)MCS-51內(nèi)部的所有兩個(gè)字節(jié)的特殊功能寄存器。單片機(jī)技術(shù)與應(yīng)用實(shí)踐7位類(lèi)型 位類(lèi)型也是C51提供的擴(kuò)展數(shù)據(jù)類(lèi)型,用于訪問(wèn)MCS-51單片機(jī)中的可尋址的位單元,但不能定義位指針也不能定義位數(shù)組。它們?cè)趦?nèi)存中都只占一個(gè)二進(jìn)制位,其值可以是“1”或“0”。支持以下兩種位類(lèi)型:(1) bit型:定義的位變量在C51編譯器編譯時(shí),在不同時(shí)間位地址是可以

15、變化的。使用它可以定義一個(gè)位變量,但不能定義位指針,也不能定義位數(shù)組。(2) sbit型:定義的位變量必須與MCS-51單片機(jī)的一個(gè)可以尋址位單元或可位尋址的字節(jié)單元中的某一位(C51內(nèi)部的RAM及特殊功能寄存器中可位尋址空間)聯(lián)系在一起,在C51編譯器編譯時(shí),其對(duì)應(yīng)的位地址是不可變化的。單片機(jī)技術(shù)與應(yīng)用實(shí)踐說(shuō)明:在C51語(yǔ)言程序中,有可能會(huì)出現(xiàn)在運(yùn)算中數(shù)據(jù)類(lèi)型不一致的情況。C51允許任何標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型的自動(dòng)轉(zhuǎn)換,除自動(dòng)轉(zhuǎn)換外,還可以通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換符“()”對(duì)數(shù)據(jù)類(lèi)型進(jìn)行人為的強(qiáng)制轉(zhuǎn)換,例:1/2=0,而,此知識(shí)點(diǎn)在編程時(shí)尤其需要注意。以上所述的數(shù)據(jù)類(lèi)型中只有bit與unsigned char

16、兩種數(shù)據(jù)類(lèi)型可以直接轉(zhuǎn)換成機(jī)器指令。所以C語(yǔ)言中使用的其他數(shù)據(jù)類(lèi)型,雖然語(yǔ)句上很簡(jiǎn)單,但都要C51編譯器用一系列機(jī)器指令處理這些數(shù)據(jù)類(lèi)型。特別是對(duì)浮點(diǎn)數(shù),處理起來(lái)更加復(fù)雜,將明顯增加程序的長(zhǎng)度與執(zhí)行時(shí)間。因此應(yīng)該避免使用復(fù)雜的數(shù)據(jù)類(lèi)型。在編制C51程序時(shí),應(yīng)該盡可能使用無(wú)符號(hào)字符變量和位變量。單片機(jī)技術(shù)與應(yīng)用實(shí)踐9.1.5 C51的常量 整型常量也就是整型常數(shù),根據(jù)其值范圍在計(jì)算機(jī)中分配不同的字節(jié)數(shù)來(lái)存放。在C51中它可以表示成以下幾種形式:(1) 十進(jìn)制數(shù)。如123、-45、0等。(2) 十六進(jìn)制數(shù)。以0 x開(kāi)頭表示,如0 x12、-0 x3B等。(3) 長(zhǎng)整型。在C51中當(dāng)一個(gè)整數(shù)的值達(dá)到

17、長(zhǎng)整型的范圍,則該數(shù)按長(zhǎng)整型存放,在存儲(chǔ)器中占4字節(jié)。另外,如一個(gè)整數(shù)后面加一個(gè)字母L,這個(gè)數(shù)在存儲(chǔ)器中也按長(zhǎng)整型存放,如12L在存儲(chǔ)器中占4個(gè)字節(jié)。 常量是指在程序執(zhí)行過(guò)程中其值不能改變的量。在C51中支持整型常量、浮點(diǎn)型常量、字符型常量和字符串型常量。1整型常量單片機(jī)技術(shù)與應(yīng)用實(shí)踐2浮點(diǎn)型常量 字符型常量是用單引號(hào)括起的字符,如2、A、n等。可以是可顯示的ASCII字符,也可以是不可顯示的控制字符。對(duì)不可顯示的控制字符須在前面加上反斜杠“”組成轉(zhuǎn)義字符。利用它可以完成一些特殊功能和輸出時(shí)的格式控制。 浮點(diǎn)型常量也就是實(shí)型常數(shù)。有十進(jìn)制表示形式和指數(shù)表示形式。 十進(jìn)制表示形式又稱定點(diǎn)表示形式

18、,由數(shù)字和小數(shù)點(diǎn)組成,如、。 指數(shù)表示又稱科學(xué)記數(shù)法,常用于表示較大、較小的實(shí)型常量,指數(shù)形式為: 數(shù)字 .數(shù)字 e 整數(shù)如:6.021023,可表示成:6.02e+23或。-1.610-19,可表示成:。3字符型常量單片機(jī)技術(shù)與應(yīng)用實(shí)踐表9-4 C51轉(zhuǎn)義字符及其含義轉(zhuǎn)義字符含 義轉(zhuǎn)義字符含 義n換行反斜杠線r回車(chē)單引號(hào)符f換頁(yè)雙引號(hào)符t水平制表(Tab)ddd13位八進(jìn)制數(shù)所代表的字符v垂直制表xhh12位十六進(jìn)制數(shù)所代表的字符b退格符(backspace)0空字符單片機(jī)技術(shù)與應(yīng)用實(shí)踐 4字符串型常量 字符串型常量由一對(duì)雙引號(hào)括起來(lái)的零個(gè)或多個(gè)字符組成,雙引號(hào)僅起定界作用,本身并不是字符串

19、中的內(nèi)容。如“0123”、“Hello!”、“I am a student. ”、“”等。 注意:字符串常量與字符常量是不一樣的,一個(gè)字符常量在計(jì)算機(jī)內(nèi)只用一個(gè)字節(jié)存放,而一個(gè)字符串常量在內(nèi)存中存放時(shí)不僅雙引號(hào)內(nèi)的每個(gè)字符占一個(gè)字節(jié),而且系統(tǒng)會(huì)自動(dòng)的在后面加一個(gè)轉(zhuǎn)義字符“0”作為字符串結(jié)束符?!?”代表空操作字符,它不引起任何操作,也不會(huì)顯示到屏幕上。 如字符串student在內(nèi)存中的存儲(chǔ)形式如下:student0 字符串student存儲(chǔ)單元長(zhǎng)度為8字節(jié),字符串長(zhǎng)度為7字節(jié),需要注意的是,不能將字符串常量賦給一個(gè)字符變量,要用一個(gè)字符數(shù)組來(lái)存放 。單片機(jī)技術(shù)與應(yīng)用實(shí)踐9.1.6 變量 變量是

20、在程序運(yùn)行過(guò)程中其值可以改變的量。一個(gè)變量由兩部分組成:變量名和變量值。 在C51中,變量在使用前必須對(duì)變量進(jìn)行定義,指出變量的數(shù)據(jù)類(lèi)型和存儲(chǔ)模式。以便編譯系統(tǒng)為它分配相應(yīng)的存儲(chǔ)單元。定義的格式如下:存儲(chǔ)種類(lèi) 數(shù)據(jù)類(lèi)型說(shuō)明符 存儲(chǔ)器類(lèi)型 變量名1=初值,變量名2=初值; 在定義格式中除了數(shù)據(jù)類(lèi)型和變量名是必要的,其他都是可選項(xiàng)。單片機(jī)技術(shù)與應(yīng)用實(shí)踐 在定義變量時(shí),必須通過(guò)數(shù)據(jù)類(lèi)型說(shuō)明符指明變量的數(shù)據(jù)類(lèi)型,指明變量在存儲(chǔ)器中占用的字節(jié)數(shù)??梢允腔緮?shù)據(jù)類(lèi)型說(shuō)明符,也可以是組合數(shù)據(jù)類(lèi)型說(shuō)明符,還可以是用typedef定義的類(lèi)型別名。格式如下: typedefC51固有的數(shù)據(jù)類(lèi)型說(shuō)明符別名; 定義別

21、名后,就可以用別名代替數(shù)據(jù)類(lèi)型說(shuō)明符對(duì)變量進(jìn)行定義,但不能作為變量使用,如: 正確用法:typedefintInteger;Integera=2;錯(cuò)誤用法:typedefintInteger;Integer =2; 1數(shù)據(jù)類(lèi)型說(shuō)明符單片機(jī)技術(shù)與應(yīng)用實(shí)踐 變量名是C51區(qū)分不同變量,為不同變量取的名稱。變量名命名符合變量名命名規(guī)則。 變量名有兩種:普通變量名和指針變量名。它們的區(qū)別是指針變量名前面要帶“*”號(hào)。2變量名(1)auto(2)extern(3)static (4)register3存儲(chǔ)種類(lèi)存儲(chǔ)種類(lèi)是指變量在程序執(zhí)行過(guò)程中的作用范圍。單片機(jī)技術(shù)與應(yīng)用實(shí)踐 存儲(chǔ)器類(lèi)型是用于指明變量所處的

22、單片機(jī)的存儲(chǔ)器區(qū)域情況。存儲(chǔ)器類(lèi)型與存儲(chǔ)種類(lèi)完全無(wú)關(guān)。4存儲(chǔ)器類(lèi)型存儲(chǔ)器類(lèi)型描 述data直接尋址的片內(nèi)RAM低128B(00H7FH),訪問(wèn)速度快bdata片內(nèi)RAM的可位尋址區(qū)(20H2FH),允許字節(jié)和位混合訪問(wèn)idata間接尋址訪問(wèn)的片內(nèi)RAM,允許訪問(wèn)全部片內(nèi)RAM(00HFFH)pdata用MOVX Ri間接訪問(wèn)的片外RAM的低256B(00HFFH)表9-5 C51存儲(chǔ)器類(lèi)型【例9-2】變量定義存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型相關(guān)情況。char datavarl;intidatavar2;bitbdatavar3;externfloatxdatavar4; 單片機(jī)技術(shù)與應(yīng)用實(shí)踐 在C51中,

23、用戶對(duì)特殊功能寄存器進(jìn)行訪問(wèn)時(shí)須通過(guò)sfr或sfr16類(lèi)型說(shuō)明符進(jìn)行定義,定義時(shí)須指明它們所對(duì)應(yīng)的片內(nèi)RAM單元的地址。格式如下:sfr或sfr16特殊功能寄存器名=特殊功能寄存器地址常數(shù); 5特殊功能寄存器變量【例9-3】特殊功能寄存器的定義。sfrPSW=0 xD0;sfrP1=0 x90;sfrSCON=0 x98;sfrIE=0 xA8;sfr16DPTR=0 x82;/DPL=82H,DPH=83Hsfr16T2=0 xCC;/定義8052定時(shí)器2,地址為T(mén)2L=CCH,T2H=CDH單片機(jī)技術(shù)與應(yīng)用實(shí)踐位類(lèi)型符有:bit和sbit。 bit位類(lèi)型符用于定義一般的可位處理位變量。它的

24、格式如下: bit 位變量名; 在格式中可以加上各種修飾符,但注意存儲(chǔ)器類(lèi)型只能是bdata、data、idata,而且只能是片內(nèi)RAM的可位尋址區(qū),嚴(yán)格來(lái)說(shuō)只能是bdata。6位變量【例9-4】bit型變量的定義。bitdataa1;/*正確*/bitbdataa2;/*正確*/bitpdataa3;/*錯(cuò)誤*/bitxdataa4;/*錯(cuò)誤*/單片機(jī)技術(shù)與應(yīng)用實(shí)踐 sbit位類(lèi)型符用于定義在可位尋址字節(jié)或特殊功能寄存器中的位,定義時(shí)須指明其位地址,可以是位直接地址,可以是可位尋址變量帶位號(hào),也可以是特殊功能寄存器名帶位號(hào)。格式如下: sbit位變量名=位地址;6位變量【例9-5】sbit型

25、變量的定義。unsigned char bdata ib; sbit ib7=ib7 ; sbit OV=0 xd2;sfr P1=0 x90;sbit P1_0=P10; 單片機(jī)技術(shù)與應(yīng)用實(shí)踐 1運(yùn)算符1) 賦值運(yùn)算符 格式:變量=表達(dá)式; 執(zhí)行時(shí)先計(jì)算出右邊表達(dá)式的值,然后賦給左邊的變量。 9.1.7 C51的常用運(yùn)算符 學(xué)習(xí)C51運(yùn)算符要注意3點(diǎn):優(yōu)先級(jí)、結(jié)合方向、與數(shù)學(xué)運(yùn)算符的區(qū)別。例如:a = 0 xFF;/將常數(shù)十六進(jìn)制數(shù)FF賦予變量ab = c = 33;/將33同時(shí)賦值給變量b、cd = e; /將變量e的值賦予變量df = a+b;/將變量a+b的值賦予變量f單片機(jī)技術(shù)與應(yīng)用

26、實(shí)踐2)算術(shù)運(yùn)算符格式:表達(dá)式1算術(shù)運(yùn)算符表達(dá)式2;+加或取正值運(yùn)算符 -減或取負(fù)值運(yùn)算符*乘運(yùn)算符/除運(yùn)算符%取余運(yùn)算符+ 自增運(yùn)算符- 自減運(yùn)算符單片機(jī)技術(shù)與應(yīng)用實(shí)踐【例9-6】設(shè)有定義:int a = 1, b = 2, c; 則有:+i:i自增1后再參與其他運(yùn)算(先增后用)。-i:i自減1后再參與其他運(yùn)算(先減后用)。i+:i參與運(yùn)算后,i的值再自增1(先用后增)。i-:i參與運(yùn)算后,i的值再自減1(先用后減)。被執(zhí)行的表達(dá)式表達(dá)式執(zhí)行后a、c值acc= +a + b24c= a+ + b23c= - -a + b02c= a- - + b03單片機(jī)技術(shù)與應(yīng)用實(shí)踐3) 關(guān)系運(yùn)算符 大于

27、=大于等于=小于等于6種關(guān)系運(yùn)算符有不同優(yōu)先級(jí),左邊優(yōu)先級(jí)大于右邊。關(guān)系表達(dá)式的一般形式如下:表達(dá)式1 關(guān)系運(yùn)算符表達(dá)式2關(guān)系運(yùn)算的結(jié)果為邏輯量,成立為真(1),不成立為假(0)。 關(guān)系運(yùn)算用于比較兩個(gè)數(shù)的大小,用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來(lái)形成的式子,稱為關(guān)系表達(dá)式。= =等于!=不等于單片機(jī)技術(shù)與應(yīng)用實(shí)踐 4)邏輯運(yùn)算符 邏輯與:當(dāng)條件式1與條件式2都為真時(shí),結(jié)果為真(非0值),否則結(jié)果 為假(0值)。邏輯或:當(dāng)條件式1與條件式2都為假時(shí),結(jié)果為假(0值),否則結(jié)果為真(非0值)。邏輯非:當(dāng)條件式為真(非0值),邏輯非后結(jié)果為假(0值);當(dāng)條件式為假(0值),邏輯非后結(jié)果為真(非0值)。

28、 邏輯運(yùn)算符則用于求條件式的邏輯值,用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來(lái)的式子就是邏輯表達(dá)式。|邏輯或 條件式1 | 條件式2&邏輯與 條件式1 & 條件式2!邏輯非 !條件式單片機(jī)技術(shù)與應(yīng)用實(shí)踐5)位運(yùn)算符【例9-7】用“右移”8位分離出16位數(shù)的高8位,用“與”0 x00FF分離出16位數(shù)的低8位。程序清單如下:#include#include#includevoid main (void) unsigned int data x=0 x238A; unsigned char data a,b; /*定義在內(nèi)部RAM中的無(wú)符號(hào)8位字符*/ a=x8;/*取x的高8位*/ b=x&0 x

29、00FF;/*取x的低8位*/ &按位與|按位或按位異或按位取反右移單片機(jī)技術(shù)與應(yīng)用實(shí)踐6)復(fù)合賦值運(yùn)算符復(fù)合賦值運(yùn)算的一般格式如下:變量 復(fù)合運(yùn)算賦值符表達(dá)式+=加法賦值+減法賦值*=乘法賦值/=除法賦值%=取模賦值&=邏輯與賦值|=邏輯或賦值=邏輯異或賦值=邏輯非賦值=右移位賦值 3| a = = 1; 整個(gè)條件表達(dá)式值為1,執(zhí)行后a=1, b=7。 ( b = b + 5 ) &!(b 3|a = = 1); 整個(gè)條件表達(dá)式值為0,執(zhí)行后 a=1,b=7。 104&!(10099)&31自左向右單目! + - + - type & * sizeof2自右向左算術(shù)* / %3自左向右+ -

30、4移位 5自左向右關(guān)系 =6自左向右= = !=7位邏輯&8自左向右9|10邏輯&11自左向右|12條件?:13自右向左賦值= += -= *= /= %= |= = &= = =14自右向左逗號(hào),15自左向右單片機(jī)技術(shù)與應(yīng)用實(shí)踐 9.1.8 C51的輸入與輸出 在C51語(yǔ)言本身不提供輸入和輸出語(yǔ)句,輸入和輸出操作是由函數(shù)來(lái)實(shí)現(xiàn)的。當(dāng)使用輸入和輸出函數(shù)時(shí),須先用預(yù)處理命令#include 將該函數(shù)庫(kù)包含到文件中。 在C51的一般I/O函數(shù)庫(kù)中定義的I/O函數(shù)都是通過(guò)串行接口實(shí)現(xiàn)的,在使用I/O函數(shù)之前,應(yīng)先對(duì)MCS-51單片機(jī)的串行接口進(jìn)行初始化。選擇串行口工作于方式2(8位自動(dòng)重載方式),波

31、特率由定時(shí)器/計(jì)數(shù)器1溢出率決定。例如,設(shè)系統(tǒng)時(shí)鐘為12MHz,波特率為2400,則初始化程序如下:SCON=0 x52;TMOD=0X20;TH1=0 xF3;TR1=1;單片機(jī)技術(shù)與應(yīng)用實(shí)踐 printf()函數(shù)的作用是通過(guò)串行接口輸出若干任意類(lèi)型的數(shù)據(jù)。 格式: printf(格式控制符,輸出參數(shù)表); 格式控制符可由格式字符串和非格式字符串兩種組成。格式字符串是以%開(kāi)頭的字符串,在%后面跟有各種格式字符,以說(shuō)明輸出數(shù)據(jù)的類(lèi)型、形式、長(zhǎng)度、小數(shù)位數(shù)等。 輸出參數(shù)表為待輸出的一系列數(shù)據(jù)項(xiàng),其個(gè)數(shù)必須與格式化字符串所說(shuō)明的輸出參數(shù)個(gè)數(shù)一樣多,各參數(shù)之間用“,”分開(kāi),且順序一一對(duì)應(yīng)。1格式輸出

32、函數(shù)printf()單片機(jī)技術(shù)與應(yīng)用實(shí)踐表9-9 printf()格式控制符說(shuō)明 說(shuō) 明 符 功 能 %d 輸出十進(jìn)制有符號(hào)整數(shù)%ld 輸出十進(jìn)制有符號(hào)長(zhǎng)整數(shù)%x或%X 以十六進(jìn)制形式輸出無(wú)符號(hào)的整數(shù)%u 輸出十進(jìn)制無(wú)符號(hào)整數(shù)%f 輸出浮點(diǎn)數(shù)%s 輸出字符串%c 輸出單個(gè)字符%p 輸出指針值%e或%E 輸出指數(shù)形式的浮點(diǎn)數(shù)%0 以八進(jìn)制形式輸出無(wú)符號(hào)的整數(shù)單片機(jī)技術(shù)與應(yīng)用實(shí)踐scanf()函數(shù)的作用是通過(guò)串行接口實(shí)現(xiàn)數(shù)據(jù)輸入。格式:scanf(格式控制符,地址列表);2格式輸入函數(shù)scanf()注意點(diǎn): (1)scanf()函數(shù)中沒(méi)有精度控制,如scanf(%5.2f, &a);是非法的。(2

33、)scanf()中要求給出變量地址,如給出變量名則會(huì)出錯(cuò)。(3)在輸入多個(gè)數(shù)值數(shù)據(jù)時(shí),若“格式控制符”中沒(méi)有非格式字符作輸入數(shù)據(jù)之間的間隔,則可用空格、TAB或回車(chē)作間隔。(4)在輸入字符數(shù)據(jù)時(shí),若“格式控制符”中無(wú)非格式字符,則認(rèn)為所有輸入的字符均為有效字符。單片機(jī)技術(shù)與應(yīng)用實(shí)踐【例9-9】使用格式輸入和輸出函數(shù)的例子。源程序清單如下:#include /包含特殊功能寄存器庫(kù)#include /包含I/O函數(shù)庫(kù)void main(void) /主函數(shù)int x;float y;SCON=0 x52; /串口初始化TMOD=0 x20;TH1=0XF3;TR1=1;printf(input x

34、,y:n); /輸出提示信息scanf(%d,%f,&x,&y); /輸入x和y的值printf(n); /輸出換行printf(%d+%f=%f,x,y,x+y); /按十進(jìn)制形式輸出while(1); /結(jié)束單片機(jī)技術(shù)與應(yīng)用實(shí)踐 在表達(dá)式的后邊加一個(gè)分號(hào)“;”就構(gòu)成了表達(dá)式語(yǔ)句。注意不能丟掉或輸入為全角符號(hào)。9.1.9 C51的基本語(yǔ)句1表達(dá)式語(yǔ)句空語(yǔ)句通常用于以下兩種情況:(1)在程序中為有關(guān)語(yǔ)句提供標(biāo)號(hào),用以標(biāo)記程序執(zhí)行的位置。例:loop:;gotoloop;(2)在用while、for語(yǔ)句構(gòu)成的循環(huán)語(yǔ)句后面加一個(gè)分號(hào),形成一個(gè)不執(zhí)行其他操作的空循環(huán)體,常用它來(lái)寫(xiě)等待事件發(fā)生的程序。

35、這種結(jié)構(gòu)通常用于對(duì)某位進(jìn)行判斷,當(dāng)不滿足條件則等待,滿足條件則執(zhí)行。 僅由一個(gè)分號(hào)“;”占一行形成一個(gè)表達(dá)式語(yǔ)句,這種語(yǔ)句稱為空語(yǔ)句。 單片機(jī)技術(shù)與應(yīng)用實(shí)踐 復(fù)合語(yǔ)句是由若干條語(yǔ)句組合而成的一種語(yǔ)句,在C51中,用一個(gè)大括號(hào)“”將若干條語(yǔ)句括在一起就形成了一個(gè)復(fù)合語(yǔ)句,復(fù)合語(yǔ)句最后不需要以分號(hào)“;”結(jié)束,但它內(nèi)部的各條語(yǔ)句仍需以分號(hào)“;”結(jié)束。復(fù)合語(yǔ)句的一般格式為:局部變量定義;語(yǔ)句l;語(yǔ)句2; 2復(fù)合語(yǔ)句 復(fù)合語(yǔ)句是允許嵌套的,在執(zhí)行時(shí),其中的各條單語(yǔ)句按順序依次執(zhí)行,整個(gè)復(fù)合語(yǔ)句在語(yǔ)法上等價(jià)于一條單語(yǔ)句。在復(fù)合語(yǔ)句內(nèi)部語(yǔ)句所定義的變量,稱為該復(fù)合語(yǔ)句中的局部變量,它僅在當(dāng)前這個(gè)復(fù)合語(yǔ)句中有

36、效。單片機(jī)技術(shù)與應(yīng)用實(shí)踐if語(yǔ)句是C51中的一個(gè)基本條件選擇語(yǔ)句,它有兩種格式:(1)不帶else的if語(yǔ)句,格式如下:if (表達(dá)式) 語(yǔ)句;如果if括號(hào)內(nèi)的條件成立,則執(zhí)行語(yǔ)句塊,否則跳過(guò)該if語(yǔ)句,直接執(zhí)行下一條語(yǔ)句。(2)帶else的if語(yǔ)句,格式如下:if (表達(dá)式) 語(yǔ)句1;else語(yǔ)句2;當(dāng)條件表達(dá)式成立時(shí),就執(zhí)行語(yǔ)句1,否則就執(zhí)行語(yǔ)句2。3分支語(yǔ)句1)if語(yǔ)句單片機(jī)技術(shù)與應(yīng)用實(shí)踐if語(yǔ)句是C51中的一個(gè)基本條件選擇語(yǔ)句,它有兩種格式:(1)不帶else的if語(yǔ)句,格式如下:if (表達(dá)式) 語(yǔ)句;如果if括號(hào)內(nèi)的條件成立,則執(zhí)行語(yǔ)句塊,否則跳過(guò)該if語(yǔ)句,直接執(zhí)行下一條語(yǔ)句。(

37、2)帶else的if語(yǔ)句,格式如下:if (表達(dá)式) 語(yǔ)句1;else語(yǔ)句2;當(dāng)條件表達(dá)式成立時(shí),就執(zhí)行語(yǔ)句1,否則就執(zhí)行語(yǔ)句2。3分支語(yǔ)句1)if語(yǔ)句 注意:if- else語(yǔ)句允許嵌套,用來(lái)實(shí)現(xiàn)多方向條件分支,使用時(shí)應(yīng)注意if和else的配對(duì)使用,else不能離開(kāi)if單獨(dú)出現(xiàn),else總是與最近的且尚未配對(duì)的if配對(duì)。單片機(jī)技術(shù)與應(yīng)用實(shí)踐3分支語(yǔ)句1)if語(yǔ)句圖9-2 不帶else的if語(yǔ)句結(jié)構(gòu)流程圖9-3 帶else的if語(yǔ)句結(jié)構(gòu)流程單片機(jī)技術(shù)與應(yīng)用實(shí)踐【例9-10】 if語(yǔ)句的用法。 對(duì)學(xué)生成績(jī)劃分為AD,對(duì)應(yīng)不同的百分制分?jǐn)?shù),要求根據(jù)不同的等級(jí)打印出它的對(duì)應(yīng)百分?jǐn)?shù)。if(grade=

38、 =A)printf(90100n);else if(grade= =B ) printf(8090n);else if(grade= =C ) printf(7080n);else if(grade= =D ) printf(6070n);else if(grade= =E) printf(60n);else printf(errorn);單片機(jī)技術(shù)與應(yīng)用實(shí)踐switch是C51中提供的專門(mén)處理多分支結(jié)構(gòu)的多分支選擇語(yǔ)句。格式如下:switch (表達(dá)式)case常量表達(dá)式1:語(yǔ)句1;break;case常量表達(dá)式2:語(yǔ)句2;break;case常量表達(dá)式n:語(yǔ)句n;break;defaul

39、t:語(yǔ)句n+1; 2)switch/case語(yǔ)句單片機(jī)技術(shù)與應(yīng)用實(shí)踐說(shuō)明:(1)switch后面括號(hào)內(nèi)的表達(dá)式,可以是整型或字符型常量表達(dá)式。(2)將switch后條件表達(dá)式的值與case后的各常量比較,轉(zhuǎn)到值相等的那個(gè)case標(biāo)號(hào)后的語(yǔ)句塊執(zhí)行,執(zhí)行過(guò)程中一旦遇到break語(yǔ)句,則跳出switch語(yǔ)句;如果無(wú)一值相等,則執(zhí)行default后的語(yǔ)句n+1;如果既無(wú)一值相等又沒(méi)有default,則不執(zhí)行switch中的任何語(yǔ)句。(3)每一個(gè)case常量表達(dá)式的值必須不同,否則會(huì)出現(xiàn)自相矛盾的現(xiàn)象。(4)case語(yǔ)句和default語(yǔ)句的出現(xiàn)次序?qū)?zhí)行過(guò)程沒(méi)有影響。(5)每個(gè)case語(yǔ)句后面可以有

40、break,也可以沒(méi)有。有break語(yǔ)句,執(zhí)行到break則退出switch結(jié)構(gòu);若沒(méi)有,則會(huì)順次執(zhí)行后面的語(yǔ)句,直至遇到break或結(jié)束。(6)每一個(gè)case語(yǔ)句后面可以帶一個(gè)語(yǔ)句,也可以帶多個(gè)語(yǔ)句,還可以不帶。語(yǔ)句可以用花括號(hào)括起,也可以不括。(7)多個(gè)case可以共用一組執(zhí)行語(yǔ)句。單片機(jī)技術(shù)與應(yīng)用實(shí)踐【例9-11】switch/case語(yǔ)句的用法。 對(duì)學(xué)生成績(jī)劃分為AD,對(duì)應(yīng)不同的百分制分?jǐn)?shù),要求根據(jù)不同的等級(jí)打印出它的對(duì)應(yīng)百分?jǐn)?shù)。switch(grade)case A: printf(90100n);break;case B: printf(8090n);break;case C: p

41、rintf(7080n);break;case D: printf(6070n);break;case E: printf(60n);break;default: printf(errorn); 單片機(jī)技術(shù)與應(yīng)用實(shí)踐1)goto語(yǔ)句 它是一個(gè)無(wú)條件的轉(zhuǎn)向語(yǔ)句,只要執(zhí)行到這個(gè)語(yǔ)句,程序指針就會(huì)跳轉(zhuǎn)到goto后的標(biāo)號(hào)所在的程序段。 格式: goto 語(yǔ)句標(biāo)號(hào); 其中的語(yǔ)句標(biāo)號(hào)為一個(gè)帶冒號(hào)的標(biāo)識(shí)符。例如: void main(void)unsigned char a;start: a+;if (a= =10) goto end;goto start;end:; 4循環(huán)語(yǔ)句單片機(jī)技術(shù)與應(yīng)用實(shí)踐 whi

42、le語(yǔ)句在C51中用于實(shí)現(xiàn)當(dāng)型循環(huán)結(jié)構(gòu)。 格式: while(表達(dá)式) 語(yǔ)句;/*循環(huán)體*/ while語(yǔ)句后面的表達(dá)式是能否循環(huán)的條件,后面的語(yǔ)句是循環(huán)體。當(dāng)表達(dá)式為非0(真)時(shí),就重復(fù)執(zhí)行循環(huán)體內(nèi)的語(yǔ)句;當(dāng)表達(dá)式為0(假),則中止while循環(huán),程序?qū)?zhí)行循環(huán)結(jié)構(gòu)之外的下一條語(yǔ)句。 2) while語(yǔ)句特點(diǎn):先判斷條件,后執(zhí)行循環(huán)體。在循環(huán)體中對(duì)條件進(jìn)行改變,然后再判斷條件,如條件成立,則再執(zhí)行循環(huán)體,如條件不成立,則退出循環(huán)。如條件第一次就不成立,則循環(huán)體一次也不執(zhí)行。 單片機(jī)技術(shù)與應(yīng)用實(shí)踐【例9-12】使用while語(yǔ)句實(shí)現(xiàn)計(jì)算并輸出110的累加和。程序清單如下:#include #i

43、nclude void main(void)unsigned int i = 1;unsigned int sum= 0;/設(shè)初值SCON = 0 x50;/串行口方式 1,允許接收TMOD = 0 x20;/定時(shí)器 1 定時(shí)方式 2TCON = 0 x40;/設(shè)定時(shí)器 1 開(kāi)始計(jì)數(shù)TH1 = 0 xE8; TL1 = 0 xE8; /11.0592MHz 1200 波特率TI = 1;TR1 = 1;/啟動(dòng)定時(shí)器while(i=10)sum += i;/累加printf (“%d sum=%dn”,i,sum); /輸出結(jié)果,最后運(yùn)行結(jié)果是 SUM=55 i+;while(1);/最后運(yùn)行結(jié)

44、果是 SUM=55單片機(jī)技術(shù)與應(yīng)用實(shí)踐do - while語(yǔ)句在C51中用于實(shí)現(xiàn)直到型循環(huán)結(jié)構(gòu)。格式: do 語(yǔ)句;/*循環(huán)體*/ while(表達(dá)式);3)do - while語(yǔ)句特點(diǎn):先執(zhí)行循環(huán)體中的語(yǔ)句,后判斷表達(dá)式。如表達(dá)式成立(真),則再執(zhí)行循環(huán)體,然后又判斷,直到有表達(dá)式不成立(假)時(shí)退出循環(huán),執(zhí)行do-while結(jié)構(gòu)的下一條語(yǔ)句。任何do-while的循環(huán)體至少會(huì)被執(zhí)行一次。單片機(jī)技術(shù)與應(yīng)用實(shí)踐【例9-13】通過(guò)do-while語(yǔ)句實(shí)現(xiàn)計(jì)算并輸出110的累加和。程序清單如下:#include #include void main(void)unsigned int i = 1;u

45、nsigned int sum= 0;/設(shè)初值SCON = 0 x50;/串行口方式 1,允許接收TMOD = 0 x20;/定時(shí)器 1 定時(shí)方式 2TCON = 0 x40;/設(shè)定時(shí)器 1 開(kāi)始計(jì)數(shù)TH1 = 0 xE8; TL1 = 0 xE8; /11.0592MHz 1200 波特率TI = 1;TR1 = 1;/啟動(dòng)定時(shí)器dosum += i;/累加printf (“%d sum=%dn”,i,sum); /輸出結(jié)果,最后運(yùn)行結(jié)果是 SUM=55i+; while(i=10);while(1);單片機(jī)技術(shù)與應(yīng)用實(shí)踐格式: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語(yǔ)句;/*循環(huán)體*/f

46、or語(yǔ)句后面帶3個(gè)表達(dá)式,它的執(zhí)行過(guò)程如下:(1)先求解表達(dá)式1的值。(2)求解表達(dá)式2的值,如表達(dá)式2的值為真,則執(zhí)行循環(huán)體中的語(yǔ)句,然后執(zhí)行下一步(3)的操作,如表達(dá)式2的值為假,則結(jié)束for循環(huán),轉(zhuǎn)到最后一步。(3)若表達(dá)式2的值為真,則執(zhí)行完循環(huán)體中的語(yǔ)句后,求解表達(dá)式3,然后繼續(xù)執(zhí)行第下一步。(4)轉(zhuǎn)到(2)繼續(xù)執(zhí)行。(5)退出for循環(huán),執(zhí)行下面的一條語(yǔ)句。 4)for語(yǔ)句 在for循環(huán)中,一般表達(dá)式1為初值表達(dá)式,用于給循環(huán)變量賦初值;表達(dá)式2為條件表達(dá)式,對(duì)循環(huán)變量進(jìn)行判斷;表達(dá)式3為循環(huán)變量更新表達(dá)式,用于對(duì)循環(huán)變量的值進(jìn)行更新,使循環(huán)變量能不滿足條件而退出循環(huán)。單片機(jī)技術(shù)與

47、應(yīng)用實(shí)踐【例9-14】用for語(yǔ)句實(shí)現(xiàn)計(jì)算并輸出110的累加和。程序清單如下:#include #include void main(void)unsigned int i = 1;unsigned int sum= 0;/設(shè)初值SCON = 0 x50;/串行口方式1,允許接收TMOD = 0 x20;/定時(shí)器1定時(shí)方式 2TCON = 0 x40;/設(shè)定時(shí)器1開(kāi)始計(jì)數(shù)TH1 = 0 xE8; TL1 = 0 xE8; /11.0592MHz 1200波特率TI = 1;TR1 = 1; /啟動(dòng)定時(shí)器for (i=1;i=10;i+) sum += i;/累加printf (“sum=%dn

48、”, sum);/輸出結(jié)果,最后運(yùn)行結(jié)果是 SUM=55while(1);單片機(jī)技術(shù)與應(yīng)用實(shí)踐 在一個(gè)循環(huán)的循環(huán)體中允許又包含一個(gè)完整的循環(huán)結(jié)構(gòu),這種結(jié)構(gòu)稱為循環(huán)的嵌套。外面的循環(huán)稱為外循環(huán),里面的循環(huán)稱為內(nèi)循環(huán),如果在內(nèi)循環(huán)的循環(huán)體內(nèi)又包含循環(huán)結(jié)構(gòu),就構(gòu)成了多重循環(huán)。在C51中,允許3種循環(huán)結(jié)構(gòu)相互嵌套。5)循環(huán)的嵌套【例9-15】用嵌套結(jié)構(gòu)構(gòu)造一個(gè)延時(shí)程序。void Delay1Unit( void ) /用軟件產(chǎn)生1s延時(shí)unsigned int i, j;for( i=0; i1000; i+ ) for( j0; j1000; j+ ); /通過(guò)實(shí)測(cè),調(diào)整j循環(huán)次數(shù),產(chǎn)生1s延時(shí)單片

49、機(jī)技術(shù)與應(yīng)用實(shí)踐 break和continue語(yǔ)句通常用于循環(huán)結(jié)構(gòu)中,用來(lái)跳出循環(huán)結(jié)構(gòu)。1)break語(yǔ)句 使用break語(yǔ)句還可以從循環(huán)體中跳出循環(huán),提前結(jié)束循環(huán)而接著執(zhí)行循環(huán)結(jié)構(gòu)下面的語(yǔ)句。通常break語(yǔ)句總是與if語(yǔ)句連在一起,即滿足條件時(shí)便跳出循環(huán)。它不能用在除了循環(huán)語(yǔ)句和switch語(yǔ)句之外的任何其他語(yǔ)句中。在多層循環(huán)中,break語(yǔ)句的作用是跳出本層循環(huán)?!纠?-16】break語(yǔ)句的作用。While(1) c=getch(); printf(%cn, c); if(c= =27) break;/*判斷若按Esc鍵則跳出循環(huán)*/ i+;printf(The No. is %dn,

50、 i);5break和continue語(yǔ)句單片機(jī)技術(shù)與應(yīng)用實(shí)踐 continue語(yǔ)句用在循環(huán)結(jié)構(gòu)中,用于結(jié)束本次循環(huán),跳過(guò)循環(huán)體中continue下面尚未執(zhí)行的語(yǔ)句,直接進(jìn)行下一次是否執(zhí)行循環(huán)的判定。 continue語(yǔ)句和break語(yǔ)句的區(qū)別在于:continue語(yǔ)句只是結(jié)束本次循環(huán)而不是終止整個(gè)循環(huán);break語(yǔ)句則是結(jié)束本層循環(huán),不再進(jìn)行條件判斷?!纠?-17】continue語(yǔ)句的作用。while(c!=0X0D)/*不是回車(chē)符則循環(huán)*/ c=getch(); if(c= =0 x1B) continue; /*若按Esc鍵,不輸出便進(jìn)行下次循環(huán)*/ printf(%cn, c);2)

51、continue語(yǔ)句單片機(jī)技術(shù)與應(yīng)用實(shí)踐 return語(yǔ)句一般放在函數(shù)的最后位置,用于終止函數(shù)的執(zhí)行,并控制程序返回調(diào)用該函數(shù)時(shí)所處的位置。返回時(shí)還可以通過(guò)return語(yǔ)句帶回返回值。return語(yǔ)句格式有兩種:格式1:return;格式2:return (表達(dá)式); 如果return語(yǔ)句后面帶有表達(dá)式,則要計(jì)算表達(dá)式的值,并將表達(dá)式的值作為函數(shù)的返回值。若不帶表達(dá)式,則函數(shù)返回時(shí)將返回一個(gè)不確定的值。通常用return語(yǔ)句把調(diào)用函數(shù)取得的值返回給主調(diào)用函數(shù)。 6return語(yǔ)句單片機(jī)技術(shù)與應(yīng)用實(shí)踐 9.2 C51的函數(shù)與數(shù)組9.2.1 函數(shù)的定義9.2.2 函數(shù)的調(diào)用與聲明9.2.3 數(shù)組單

52、片機(jī)技術(shù)與應(yīng)用實(shí)踐9.2.1 函數(shù)的定義函數(shù)定義的一般格式如下:函數(shù)類(lèi)型 函數(shù)名(形式參數(shù)表) reentrant interrupt m using n形式參數(shù)說(shuō)明局部變量定義函數(shù)體 9.2 C51的函數(shù)與數(shù)組 格式說(shuō)明:函數(shù)類(lèi)型是說(shuō)明函數(shù)返回值的類(lèi)型。函數(shù)體中能包含有局部變量的定義和程序語(yǔ)句,如函數(shù)要返回運(yùn)算值則要使用return語(yǔ)句進(jìn)行返回。在函數(shù)的號(hào)中也可以什么也不寫(xiě),這就成了空函數(shù)。單片機(jī)技術(shù)與應(yīng)用實(shí)踐1函數(shù)類(lèi)型 函數(shù)類(lèi)型說(shuō)明了所定義函數(shù)返回值的類(lèi)型。如函數(shù)不需要返回值函數(shù)類(lèi)型可寫(xiě)作“void” 。注意:函數(shù)體返回值的類(lèi)型一定要和函數(shù)類(lèi)型一致,否則會(huì)造成錯(cuò)誤。2函數(shù)名 函數(shù)名是用戶為

53、自定義函數(shù)取的名字,以便調(diào)用函數(shù)時(shí)使用。函數(shù)名的定義在遵循 C 語(yǔ)言變量名命名規(guī)則的同時(shí),不能在同一程序中定義同名的函數(shù),這將造成編譯錯(cuò)誤(同一程序中是允許有同名變量的,因?yàn)樽兞坑腥肿兞亢途植孔兞恐?。3形式參數(shù)表 形式參數(shù)是指調(diào)用函數(shù)時(shí)要傳入到函數(shù)體內(nèi)參與運(yùn)算的變量,形參可以有一個(gè)、幾個(gè)或沒(méi)有,當(dāng)不需要形式參數(shù)也就是無(wú)參函數(shù),括號(hào)內(nèi)可以為空或?qū)懭搿皏oid”表示,但括號(hào)不能少。單片機(jī)技術(shù)與應(yīng)用實(shí)踐 用于把函數(shù)定義為可重入函數(shù),所謂可重入函數(shù)就是允許被遞歸調(diào)用的函數(shù)。函數(shù)的遞歸調(diào)用是指當(dāng)一個(gè)函數(shù)正被調(diào)用尚未返回時(shí),又直接或間接調(diào)用函數(shù)本身,只有重入函數(shù)才允許遞歸調(diào)用。4reentrant修

54、飾符注意:(1)用reentrant修飾的重入函數(shù)被調(diào)用時(shí),實(shí)參表內(nèi)不允許使用bit類(lèi)型的參數(shù)。函數(shù)體內(nèi)也不允許存在任何關(guān)于位變量的操作,更不能返回bit類(lèi)型的值。(2)編譯時(shí),系統(tǒng)為重入函數(shù)在內(nèi)部或外部存儲(chǔ)器中建立一個(gè)模擬堆棧區(qū),稱為重入棧。重入函數(shù)的局部變量及參數(shù)被放在重入棧中,使重入函數(shù)可以實(shí)現(xiàn)遞歸調(diào)用。(3)在參數(shù)的傳遞上,實(shí)際參數(shù)可以傳遞給間接調(diào)用的重入函數(shù)。無(wú)重入屬性的間接調(diào)用函數(shù)不能包含調(diào)用參數(shù),但是可以使用定義的全局變量來(lái)進(jìn)行參數(shù)傳遞。單片機(jī)技術(shù)與應(yīng)用實(shí)踐 單片機(jī)C語(yǔ)言擴(kuò)展了函數(shù)的定義,使它能直接編寫(xiě)中斷服務(wù)函數(shù),不必考慮出、入堆棧的問(wèn)題,從而提高了工作效率。在該修飾符中,m的

55、取值為031,對(duì)應(yīng)的中斷情況如表9-10所示。 5interrupt m修飾符中 斷 號(hào)中 斷 源中斷向量0外部中斷 00003H1定時(shí)器/計(jì)數(shù)器 0000BH2外部中斷 10013H3定時(shí)器/計(jì)數(shù)器 1001BH4串行口0023H5定時(shí)器/計(jì)數(shù)器 2002BH表9-10 51系列芯片中斷號(hào)和中斷向量單片機(jī)技術(shù)與應(yīng)用實(shí)踐注意:(1)中斷函數(shù)不能進(jìn)行參數(shù)傳遞。(2) 中斷函數(shù)沒(méi)有返回值。在任何情況下都不能直接調(diào)用中斷函數(shù),否則會(huì)產(chǎn)生編譯錯(cuò)誤。如果在中斷函數(shù)中調(diào)用了其他函數(shù),則被調(diào)用函數(shù)所使用的寄存器必須與中斷函數(shù)相同;否則會(huì)產(chǎn)生不正確的結(jié)果。(5)C51編譯器對(duì)中斷函數(shù)編譯時(shí)會(huì)自動(dòng)在程序開(kāi)始和結(jié)

56、束處加上相應(yīng)的內(nèi)容,具體如下:在程序開(kāi)始處對(duì)ACC、B、DPH、DPL和PSW入棧,結(jié)束時(shí)出棧。中斷函數(shù)未加using n修飾符的,開(kāi)始時(shí)還要將R0R1入棧,結(jié)束時(shí)出棧。如中斷函數(shù)加using n修飾符,則在開(kāi)始將PSW入棧后還要修改PSW中的工作寄存器組選擇位。(6)C51編譯器從絕對(duì)地址8m+3處產(chǎn)生一個(gè)中斷向量,其中m為中斷號(hào),也即interrupt后面的數(shù)字。該向量包含一個(gè)到中斷函數(shù)入口地址的絕對(duì)跳轉(zhuǎn)。(7)中斷函數(shù)最好寫(xiě)在文件的尾部,并且禁止使用extern存儲(chǔ)類(lèi)型說(shuō)明。防止其他程序調(diào)用。單片機(jī)技術(shù)與應(yīng)用實(shí)踐 修飾符using n用于指定本函數(shù)內(nèi)部使用的工作寄存器組,其中n的取值為0

57、3,表示寄存器組號(hào)。 對(duì)于using n修飾符的使用,應(yīng)注意以下兩點(diǎn):(1)加入using n后,C51在編譯時(shí)自動(dòng)在函數(shù)的開(kāi)始處和結(jié)束處加入以下指令。PUSHPSW;標(biāo)志寄存器入棧MOVPSW,#與寄存器組號(hào)相關(guān)的常量POPPSW;標(biāo)志寄存器出棧(2)using n修飾符不能用于有返回值的函數(shù)。【例9-18】編寫(xiě)一個(gè)用于統(tǒng)計(jì)外中斷0的中斷次數(shù)的中斷服務(wù)程序。extern intx;void int0( ) interrupt 0 using 1 x+; 6using n修飾符單片機(jī)技術(shù)與應(yīng)用實(shí)踐9.2.2 函數(shù)的調(diào)用與聲明 函數(shù)定義好以后,要被其他函數(shù)調(diào)用才能被執(zhí)行。C 語(yǔ)言的函數(shù)是能相互調(diào)

58、用的, 但在調(diào)用函數(shù)前,必須對(duì)函數(shù)的類(lèi)型進(jìn)行說(shuō)明,就算是標(biāo)準(zhǔn)庫(kù)函數(shù)也不例外。標(biāo)準(zhǔn)庫(kù)函數(shù)的說(shuō)明會(huì)被按功能分別寫(xiě)在不一樣的頭文件中,使用時(shí)只要在文件最前面用#include預(yù)處理語(yǔ)句引入相應(yīng)的頭文件即可。調(diào)用就是指一個(gè)函數(shù)體中引用另一個(gè)已定義的函數(shù)來(lái)實(shí)現(xiàn)所需要的功能,這時(shí)函數(shù)體稱為主調(diào)用函數(shù),函數(shù)體中所引用的函數(shù)稱為被調(diào)用函數(shù)。 一個(gè)函數(shù)體中能調(diào)用數(shù)個(gè)其他的函數(shù),這些被調(diào)用的函數(shù)同樣也能調(diào)用其他函數(shù),即函數(shù)允許嵌套調(diào)用,需要注意的是函數(shù)不允許嵌套定義。在C51中有一個(gè)函數(shù)是不能被其他函數(shù)所調(diào)用的,它就是主函數(shù)main( )。單片機(jī)技術(shù)與應(yīng)用實(shí)踐格式: 函數(shù)名(實(shí)參列表); “函數(shù)名”就是指被調(diào)用的

59、函數(shù)。實(shí)際參數(shù)表能為零或多個(gè)參數(shù),多個(gè)參數(shù)時(shí)要用逗號(hào)隔開(kāi),每個(gè)參數(shù)的類(lèi)型、位置應(yīng)與函數(shù)定義時(shí)的形式參數(shù)一一對(duì)應(yīng),它的作用就是把實(shí)際參數(shù)傳到被調(diào)用函數(shù)中的形式參數(shù),如果類(lèi)型不對(duì)應(yīng)就會(huì)產(chǎn)生錯(cuò)誤。調(diào)用的函數(shù)是無(wú)參函數(shù)時(shí)不寫(xiě)參數(shù),但不能省略后面的括號(hào)。 按照函數(shù)調(diào)用在主調(diào)函數(shù)中出現(xiàn)的位置,函數(shù)調(diào)用方式有3種:(1)函數(shù)語(yǔ)句。把被調(diào)用函數(shù)作為主調(diào)用函數(shù)的一個(gè)語(yǔ)句。如printf (“Hello Keil C51!n”); (2)函數(shù)表達(dá)式。函數(shù)被放在一個(gè)表達(dá)式中,以一個(gè)運(yùn)算對(duì)象的方式出現(xiàn)。這時(shí)的被調(diào)用函數(shù)要求帶有返回語(yǔ)句,以返回一個(gè)明確的數(shù)值參數(shù)表達(dá)式的運(yùn)算。如temp = Count( ); (3)函

60、數(shù)參數(shù)。被調(diào)用函數(shù)作為另一個(gè)函數(shù)的參數(shù)。如x=fun2(fun1(5);1函數(shù)的調(diào)用單片機(jī)技術(shù)與應(yīng)用實(shí)踐 調(diào)用函數(shù)前要對(duì)被調(diào)用的函數(shù)進(jìn)行聲明。如果在函數(shù)調(diào)用之前沒(méi)有對(duì)函數(shù)進(jìn)行聲明,則編譯系統(tǒng)會(huì)把第一次遇到的該函數(shù)形式(函數(shù)定義或函數(shù)調(diào)用)作為函數(shù)的聲明,并將函數(shù)類(lèi)型默認(rèn)為int型。標(biāo)準(zhǔn)庫(kù)函數(shù)只要用#include引入已寫(xiě)好說(shuō)明的頭文件,在程序中就能直接調(diào)用函數(shù)了。格式:extern函數(shù)類(lèi)型函數(shù)名(形式參數(shù)表); 函數(shù)的聲明是把函數(shù)的名字、函數(shù)類(lèi)型以及形參的類(lèi)型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便調(diào)用函數(shù)時(shí)系統(tǒng)進(jìn)行對(duì)照檢查。函數(shù)的聲明后面要加分號(hào)。也可以把這些寫(xiě)到“文件名.h”的文件中用#includ

溫馨提示

  • 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)論