版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第2章C51編程基礎(chǔ)
——基于Keil和Proteus單片機(jī)應(yīng)用項(xiàng)目式教程第2章目錄
C51編程基礎(chǔ)知識(shí)準(zhǔn)備2.1C51數(shù)據(jù)與數(shù)據(jù)類型2.2C51變量及其定義方法2.3C51運(yùn)算符和表達(dá)式2.4C51基本語(yǔ)句項(xiàng)目4鍵控信號(hào)燈任務(wù)4.1編制鍵控信號(hào)燈程序任務(wù)4.2鍵控信號(hào)燈Keil編譯調(diào)試任務(wù)4.3鍵控信號(hào)燈Proteus虛擬仿真運(yùn)行C51編程基礎(chǔ)知識(shí)準(zhǔn)備2.5C51函數(shù)2.6C51數(shù)組和指針項(xiàng)目7花樣循環(huán)燈任務(wù)7.1編制花樣循環(huán)燈程序任務(wù)7.2花樣循環(huán)燈Keil編譯調(diào)試任務(wù)7.3花樣循環(huán)燈Proteus虛擬仿真C51編程基礎(chǔ)知識(shí)準(zhǔn)備2.1C51數(shù)據(jù)與數(shù)據(jù)類型
⒈數(shù)據(jù)類型和數(shù)據(jù)長(zhǎng)度
基本類型:位型bit、字符型char、整型int、長(zhǎng)整型long和浮點(diǎn)型float;還有數(shù)組array(屬構(gòu)造類型)和指針根據(jù)有、無(wú)符號(hào),又可分別分為signed和unsigned,有符號(hào)時(shí),signed一般可省略不寫(xiě)。無(wú)符號(hào)時(shí)全部為正值;有符號(hào)時(shí),其值域有正有負(fù),最高位用于表示正負(fù),“0”表示正,“1”表示負(fù)。⒊標(biāo)識(shí)符
在C語(yǔ)言程序中,數(shù)據(jù)、數(shù)據(jù)類型、變量、數(shù)組、函數(shù)和語(yǔ)句等常用標(biāo)識(shí)符表示,實(shí)際上標(biāo)識(shí)符就是一個(gè)代號(hào),是上述這些數(shù)據(jù)和函數(shù)的名字。C語(yǔ)言標(biāo)識(shí)符命名規(guī)定:⑴標(biāo)識(shí)符只能由字母、數(shù)字和下劃線三種字符組成,且須以字母或下劃線開(kāi)頭。⑵標(biāo)識(shí)符不能與“關(guān)鍵詞”同名。⑶英文字母區(qū)分大小寫(xiě)。即標(biāo)識(shí)符中的英文字母大小寫(xiě)不能通用。⑷有效長(zhǎng)度隨編譯系統(tǒng)而異,一般多于32個(gè)字符,已足夠用了。80C51單片機(jī)主要用于實(shí)時(shí)控制,變量一般為8bit無(wú)符號(hào)格式,16bit較少,有符號(hào)和有小數(shù)點(diǎn)的數(shù)值計(jì)算也很少。因此,在已知變量長(zhǎng)度及變量為正整數(shù)的情況下,應(yīng)盡量采用8bit無(wú)符號(hào)格式:unsignedchar。2.2C51變量及其定義方法⒈變量及其存儲(chǔ)區(qū)域C51程序中使用的常量和變量必須定位在80C51不同的存儲(chǔ)區(qū)域。由于80C51片內(nèi)RAM空間有限,不同性質(zhì)的數(shù)據(jù)應(yīng)區(qū)別對(duì)待。位變量只能定位在片內(nèi)RAM位尋址區(qū),使用bdata存儲(chǔ)器類型;常用的數(shù)據(jù)應(yīng)定位在片內(nèi)RAM中,使用data和idata存儲(chǔ)器類型;不太常用的數(shù)據(jù)可定位在片外RAM中,使用pdata和xdata存儲(chǔ)器類型;常量可采用code存儲(chǔ)器類型。若用戶不對(duì)變量的存儲(chǔ)器類型作出定義,系統(tǒng)將采用由源程序、函數(shù)或C51編譯器設(shè)置的編譯模式默認(rèn)存儲(chǔ)器類型。C51編譯模式選項(xiàng)有3種:Small、Compact和Large。一般,應(yīng)盡量選擇Small模式。缺省時(shí),系統(tǒng)默認(rèn)的模式為Small。⒉
局部變量和全局變量
變量按使用范圍可分為局部變量和全局變量。⑴局部變量局部變量是某個(gè)函數(shù)內(nèi)部定義的變量,其使用范圍僅限于該函數(shù)內(nèi)部。⑵全局變量全局變量定義在函數(shù)外部,在整個(gè)文件或程序中有效,可供各函數(shù)共用,可起到各函數(shù)間數(shù)據(jù)交換的作用。C51程序在一個(gè)函數(shù)開(kāi)始運(yùn)行時(shí)才對(duì)該函數(shù)的局部變量分配存儲(chǔ)單元,函數(shù)運(yùn)行結(jié)束,即釋放該存儲(chǔ)單元。這正是C語(yǔ)言的優(yōu)點(diǎn)之一,可大大提高內(nèi)部存儲(chǔ)單元的利用率。全局變量定義應(yīng)放在所有函數(shù)(包括主函數(shù))之外。不同函數(shù)中允許使用相同的局部變量名,其含義可以不同,不會(huì)相互干擾。全局變量始終占用一個(gè)固定的存儲(chǔ)單元,降低了內(nèi)部存儲(chǔ)單元的利用率;降低了函數(shù)的通用性。因此,應(yīng)盡量減少全局變量的使用。⒋變量的定義方式C51要求,所有變量均應(yīng)先定義,后使用。其格式如下:數(shù)據(jù)類型[存儲(chǔ)器類型]
變量名表⒌80C51特殊功能寄存器定義方式
只需在程序開(kāi)頭的頭文件部分寫(xiě)一條預(yù)處理命令:#include<reg51.h>,既可調(diào)用該庫(kù)函數(shù)reg51.h在C51的文件夾里,有一個(gè)取名reg51.h的庫(kù)函數(shù)文件,對(duì)80C51片內(nèi)21個(gè)特殊功能寄存器按MCS-51中取的名字(必須大寫(xiě))全部作了定義,并賦予了既定的字節(jié)地址。⒍位變量定義方式
⑴定義128位可尋址位的位變量bit位變量名⑵定義11個(gè)特殊功能寄存器可尋址位的位變量sbit位變量名=位地址常數(shù)
2.3C51運(yùn)算符和表達(dá)式
表示各種運(yùn)算的符號(hào)稱為運(yùn)算符。由運(yùn)算符和運(yùn)算對(duì)象組成的具有特定含義的運(yùn)算式稱為表達(dá)式。⒈賦值運(yùn)算符
變量=表達(dá)式⒉算術(shù)運(yùn)算符
⑴自增1和自減1有兩種寫(xiě)法:①雙加(減)號(hào)寫(xiě)在前面:++i和--i。此時(shí),變量先加(減)1,后使用;②雙加(減)號(hào)寫(xiě)在后面:i++和i--。此時(shí),變量先使用,后加(減)1。⑵除法運(yùn)算的結(jié)果與參與運(yùn)算數(shù)據(jù)的類型有關(guān)。若兩個(gè)數(shù)據(jù)都是浮點(diǎn)數(shù),則運(yùn)算結(jié)果也為浮點(diǎn)數(shù)。若兩個(gè)數(shù)據(jù)都是整數(shù),則運(yùn)算結(jié)果只取整數(shù),舍去小數(shù)。⑶求余運(yùn)算時(shí),“%”符左側(cè)為被除數(shù),右側(cè)為除數(shù)。且要求參與運(yùn)算的數(shù)據(jù)都是整型,運(yùn)算結(jié)果為兩數(shù)相除的余數(shù)。⒊關(guān)系運(yùn)算符
關(guān)系運(yùn)算符用于兩個(gè)數(shù)據(jù)之間進(jìn)行比較判斷,關(guān)系表達(dá)式運(yùn)算的結(jié)果只能有兩種:條件滿足,運(yùn)算結(jié)果為1(真);條件不滿足,運(yùn)算結(jié)果為0(假)。⒋邏輯運(yùn)算符
邏輯運(yùn)算符用于求條件表達(dá)式整體之間邏輯運(yùn)算的邏輯值。條件表達(dá)式的值只有兩種:1(非0或真)或0(假);運(yùn)算結(jié)果也只有兩種:1(真)或0(假)。⒌位邏輯運(yùn)算符位邏輯運(yùn)算是變量數(shù)據(jù)本身(值可以是任意整常數(shù))按位(化為二進(jìn)制數(shù))進(jìn)行邏輯與、或、非、異或和左移、右移的邏輯運(yùn)算。⒍復(fù)合賦值運(yùn)算符
復(fù)合賦值運(yùn)算符由運(yùn)算符和賦值運(yùn)算符疊加組合2.4C51基本語(yǔ)句C51語(yǔ)句是組成程序的基本成分,是學(xué)習(xí)C51編程的基礎(chǔ)。C51基本語(yǔ)句主要有表達(dá)式語(yǔ)句、復(fù)合語(yǔ)句、選擇語(yǔ)句和循環(huán)語(yǔ)句。⒈表達(dá)式語(yǔ)句在表達(dá)式后面加上“;”就構(gòu)成表達(dá)式語(yǔ)句。需要注意的是,編寫(xiě)語(yǔ)句時(shí),不能忽略語(yǔ)句的有效組成部分“;”,一條語(yǔ)句,應(yīng)以“;”結(jié)束。⒉復(fù)合語(yǔ)句由若干條單語(yǔ)句組合而成的語(yǔ)句稱為復(fù)合語(yǔ)句。復(fù)合語(yǔ)句,必須用花括號(hào){}括起,且每個(gè)單語(yǔ)句后須有“;”?;ɡㄌ?hào)的功能是把復(fù)合語(yǔ)句中若干單語(yǔ)句組成一條語(yǔ)句,C51將復(fù)合語(yǔ)句視為一條“單”語(yǔ)句。復(fù)合語(yǔ)句允許嵌套,即在復(fù)合語(yǔ)句中引入另一條復(fù)合語(yǔ)句。⒊選擇語(yǔ)句選擇語(yǔ)句是根據(jù)給定的條件是否成立進(jìn)行判斷,從而選擇相應(yīng)的操作。選擇語(yǔ)句具有一定的邏輯分析能力和選擇決策功能,按結(jié)構(gòu)可分為單分支選擇結(jié)構(gòu)和多分支選擇結(jié)構(gòu),主要有if語(yǔ)句和switch語(yǔ)句。⑴if語(yǔ)句1)條件成立就選擇,否則就不選擇。if(條件表達(dá)式){內(nèi)嵌語(yǔ)句;}2)不論條件成立與否,總要選擇一個(gè)。if(條件表達(dá)式){內(nèi)嵌語(yǔ)句1;}else{內(nèi)嵌語(yǔ)句2;}3)串行多分支結(jié)構(gòu)。if(條件表達(dá)式1){內(nèi)嵌語(yǔ)句1;}elseif(條件表達(dá)式2){內(nèi)嵌語(yǔ)句2;}…
elseif(條件表達(dá)式n){內(nèi)嵌語(yǔ)句n;}else{內(nèi)嵌語(yǔ)句(n+1);}4)if語(yǔ)句嵌套if(條件表達(dá)式0)if(條件表達(dá)式1){內(nèi)嵌語(yǔ)句11;}else{內(nèi)嵌語(yǔ)句12;}elseif(條件表達(dá)式2){內(nèi)嵌語(yǔ)句21;}else{內(nèi)嵌語(yǔ)句22;}內(nèi)嵌if語(yǔ)句1內(nèi)嵌if語(yǔ)句2串行多分支語(yǔ)句運(yùn)行時(shí),依次計(jì)算并判斷條件表達(dá)式,若成立(或值為非0),則執(zhí)行相應(yīng)的內(nèi)嵌語(yǔ)句;若不成立(或值為0),計(jì)算并判斷下一條件表達(dá)式,直至整個(gè)if語(yǔ)句結(jié)束。在if語(yǔ)句中又包含一個(gè)或多個(gè)if語(yǔ)句,稱為if語(yǔ)句嵌套。if語(yǔ)句嵌套實(shí)際上是用另一個(gè)if-else語(yǔ)句替代原if語(yǔ)句中的普通內(nèi)嵌語(yǔ)句。⑵switch語(yǔ)句switch語(yǔ)句是一種并行多分支選擇語(yǔ)句,其作用為散轉(zhuǎn)。與嵌套的if語(yǔ)句相比,更直接,層次更清晰,特別適用于分支較多時(shí)。switch(表達(dá)式){case常量表達(dá)式1:{語(yǔ)句1;}break;case常量表達(dá)式2:{語(yǔ)句2;}break;…case常量表達(dá)式n:{語(yǔ)句n;}break;default:{語(yǔ)句(n+1);}}case后的各常量表達(dá)式值不能相同,否則會(huì)引起混亂,導(dǎo)致同一值有多種不同響應(yīng)。允許不寫(xiě)break語(yǔ)句。default后可不加執(zhí)行語(yǔ)句⒋循環(huán)語(yǔ)句⑴while循環(huán)語(yǔ)句while循環(huán)根據(jù)判斷語(yǔ)句在流程中執(zhí)行的先后可分為:while循環(huán)(也稱為當(dāng)型)和do-while循環(huán)(也稱為直到型)。1)while循環(huán)while(條件表達(dá)式){循環(huán)體語(yǔ)句;}2)do-while循環(huán)do{循環(huán)體語(yǔ)句;}while(條件表達(dá)式);while循環(huán)(當(dāng)型)與do-while循環(huán)(直到型)的區(qū)別是,“先判斷后執(zhí)行”還是“先執(zhí)行后判斷”?當(dāng)?shù)谝淮闻袛酁檎鏁r(shí),兩者的執(zhí)行結(jié)果是完全相同的。但若第一次判斷為假時(shí),兩者的執(zhí)行結(jié)果就不同:while循環(huán)一次也沒(méi)執(zhí)行,do-while循環(huán)至少執(zhí)行了一次。⑵for循環(huán)語(yǔ)句for循環(huán)是循環(huán)結(jié)構(gòu)中語(yǔ)句最簡(jiǎn)潔、功能最強(qiáng)大的一種。for(表達(dá)式1;表達(dá)式2;表達(dá)式3){循環(huán)體語(yǔ)句;}for循環(huán)語(yǔ)句括號(hào)內(nèi)三個(gè)表達(dá)式之間必須用分號(hào)“;”分隔。三個(gè)表達(dá)式中允許有一個(gè)或多個(gè)缺位,1)三個(gè)表達(dá)式全部為空。表示無(wú)初值、無(wú)判斷條件、無(wú)循環(huán)變量更新,此時(shí)將導(dǎo)致一個(gè)無(wú)限循環(huán),2)表達(dá)式1缺位。表示在for語(yǔ)句體內(nèi)未設(shè)定初值。有兩種情況:一是在for語(yǔ)句之前未賦初值,則C51默認(rèn)初值為0;二是在for語(yǔ)句之前已賦初值,可使for語(yǔ)句應(yīng)用更靈活。例如,有些用for語(yǔ)句構(gòu)成的延時(shí)程序,在for語(yǔ)句體外改變初值就可改變延時(shí)時(shí)間。3)無(wú)循環(huán)體語(yǔ)句。通常用作延時(shí)程序,但語(yǔ)句末尾的“;”不能少。項(xiàng)目4鍵控信號(hào)燈
鍵控信號(hào)燈電路如圖所示,要求實(shí)現(xiàn):①S0、S1均未按下,VD0亮,其余燈滅;②S0單獨(dú)按下,VD1亮,其余燈滅;③S1單獨(dú)按下,VD2亮,其余燈滅;④S0、S1均按下,VD3亮,其余燈滅。任務(wù)4.1編制鍵控信號(hào)燈程序
根據(jù)按鍵狀態(tài)控制信號(hào)燈亮滅,應(yīng)用選擇語(yǔ)句。C51選擇語(yǔ)句有多種形式,因此,編制鍵控信號(hào)燈程序也有多種形式。⑴if-else語(yǔ)句⑵if語(yǔ)句嵌套⑶switch語(yǔ)句上述switch語(yǔ)句程序中,第6行“P1&0xc0”是屏蔽P1口后6位,單取P1.7、P1.6鍵狀態(tài)值;第8~11行中“P1&0xf0|0x××”是保留P1口高4位狀態(tài)(P1.5、P1.4可能還有他用,不能隨意改變),改變低4位VD3~VD0亮滅狀態(tài),高4位先“與”1,后“或”0,低4位先“與”0,后“或”燈亮滅狀態(tài)值。任務(wù)4.2鍵控信號(hào)燈Keil編譯調(diào)試
⑴打開(kāi)μVision,建立工程項(xiàng)目,設(shè)置工程屬性。⑵編寫(xiě)和輸入源程序。⑶程序編譯鏈接及糾錯(cuò)。⑷調(diào)試設(shè)置準(zhǔn)備。①打開(kāi)P1口;②在if語(yǔ)句和elseif語(yǔ)句行設(shè)置斷點(diǎn)。⑸程序調(diào)試。①斷點(diǎn)運(yùn)行;②單步運(yùn)行;③全速運(yùn)行。在斷點(diǎn)處設(shè)置P1.7、P1.6(s0、s1)的狀態(tài)全速運(yùn)行后,觀測(cè)P1.3~P1.0狀態(tài)(VD0~VD3燈的亮滅狀態(tài))刪除斷點(diǎn),單步運(yùn)行,過(guò)程較慢,但可觀測(cè)程序運(yùn)行全過(guò)程。設(shè)置不同,不但程序運(yùn)行最終結(jié)果不同,而且程序運(yùn)行路徑也不同。運(yùn)行前先設(shè)置,全速運(yùn)行后,觀測(cè)程序運(yùn)行結(jié)果。任務(wù)4.3鍵控信號(hào)燈Proteus虛擬仿真運(yùn)行
⒈畫(huà)Proteus虛擬仿真電路
⒉虛擬仿真運(yùn)行
設(shè)置帶鎖按鈕SW0、SW1四種不同的狀態(tài)(鼠標(biāo)左鍵點(diǎn)擊按鈕右側(cè)小紅點(diǎn),按鈕閉合;再次點(diǎn)擊,按鈕斷開(kāi)),信號(hào)燈會(huì)按題目要求隨之變化。可打開(kāi)本書(shū)配套的<單片機(jī)項(xiàng)目式教程仿真50例>項(xiàng)目4,直接操作。2.5C51函數(shù)
函數(shù)是C程序的基本單位,即C51程序主要是由函數(shù)構(gòu)成的。⒈函數(shù)的分類
分為主函數(shù)和普通函數(shù)兩種。主函數(shù)就是主程序,一個(gè)C51源程序必須有也只能有一個(gè)main函數(shù),而且是整個(gè)程序執(zhí)行的起始點(diǎn)。普通函數(shù)是被主函數(shù)調(diào)用的子函數(shù)。普通函數(shù)又可分為標(biāo)準(zhǔn)庫(kù)函數(shù)和自定義函數(shù)。⒉函數(shù)的定義方式返回值類型函數(shù)名([形式參數(shù)列表])
[編譯屬性][中斷屬性][寄存器組屬性]{局部變量說(shuō)明函數(shù)體語(yǔ)句}
C51編程基礎(chǔ)知識(shí)準(zhǔn)備①返回值類型是指本函數(shù)返回值的數(shù)據(jù)類型,若無(wú)返回值,則成為無(wú)類型(或稱空類型),用void表示;若該項(xiàng)要素缺?。ú粚?xiě)明),則C51編譯系統(tǒng)默認(rèn)為int類型。②函數(shù)名除了main函數(shù)有固定名稱外,其他函數(shù)由用戶按標(biāo)識(shí)符的規(guī)則自行命名。③形式參數(shù)用變量名(標(biāo)識(shí)符)表示,沒(méi)有具體數(shù)值;可以是一個(gè),或多個(gè)(中間用逗號(hào)“,”分隔),或沒(méi)有形式參數(shù),但圓括號(hào)不可少。同時(shí),在列舉形式參數(shù)變量名時(shí)應(yīng)對(duì)該參數(shù)的數(shù)據(jù)類型一并說(shuō)明(也允許將形式參數(shù)說(shuō)明單獨(dú)列一行,放在圓括號(hào)之外)。④編譯屬性是指定該函數(shù)采用的存儲(chǔ)器編譯模式,有Small、Compact和Large3種選擇,缺省時(shí),默認(rèn)Small模式(參閱基礎(chǔ)知識(shí)2.2)。⑤中斷屬性是指明該函數(shù)是否中斷函數(shù);寄存器組屬性是指明該函數(shù)被調(diào)用時(shí)準(zhǔn)備采用哪組工作寄存器,該兩個(gè)屬性主要用于中斷函數(shù),允許缺省,將在基礎(chǔ)知識(shí)3.1詳述。⑥局部變量是僅應(yīng)用于本函數(shù)內(nèi)的變量。在執(zhí)行本函數(shù)時(shí),臨時(shí)開(kāi)辟存儲(chǔ)單元使用,本函數(shù)運(yùn)行結(jié)束即予釋放;局部變量說(shuō)明是說(shuō)明該變量的數(shù)據(jù)類型、存儲(chǔ)器類型等。⑦函數(shù)體語(yǔ)句是本函數(shù)執(zhí)行的任務(wù),是函數(shù)運(yùn)行的主體。⑧不能顛倒局部變量說(shuō)明與函數(shù)體語(yǔ)句的次序。即在一個(gè)函數(shù)中,所有局部變量說(shuō)明須放在函數(shù)體語(yǔ)句之前,不能插在函數(shù)體語(yǔ)句之中,否則C51編譯器將視作出錯(cuò)。⑨一對(duì)花括號(hào)是必須的。說(shuō)明如下:⒊函數(shù)的參數(shù)函數(shù)可分為無(wú)參數(shù)函數(shù)和有參數(shù)函數(shù)。無(wú)參數(shù)函數(shù)不能理解為函數(shù)內(nèi)無(wú)參數(shù),僅是無(wú)外界參數(shù)輸入。因而上述函數(shù)定義格式中的形式參數(shù)表就沒(méi)有了,但括號(hào)不能少。函數(shù)的形式參數(shù)(簡(jiǎn)稱形參),在函數(shù)被調(diào)用時(shí),主調(diào)用函數(shù)必須賦予形式參數(shù)實(shí)際數(shù)值(簡(jiǎn)稱實(shí)參),實(shí)際參數(shù)可以是常量,也可以是變量或表達(dá)式,但必須有確定的值,且兩者的數(shù)據(jù)類型必須一致,否則會(huì)發(fā)生“類型不匹配”的錯(cuò)誤。調(diào)用函數(shù)時(shí),形參與實(shí)參之間的傳遞是單方向的,只能是主調(diào)用函數(shù)向被調(diào)用函數(shù)傳遞,即只能是實(shí)參傳遞給形參。①提高了函數(shù)的通用性與靈活性,使一個(gè)函數(shù)能對(duì)變量的不同數(shù)值進(jìn)行功能相同的處理。②提高80C51內(nèi)存空間的利用率。函數(shù)的形式參數(shù)和局部變量在函數(shù)調(diào)用前并不占用80C51寶貴的內(nèi)存空間,僅在調(diào)用時(shí)臨時(shí)開(kāi)辟存儲(chǔ)單元寄存;該函數(shù)退出時(shí),這些臨時(shí)開(kāi)辟的存儲(chǔ)單元全部釋放。因此,可大大提高80C51寶貴內(nèi)存的利用率。⒋函數(shù)的返回值
return表達(dá)式;函數(shù)調(diào)用時(shí),臨時(shí)開(kāi)辟存儲(chǔ)單元,寄存函數(shù)中的形式參數(shù)和局部變量;函數(shù)調(diào)用結(jié)束退出后,臨時(shí)開(kāi)辟的存儲(chǔ)單元全部釋放,其中包括被調(diào)用函數(shù)中執(zhí)行某段程序的結(jié)果,有時(shí)需要把有用的結(jié)果(稱為函數(shù)值或函數(shù)返回值),返回給主調(diào)用函數(shù)。返回語(yǔ)句的一般形式為:①函數(shù)的返回值只能通過(guò)return語(yǔ)句返回;
return語(yǔ)句可有多條,但最終只能返回一個(gè)返回值。②函數(shù)的返回值必須與函數(shù)的類型一致。若不相同,則按函數(shù)類型自動(dòng)轉(zhuǎn)換。③允許函數(shù)沒(méi)有返回值,凡是不需要返回值的函數(shù)均宜明確定義為無(wú)類型void。④無(wú)類型函數(shù)不能使用return語(yǔ)句。說(shuō)明:⒌函數(shù)的調(diào)用函數(shù)在定義時(shí)都是相互獨(dú)立的,即在一個(gè)函數(shù)中不能再定義其他函數(shù)。函數(shù)不能嵌套定義,但可以互相調(diào)用。調(diào)用規(guī)則是:主函數(shù)main可以調(diào)用其他普通函數(shù);普通函數(shù)之間也可以互相調(diào)用,但普通函數(shù)不能調(diào)用主函數(shù)main。函數(shù)調(diào)用格式:函數(shù)名(實(shí)際參數(shù)表);
對(duì)于無(wú)參數(shù)函數(shù),實(shí)際參數(shù)表可以省略,但函數(shù)名后一對(duì)圓括號(hào)不能少。對(duì)于有參數(shù)函數(shù),形參必須賦予實(shí)參;若包含多個(gè)實(shí)參,實(shí)參數(shù)量與形參數(shù)量應(yīng)相等;且順序應(yīng)一一對(duì)應(yīng)傳遞;實(shí)參與實(shí)參之間應(yīng)用逗號(hào)分隔。在C語(yǔ)言中,函數(shù)不但可以互相調(diào)用,而且允許嵌套調(diào)用。即在調(diào)用一個(gè)函數(shù)的過(guò)程中,允許這個(gè)被調(diào)用函數(shù)調(diào)用其他另外的函數(shù)。⒍常用庫(kù)函數(shù)
庫(kù)函數(shù)是C51在庫(kù)文件中已經(jīng)定義好的函數(shù),C51編譯器提供了豐富的庫(kù)函數(shù)(位于KEIL\C51\LIB目錄),使用庫(kù)函數(shù)可以大大提高編程效率,用戶可以根據(jù)需要隨時(shí)調(diào)用。每個(gè)庫(kù)函數(shù)都在相應(yīng)的頭文件中給出了函數(shù)原型聲明,用戶若需調(diào)用,應(yīng)在源程序的開(kāi)頭采用預(yù)處理指令#include將其包含進(jìn)來(lái)。具體格式如下:#include<函數(shù)庫(kù)名.h>
⑴訪問(wèn)80C51特殊功能寄存器庫(kù)函數(shù)REGxxx.H#include<reg51.h> //包含訪問(wèn)sfr庫(kù)函數(shù)reg51.h①C51編譯器對(duì)80C51片內(nèi)21個(gè)特殊功能寄存器(必須大寫(xiě))全部作了定義,并賦予了既定的字節(jié)地址。若在頭文件中用#include命令包含進(jìn)來(lái)后,可以MCS-51標(biāo)準(zhǔn)SFR名直接引用。②21個(gè)特殊功能寄存器中有6個(gè)SFR(PSW、TCON、SCON、IE、IP和P3),只要在頭文件中聲明包含庫(kù)函數(shù)reg51.h,就可按位定義名稱直接引用。另有5個(gè)SFR(ACC、B、P0、P1和P2),可尋址位沒(méi)有專用的位定義名稱,只有位編號(hào),但這些位編號(hào)不符合ANSIC標(biāo)識(shí)符要求,例如,ACC.0、P1.0等(C51標(biāo)識(shí)符規(guī)定不可用小數(shù)點(diǎn)),應(yīng)按位變量定義方式重新定義,方可引用。⑵絕對(duì)地址訪問(wèn)庫(kù)函數(shù)ABSACC.H#include<absacc.h> //包含絕對(duì)地址訪問(wèn)庫(kù)函數(shù)absacc.h例如,任務(wù)14.1
中,百、十、個(gè)位377口地址分別為0xdfff、0xbfff、0x7fff。輸出顯示時(shí),分別用XBYTE[0xdfff]、XBYTE[0xbfff]、XBYTE[0x7fff]。單片機(jī)應(yīng)用系統(tǒng),硬件電路設(shè)計(jì)定型以后,片外擴(kuò)展I/O口變量的地址也就固定了。而在C51程序中,通常不固定變量的存儲(chǔ)單元地址,由編譯系統(tǒng)自動(dòng)完成地址的分配和使用。因此,在需要指定變量的存儲(chǔ)單元地址(例如,片外擴(kuò)展I/O口)時(shí),就需要對(duì)該絕對(duì)地址變量定義。⑶內(nèi)聯(lián)函數(shù)INTRINS.H內(nèi)聯(lián)函數(shù)也稱內(nèi)部函數(shù),編譯時(shí)將被直接替換為匯編指令或匯編指令序列。2.6C51數(shù)組和指針
⒈數(shù)組
數(shù)組是一組具有相同類型數(shù)據(jù)的有序集合。每一數(shù)組用一個(gè)標(biāo)識(shí)符表示,稱為數(shù)組名,數(shù)組名同時(shí)代表數(shù)組的首地址;數(shù)組內(nèi)數(shù)據(jù)有序排列的序號(hào)稱為數(shù)組下標(biāo),放在方括號(hào)內(nèi),根據(jù)數(shù)組下標(biāo)可訪問(wèn)組成數(shù)組的每一個(gè)數(shù)組元素。數(shù)組可分為一維和多維,常用的是一維數(shù)組。⑴定義格式數(shù)據(jù)類型[存儲(chǔ)器類型]
數(shù)組名[元素個(gè)數(shù)]
⑵引用格式數(shù)組名[下標(biāo)]
例如,數(shù)組a[10]中的10個(gè)元素可分別表示為:a[0]、a[1]、a[2]、…、a[9]。其中0~9稱為數(shù)組下標(biāo),下標(biāo)是從0開(kāi)始編號(hào)的,可以是整型常量或整型表達(dá)式。引用數(shù)組時(shí),C語(yǔ)言規(guī)定:①數(shù)組必須先定義后使用;②數(shù)組元素不能整體引用,只能單個(gè)引用。在單片機(jī)應(yīng)用中,數(shù)組的主要功能是查表。一般來(lái)說(shuō),實(shí)時(shí)控制系統(tǒng)沒(méi)有必要按繁復(fù)的控制公式進(jìn)行精確的計(jì)算,而只需預(yù)先將計(jì)算或檢測(cè)結(jié)果形成表格,使用時(shí)一一查表對(duì)應(yīng),特別是對(duì)于一些傳感器的非線性轉(zhuǎn)換,既方便又快捷。⑶數(shù)組賦值1)數(shù)組元素的值,一般在數(shù)組初始化時(shí)(即數(shù)組定義時(shí))賦值。2)數(shù)組初始化時(shí),也可只給一部分?jǐn)?shù)組元素賦值。若賦值個(gè)數(shù)少于數(shù)組元素個(gè)數(shù)時(shí),只將有效數(shù)值賦給最前一部分?jǐn)?shù)組元素,其后的數(shù)組元素均賦值0。3)若未在數(shù)組初始化時(shí)賦值,則數(shù)組定義后只能單個(gè)賦值。⑷字符數(shù)組數(shù)組的數(shù)據(jù)除了用數(shù)字表示外,還可用字符表示。其定義和引用格式與數(shù)值數(shù)組類同。只不過(guò)用字符代替了數(shù)值。例如:unsignedcharwelcom[7]={'W','e','l','c','o','m','e'};unsignedcharwelcom[8]={“Welcome”};unsignedcharwelcom[8]=“Welcome”;⑸數(shù)組作為函數(shù)的形式參數(shù)函數(shù)的形式參數(shù)除了基本類型和指針變量外,還可以用數(shù)組。通常形參數(shù)組不指定大小,僅在數(shù)組名后跟一個(gè)空方括號(hào);另設(shè)一個(gè)形參作為數(shù)組元素個(gè)數(shù),這樣可適用于不同大小的數(shù)組。用數(shù)組作函數(shù)的參數(shù)時(shí),并不是把數(shù)組值傳遞給形參,而是將實(shí)參數(shù)組起始地址傳遞給形參數(shù)組,這樣就使兩個(gè)數(shù)組占用同一段存儲(chǔ)單元。一旦形參數(shù)組某元素值發(fā)生變化,將會(huì)導(dǎo)致實(shí)參數(shù)組相應(yīng)元素值隨之變化。這種傳遞不同于數(shù)值傳遞,稱為地址傳遞。地址傳遞的結(jié)果具有雙向性,若在被調(diào)用函數(shù)中該地址存儲(chǔ)單元中的內(nèi)容發(fā)生了變化,在調(diào)用結(jié)束后這些變化將被保留下來(lái),即其結(jié)果會(huì)被返回到主調(diào)用函數(shù)。因此,用數(shù)組作為函數(shù)的形式參數(shù),可以得到多于一個(gè)的函數(shù)返回值。⒉指針
⑴指針和指針變量指針就是地址;變量的指針就是變量的地址;存放指針(地址)的變量稱為指針變量,而且指針變量也只允許存放地址。⑵指針變量定義方式[指針存儲(chǔ)器類型]數(shù)據(jù)類型
[數(shù)據(jù)存儲(chǔ)器類型]*指針變量名
數(shù)據(jù)類型與指針運(yùn)算有關(guān),例如指針變量ap+1,并不是簡(jiǎn)單的加1,而是根據(jù)數(shù)據(jù)類型的字節(jié)長(zhǎng)度增加一個(gè)長(zhǎng)度單位,指向下一個(gè)同類型的數(shù)據(jù)。因此,char型增加1個(gè)字節(jié),int型增加2個(gè)字節(jié),long型和flort型增加4個(gè)字節(jié)。指針變量名須符合C51標(biāo)識(shí)符要求,可任取。為防止與普通變量誤讀誤用,筆者建議,指針變量名末尾加字母p,以示區(qū)別(僅是建議,不是C51規(guī)則)。例如:ap、bp、a_p、b_p等。⑶取地址運(yùn)算符和指針運(yùn)算符&:取地址運(yùn)算符*:指針運(yùn)算符(或稱為間接訪問(wèn)運(yùn)算符、取指針內(nèi)容運(yùn)算符)①*ap與a是等價(jià)的,即*ap就是a。②由于*ap與a等價(jià),因此,&*ap與&a也是等價(jià)的。③由于ap=&a,因此,*ap與*&a等價(jià),*&a與a等價(jià)。若指針變量ap指向變量a。則有如下結(jié)論:⑷數(shù)組的指針變量在C51中,指針和指針變量常用于數(shù)組,數(shù)組的指針就是數(shù)組的起始地址。數(shù)組指針引用數(shù)組元素①a+i與ap+i等價(jià)。數(shù)組名a同時(shí)代表數(shù)組的首地址,指針變量ap指向數(shù)組的首地址。因此,a+i和ap+i均為數(shù)組元素a[i]的地址&a[i],或者說(shuō)它們均指向數(shù)組a[]的第i個(gè)元素。注意,不能將a+i看成數(shù)組元素加i。②*(a+i)、*(ap+i)與a[i]等價(jià)。既然(a+i)、(ap+i)均指向數(shù)組a[]的第i個(gè)元素,則加上指針運(yùn)算符“*”后,就表示(a+i)或(ap+i)所指向的數(shù)組元素,即a[i]。③指向數(shù)組的指針變量可以帶下標(biāo),即:ap[i]與*(ap+i)等價(jià)。⑸指針變量作為函數(shù)的形式參數(shù)函數(shù)的形式參數(shù)不僅可以是字符型、整型、實(shí)型或數(shù)組,還可以用指針變量,其作用是將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中去,這種參數(shù)傳遞屬于地址傳遞,具有雙向性。
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)版2024年:房產(chǎn)交易合同及附件
- 2024版建筑公司技術(shù)員工勞動(dòng)協(xié)議版B版
- 個(gè)人股權(quán)質(zhì)押融資合同(2024版)版B版
- 二零二五年度資產(chǎn)收購(gòu)協(xié)議8篇
- 2025年新能源電動(dòng)車租賃及充電設(shè)施建設(shè)合作協(xié)議3篇
- 二零二五年度高端住宅鋁窗更換及安裝工程合同范本4篇
- 專利事務(wù)委托代理合作合同2024版B版
- 二零二五廠長(zhǎng)任期責(zé)任書(shū)及薪酬福利聘用合同4篇
- 二手車交易合同協(xié)議書(shū)簡(jiǎn)單(2024版)
- 二零二五年電子商務(wù)平臺(tái)社交電商銷售合作協(xié)議3篇
- SQL Server 2000在醫(yī)院收費(fèi)審計(jì)的運(yùn)用
- 《FANUC-Oi數(shù)控銑床加工中心編程技巧與實(shí)例》教學(xué)課件(全)
- 微信小程序運(yùn)營(yíng)方案課件
- 抖音品牌視覺(jué)識(shí)別手冊(cè)
- 陳皮水溶性總生物堿的升血壓作用量-效關(guān)系及藥動(dòng)學(xué)研究
- 安全施工專項(xiàng)方案報(bào)審表
- 學(xué)習(xí)解讀2022年新制定的《市場(chǎng)主體登記管理?xiàng)l例實(shí)施細(xì)則》PPT匯報(bào)演示
- 好氧廢水系統(tǒng)調(diào)試、驗(yàn)收、運(yùn)行、維護(hù)手冊(cè)
- 中石化ERP系統(tǒng)操作手冊(cè)
- 五年級(jí)上冊(cè)口算+脫式計(jì)算+豎式計(jì)算+方程
- 氣體管道安全管理規(guī)程
評(píng)論
0/150
提交評(píng)論