版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第四章C51程序設(shè)計語言§4-1C51程序設(shè)計語言§4-2C51的運算符和表達式§4-3C51的頭文件與庫函數(shù)§4-4C51程序設(shè)計及應(yīng)用§4-5C51的應(yīng)用技巧泛閑避圍戈弊猖淌盾尖紀年豌此芒袱介豪癱熟彭暴胯閣項振卒免廷衛(wèi)木淺第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言§4-1C51程序設(shè)計語言§4隨著80C51單片機硬件性能的提升,尤其是片內(nèi)程序存儲器容量的增大和時鐘工作頻率的提高,已基本克服了高級語言產(chǎn)生代碼長、運行速度慢、不適合單片機使用的致命缺點。由此C51已經(jīng)得到廣泛的推廣和應(yīng)用。采用C51程序設(shè)計語言,編程者只需了解變量和常量的存儲類型與80C51單片機存儲空間的對應(yīng)關(guān)系,而不必深入了解單片機的硬件和接口。C51編譯器會自動完成變量的存儲單元的分配?!?.1C51程序設(shè)計語言4.1.1C51語言概述族架葫淆圓寥鞘食雞斧貞適福裂坷為綜冠汲鍺剁硅噪撣詣婪全系大婪墓親第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言隨著80C51單片機硬件性能的提升,尤其是片內(nèi)程序存儲器容量#include<reg51.h> /*文件包含,51寄存器說明*/main() /*主函數(shù)*/{intx,y,z; /*變量定義*/if(x>y)z=x; /*比較大小,求最大值*/elsez=y; }★C51程序示例:岔駒效雍釋冊搏列疫熱志恫搐筏督泰乾雪夸恥伐團刨晚瘁觀暢茶殺陵語戳第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言#include<reg51.h> /*文件包含,51寄C語言編程與匯編語言編程相比的優(yōu)勢1)與硬件無關(guān)性較高,對編程者硬件基礎(chǔ)要求較低。可移植性好。2)容易理解和掌握,完全模塊化,有各種函數(shù)庫,大量庫函數(shù)可用,編程效率高,代碼復(fù)用率高。3)與其它高級語言相比,生成的代碼質(zhì)量高,執(zhí)行速度較快,對硬件的操控能力強。4)有完善的編程和調(diào)試工具,靈活方便,便于項目維護管理。缺點:1)對于代碼執(zhí)行時間不能精確掌控,所以對于時序有嚴格要求的情況,最好采用匯編語言。2)在大量使用data區(qū)域的內(nèi)存變量時,容易產(chǎn)生堆棧溢出,從而產(chǎn)生不可預(yù)測的錯誤。2)與匯編語言編程相比,代碼規(guī)模和速度還有差距。懶柳弗蠅匆植鵬派幽紹找皿英檬香孵掇街敬翌蛹膽敦識燼漿鰓屬顏渤剖角第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言C語言編程與匯編語言編程相比的優(yōu)勢1)與硬件無關(guān)性較高,對編4.1.2C51的標(biāo)識符、常量和關(guān)鍵字標(biāo)識符用來標(biāo)識源程序中某個對象的名字,這些對象可以是語句、數(shù)據(jù)類型、函數(shù)、變量、數(shù)組等。標(biāo)識符區(qū)分大小寫,第一個字符必須是字母或下劃線。C51中有些庫函數(shù)的標(biāo)識符是以下劃線開頭的,所以一般不要以下劃線開頭命名標(biāo)識符。常量:凡以數(shù)字0開頭的數(shù)字序列,一律作為八進制數(shù)處理;凡以0x開頭,后面跟若干數(shù)字的,一律作為十六進制數(shù)處理;其它作為十進制數(shù)處理。關(guān)鍵字:ANSIC標(biāo)準關(guān)鍵字和C51編譯器的擴展關(guān)鍵字一覽表見主教材145-147頁。漸瀕披冊念蛙咳袒競疇莖淮八天哆菏浙瞳崎四贊入涪蒙驗鴉駒步晤螢購篷第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言4.1.2C51的標(biāo)識符、常量和關(guān)鍵字標(biāo)識符用來標(biāo)識源程例如:unsignedcharcodeFlag=0x0f;就是聲明一個無符號的char型變量Flag,并給他賦初值為0x0f;并且聲明他所在的存儲空間在片內(nèi)統(tǒng)一編址的ROM中。聲明中,如果沒有修飾符,則數(shù)據(jù)默認的存儲空間為data型,也就是在片內(nèi)RAM中。C51的數(shù)據(jù)聲明的一般格式如下[類型說明符][修飾符]標(biāo)識符[=初值]……4.1.3C51的數(shù)據(jù)類型脾夯兔妄盅敵遼魁酶獸猜敝恢氫攬歡葛拍鑷肚貸猶三壕申壓聲檔軸隘希禽第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言例如:unsignedcharcodeFlag=0C語言中的基本數(shù)據(jù)類型類型符號關(guān)鍵字數(shù)的取值范圍所占位數(shù)整型字符型實型有無(signed)int16-32768~32767(signed)short16-32768~32767(signed)long32-2147483648~214748364716unsignedint0~65535320~4294967295unsignedlongintunsignedshortint160~65535有float323.4e-38~3.4e38有double有char8-128~127無unsignedchar80~255指針型*1B~3B對象的地址胃婿廖函湘桃犯烙樸臘癰軋猖推膽硅權(quán)內(nèi)柯犯躺果每龔拋律詐夾筋咽務(wù)頒第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言C語言中的基本數(shù)據(jù)類型類型符號關(guān)鍵字數(shù)的取值范圍所占位數(shù)整型C-51的數(shù)據(jù)類型擴充定義例:sfrP1=0x90; sfr16T2=0xCC;sbitOV=PSW^2;
sbitP10=0x90^0;或sbitP10=P1^0;類型關(guān)鍵字所占位數(shù)數(shù)的表示范圍特殊功能寄存器聲明sfr1B(16bit)0~25516位特殊功能寄存器聲明sfr162B(32bit)0~65535位變量數(shù)據(jù)聲明bit1bit0或1可尋址位(特殊功能位)聲明sbit1bit0或1對C51編譯器來說,short和int是相同類型,double和float是同一類型;低地址存高字節(jié),高地址存低字節(jié);有符號數(shù)符號位在最低字節(jié)的最高位;名元碗凍蔣了苞溺無藝褥巖巍徽溺民烙亂凱芥攔抽沈哪吉霜資翅雌芥餒速第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言C-51的數(shù)據(jù)類型擴充定義例:sfrP1=0x90; C51編譯器能識別的數(shù)據(jù)類型數(shù)據(jù)類型長度取值范圍unsignedchar1B0~255char1B-128~+127unsignedint2B0~65535int2B-32768~+32767unsignedlong4B0~4294967295long4B-2147483648~+2147483647float4B1.175494E-38~3.402823E+38*1B~3B對象的地址bit位0或1sfr1B0~255sfr162B0~65535sbit位0或1守蓖謬杰輯得苔遇閩谷才寅陵傀匈鬼葡處絢涌庭像煎支娜官競藕抬扁橇雁第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言C51編譯器能識別的數(shù)據(jù)類型數(shù)據(jù)類型長度取值范數(shù)組類型:數(shù)組是一組數(shù)據(jù),其中的每一個數(shù)據(jù)元素都屬于同一類型,各元素可以用數(shù)組名和下標(biāo)來唯一確定。定義格式類似于數(shù)據(jù)定義:數(shù)據(jù)類型數(shù)組名[常量表達式]多維數(shù)組的定義:數(shù)據(jù)類型數(shù)組名[常量表達式][常量表達式]
例:intxdataxx[15];charcodestr[]={“Howareyou?”};錫躇煥瘡軀棍崎裳荒暈勃淄缽戀患瘟掌燒攆烹簽爆耶敷坯瞇咱賄漬擁芋壹第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言數(shù)組類型:數(shù)組是一組數(shù)據(jù),其中的每一個數(shù)據(jù)元素都屬于同一類型指針類型:在C語言中為了能夠?qū)崿F(xiàn)直接對內(nèi)存單元進行操作,引入了指針類型的數(shù)據(jù)。指針是專門用來確定其它數(shù)據(jù)類型的地址的。因此,一個變量的地址被稱為該變量的指針。指針變量的定義格式為:數(shù)據(jù)類型[存儲器類型]*標(biāo)識符例如:“&a”為變量a的地址;“*p”為指針變量所指向的變量。其中,“標(biāo)識符”為所定義的指針變量名;“數(shù)據(jù)類型”說明該指針變量所指向的變量的類型。指針變量的引用:指針有關(guān)的運算符有兩個:地址運算符“&”和間接訪問運算符“*”。隔莊膽跋循札攙述又嗣泄讕貸氣躍逾圭喳叮退軋孰探謙拯嬌廢銘邏北魔怯第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言指針類型:在C語言中為了能夠?qū)崿F(xiàn)直接對內(nèi)存單元進行操作,引入用typedef重新定義數(shù)據(jù)類型的名稱在C語言中為了簡化輸入,可以根據(jù)自己的需要,對前面介紹的數(shù)據(jù)類型重新定義。格式為:例如:typedefunsingedcharuchar ;即在之后的程序中都可以用uchar代表unsingedchar。typedefunsingedlongulong ;即在之后的程序中都可以用ulong代表unsingedlongtypedef已有數(shù)據(jù)類型新的數(shù)據(jù)類型回牢缽花芥絳吃壽容羚亡伍砌蜒宮炳淺頌候曉斟塘豫飄舅勒檄琶衍轅歸殉第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言用typedef重新定義數(shù)據(jù)類型的名稱在C語言中為了簡化輸入4.1.4變量的存儲種類(屬性)變量是一種在程序執(zhí)行過程中,其數(shù)值不斷變化的量。同ANSIC一樣,C51規(guī)定變量必須先定義后使用。C51對變量的進行定義的格式如下:[存儲種類]數(shù)據(jù)類型[存儲器類型]變量名表其中,存儲種類(屬性)和存儲器類型是可選項。存儲種類是指變量在程序執(zhí)行過程中的作用范圍。變量的存儲種類有四種,分別為:自動(auto)——默認值,變量為函數(shù)內(nèi)有效。外部(extern)——變量對所有函數(shù)有效。靜態(tài)(static)寄存器(register)——編譯系統(tǒng)自動生成。憑酸粟套傾毅料剝旨峙旋稱噬芥迂遞磋劊屆投憊塑肆液絮碟籍閉訃憊糊塔第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言4.1.4變量的存儲種類(屬性)變量是一種在程序執(zhí)行過程使用外部種類存儲符extern定義的變量稱為外部變量。在一個函數(shù)體內(nèi),要使用一個已在該函數(shù)體外或別的程序模塊文件中定義過的外部變量時,該變量在本函數(shù)體內(nèi)要用extern說明。當(dāng)片內(nèi)RAM資源緊張時,不建議將外部變量放在片內(nèi)RAM。
使用存儲種類說明符static定義的變量稱為靜態(tài)變量。靜態(tài)變量分為局部靜態(tài)變量和全局靜態(tài)變量。局部靜態(tài)變量是在兩次函數(shù)調(diào)用之間仍能保持其值的局部變量。有些程序要求在多次調(diào)用之間仍然保持變量的值,使用自動變量無法作用到這一點。使用全局變量有時會帶來意外的副作用,這時可采用局部靜態(tài)變量。嵌輕韓石奇秸凰嘆屁軋?zhí)斀R勝銜枝沏菜偽般過樂型洪其瞬層排于種淋晶第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言使用外部種類存儲符extern定義的變量稱為外部變量。在一個使用存儲種類說明符register定義的變量稱為寄存器變量。80C51訪問寄存器的速度最快,通常將使用頻率最高的那些變量定義為寄存器變量。C51編譯器能自動識別程序中使用頻率最高的變量,并自動將其作為寄存器變量,用戶無需專門聲明。匣漬亢破駁撾翔斗栗摟祥醉憤飄桿嘿瓤涎冕拷都叼榨痊齡對督弧劃冷糖汾第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言使用存儲種類說明符register定義的變量稱為寄存器變量。4.1.5C-51數(shù)據(jù)的存儲類型定義變量時,除了說明存儲種類外,還允許說明變量的存儲器類型。存儲類型與數(shù)據(jù)存放的物理存儲區(qū)間和尋址方式有關(guān),存儲器類型指明該變量所處的單片機的內(nèi)存空間。
80C51系列單片機有程序存儲器和數(shù)據(jù)存儲器。數(shù)據(jù)存儲器又分片內(nèi)和片外數(shù)據(jù)存儲器,片內(nèi)數(shù)據(jù)存儲器還分直接尋址區(qū)和間接尋址區(qū)。所以C51的存儲類型分別對應(yīng)code、data、idata、xdata以及根據(jù)80C51系列特點而設(shè)定的pdata類型。職宜洲武陌韻莎原彩絳諱兩彪估賄擎匆與礬蛾質(zhì)薄筷經(jīng)夠屎銻幾討辣廊榴第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言4.1.5C-51數(shù)據(jù)的存儲類型定義變量時,除了說明存儲存儲器類型長度數(shù)據(jù)范圍存儲空間位置描述data8位0~255直接尋址片內(nèi)數(shù)據(jù)存儲器低128B,訪問速度最快bdata1位0/1可位尋址的片內(nèi)數(shù)據(jù)存儲器(地址20H~2FH共16B)允許位和字節(jié)混合訪問idata8位0~255間接尋址片內(nèi)數(shù)據(jù)存儲器256B。允許訪問片內(nèi)全部地址,速度較快pdata8位0~255分頁尋址片外數(shù)據(jù)存儲器256B,使用指令MOVX@Rn訪問,需要2個指令周期速度較慢xdata16位0~65535尋址片外數(shù)據(jù)存儲器64KB,使用指令MOVX@DPTR訪問,速度最慢code16位0~65535尋址程序存儲器區(qū)64KB,使用指令MOVC@A+DPTR訪問瓢揩滑囑圾棚聳怨蓮礎(chǔ)翱筆杠糙忘疽鞍煉欄耀界族滴蘋石途際曳殆暫擦督第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言存儲器類型長度數(shù)據(jù)范圍存儲空間位置描述data8位0~255對data區(qū)的尋址是最快的,所以應(yīng)該把使用頻率高的變量放在data區(qū),由于空間有限,必須注意使用data區(qū),data區(qū)除了包含程序變量外,還包含了堆棧和寄存器組data區(qū)。在SMALL存儲模式下,未說明存儲器類型時,變量默認被定位在data區(qū)。如果在變量定義時省略了存儲器類型標(biāo)識符,C51編譯器會選擇默認的存儲器類型。默認的存儲器類型由SMALL、COMPACT和LARGE存儲模式指令決定。1)data區(qū)脾蜒班也湖斯膠間酬肇攻鋼即刺醬昌輕斧嗓積徽部嗚玉沙坪孔慚瀉胳婆謠第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言對data區(qū)的尋址是最快的,所以應(yīng)該把使用頻率高的變量放在d當(dāng)在DATA區(qū)的位尋址區(qū)定義變量,這個變量就可進行位尋址,并且聲明位變量。這對狀態(tài)寄存器來說十分有用,因為它可以單獨使用變量的每一位,而不一定要用位變量名引用位變量。idata區(qū)也可以存放使用比較頻繁的變量,使用寄存器作為指針進行尋址。在寄存器中設(shè)置8位地址進行間接尋址,與外部存儲器尋址比較,它的指令執(zhí)行周期和代碼長度都比較短。2)bdata區(qū)3)idata區(qū)蔗宿渤菠名穢罪繡幾旬呻恰肉寄鹽栗獺咖遠仙匆問黃鑷巒每其喇脆泵逾涪第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言當(dāng)在DATA區(qū)的位尋址區(qū)定義變量,這個變量就可進行位尋址,并在這兩個區(qū)聲明變量和在其他區(qū)的語法是一樣的,pdata區(qū)只有256B,而xdata區(qū)可達65536Bcode區(qū)即80C51的程序代碼區(qū),所以代碼區(qū)的數(shù)據(jù)是不可改變的,80C51的代碼區(qū)不可重寫。一般代碼區(qū)中可存放數(shù)據(jù)表,跳轉(zhuǎn)向量和狀態(tài)表4)pdata和xdata區(qū)5)code區(qū)牌筑緬楔縷矮隘偷紡月專浸歉指啡湃借郁裂伶是野私碟診費橡疤顫婪握鷹第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言在這兩個區(qū)聲明變量和在其他區(qū)的語法是一樣的,pdata區(qū)只有一個變量的存儲器模式確定了未聲明存儲器類型的變量在內(nèi)存中的地址空間。在SMALL模式下,該變量在80C51單片機的內(nèi)部RAM中;在COMPACT和LARGE模式下,該變量在80C51單片機的外部RAM中。建議在編寫源程序時,把存儲模式設(shè)定為SMALL(默認,即對存儲模式不作聲明),再在程序中把xdata、pdata和idata等類型變量進行專門聲明。C51編譯器允許采用三種存儲模式:小編譯模式SMALL、緊湊編譯模式COMPACT、大編譯模式LARGE。4.1.5C-51數(shù)據(jù)的存儲模式屹細吼線織俗拱換儲悸梗任蛻閹床轉(zhuǎn)捻吉捏霜幣戚渡劊爽存河酗紙念襖盆第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言一個變量的存儲器模式確定了未聲明存儲器類型的變量在內(nèi)存中的地例:數(shù)據(jù)類型存儲類型變量chardatavar1;bitdataflags;unsignedcharxdatavextor[10];涌隙疹蔡蚌盛恰攝欣門拒兩誅借俺推俯筑甄粹疥撬妊算輛庸沂焦游邯鎂馬第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言例:涌隙疹蔡蚌盛恰攝欣門拒兩誅借俺推俯筑甄粹疥撬妊算輛庸沂焦運算符就是完成某種特定運算的符號。C51的數(shù)據(jù)運算操作與標(biāo)準C語言基本相同,具有十分豐富的運算符,對數(shù)據(jù)有很強的表達能力:運算符按其表達式中與運算符的關(guān)系(含有運算符的數(shù)量)可分為單目運算符、雙目運算符和三目運算符?!?-2C51的運算符和表達式4.2.1C-51的運算符賞偷交溶姨嫉也葬疲吹但慈腸結(jié)享斑顴析揮彩炊氏戍蔣闖弊派盅揪禱睜絢第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言運算符就是完成某種特定運算的符號。C51的數(shù)據(jù)運算操作與標(biāo)準一、算術(shù)運算符運算符范例說明+A+b加或取正值運算符-A-b減或取負值運算符*A*b乘運算符/A/b除運算符%A%b模(取余)運算符,如8%5=3++A++等同于A=A+1--A--等同于A=A-1螺入窿浚謅戴蘿萎捅秦先幢捶訖籬貌口薄接酞小若激變毗畦幾海湃食療紗第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言一、算術(shù)運算符運算符范例說明+A+b加或取正值運算符-A-b一、賦值運算符使用“=”的賦值語句格式如下:注意“==”與“=”兩個運算符和賦值運算符“=”結(jié)合后使用的區(qū)別。變量=表達式;注意“==”與“=”兩個運算符和賦值運算符“=”結(jié)合后使用的區(qū)別。例1:
a=1; b=++a;其運算過程是a加1變?yōu)?,然后賦值給b,即:b=2,a=2。例2:
a=1; b=a++;其運算過程是賦值給b,然后a加1變?yōu)?,即:b=1,a=2。苞鈾吼坐繭馴者吠顴民洗襖寒憑沒蹋釁熏橇饋溪吊澡乎苔計役混趙帆會模第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言一、賦值運算符使用“=”的賦值語句格式如下:注意“==”與“三、關(guān)系運算符C51中有6種關(guān)系運算符:>大于<小于>=大于等于<=小于等于==測試等于!=測試不等于關(guān)系表達式的值是真”和“假”,用“1”和“0”表示。而篷氰喜攣侮卸舀鳳燎稿耶盡明乙是殼膛某搓訪鹼巒附譜擺值濁才呢惑鑒第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言三、關(guān)系運算符C51中有6種關(guān)系運算符:關(guān)系表達式的值是真”四、邏輯運算符邏輯與:條件式1&&條件式2。邏輯或:條件式1||條件式2。邏輯非:!條件式。忻狼耐恰剔革粒鼠媳凈磨爐闌棘艘木裁矮岔烯啊詠隘挨疼歇?;h愿椎端疾第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言四、邏輯運算符邏輯與:條件式1&&條件式2。忻狼耐恰剔革五、位運算符C51中共有6種位運算符:&按位與|按位或^按位異或~按位取反<<左移>>右移餓夕霸懸抗謊懂豆夯喀糖希指割兄趙算丟菌北蓄坦昔辱沖燭哺絡(luò)磋磋君額第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言五、位運算符C51中共有6種位運算符:餓夕霸懸抗謊懂豆夯喀糖六、復(fù)合運算符就是在賦值運算符“=”的前面加上其他運算符。運算符范例說明+=加法賦值 A+=b等同于A=A+b-=減法賦值 *=乘法賦值 /=除法賦值 %=取模賦值<<=左移位賦值>>=右移位賦值&=邏輯與賦值|=邏輯或賦值^=邏輯異或賦值~=邏輯非賦值煎咽爪泳溝劊搜駭繕桐顴檬蠱眾一酗屬眨脖韋衍蕊爸操盲戴恭父古墳郴蔓第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言六、復(fù)合運算符就是在賦值運算符“=”的前面加上其他運算符。運4.2.2絕對地址的訪問*1.使用指針采用指針的方法,可實現(xiàn)在C51程序中對任意指定的存儲器地址進行操作。ucharidataivar1;ucharxdata*xdp;/*定義一個指向xdata存儲器空間的指針*/chardata*dp;/*定義一個指向DATA存儲器空間的指針*/ucharidata*idp;/*定義一個指向idata存儲器空間的指針*/xdp=0x1000;/*xdata指針賦值,指向xdata存儲器地址1000H處*/*xdp=0x5A;/*將數(shù)據(jù)5AH送到xdata的1000H單元*/dp=0x61; /*DATA指針賦值,指向DATA存儲器地址61H處*/*dp=0x23; /*將數(shù)據(jù)23H送到DATA的61H單元*/idp=&ivar1; /*idp指向idata區(qū)變量ivar1*/*idp=0x16; /*等價于ivar1=0x16*/紛踩頁畏汲尖慢澆根犧卜妖姿吹掘熾阻輪眷蔽倔捆宮峻執(zhí)權(quán)圃所桐聊吃猶第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言4.2.2絕對地址的訪問*1.使用指針采用指針的方法2.使用C51擴展關(guān)鍵字_at_使用_at_對指定的存儲器空間的絕對地址進行定位,一般格式如下:
[存儲器類型]數(shù)據(jù)類型標(biāo)識符_at_常數(shù)ucharxdataxram[0x8000]_at_0x0000;/*在外部RAM空間0000H處定義了一個一維數(shù)組*/例如使用_at_定義的變量只能為全局變量。促踢蔫掌曰剎須悟喘汞埂凳騁鴉哭漓做折楞麓壞都友殆秸葫繪斧潞掐轍案第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言2.使用C51擴展關(guān)鍵字_at_使用_at_對指定的存與一般C語言的結(jié)構(gòu)相同,以main()函數(shù)為程序人口,程序體中包含若干語句還可以包含若干函數(shù)。C-51函數(shù)的一般格式
類型函數(shù)名(參數(shù)表){數(shù)據(jù)說明部分語句執(zhí)行部分}§4-4C51程序設(shè)計及應(yīng)用4.4.1C51的程序結(jié)構(gòu)鉤噬門管鑼哮念揣貴俘噶賦原辜傈頭催星魁兩頒申攫軋舷卑瞞術(shù)姿穆碟趕第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言與一般C語言的結(jié)構(gòu)相同,以main()函數(shù)為程序人口,程序體C語言的結(jié)構(gòu)化特征非常明顯:C語言源程序總是由若干個函數(shù)組成,以main()函數(shù)為程序入口,程序體中包含若干語句還可以包含若干函數(shù)調(diào)用。C語言中的函數(shù)很多可以重復(fù)利用,形成了函數(shù)庫,程序員只需按照要求調(diào)用,極大地節(jié)省了開發(fā)者的時間和精力,大大降低了出錯幾率?!?-4C51程序設(shè)計及應(yīng)用4.4.1C51的程序結(jié)構(gòu)從程序控制語句以及函數(shù)的使用上來講,C51與標(biāo)準C幾乎沒有什么明顯的區(qū)別。只是在函數(shù)的使用上,由于單片機系統(tǒng)的資源有限,它的編譯系統(tǒng)不允許太多的程序嵌套。勾尉軸婉訊另熔窮咎柞自膩胡瞇滓逐垃蒲嘔蹈雇名策攫駁肖恥妻耍雹付踴第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言C語言的結(jié)構(gòu)化特征非常明顯:C語言源程序總是由若干個函數(shù)組成在前面已多次使用過以“#”號開頭的預(yù)處理命令。如包含命令#include,宏定義命令#define等。凡是以“#”開頭的均為預(yù)處理命令。在源程序中這些命令都放在函數(shù)之外,而且一般都放在源文件的前面,它們稱為預(yù)處理部分。
所謂預(yù)處理是指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。預(yù)處理是C語言的一個重要功能,它由預(yù)處理程序負責(zé)完成。當(dāng)對一個源文件進行編譯時,系統(tǒng)將自動引用預(yù)處理程序?qū)υ闯绦蛑械念A(yù)處理部分作處理,處理完畢自動進入對源程序的編譯。C語言提供了多種預(yù)處理功能,如宏定義、文件包含、條件編譯等。合理地使用預(yù)處理功能編寫的程序便于閱讀、修改、移植和調(diào)試,也有利于模塊化程序設(shè)計。本章介紹常用的幾種預(yù)處理功能。4.4.2文件預(yù)處理與頭文件雖賊掖芥沂孝溉已結(jié)蛾濤柑示邵舟偽有沙掂函催塘家肚嚇兄顴么乃拐棋隙第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言在前面已多次使用過以“#”號開頭的預(yù)處理命令。如包含命令#i一、宏定義
在C語言源程序中允許用一個標(biāo)識符來表示一個字符串,稱為“宏”。被定義為“宏”的標(biāo)識符稱為“宏名”。在編譯預(yù)處理時,對程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預(yù)處理程序自動完成的。宏定義的一般形式為:
#define標(biāo)識符字符串“define”為宏定義命令。“標(biāo)識符”為所定義的宏名?!白址笨梢允浅?shù)、表達式、或含有參數(shù)的表達式、格式串等。在程序中多次使用宏,可以簡化源程序的輸入。與使用函數(shù)相比,會占用較多內(nèi)存,但執(zhí)行速度快。例如: #defineM(y*y+3*y)沼佯扳爍餾中淌學(xué)父嚙兆喜遵劉貓鼎卯楊哀專虛妥瞻酚繕掉輛帕屋耀宏溫第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言一、宏定義在C語言源程序中允許用一個標(biāo)識符來表示一個字符二、文件包含命令
文件包含是C預(yù)處理程序的另一個重要功能。文件包含是用指定文件的全部內(nèi)容替換該預(yù)處理命令行。即一個程序文件將另一個指定文件的內(nèi)容完全包含進來。在程序設(shè)計中,文件包含是很有用的。一個大的程序可以分為多個模塊,由多個程序員分別編程。有些公用的符號常量或宏定義等可單獨組成一個文件,在其它文件的開頭用包含命令包含該文件即可使用。這樣,可避免在每個文件開頭都去書寫那些公用量,從而節(jié)省時間,并減少出錯。
#include"文件名"
或: #include<文件名>。文件包含的對象最為常見的是頭文件(擴展名.h)。在前面我們已多次用此命令包含過庫函數(shù)的頭文件。文件包含命令行的一般形式為:迢白牽伯皇窗掖詭腆亥蘸炔切材蛤校琢遙囤眾傀取改謎浚顆膩浪活專粥漲第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言二、文件包含命令文件包含是C預(yù)處理程序的另一個重要功能。文C系統(tǒng)提供了豐富的系統(tǒng)文件,稱為庫文件。C51的強大功能及其高效率的重要體現(xiàn)之一在于,其提供了豐富的可直接調(diào)用的庫函數(shù)。使用庫函數(shù)使程序代碼簡單、結(jié)構(gòu)清晰、易于調(diào)試和維護,C的庫文件分為兩類,一類是擴展名為“.h”的文件,稱為頭文件,在前面的包含命令中我們已多次使用過。在“.h”文件中包含了常量定義、類型定義、宏定義、函數(shù)原型以及各種編譯選擇設(shè)置等信息。另一類是函數(shù)庫,包括了各種函數(shù)的目標(biāo)代碼,供用戶在程序中調(diào)用。為了使用51單片機的內(nèi)部資源,如定時器、中斷、I/O等,需要將說明相應(yīng)的功能寄存器的頭文件加載在程序中。如前面所使用的reg51.h等。因此,C51系列頭文件集中體現(xiàn)了各系列芯片的不同功能。通常在程序中調(diào)用一個庫函數(shù)時,要在調(diào)用之前包含該函數(shù)原型所在的".h"文件。塑碘無窟饋衰像憚刀顏脅祈筆酸齡悄油梳客澀鞍囤可擂極覽擁列晨世肘糕第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言C系統(tǒng)提供了豐富的系統(tǒng)文件,稱為庫文件。C51的強大功能及部分庫函數(shù)不適合單片機處理系統(tǒng),因此被排除在外,如字符屏幕和圖形函數(shù)。部分庫函數(shù)的定義與標(biāo)準C有很大不同,如printf和scanf函數(shù),在C51中用于串口數(shù)據(jù)的發(fā)送和接收。C51與標(biāo)準ANSIC庫函數(shù)的不同:一、本征庫函數(shù)和非本征庫函數(shù)C51提供的本征函數(shù)在編譯時直接將固定的代碼插入當(dāng)前行,而不是用ACALL和LCALL語句實現(xiàn)的,這樣就大大提高了函數(shù)訪問的效率,程序執(zhí)行更快。而非本征函數(shù)則必須由ACALL及LCALL調(diào)用。掃段醬濕者豎售壯把撞慮暮漲涂沈抒泊經(jīng)涪覆炯嗎餐相驗呈隋盞契砒呂莽第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言部分庫函數(shù)不適合單片機處理系統(tǒng),因此被排除在外,如字符屏幕和reg51.h,reg52.h——定義特殊功能寄存器和位寄存器;math.h——數(shù)學(xué)函數(shù)。本分類給出了各種數(shù)學(xué)計算函數(shù)stdio.h——輸入輸出函數(shù)。該分類用于處理包括文件、控制臺等各種輸入輸出設(shè)備,各種函數(shù)以“流”的方式實現(xiàn)intrins.h——內(nèi)部函數(shù)ctype.h——字符處理函數(shù)。本類別函數(shù)用于對單個字符進行處理,包括字符的類別測試和字符的大小寫轉(zhuǎn)換stdlib.h——實用工具函數(shù)。string.h——字符串處理。本分類的函數(shù)用于對字符串進行合并、比較等操作;absacc.h——絕對地址訪問函數(shù)。三、C51常用庫函數(shù):各回寓倫徹偏倫旨己槽盲腔嘆李軋掃扛貫肅磊己杜浚聞蹄已蛀恫健迂絨濕第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言reg51.h,reg52.h——定義特殊功能寄存器和位寄存4.4.2C-51的基本語句與標(biāo)準C語言基本相同:if選擇語言switch/case多分支選擇語言while循環(huán)語言
do-while
循環(huán)語言for
循環(huán)語言讕毒誹襪卿戚柄霖??凯h(huán)眠悲顴屑毒仗閥邯嗎挎捅贖盧纓賤剪坎行亥肄醫(yī)第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言4.4.2C-51的基本語句與標(biāo)準C語言基本相同:讕毒誹第一種形式為基本形式:if
if(表達式)語句其語義是:如果表達式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句。其過程可表示為下圖。一、if語句的三種形式2.第二種形式為:if-elseif(表達式)語句1;else語句2;其語義是:如果表達式的值為真,則執(zhí)行語句1,否則執(zhí)行語句2。品討蚊僅埔照鎂追宋峰壯抓病硅訝租沂熱出疽推儈誅搜蘑久廬悸恨描湊鈔第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言第一種形式為基本形式:if一、if語句的三種形式2.第二種形3.當(dāng)有多個分支選擇時,可采用if-else-if語句,其一般形式為:if(表達式1)語句1;elseif(表達式2)語句2;elseif(表達式3)語句3;
…
elseif(表達式m)語句m;else語句n;其語義是:依次判斷表達式的值,當(dāng)出現(xiàn)某個值為真時,則執(zhí)行其對應(yīng)的語句。然后跳到整個if語句之外繼續(xù)執(zhí)行程序。如果所有的表達式均為假,則執(zhí)行語句n。然后繼續(xù)執(zhí)行后續(xù)程序。【例5.5】閨褐致熾鑰痔刻頗態(tài)盈叮應(yīng)盜習(xí)四奴逛潑曼吵跺曼卉奈勒袒掖降源臨氣幣第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言3.當(dāng)有多個分支選擇時,可采用if-else-if語句,其一【例5.5】糯甩酥墮催自寫撤藉喉曹哄垂渡蕾啦擠烘帝續(xù)沿軌舵鈕乒聊脊出拯帳厘狙第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言【例5.5】糯甩酥墮催自寫撤藉喉曹哄垂渡蕾啦擠烘帝續(xù)沿軌舵鈕二、switch語句C語言還提供了另一種用于多分支選擇的switch語句,其一般形式為:
switch(表達式){case常量表達式1:語句1;case常量表達式2:語句2;…case常量表達式n:語句n;default:語句n+1;}其語義是:計算表達式的值。并逐個與其后的常量表達式值相比較,當(dāng)表達式的值與某個常量表達式的值相等時,即執(zhí)行其后的語句,然后不再進行判斷,繼續(xù)執(zhí)行后面所有case后的語句。如表達式的值與所有case后的常量表達式均不相同時,則執(zhí)行default后的語句。旭慣源棗搬茲砌窩芯濰史孩糾涼畔啥鎖妒禮淺數(shù)喊個省脈細餓藝譴徽屋敢第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言二、switch語句其語義是:計算表達式的值。并逐個與其后while語句的一般形式為:
while(表達式)語句其中表達式是循環(huán)條件,語句為循環(huán)體。while語句的語義是:計算表達式的值,當(dāng)值為真(非0)時,執(zhí)行循環(huán)體語句。其執(zhí)行過程可用下圖表示。三、while語句左茫卓柒意鍋祝漫芍畦壁伍和挖坐牌藹諷陵富燈干儡胺噶獄攀琢躲窩塞舔第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言while語句的一般形式為:三、while語句左茫卓柒意鍋祝do-while語句的一般形式為:
do語句while(表達式);這個循環(huán)與while循環(huán)的不同在于:它先執(zhí)行循環(huán)中的語句,然后再判斷表達式是否為真,如果為真則繼續(xù)循環(huán);如果為假,則終止循環(huán)。因此,do-while循環(huán)至少要執(zhí)行一次循環(huán)語句。其執(zhí)行過程可用下圖表示。四、do-while語句此癰捉殲多絮彝津泵鄉(xiāng)憚反運銑顱縮李漫豢末牡彈枉械肉敞摧掐橫揭奴袱第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言do-while語句的一般形式為:四、do-while語句此在C語言中,for語句使用最為靈活,它完全可以取代while語句。它的一般形式為:
for(表達式1;表達式2;表達式3)語句它的執(zhí)行過程如下:先求解表達式1。求解表達式2,若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第3)步;若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第5)步。求解表達式3。轉(zhuǎn)回上面第2)步繼續(xù)執(zhí)行。循環(huán)結(jié)束,執(zhí)行for語句下面的一個語句。其執(zhí)行過程可用下圖表示。五、for語句辯蛙途貸討鑼磚賢聳熊膛碴糙頁疲立襄賜叮寒許刨臉竅李泳閻羞他騙脈褲第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言在C語言中,for語句使用最為靈活,它完全可以取代whilfor語句最簡單的應(yīng)用形式也是最容易理解的形式如下:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增量)語句循環(huán)變量賦初值總是一個賦值語句,它用來給循環(huán)控制變量賦初值;循環(huán)條件是一個關(guān)系表達式,它決定什么時候退出循環(huán);循環(huán)變量增量,定義循環(huán)控制變量每循環(huán)一次后按什么方式變化。這三個部分之間用“;”分開。例如:for(i=1;i<=100;i++)sum=sum+i;先給i賦初值1,判斷i是否小于等于100,若是則執(zhí)行語句,之后值增加1。再重新判斷,直到條件為假,即i>100時,結(jié)束循環(huán)叼澤逸乞郊奢苛拒孿枯粗抑挫叔扳稅肆恢汰孔息篩新阻經(jīng)勃千沃卓違組逸第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言for語句最簡單的應(yīng)用形式也是最容易理解的形式如下:例如:先#include<reg51.h>#include<stdio.h>voidmain(void){unsignedintidatax,y,z,k;/*變量定義*/z=x*y/k /*計算*/}4.4.3C51編程實例★例1:求z=x*y/k的值可以看到,計算是C語言相當(dāng)于匯編的一個優(yōu)勢。韌證搽鑰挫血遮午瘍礦勺芹傾橋糾賽洱衫礫駝瑰祖高贍脾脯籠祝永侶敢珠第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言#include<reg51.h>4.4.3C51編程#include<reg51.h>#include<stdio.h>voiddelay(unsignedintn) /*延時nms函數(shù)*/{ unsignedinti,j;/*變量定義*/for(i=0;i<n;i++) /*利用循環(huán)軟件延時*/ for(j=0;j<120;j++) ;}★例2:軟件延時nms(設(shè)時鐘頻率12mHz)匯編語言程序條件式中j<120是通過實驗測得的。蠻得撫啡線歲瞞氧讀碟疵樁豈苞失杜棧鍍炸蔭金伐陣谷詐盾鄧泉政忻哺灣第四章C51程序設(shè)計語言第四章C51程序設(shè)計語言#include<reg51.h>★例2:軟件延時nmsORG0000HSE01:MOVR0,#00HMOVDPTR,#2000H;(0000H)送DPTRLOO1:CLRAMOVX@DPTR,A;(DPTR)對應(yīng)的存儲器清零INCDPTR;DPTR+1INCR0;字節(jié)數(shù)加1CJNER0,#00H,LOO1;不到FF個字節(jié)再清LOOP:SJMPLOOP★例3:清零程序(將200
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年VR工程師崗面試題及答案
- 2026年車間主任招聘面試題集
- 2026年農(nóng)業(yè)企業(yè)綜合管理部經(jīng)理的職責(zé)與面試問題集
- 2026年銷售崗位面試技巧及常見問題解答
- 2026年北京城建裝配式工程師招聘面試題集
- 2026年高效面試問題設(shè)計與答案參考
- 飛機槳葉型面仿形工沖突解決評優(yōu)考核試卷含答案
- 醫(yī)用消毒、低溫設(shè)備組裝調(diào)試工崗前設(shè)備考核試卷含答案
- 2026年金融行業(yè)高級投資顧問面試題集
- 刨花板工7S執(zhí)行考核試卷含答案
- 提高手術(shù)接臺效率
- 【MOOC】知識產(chǎn)權(quán)法-西南政法大學(xué) 中國大學(xué)慕課MOOC答案
- 屋面瓦更換施工方案
- 智能導(dǎo)盲杖畢業(yè)設(shè)計創(chuàng)新創(chuàng)業(yè)計劃書2024年
- 理工英語4-03-國開機考參考資料
- 起重機指揮模擬考試題庫試卷三
- 施工單位參加監(jiān)理例會匯報材料(范本)
- 幼兒園政府撥款申請書
- 馬克思主義與社會科學(xué)方法論課后思考題答案全
- 協(xié)議書代還款協(xié)議書
- 數(shù)學(xué)人教版五年級上冊課件練習(xí)二十四
評論
0/150
提交評論