單片機(jī)的應(yīng)用程序設(shè)計課程課件_第1頁
單片機(jī)的應(yīng)用程序設(shè)計課程課件_第2頁
單片機(jī)的應(yīng)用程序設(shè)計課程課件_第3頁
單片機(jī)的應(yīng)用程序設(shè)計課程課件_第4頁
單片機(jī)的應(yīng)用程序設(shè)計課程課件_第5頁
已閱讀5頁,還剩164頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7章單片機(jī)的C語言應(yīng)用程序設(shè)計7.1C語言與MCS-517.2C51數(shù)據(jù)類型及在MCS-51中的存儲方式

7.3C51數(shù)據(jù)的存儲類型與MCS-51存儲結(jié)構(gòu)7.4MCS-51特殊功能寄存器(SFR)的C51定義7.5MCS-51并行接口的C51定義7.6位變量的C51定義7.7C51構(gòu)造數(shù)據(jù)類型

7.8模塊化程序開發(fā)過程7.9MCS-51內(nèi)部資源使用的C語言編程7.10MCS-51片外擴(kuò)展的C語言編程7.11頻率量測量的C語言編程7.12MCS-51機(jī)間通信的C語言編程7.13鍵盤和數(shù)碼顯示人機(jī)交互的C語言編程7.1C語言與MCS–51用匯編程序設(shè)計MCS–51系列單片機(jī)應(yīng)用程序時,必須要考慮其存儲器結(jié)構(gòu),尤其必須考慮其片內(nèi)數(shù)據(jù)存儲器與特殊功能寄存器正確、合理的使用以及按實(shí)際地址處理端口數(shù)據(jù)。用C語言編寫MCS–51單片機(jī)的應(yīng)用程序,雖然不像用匯編語言那樣具體地組織、分配存儲器資源和處理端口數(shù)據(jù),但在C語言編程中,對數(shù)據(jù)類型與變量的定義,必須要與單片機(jī)的存儲結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。用C語言編寫單片機(jī)應(yīng)用程序與編寫標(biāo)準(zhǔn)的C語言程序的不同之處就在于根據(jù)單片機(jī)存儲結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的C語言中的數(shù)據(jù)類型和變量,其它的語法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計方法都與標(biāo)準(zhǔn)的C語言程序設(shè)計相同。用C語言編寫的應(yīng)用程序必須經(jīng)單片機(jī)的C語言編譯器(簡稱C51),轉(zhuǎn)換生成單片機(jī)可執(zhí)行的代碼程序。支持MCS–51系列單片機(jī)的C語言編譯器有很多種。如AmericanAutomation、Auocet、BSO/TASKING、DUNFIELDSHAREWARE、KEIL/Franklin等。其中KEIL/Franklin以它的代碼緊湊和使用方便等特點(diǎn)優(yōu)于其它編譯器。本章是針對這種編譯器介紹MCS–51單片機(jī)C語言程序設(shè)計。7.2C51數(shù)據(jù)類型及在MCS-51中的存儲方式7.2.1C51的數(shù)據(jù)類型FranklinC51編譯器具體支持的數(shù)據(jù)類型有:位型(bit)、無符號字符(unsignedchar)、有符號字符(singedchar)、無符號整型(unsignedint)、有符號整型(signedint)、無符號長整型(unsignedlong)、有符號長整型(signedlong)、浮點(diǎn)型(float)和指針類型等。表7.1FranklinC51的數(shù)據(jù)類型數(shù)據(jù)類型長度(bit)長度(byte)值域bit110,1unsignedchar810~255signedchar81–128~127unsignedint1620~65535signedint162–32768~32767unsignedlong3240~4294967295signedlong324–2147483648~2147483647float324±1.176E–38~±3.40E+38(6位數(shù)字)double648±1.176E–38~±3.40E+38(10位數(shù)字)一般指針243存儲空間0~655357.2.2C51數(shù)據(jù)在MCS-51中的存儲方式位變量(bit):與MCS-51硬件特性操作有關(guān)的可以定義成位變量。位變量必須定位在MCS-51單片機(jī)片內(nèi)RAM的位尋址空間中。字符變量(char):字符變量的長度為1byte即8位。這很合適MCS-51單片機(jī),因?yàn)镸CS-51單片機(jī)每次可處理8位數(shù)據(jù)。對于無符號變量(unsignedchar)的值域范圍是0~255。對于有符號字符變量(signedchar),最具有重要意義的位是最高位上的符號標(biāo)志位(msb)。此位為1代表"負(fù)",為0代表"正"。有符號字符變量和無符號字符變量在表示0~127的數(shù)值時,其含義是一樣的,都是0~0x7F。負(fù)數(shù)一般用補(bǔ)碼表示,即用11111111表示-1,用11111110表示-2……。當(dāng)進(jìn)行乘除法運(yùn)算時,符號問題就變得十分復(fù)雜,而C51編譯器會自動地將相應(yīng)的庫函數(shù)調(diào)入程序中來解決這個問題。整型變量(int):整型變量的長度為16位。與8080和8086CPU系列不同,MCS-51系列單片機(jī)將int型變量的高位字節(jié)數(shù)存放在低地址字節(jié)中,低位字節(jié)數(shù)存放在高地址字節(jié)中。有符號整型變量(signedint)也使用msb位作符號標(biāo)志位,并使用二進(jìn)制補(bǔ)碼表示數(shù)值??芍苯邮褂脦追N專用的機(jī)器指令來完成多字節(jié)的加、減、乘、除運(yùn)算。整型變量值0x1234以圖7.1所示的方式存放在內(nèi)存中。圖7.1整型數(shù)的存儲結(jié)構(gòu)…0x120x34…+0+1地址0x120x340x560x78….+0+1+2+3地址圖7.2長整型變量的存儲結(jié)構(gòu)浮點(diǎn)型變量(float):浮點(diǎn)型變量為32位,占4個字節(jié),許多復(fù)雜的數(shù)學(xué)表達(dá)式都采用浮點(diǎn)變量數(shù)據(jù)類型。應(yīng)用符號位表示數(shù)的符號,用階碼和尾數(shù)表示數(shù)的大小。用它們進(jìn)行任何數(shù)學(xué)運(yùn)算都需要使用由編譯器決定的各種不同效率等級的庫函數(shù)。FranklinC51的浮點(diǎn)變量數(shù)據(jù)類型的使用格式與IEEE-754標(biāo)準(zhǔn)有關(guān),具有24位精度,尾數(shù)的高位始終為"1",因而不保存,位的分布如下:●1位符號位?!?位指數(shù)位?!?3位尾數(shù)。符號位是最高位,尾數(shù)為低23位,內(nèi)存中按字節(jié)存儲順序如下:地址+0+1+2+3內(nèi)容MMMMMMMMMMMMMMMMEMMMMMMMSEEEEEEE其中,S為符號位,1表示負(fù),0表示正;E為階碼;M為23位尾數(shù),最高位為"1"。浮點(diǎn)變量值-12.5的十進(jìn)制為:0xC1480000,它按圖7.3所示方式存于內(nèi)存中。0x000x000x480xC1….+0+1+2+3地址圖7.3浮點(diǎn)數(shù)的存儲結(jié)構(gòu)在編程時,如果只強(qiáng)調(diào)運(yùn)算速度而不進(jìn)行負(fù)數(shù)運(yùn)算時,最好采用無符號(unsigned)格式。無符號字符類型的使用:無論何時,應(yīng)盡可能使用無符號字符變量,因?yàn)樗苤苯颖籑CS-51所接受?;谕瑯拥脑?,也應(yīng)盡量使用位變量。有符號字符變量雖然也只占用一個字節(jié),但需要進(jìn)行額外的操作來進(jìn)行測試代碼的符號位。這無疑會降低代碼效率。使用簡化形式定義數(shù)據(jù)類型。其方法是在源程序開頭使用#define語句自定義簡化的類型標(biāo)識符。例如:#defineucharunsignedchar#defineuintunsignedint這樣,在編程中,就可以用uchar代替unsignedchar,用uint代替unsignedint來定義變量。7.3C51數(shù)據(jù)的存儲類型與MCS-51存儲結(jié)構(gòu)表7.2C51存儲類型與MCS-51存儲空間的對應(yīng)關(guān)系存儲類型與存儲空間的對應(yīng)關(guān)系data直接尋址片內(nèi)數(shù)據(jù)存儲區(qū),訪問速度快(128字節(jié))bdata可位尋址片內(nèi)數(shù)據(jù)存儲區(qū),允許位與字節(jié)混合訪問(16字節(jié))idata間接尋址片內(nèi)數(shù)據(jù)存儲區(qū),可訪問片內(nèi)全部RAM地址空間(256字節(jié))pdata分頁尋址片外數(shù)據(jù)存儲區(qū)(256字節(jié))由MOV@Ri訪問(i=0,1)xdata片外數(shù)據(jù)存儲區(qū)(64KB)由MOVX@DPTR訪問code程序存儲器64KB空間,由MOVC@DPTR訪問表7.3C51存儲類型及其數(shù)據(jù)長度和值域存儲類型長度(bit)長度(byte)值域范圍data810~255idata810~255pdata810~255xdata1620~65535code1620~65535帶存儲類型的變量的定義的一般格式為數(shù)據(jù)類型存儲類型變量名帶存儲類型的變量定義舉例:chardatavar1;bitbdataflags;floatidatax,y,z;unsignedintpdatavar2;unsignedcharvector[3][4];表7.4存儲模式說明存儲模式說明SMALL默認(rèn)的存儲類型是data,參數(shù)及局部變量放入可直接尋址片內(nèi)RAM的用戶區(qū)中(最大128字節(jié))。另外所有對象(包括堆棧),都必須嵌入片內(nèi)RAM。棧長很關(guān)鍵,因?yàn)閷?shí)際棧長依賴于函數(shù)嵌套調(diào)用層數(shù)COMPACT默認(rèn)的存儲類型是pdata,參數(shù)及局部變量放入分頁的外部數(shù)據(jù)存儲區(qū),通過@R0或@R1間接訪問,??臻g位于片內(nèi)數(shù)據(jù)存儲區(qū)中LARGE默認(rèn)的存儲類型是xdata,參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲區(qū),使用數(shù)據(jù)指針DPTR來進(jìn)行尋址。用此數(shù)據(jù)指針進(jìn)行訪問效率較低,尤其對兩個或多個字節(jié)的變量,這種數(shù)據(jù)類型的訪問機(jī)制直接影響代碼的長度7.4MCS-51特殊功能寄存器(SFR)的C51定義MCS-51單片機(jī)中,除了程序計數(shù)器PC和4組工作寄存器組外,其它所有的寄存器均為特殊功能寄存器(SFR),分散在片內(nèi)RAM區(qū)的高128字節(jié)中,地址范圍為80H~0FFH。SFR中有11個寄存器具有位尋址能力,它們的字節(jié)地址都能被8整除,即字節(jié)地址是以8或0為尾數(shù)的。為了能直接訪問這些SFR,F(xiàn)ranklinC51提供了一種自主形式的定義方法,這種定義方法與標(biāo)準(zhǔn)C語言不兼容,只適用于對MCS-51系列單片機(jī)進(jìn)行C語言編程。特殊功能寄存器C51定義的一般語法格式如下: sfrsfr-name=intconstant;"sfr"是定義語句的關(guān)鍵字,其后必須跟一個MSC-51單片機(jī)真實(shí)存在的特殊功能寄存器名,"="后面必須是一個整型常數(shù),不允許帶有運(yùn)算符的表達(dá)式,是特殊功能寄存器"sfr-name"的字節(jié)地址,這個常數(shù)值的范圍必須在SFR地址范圍內(nèi),位于0x80~0xFF。例如:sfrSCON=0x98; /*串口控制寄存器地址98H*/sfrTMOD=0x89; /*定時器/計數(shù)器方式控制寄存器地址89H*/MCS-51系列單片機(jī)的特殊功能寄存器的數(shù)量與類型不盡相同,因此建議將所有特殊的"sfr"定義放入一個頭文件中,該文件應(yīng)包括MCS-51單片機(jī)系列機(jī)型中的SFR定義。C51編譯器的"reg51.h"頭文件就是這樣一個文件。在新的MCS-51系列產(chǎn)品中,SFR在功能上經(jīng)常組合為16位值,當(dāng)SFR的高字節(jié)地址直接位于低字節(jié)之后時,對16位SFR的值可以直接進(jìn)行訪問。例如52子系列的定時器/計數(shù)器2就是這種情況。為了有效地訪問這類SFR,可使用關(guān)鍵字"sfr16"來定義,其定義語句的語法格式與8位SFR相同,只是"="后面的地址必須用16位SFR的低字節(jié)地址,即低字節(jié)地址作為"sfr16"的定義地址。例如:sfr1歪6T狀2=擋0xCC絡(luò)/*慚定時器/影計數(shù)器2身:T2低斯8位地址槐為0CC現(xiàn)H,T2閘高8位地勻址為0C鄉(xiāng)豐DH*/這種定念義適用狂于所有學(xué)新的1蕉6位S蹲FR,尸但不能握用于定扶時器/克計數(shù)器窗0和1質(zhì)。對于位尋矛址的SF士R中的位求,C51姨的擴(kuò)充功藝能支持特償殊位的定奏義,像S聲FR一樣遣不與標(biāo)準(zhǔn)龍C兼容,扣使用"s哈bit"園來定義位擴(kuò)尋址單元然。第一種格辱式:s畏bit遵bit臂-nam運(yùn)e=凡sfr-由name民^int歉con杏stan今t;"sbi筐t"是定戶義語句的驢關(guān)鍵字,暢后跟一個估尋址位符市號名(該平位符號名類必須是M拆CS-5章1單片機(jī)鋪中規(guī)定的宜位名稱)悄,"="右后的"s罪fr-n韻ame"察必須是已倘定義過的戀SFR的運(yùn)名字,"斃^"后的孕整常數(shù)是鼠尋址位在童特殊功能報寄存器"饅sfr-禁name偷"中的位壟號,必須種是0~7伏范圍中的趕數(shù)。例如滅:sfr擺PS染W(wǎng)=0x微D0;逆/飲*定義乏PSW寄善存器地址蘋為D0H往*/sbit訪OV決=PSW龍^2;歉/垂*定義堅O(shè)V位為隸PSW.饒2,地址偽為D2H床*/sbit椅CY嘗=PSW研^7;祥/*院定義C準(zhǔn)Y位為P回SW.7附,地址為辨D7H貼*/第二種是格式:森sbi阻t筑bit孝-na徑me銷=i科nt宅con悉sta插nt^睡int順co疑nst旱ant吸;"="后節(jié)的int芒con齒stan費(fèi)t為尋址臉地址位所傭在的特殊障功能寄存荒器的字節(jié)轟地址,"琴^"符號醬后的in醋tco蹦nsta催nt為尋拍址位在特凍殊功能寄黃存器中的鎖位號。例捧如:sbit符OV興=0XD降0^2參; /征*定義鐘OV位地架址是D0昏H字節(jié)穿中的第2榨位*/sbi福t鞭CY=獎0XD芹0^7急;爭/*兩定義奴CY位曬地址是忠D0H故字節(jié)中股的陷第7位防*/第三種格改式:sb飛it那bit-員name蛛=i悠ntc冤onst俘ant;"="后鏈的int晶con勉stan委t為尋址蘇位的絕對霞位地址。絡(luò)例如:sbi世t哥OV=紛0XD刻2;少/鞏*定登義OV蓬位地址伯為D2栗H*譽(yù)/sbi涼t資CY=四0XD撓7;棒/遭*定索義CY總位地址尺為D7點(diǎn)H*偵/特殊功能桂位代表了才一個獨(dú)立唉的定義類身,不能與旺其它位定渴義和位域償互換。7.5慚MCS撞-51并君行接口的楊C51定屆義MCS-詞51系列險單片機(jī)并僑行I/O粒接口除了贏芯片上的稈4個I/型O口(P回0~息P3)外容,還可以浴在片外擴(kuò)璃展I/O蛇口。MC北S-51磨單片機(jī)I塌/O口與現(xiàn)數(shù)據(jù)存儲計器統(tǒng)一編蚊址,即把詞一個I/供O口當(dāng)作擁數(shù)據(jù)存儲答器中的一奮個單元來館看待。使用C獻(xiàn)51進(jìn)娘行編程勢時,M義CS-筆51片感內(nèi)的I考/O口射與片外濱擴(kuò)展的酬I/O膽可以統(tǒng)思一在一議個頭文淘件中定章義,也驢可以在襖程序中掌(一般秩在開始炭的位置刷)進(jìn)行缺定義,磨其定義航方法如豎下:對于MC姓S-51況片內(nèi)I/稍O(shè)口按特通殊功能寄茫存器方法膠定義。例援如:sfr舒P0榴=0x唐80斗;乘/*踐定義P犧0口,訪地址為香80H德*/sfr蠶P1=0鳳x90??;/飄*定義回P1口,辮地址為9隨0H*稍/對于片摩外擴(kuò)展鍵I/O恰口,則耗根據(jù)硬逮件譯碼堪地址,嚷將其視頸作為片辣外數(shù)據(jù)舞存儲器誓的一個萬單元,灑使用#嫌def漂ine崗語句進(jìn)齒行定義資。例如#in要clu礙de紡<ab遣sac冒c.h響>#de薄fin帳eP斜O(jiān)RT湖AX切BYT汁E[御0xF濤FC0采]abs箭acc釘.h是抵C51粱中絕對賓地址訪攜問函數(shù)哄的頭文鑰件,將稱POR索TA定介義為外趙部I/爬O口,巷地址為粗F芝FC0壞H,長車度為8里位。一旦在裹頭文件雖或程序郊中對這新些片外盯I/O禁口進(jìn)行薦定義后科,在程劃序中就孤可以自怕由使用模變量名樂與其實(shí)膝際地址變的聯(lián)系長,以便點(diǎn)使程序而員能用攏軟件模森擬MC鹽S-5礎(chǔ)1的硬奔件操作扒。(1)茂位變剪量C5織1定義瘋。使用顛C51暢編程時毫,定義抵了位變泰量后,邪就可以令用定義千了的變賞量來表繁示MC孝S-5愿1的位茶尋址單逝元。位變量舞的C5伶1定義高的一般餡語法格剝式如下究:位類型標(biāo)備識符(b蘋it)妥位變量患名;例如:bit兩dir接ecti發(fā)on_b躍it;慌/*倦把dir搶ecti騾on_b洽it定義貌為位變量乖*/bit相l(xiāng)豪ook禮_po霧int澇er燈; /莊*把鑼loo第k_p雅oin距ter播定義為杏位變量脈*/7.6抹位墓變量的釘C51泊定義(2)邀函數(shù)可包抓含類型為跪"bit兆"的參數(shù)位,也可以賢將其作為見返回值。天例如:bit纖fun霉c(bi煩tb0吸,bi鉗tb1拍)營/*技變量b0利,b1作為為函數(shù)的盆參數(shù)*抓/{retu臟rn(秀b1);航/羅*變量堤b1作為轉(zhuǎn)函數(shù)的返凍回值*勻/}注意,使吊用(#p胡ragm煉adi什sabl彈e)或包死含明確的娃寄存器組盛切換(u睡sing參n)的溝函數(shù)不能餅返回位值浴,否則編膚輯器將會客給出一個崇錯誤信息掀?!?3)羨對位變量蔑定義的限躲制。位變喬量不能定模義成一個婦指針,如墾不能定義涂:bit擴(kuò)*黨bit_瘡poin脈ter。秋不存在位醒數(shù)組,如疾不能定義承:bit寧b_慣arra淘y[]磨。在位定根義中,謝允許定廳義存儲泥類型,笨位變量肯都被放寄入一個宇位段,堂此段總魄位于M談CS-罪51片怕內(nèi)的R給AM區(qū)辦中。因刷此,存秋儲類型愉限制為怠dat拜a和i理dat由a,如凝果將位跟變量的糕存儲類艇型定義糕成其它皇存儲類子型都將撒編譯出潛錯。例1先定義變指量的數(shù)據(jù)森類型和存陷儲類型:bda士ta汗int以ib抓ase蟻;曬/錯*定豆義ib避ase沃為bd深ata勾整型變能量*己/bdat謀ach這ar駁bary統(tǒng)[4];墾/*黃bar銳y[4]英定義為b艇data驅(qū)字符型數(shù)崖組*/然后可使淹用"sb多it"定晨義可獨(dú)立急尋址訪問胖的對象位集:sbi添t富myb荷it0瓦=本iba喬se^來0;偏/*第my肢bit婦0定義禽為ib母ase摩的第0伍位*攏/sbit剩my撲bit1劃5=悶ibas隙e^15窗; /*款myb撲it0定丙義為ib疾ase的思第15位饅*/sbit守Ar管y07繡=ba興ry[0雖]^7戲; /*淚Ary流07定義日為abr物y[0]希的第7位犬*/sbit伙Ar胃y37神=ba者ry[3坡]^7述; /*葵Ary性37定義且為abr頭y[3]慕的第7位襖*/對象i墾bas劇e和b淘ary瞎也可以描字節(jié)尋適址:ary3處7=0;拘/*淚bary團(tuán)[3]的數(shù)第7位賦盲值為0累*/bar為y[3廈]='犁a';瘋/*憑字節(jié)儀尋址,涼bar飛y[3怠]賦便值為'事a'帶*/sbi林t定義尚要位尋易址對象問所在字蛾節(jié)基址柜對象的卷存儲類撲型為"馳bda宿ta"膊,否則爹只有絕攝對的特?fù)焓馕欢灹x(s鑒bit侮)是合隸法的。燙"^"彎操作符絹后的最帖大值依叔賴于指恩定的基嘴類型,怕對于c父har幕/uc伯har耐而言是滋0~7詳,對于寒int首/ui弓nt而霜言是0榮~15蚊,對于走lon蠟g/u街lon細(xì)g而言隸是0~蕉31。7.7堵C日51構(gòu)淹造數(shù)據(jù)撥類型1.基妙于存儲蠢器的指判針基于存學(xué)儲器的健指針以作存儲器釣類型為啊參量,測它在編楊譯時才外被確定詞。因此宵,為指吼針選擇某存儲器攏的方法蠶可以省燦掉,以么便這些徑指針的災(zāi)長度為分一個字拴節(jié)(i槳dat瓣a*載,da到ta漲*,p豆dat盲a*矮)或2預(yù)個字節(jié)局(co季de流*,x腦dat桃a*暗)。編的譯時,插這類操否作一般喝被"行策內(nèi)"(左inl濫ine瞧)編碼京,而無申需進(jìn)行僚庫調(diào)用諷?;诖婢弮ζ鞯陌橹羔樁▕A義舉例歉:char郊xd羽ata租*px求;在xda飯ta存儲靜器中定義鍵了一個指丈向字符型蹄(cha劈燕r)的指朋針變量p兇x。指針某自身在默均認(rèn)存儲區(qū)屋(決定于讓編譯模式晉),長度促為2個字杏節(jié)(值為己0~0x寄FFFF失)。cha蔬r劈燕xda則ta井*d土ata拐p檢dx;除了明既確定義痰指針位蠅于MC沿S-5讀1內(nèi)部驗(yàn)存儲區(qū)健(da嗚ta)厭外,其偶它與上厘例相同僚,它與輛編譯模褲式無關(guān)柳。data友ch召ar陪xdat跨a*驅(qū)pdx;stru守ct冠time{捏cha壓r航hou韻r;cha仙r翻min宮;cha絲式r震sec唇;str環(huán)uct紐奉ti縣me訓(xùn)xd鐘ata聽*p裂xti承me;}在結(jié)構(gòu)需str舊uct扒ti梁me中洋,除了唐其它結(jié)擇構(gòu)成員爛外,還粒包含有隸一個具愁有和s供tru停ct銀tim慰e相同蠻的指針魔pxt養(yǎng)ime扔,ti探me位匠于外部換數(shù)據(jù)存擱儲器(黑xda茄ta)識,指針跌pxt尊ime腿具有兩究個字節(jié)產(chǎn)長度。str莫uct繪ti昨me返ida肯ta蓮*pt浸ime釘;這個聲明吃定義了一誤個位于默歇認(rèn)存儲器斧中的指針淘,它指向宜結(jié)構(gòu)ti膊me,t險ime位析于ida膨ta存儲徑器中,結(jié)騎構(gòu)成員可話以通過M扎CS-5款1的@R益0或@R千1進(jìn)行骨間接訪問怖,指針p惹time消為1個字挪節(jié)長。ptim醒e→px角time戚→hou普r=睡12;使用上面際的關(guān)于s工truc閱tti羅me和s顧truc靠tid尖ata贊*pti門me的定缸義,指針挖"pxt倦ime"雕被從結(jié)構(gòu)允中間接調(diào)首用,它指悼向位于x去data很存儲器中羽的tim嫁e結(jié)構(gòu)。闖結(jié)構(gòu)成員幻玉hour寄被賦值為擠12。2.一奸般指針一般指針屢包括3個拋?zhàn)止?jié):1隸個字節(jié)存伍儲類型和育2個字節(jié)苗偏移地址劉,即地址+0+1+2內(nèi)容存儲器類型偏移地址高位字節(jié)偏移地址低位字節(jié)其中,第臣一字節(jié)代牲表了指針階的存儲器近類型,存群儲器類型怕編碼如下頌:存儲器類型idataxdatapdatadatacode值12345例如,以泊xdat破a類型的疤0x12碧34地址題為指針可殿以表示如緣瑞下:地址+0+1+2內(nèi)容0x020x120x34當(dāng)用常胖?jǐn)?shù)作指施針時,展必須注赤意正確范定義存糖儲器類值型和偏著移量。例如,而將常數(shù)勝值0x姐41寫踢入地址進(jìn)為0x拳800鋪0的外危部數(shù)據(jù)厲存儲器夕。#def鬼ine陰XBY哄TE(安(ch減ar*宇)0x看2000咳0L)XBYT忌E[0x融8000阿]=失0x41的;其中,X狡BYTE垮被定義為役(cha匙r*)塘0x20約000L繪,0x2查0000于L為一般爛指針,其繡存儲類型如為2,偏柳移量為0緩000H規(guī),這樣X組BYTE貢成為指向江xdat府a(chǎn)零地址時的指針。妹而XBY兩TE[8陶000]破則是外部雨數(shù)據(jù)存儲自器的0x番8000拋絕對地址翼。7.8獅模塊化旋程序開發(fā)罩過程圖7.瘋4融程序開端發(fā)過程7.8貫.1在混合編味程1.命戲名規(guī)則表7.5滾函數(shù)壞名的轉(zhuǎn)換說明符號名轉(zhuǎn)換規(guī)則voidfunc(void)FUNC無參數(shù)傳遞或不含寄存器參數(shù)的函數(shù)名不作改變轉(zhuǎn)入目標(biāo)文件中,名字只是簡單地轉(zhuǎn)換為大寫形式voidfunc(void)_FUNC帶寄存器參數(shù)的函數(shù)名加入“_”字符前綴,表明這類函數(shù)包含寄存器的參數(shù)傳遞voidfunc(void)reentrant_?FUNC對于重入函數(shù)加上“_?”字符串前綴,表明這類函數(shù)包含棧內(nèi)的參數(shù)傳遞例2用匯編語艱言編寫函痛數(shù)"to賺uppe涌r",參被數(shù)傳遞發(fā)華生在寄存新器R7中固。UPP侍ER央SEG蝴MEN挪TC亭ODE鞏;程序早段PUB缸LIC親_TO排UPP瓜ER謀;入口嗎地址PSEG浸UPPE居R霉;程序示段_TOU周PPER外:MO陰VA耍,R7崗;從R7況中取參數(shù)CJNE巨A,遭#'a漲',$+周3JC淺UP吐PER肆ETCJNE討A于,#固'z'+交1,$宣+3JNC姐U霉PPER照ETCLR料ACC保,5UPP色ERE饞T:珠MO接V瓜R7渾,A壇;返睬回值放克在R7逼中RET鬼;返銅回到C2.參數(shù)襯傳遞規(guī)則表7.季6代參數(shù)傳財遞的寄鳳存器選挨擇參數(shù)類型charintlong,float一般指針第1個參數(shù)R7R6,R7R4~R7R1,R2,R3第2個參數(shù)R5R4,R5R4~R7R1,R2,R3第3個參數(shù)R3R2,R3無R1,R2,R3fun險c1(數(shù)int窮a)識"劍a"是巧第一個舍參數(shù),吩在R6受,R7慚中傳遞到。func形2(i番ntb董,in繞tc,痛int舊*d輝)"淡b"是第霜一個參數(shù)階,在R6招,R7中懸傳遞;"蠟c"是第乖二個參數(shù)糖,在R4鑄,R5中星傳遞;"快d"是第誕三個參數(shù)約,在R1渠,R2,夸R3中傳味遞。func厲3(lo戰(zhàn)nge刻,l宿ong鍵f)掠"e"搜是第一個膊參數(shù),在賀R4~R及7中傳遞卵;"f"縣是第二個拌參數(shù),不芹能在寄存期器中傳遞宴,只能在貫參數(shù)傳遞壤段中傳遞吩。func忍4(fl度oat護(hù)g,領(lǐng)char嫌h)煉"g走"是第一在個參數(shù),寇在R4~逝R7中傳召遞;"h穗"是第二熟個參數(shù),蠻必須在參反數(shù)傳遞段嚼中傳遞。表7.7隊函數(shù)攏返回值的份寄存器返回值寄存器說明bitC進(jìn)位標(biāo)位(unsigned)charR7

(unsigned)intR6,R7高位字節(jié)在R6,低位字節(jié)在R7(unsigned)longR4~R7高位字節(jié)在R4,低位字節(jié)在R7floatR4~R732位IEEE格式,指數(shù)和符號位在R7指針R1,R2,R3R3放存儲器類型,高位在R2,低位在R1在匯編子蝦程序中,附當(dāng)前選擇恭的寄存器抵組及寄存騎器ACC旁、B、D底PTR和菊PSW都百可能改變烤。當(dāng)被C習(xí)調(diào)用時,驚必須無條凍件地假設(shè)濕這些寄存汽器的內(nèi)容渠已被破壞昆。如果已帳在連接/稿定位程序滅時選擇了愉覆蓋,那遣么每個匯沙編子程序絮包含一個塵單獨(dú)的程出序段是必堆要的,因?qū)樵诟采w失過程中,售函數(shù)間參旁量通過子袍程序各自拳的段參量單計算。匯館編子程序沾的數(shù)據(jù)區(qū)篇甚至可包鳳含在覆蓋繳部分中,微但應(yīng)注意容下面兩點(diǎn)徒:(1)莖所有貌段名必咸須以C飛51類筍似的方雕法建立籮。(2)近每個有局混部變量的心匯編程序膊必須指定支自己的數(shù)醉據(jù)段,這棋個數(shù)據(jù)段潮只能為其適它函數(shù)訪退問作參數(shù)駐傳遞用。辣所有參數(shù)尖一個接一橫個被傳遞階,由其它求函數(shù)計算垃的結(jié)果保站存入棧。7.8.釣2覆亞蓋和共享1.覆休蓋單片機(jī)片賺內(nèi)存儲空陷間有限,系連接器/蓋定位器通桿常重新啟膽用程序不聾再用的位桑置。這就跡是說,若宰一個程序油不再調(diào)用膀,也不由熄其它程序閃調(diào)用(甚碌至間接調(diào)冷用),那娃么在其它刪程序執(zhí)行悉完之前,槽這個程序香不再運(yùn)行寨。這個程暑序的變量遙可以放在豪與其它程梁序完全相旗同的RA夜M空間,未很像可重詳用的寄存構(gòu)器。這種謙技術(shù)就是桃覆蓋。在貨匯編中直劈燕接通過手割工完成的矛這些空間葛分配,C脊語言中可閉以由連接撞器自動管五理。若有筐幾個不相市關(guān)聯(lián)的程慚序時,它??梢允筊趣AM單元排比手工考笛慮要用的覺少。2.共量享1)共獅享變量類型匯編語言C語言動態(tài)變量

y(){intx;}靜態(tài)變量

staticintx;公用變量PUBLICXX:ds2Intx;外部變量EXTERNDATA(X)MOVDPTR,#Xexternintx;靜態(tài)子程序/函數(shù)Y:…staticy(){…};公共子程序/函數(shù)PUBLICYY:y(){…};外部子程序/函數(shù)EXTERNCODE(Y)LCALLYy()2)治共享函遭數(shù)/子飄程序C中函鑰數(shù)若是允全局的昨(公用啟的),女可以放拘在調(diào)用圣的函數(shù)搭之后。絹若函數(shù)或是模塊遮專用的泡,它可健以定義縮慧為靜態(tài)壟函數(shù),譽(yù)這樣它拔不能被芬其它模粒塊調(diào)用拴。C語余言的A宋NSI懸標(biāo)準(zhǔn)建伴議所有筆函數(shù)在席主函數(shù)譜前要有帳原型(東進(jìn)行說蛇明),嫩然后實(shí)頁際函數(shù)丸可在主快函數(shù)之翠后或其剪它模塊丈中。這疲符合自賣頂向下餡編程的詞概念。匯編語言悲中,子程黎序使用標(biāo)稻號可在給虜定模塊的貫任何位置威。匯編器努首先掃描豎得到所有排的符號名意,然后值內(nèi)就可填入奸LCAL育L或LJ樸MP。一鏈個模塊或訴另一模塊泰共享子程宮序,一個劑使用PU妄BLIC餃而另一個織使用EX國TERN加。當(dāng)指定脊為EXT積ERN,畜符號類型添(COD皺E,DA旱TA,X右DATA院,IDA利TA,B貢IT或N必UMBE笛R)必須蠟特別加以燙指定,以嶄便連接器消可以確定累放在一起委的正確類犯型。7.8.吃3庫活和連接器浮/定位器1.五庫表7.9釘Fr窗ankl刪inC磨51的編診譯庫庫說明C51S.LIBSMALL模式,無浮點(diǎn)運(yùn)算C51FPS.LIB浮點(diǎn)數(shù)學(xué)運(yùn)算庫(SMALL模式)C51C.LIBCOMPACT模式,無浮點(diǎn)運(yùn)算C51FPC.LIB浮點(diǎn)運(yùn)算庫(COMPACT模式)C51L.LIBLARGE模式,無浮點(diǎn)運(yùn)算C51FPL.LIB浮點(diǎn)運(yùn)算庫(LARGE模式)2.連杰接器/洪定位器1)組甘合程序模封塊將幾個叔不同程憤序模塊揚(yáng)組合為黎一個模皂塊,并呈自動從頓庫中挑升選模塊陣嵌入目辜標(biāo)文件漲。輸入杠文件按陡命令行語中出現(xiàn)守的順序離處理。必通常的任程序模宗塊是由漁C51護(hù)編譯器體或A5菌1宏匯帆編生成迎的可重媽入的目拳標(biāo)文件畝。2)組闊合段將具有脹相同段內(nèi)名的可威重定位掩段組合芒成單一割的段。調(diào)在一個屋程序模該塊中定劫義的一冒個段成寺為部分崗段。一鐮個部分?jǐn)U段在源塊文件中關(guān)以下列詳形式指右定:(1)皆名字晴每個重定孝位段有一方個名字,每它可與來娛自其它模送塊的同名脅的可重定脹位段組合嶺。絕對段蚊沒有名字饞。(2)籃類型路類型表明痰段所屬的禽地址空間透CODE疾,XDA膀TA,D佳ATA或豪BIT。(3)易定位方式把可重定線位段的定愧位方式有革PAGE鳥,INP夏AGE,吩INBL值OCK,叼B(yǎng)ITA堆DDR列ESSA蘿BLE或精UNIT魂。INP嚼AGE表潛明段必須返放入一頁暑(高8位干地址相同摟)中以使孔用短轉(zhuǎn)移貍和調(diào)用指及令。IN屬BLOC貼K段應(yīng)使尸用ACA富LL,必擦須放在2救048字奴節(jié)塊中。武因?yàn)闆]有粘連接器可賴以靈活地?fù)p判知調(diào)用吊和轉(zhuǎn)移是盾否在塊內(nèi)螞??芍囟`位的其它筑限制是:根PAGE咸--不能資超過25格6字節(jié);佛B(yǎng)ITA艷DDRE竟SSAB陡LE--穿必須放在瓣可位尋址壞的內(nèi)部R哀AM空間梨;UNI睬T--允蠢許段從任君意字節(jié)開套始(對位誕變量是位翻)。(4)貍長度吼一恐個段的幼長度。(5)夜基址乞段性的首址摟。對于扣絕對段尼,地址腫由匯編酸器賦予沉,對于辰可重定揚(yáng)位段,效地址由櫻L51饑決定。培在處理他程序模做塊時,榜L51響自動產(chǎn)錫生段表撈(MA燈P),奴該表包傍含了每黨個段的往類型、碼基址、燥長度、惑可重定課位性和苦名字。粱L5吉1自動董將所具菜有相同劣名字的壤所有部勞分段組狡合到單此一可重許定位段收中。例油如,三陽個程序脖模塊包啞含字段矮VAR冰,在組摟合時,府三個段分的長度過相加,貧從而組迷合段的秤長度也技增加了韻。對組殊合段有壯下列規(guī)剪則:①所有新具有相同忍名的部分糠段必須有航相同類型格(COD雜E,DA植TA,I凈DATA霞,XDA儀TA或B示IT)。②組合執(zhí)段的長度叫不能超過東存儲區(qū)的漏物理長度瘦。③每牙個組合悲的部分駝段的定糾位方法異也必須療相同。④絕對嘉段相互不繳組合,它掃們被直接計拷貝到輸振出文件。3)存蔬儲器分配物理存儲區(qū)最大長度地址區(qū)段類型程序64KB0~0FFFFHCODE外部數(shù)據(jù)64KB0~0FFFFHXDATA直接尋址片內(nèi)數(shù)據(jù)128字節(jié)0~7FHDATA間接尋址片內(nèi)數(shù)據(jù)256字節(jié)0~0FFHIDATA片內(nèi)數(shù)據(jù)的位空間128位0~7FHBIT表7.1然0M虎CS-5儀1系列的飯物理存儲動區(qū)4)崗采用覆孟蓋技術(shù)姿使用數(shù)喬據(jù)存儲仁器通過采用森一定的覆小蓋技術(shù),所MCS-殿51系列針少量的片銷內(nèi)數(shù)據(jù)存疾儲器可由腰L51有倡效地使用貌。由C5帶1編譯器膜或是A5訂1匯編器辮生成的參保數(shù)和局部獸變量(若怖使用它們努的函數(shù)不孫相互調(diào)用烏)可在存摧儲器中覆度蓋。這樣墨,所用的酸存儲器得忽到相當(dāng)程晨度地減少起。為完成數(shù)挑據(jù)覆蓋,映L51分陵析所有不小同函數(shù)間網(wǎng)的調(diào)用,倦使用該信渴息可以確輸定哪個數(shù)廉據(jù)和位段氣可被覆蓋粥。使用控?zé)熤茀?shù)O趙VERL洲AY和N仁OOVE澡RLAY浙可允許或滋禁止覆蓋飲。OVE遺RLAY徑是默認(rèn)值石,用它可夕產(chǎn)生非常耍緊湊的數(shù)括據(jù)區(qū)。5)藝決定外親部參考墳地址具有相脆同名的達(dá)外部符概號(E錢XTE三RN)秤和公用悲符號(侍PUB鈴LIC遮)被確夾定后,千外部符則號指向津其它模訂塊中的舟地址。懶一個已認(rèn)聲明的創(chuàng)外部符勒號用具朱有相同槽名字的棵功用符青號確定叫,外部豬參考地慚址由其膛公共參貓考地址治確定。緒這還與趣類型(逗DAT鳴A,I炒DAT錫A,X逃DAT擺A,C違ODE蔬,BI杏T或N回UMB造ER)姜有關(guān),禍如果類紡型不符桐或未發(fā)竊現(xiàn)外部玩符號參焰考地址秤的公用害符號,淡則會產(chǎn)終生錯誤某。公用預(yù)符號的虎絕對地費(fèi)址在段施定位后肚決定。6)絕勾對地址計秋算定義絕問對地址輕并計算脅可重定項(xiàng)位段的僵地址。桃在段分篩配和外紹部公用杏參考地越址處理刃完后,忘程序模捆塊中所胸有可重摧定位地魔址和外貸部地址戰(zhàn)要進(jìn)行菌計算,溪此時生劑成的目裳標(biāo)文件櫻中的符沸號信息米(DE嚷BUG碗)被改超變以反搖映新的寬值。7)儉產(chǎn)生絕衡對目標(biāo)窮文件可執(zhí)行旁程序以婚絕對目柏標(biāo)格式狗產(chǎn)生。從該絕對懲目標(biāo)文煤件可包僅含附加聰?shù)姆柸嘈畔?香DEB月UG)考,從而困使符號贈調(diào)試成額為可能圾。符號兆信息可雪用參數(shù)蜜NOD舒EBU船GSY潔MBO此LS,晉NOD撿EBU乓GPU沉BLI映CS和梅NOD昏EBU處GLI悠NES疤禁止。僚輸出文臂件是可雖執(zhí)行的民,并可戒由仿真臉器裝入晃調(diào)試或腐被OH碼S51橫翻譯為燥Int蛋el恥HEX擺格式文吼件以供洗EPR幫OM固沿化。8)產(chǎn)繁生映像文顯件產(chǎn)生一圈個反映扭每個處纏理步驟虎的映像施文件,窮它顯示之有關(guān)連姨接/定飽位過程叉的信息替和程序揭符號,煎并包含滋一個公洗用和外還部符號災(zāi)的交叉演參考報省告。映奴像文件瓣包含下紡列信息近:①文鬧件名和蹤蝶命令行遠(yuǎn)參數(shù)。②模級塊的文蚊件名和矛模塊名把。③一腐個包含乳段地址縱、類型希、定位腔方法和屠名字的長存儲器風(fēng)分配表落。該表趙可在命病令行中冊用NO心MAP卡參考禁既止。④段裙和符號業(yè)的所有名錯誤列檢表。列演表文件帥末尾顯甜示出所乏有出錯覺的原因柳。⑤一灶個包含惕輸入文拒件中符音號信息飾的符號亂表。該充信息由趙MOD旗ULE勺S,S賊YMB駐OLS心,PU欺BLI押CS和奇LIN愉ES名樸組成,哥LIN氣ES是念C編譯矩器產(chǎn)生販的行號軍。符號弊信息可燙用參數(shù)爐NOS筑YMB所OLS嘩,NO位PUB賓LIC掠S和N吐OLI秀NES啦完全或爽部分禁約止。⑥一個崇按字母順湖序排列的檢有關(guān)所有般PUBL磚IC和E拖XTER繡N符號的峰交叉參考胖報告,其剃中顯示出哈符號類型希和模塊名纏。第一個娘顯示的模北塊名是定慢義了PU慘BLIC光符號的模范塊,后面黑的模塊名著是定義了襪EXTE倍RN符號蛙的模塊。厘在命令行調(diào)輸入?yún)?shù)掙IXRE緩F可產(chǎn)生購此報告。⑦在連繞接器/定離位器運(yùn)行膛期間檢測腰到的錯誤耍同時顯示兄在屏幕和仁文件尾部惰。7.8.掃4程返序優(yōu)化以下選斯擇對提怨高程序侮效率有汽很大影潤響:(1)甘盡量選擇盜小存儲模刺式以避免集使用MO臭VX指令盛。(2)胸使用賢大模式戀(CO舞MPA停CT/撲LAR倍GE)廁應(yīng)仔細(xì)肯考慮要菌放在內(nèi)叛部數(shù)據(jù)葉存儲器器的變量允要求是扇經(jīng)常用奏的或是營用于中照間結(jié)果校的。訪庸問內(nèi)部龍數(shù)據(jù)存獲儲器要姓比訪問嘗外部數(shù)室據(jù)存儲尖器快得墊多。內(nèi)俗部RA覺M由寄群存器組振、位數(shù)注據(jù)區(qū)和串其它用衫戶用“項(xiàng)dat念a”類啦型定義騰的變量濾共享。槳由于內(nèi)即部RA喪M容量槍的限制掩(12秋8~2做56字耽節(jié),由蠶使用的寸單片機(jī)完決定)努,必須桂權(quán)衡利匠弊以解破決訪問任效率和勿這些對賺象的數(shù)伙量之間膚的矛盾蓮。(3)作要考慮操防作順序,齒完成一件江事后再做曉一件事。(4)妨注意免程序編除寫細(xì)則壁。例如勿,若使弦用fo洲r(nóng)(;嶄;)循停環(huán),D崇JNZ煌指令比往CJN撫E指令醋更有效足,可減新少重復(fù)芬循環(huán)次藥數(shù)。(5)紗若編簽譯器不妹能使用謝左移和賊右移完罷成乘除臣法,應(yīng)沙立即修援改,例坦如,左道移為乘砌2。(6)默用邏輯A盈ND/&蒙取模比用若MOD謹(jǐn)/%操甘作更有效楚。(7)廳因計算機(jī)御基于二進(jìn)近制,仔細(xì)視選擇數(shù)據(jù)烈存儲器和鏡數(shù)組大小憶可節(jié)省操別作。(8)截盡可丟能使用奪最小的呆數(shù)據(jù)類貢型,M另CS-姓51系棟列是8蛛位機(jī),溫顯然對胖具有"資cha煙r"類肚型的對憲象的操買作比"蛙int圣"或"槍lon拌g"類這型的對恢象的操絨作要方彈便得多郊。(9)嚷盡可嫌能使用筒"un中sig祝ned座"數(shù)據(jù)揉類型。窯MCS怪-51栗系列C償PU并悶不直接紫支持有怪符號數(shù)縣的運(yùn)算暗。因而凡C51董編譯器震必須產(chǎn)魄生與之伍相關(guān)的煤更多的尺程序代鈴碼以解前決這個姻問題。(10)賞盡可能釀使用局部叮函數(shù)變量閑。編譯器選總是嘗試粗在寄存器腦里保持局崖部變量。心這樣,將時循環(huán)變量斯(如fo蠶r和wh霞ile循暗環(huán)中的計屑數(shù)變量)攀說明為局送部變量是拉最好的。聚使用"u益nsig污ned哄char悟/int擋"的對象唯通常能獲哥得最好的令結(jié)果。7.9停M篩CS-氏51內(nèi)壟部資源肌使用的筍C語言讓編程7.9頁.1照中斷絮應(yīng)用的熄C語言陳編程C51編倉譯器支持齒在C源程墾序中直接醒開發(fā)中斷乖程序。中遲斷服務(wù)程恒序是通過紐奉按規(guī)定語像法格式定額義的一個共函數(shù)。中斷服務(wù)珠程序的函誤數(shù)定義的耗語法格式箱如下:返回值登函數(shù)名年([參數(shù)批])華inte況rrup寫tm增[usi甚ngn距]{}…表7.準(zhǔn)11擦MC寸S-5嗓1中斷大源編號編號中斷源入口地址0外部中斷00003H1定時器/計數(shù)器0000BH2外部中斷10013H3定時器/計數(shù)器1001BH4串行口中斷0023Husin池gn選項(xiàng)用毅于實(shí)現(xiàn)勻工作寄侍存器組葡的切換跳,n是皇中斷服鼓務(wù)子程阿序中選花用的工毀作寄存澇器組號睛(0暑~3企)。在身許多情客況下,育響應(yīng)中水?dāng)鄷r需閉保護(hù)有旺關(guān)現(xiàn)場你信息,患以便中艇斷返回想后,能宣使中斷盤前的源宵程序從箏斷點(diǎn)處尿繼續(xù)正根確地執(zhí)著行下去防。這在容MCS稼-51身單片機(jī)志中,能奇很方便燒地利用昂工作寄們存器組透的切換甲來實(shí)現(xiàn)念。即在首進(jìn)入中姥斷服務(wù)屆程序前幼的程序遷中使用嗽一組工見作寄存女器,進(jìn)躺入中斷跌服務(wù)程貌序后,蛾由"u兵sin嚴(yán)gn膽"切換殲到另一丟組寄存愧器,中毛斷返回下后又恢疼復(fù)到原吃寄存器故組。這扶樣互相港切換的塞兩組寄仆存器中如的內(nèi)容慚彼此都繡沒有被仔破壞。圖7.肯5擴(kuò)滑展多個中星斷源例3圖7.5所示是利用優(yōu)先權(quán)解碼芯片,在單片機(jī)8031的一個外部中斷INT1上擴(kuò)展多個中斷源的原理電路圖。圖中是以開關(guān)閉合來模擬中斷請求信號。當(dāng)有任一中斷源產(chǎn)生中斷請求,能給8031的INT1引腳送一個有效中斷信號,由P1的低3位可得對應(yīng)中斷源的中斷號。在中斷表服務(wù)程超序中僅置設(shè)置標(biāo)嶺志,并腐保存I圖/O口禽輸入狀擦態(tài)。F盤ran月kli集nC裳51編豬譯器提博供定義殿特定M群CS-伙51系眾列成員惑的寄存群器頭文色件。M蔬CS-版51頭理文件為釋reg怨51.紫h。C悉51程反序如下遞:#i干ncl散ude品<r知eg5傾1.h所>uns勉ign鼻ed光cha舍rs柴tat始us;bit灘flag貿(mào);voi適ds隙erv構(gòu)ice霞_in夫t1(槽)憐int帝err桃upt叫2義usi壟ng漠2竄/*黨INT雖1中斷虜服務(wù)程合序,使鑼用第2眼組工看作寄峰存器宜*/{簽fla織g=1鼓;筑/廳*設(shè)枕置標(biāo)志狡*/sta渴tus納=p1評;效/*科存輸入賓口狀態(tài)的*/}void曉ma括in(v馬oid){I擔(dān)P=0x辜04;頓/語*置I期NT1為初高優(yōu)先級樣中斷拾*/IE=菌-0x老84柏;留/*厚IN奶T1開坊中斷,別CPU兩開中斷凝*/for(革;;){i診f(f驅(qū)lag箭)肺/*譯有中憤斷*急/{惠swi晴tch粘(st鏟atu那s)仁/*完根據(jù)中辭斷源分宇支*臂/{繳cas耀e0貼:夫bre居ak沖;唇/勇*處場理IN押0*抱/case蠻1:各bre衫ak;級/*處蹲理IN1處*/case異2:著bre陳ak;掃/*處偵理IN2廟*/cas板e3沈:殼bre也ak;庫/叼*處剃理IN借3*洋/def位aul約t:迅;}fla針g=0俘;襪/*輕處理錫完成清抽標(biāo)志俯*/}}}7.9張.2仙定時余器/計干數(shù)器(似T/C腳)應(yīng)用議的C語柜言編程例4設(shè)單片機(jī)怪的fos許c=12愁MHz鞏晶振,要修求在P1盈.0腳上婆輸出周期創(chuàng)為2m愈s的方波晃。周期為戴2m休s的方故波要求宿定時時浙間隔1匙ms近,每次思時間到咸P1.窗0取反侍。機(jī)器周期住=12/英fosc蓋=1μ群s需計數(shù)幻玉次數(shù)=齡100靠0/(蹤蝶12/典fos助c)=瞞100廣0/1買=10鉗00由于計數(shù)充器是加1泡計數(shù),為令得到10卷00個計掉數(shù)之后的絡(luò)定時器溢冬出,必須董給定時器慕置初值為灘-100仗0(即1棉000的觸補(bǔ)數(shù))。(1)防用定時器逝0的方式鹿1編程,談采用查詢且方式,程泥序如下:#in結(jié)clud紐奉e<r設(shè)eg51低.h>sbi地tP毫1_0醫(yī)=P1桂^0闖;void情mai雅n(vo跪id){題TMO穿D=0貧x01弊;質(zhì)/*住設(shè)置定暈時器1培為非門猜控制方吉式1*臥/TR0=君1牲;夫/*伙啟動T禍/C0貓*/for(薦;;堤){TH仇0=-廣(100費(fèi)0/25雹6)慚; /唐*裝載假計數(shù)器初比值*/TL0削=-彩(10波00%妻256仆);do{銳}氧whil采e(!塵TF0)麻;吳/*照查詢等待哈TF0置嫩位*/P1_來0=!椅P1_閉0;累/*慰定時時似間到P師1.0墾反相謠*/TF0述=0;味/*驗(yàn)軟件灘清T寄F0秤*/}}(2)打用定歉時器0首的方式搭1編程梢,采用浪中斷方賓式。程財序如下濟(jì):#i枝ncl艇ude頃<草reg沫51.巾h>sbi廊t鎖P1_助0=P渡1^0岸;voi灣d羞tim羊e(知voi費(fèi)d)計int哥err悉upt輩1迎usi聲ng彼1滔/*刊T/腰C0中曬斷服務(wù)弓程序入寧口*稱/{肥P1_芽0=!脫P(yáng)1_寶0;央/逝*P圍1.0煩取反施*/TH0肚=-范(10愿00/未256清);描/*將重新砌裝載計暖數(shù)初值觀*/}void典ma度in(扭void粒){戴TMO澇D=0糧x01凡;襪/莫*T縫/C0輩工作在津定時器音非門控殺制方式踏1*瓶/P1_扇0=0睜;TH0錦=-剝(10袋00/俊256鉛);夠/*居預(yù)紡置計數(shù)耗初值村*/TL0=子-(1盼000%當(dāng)256)蹄;EA=1釋;鑼/腐*CP天U中斷開漿放*/ET0=深1;卸/*胖T/C0灣中斷開放障*/TR0=命1;漫/*啟截動T/C辟0開始定總時*/do太{麻}w朝hil插e(1毅);遵/*融等待中魯斷*議/}例5采用10殘MHz謙晶振,在認(rèn)P1.0晝腳上輸出貢周期為2飾.5s寨,占空比舒20%的朋脈沖信號腰。10M蠶Hz晶振消,使用定傻時器最大站定時幾十陜毫秒。取旦10m議s定時,察周期2.釋5s需削250次盛中斷,占臟空比20擔(dān)%,高電津平應(yīng)為5赴0次中斷捉。10紫ms定株時,晶透振fo各sc=斑10餅MHz嶺。需定時點(diǎn)器計數(shù)緊次數(shù)=非10×量103符×10買/12爪=83寇33#i拼ncl被ude唯<r誕eg5弄1.h嫌>#de款fine頭uch釀aru頂nsig復(fù)ned紐奉charucha喇rpe拍riod抵=250帖;ucha嶄rhi較gh=5息0;tim稼er0醫(yī)()遵int植err桌upt墨1與usi屠ng桶1耐/喚*T騎/C0湊中斷服抬務(wù)程序太*/{TH0軌=-啦8333溉/256舞;抓/*每重置計數(shù)也值*/TL0挨=-探83殲33%郊256相;if(+稱+tim叉e==h享igh)朋P1=0畏;忌/*適高電平時額間到變低箱*/els中ei暫f(抄tim聞e==肯per做iod娃)音/*淹周期并時間到局變高繩*/{tim倆e=0查;P1=1綢;}}main稱(){沖TMO跨D=0惠x01何;賢/*眼定時家器0方蜓式1巧*/TH0=陰-8盼333/朋256陶; /酷*預(yù)置井計數(shù)初值慕*/TL0辛=-謀83量33%刊256漆;EA=圈1;賢/滋*驗(yàn)開CP枝U中斷蘆*/ET0=蝕1;考/*眉開T/C善0中斷始*/TR0自=1勿;寫/漢*虛啟動T瞧/C0猜*/do佳{}役whi哈le(膚1)撞;}圖7.伍6蒼中斷服怒務(wù)程序題流程圖產(chǎn)生一陶個占空破比變化雄脈沖信貢號的程毒序,它萬產(chǎn)生的進(jìn)脈寬調(diào)御制信號烏用于電熱機(jī)變速講控制。#i命ncl搖ude帶<r錘eg5早1.h招>#de米fine識uch遺aru鞠nsig悟ned刑char#de飼fine屠uin貝tun稱sign院edi芝ntunc柱har巴ti膜me,改sta泡tus鹿,pe域rce冠nt,猴per儉iod牢;bit買on樣e_r雹oun瘦d;uint無old辭coun迷t,ta舍rget折=500幟;void愧pul悅se(巴void稻)in鴨terr犬upt沾1us酒ing代1容/鬼*T/異C0中斷巡壽服務(wù)程序頑*/{T該H0=筍-柜833危/25獄6;友/*凝1m若s-城-1榨0M叛Hz追*/TL0斗=-森83佳3%2催56吉;ET0蠅=1歷;if塵(++燒tim她e=p魄erc獵ent漿)P喪1=0腔;els禾ei川f(巾tim染e=能=10胳0){靈tim盼e=0漠;誘P1=察1;份}}void里tac獨(dú)hmet票er(材voi雁d)渾inte禮rrup穗t2癢usin臨g2衰/*外敲中斷1服門務(wù)程序塊*/{u錫nio摸n{un欄itw鍬ord另;str勒uct裕{牲uc椒har引hi少;君uch遠(yuǎn)ar妻lo削;}byte施;}newc價ount符;newc根ount兇.by羨te.貝hi=T殺H1;new烘cou馬nt掉.by洪te吉.lo嚼=TL旬1;peri圈od=n顛ewco蔽unt事.wor異d-丟oldc制ount酒;/同*測得慣周期*堆/oldc寧ount央=new碧coun慰t.w綁ord紀(jì);one_腥roun誓d=1;剃/*闊每轉(zhuǎn)一圈傲,引起中康斷,設(shè)置錘標(biāo)志*盆/}voi扯dm創(chuàng)ain所(貞voi粒d){I遷P=0x批04;漁/妥*置I醒NT1為購高位優(yōu)先侮級*/TMOD食=0x激11;滔/*拿T0,杰T1溉16位方知式*/TCON母=0x5沙4;廈/已*T0莖,T1運(yùn)公行,IT煙1邊沿觸樣發(fā)*/TH1=闖0;TL記1=0;衛(wèi)/*顛設(shè)置初電始計數(shù)值膜*/IE=0債x86杯;牛/*電允許中斷狀EX1,騾ET0恥*/for廢(;;秤){i辨f(o腰ne_r賠ound擦)惹/*歪每轉(zhuǎn)一圈陜,調(diào)整取*/{框if慮(p豆eri惕od每<ta匆rge按t){if哄(p荷erc畜ent冒<1綿00溉)+腳+pe臥rce居nt貪; /竟*占異空比增槐*/}els意ei柜f(爆pe卵rce金nt安>0距)-解-p獎erc喂ent來;鮮/*卸占空鹽比減送*/one_棵roun燒d=0貨;}}}7.9.街3串授行口使用賄的C語言彼編程例6單片機(jī)f并osc=阻11.0配592礙MHz,牧波特率為儲9600暑,各設(shè)置買32字節(jié)精的隊列緩年沖區(qū)用于吩發(fā)送接收員。設(shè)計單食片機(jī)和終時端或另一鏟計算機(jī)通桃信的程序指。單片機(jī)變串行口痰初始化罰成96蔬00波罵特,中礦斷程序物雙向處證理字符偏,程序相雙向緩很沖字符寒。背景蝦程序可池以"放豈入"和調(diào)"提取園"在緩芝沖區(qū)的加字符串越,而實(shí)進(jìn)際傳入釣和傳出賞SBU華F的動枝作由中粘斷完成潑。Load村msg囑函數(shù)加載鐘緩沖數(shù)組宜,標(biāo)志發(fā)仍送開始。砌緩沖區(qū)分賊發(fā)(t)瞎和收(r左)緩沖,聚緩沖區(qū)通援過兩種指襲示(進(jìn)i喜n和出o改ut)和暑一些標(biāo)志蓮(滿fu才ll,空符empt訴y,完成偉done沃)管理。往隊列緩沖項(xiàng)區(qū)32字弓節(jié)接收緩銳沖(r_使buf)梅區(qū)滿,不挑能再有字魚符插入。架當(dāng)t_i盼n=t_注out,復(fù)發(fā)送緩沖多區(qū)(t_曾buf)長空,發(fā)送印中斷清除聚,停止U糕ART請酒求。具體止程序如下廈:#in縱clud辭e<r齡eg51志.h>#d彎efi花ne掠uch鏟ar夏uns遇ign元ed酷cha損ruch翅ar股xda宜ta華r_b森uf[植32]偏;砍/*良it

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論