版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章51單片機(jī)的C語(yǔ)言程序設(shè)計(jì)56374.5C51對(duì)絕對(duì)地址的訪問4.6指針4.7C51函數(shù)返回4.1C51語(yǔ)言與匯編語(yǔ)言和標(biāo)準(zhǔn)C語(yǔ)言的區(qū)別1.C語(yǔ)言與匯編語(yǔ)言的比較使用C語(yǔ)言進(jìn)行單片機(jī)系統(tǒng)的開發(fā),有著匯編語(yǔ)言編程所不具備的優(yōu)勢(shì),主要體現(xiàn)在以下幾個(gè)方面:(1)不需要了解單片機(jī)指令集,也不需要了解其存儲(chǔ)器結(jié)構(gòu)。(2)寄存器分配和尋址方式由編譯器進(jìn)行管理,程序員可以忽略這些問題。(3)編程時(shí)可使用與其他程序設(shè)計(jì)時(shí)的關(guān)鍵字和操作函數(shù)。(4)與使用匯編語(yǔ)言編程相比,程序的開發(fā)和調(diào)試時(shí)間大大縮短。(5)C語(yǔ)言中的庫(kù)文件提供了許多標(biāo)準(zhǔn)的函數(shù),如數(shù)學(xué)運(yùn)算。開發(fā)者可以直接調(diào)用,而不必使用煩瑣的匯編語(yǔ)言來實(shí)現(xiàn)。下一頁(yè)返回4.1C51語(yǔ)言與匯編語(yǔ)言和標(biāo)準(zhǔn)C語(yǔ)言的區(qū)別(6)C語(yǔ)言可移植性好且非常普及,C語(yǔ)言編譯器幾乎適用于所有的目標(biāo)系統(tǒng)。(7)C語(yǔ)言在模塊化開發(fā)、可移植性、代碼管理上有明顯的優(yōu)勢(shì)。2.C51與ANSI-C的主要區(qū)別目前最常見的編譯器是Keil公司針對(duì)51系列單片機(jī)開發(fā)提供的C51編譯器。ANSI-C語(yǔ)言是一門應(yīng)用非常普遍的高級(jí)程序設(shè)計(jì)語(yǔ)言,C51和標(biāo)準(zhǔn)的ANSI-C有一定的區(qū)別,或者說C51是對(duì)標(biāo)準(zhǔn)C語(yǔ)言的擴(kuò)展。C51語(yǔ)言的特色主要體現(xiàn)在以下幾方面:(1)C51繼承了標(biāo)準(zhǔn)C語(yǔ)言的絕大部分的特性,其基本語(yǔ)法相同,但C51其本身又在特定的硬件結(jié)構(gòu)上有所擴(kuò)展,如定義了關(guān)鍵字sbit、xdata、idata、code等。上一頁(yè)下一頁(yè)返回4.1C51語(yǔ)言與匯編語(yǔ)言和標(biāo)準(zhǔn)C語(yǔ)言的區(qū)別(2)編譯生成的.m51文件,包含了硬件資源使用的情況。應(yīng)用C51編程可以通過該文件了解系統(tǒng)資源。(3)C51頭文件體現(xiàn)了51單片機(jī)芯片的不同功能。只需要將相應(yīng)的功能寄存器的頭文件加載在程序內(nèi)就可實(shí)現(xiàn)它們所指定的不同功能。(4)C51與標(biāo)準(zhǔn)ANSI-C從庫(kù)函數(shù)方面來說有很大的不同。上一頁(yè)返回4.2C51程序的基本結(jié)構(gòu)總體而言,C語(yǔ)言的程序均是由一個(gè)或多個(gè)函數(shù)(或子程序,function)構(gòu)成,其程序入口處是以main()開始的函數(shù),其余函數(shù)都是直接或間接被main()函數(shù)調(diào)用。這些函數(shù)就是組成C程序的模塊。C51程序同標(biāo)準(zhǔn)C程序一樣,盡量在一個(gè)函數(shù)內(nèi)完成較少的功能,而不同函數(shù)之間設(shè)置較少的接口參數(shù),即高內(nèi)聚低耦合。C51程序的基本結(jié)構(gòu)如圖4.1所示。返回4.3數(shù)據(jù)類型4.3.1C51數(shù)據(jù)類型在標(biāo)準(zhǔn)C語(yǔ)言中基本的數(shù)據(jù)類型為char、int、short、long、float和double,而在C51編譯器中int和short相同;除此之外,C51編譯器還擴(kuò)充了其特有的數(shù)據(jù)類型bit、sbit、sfr和sfr16四種,如表4.1所示。1.位型數(shù)據(jù)bitbit數(shù)據(jù)類型使用一個(gè)二進(jìn)制位來存儲(chǔ)數(shù)據(jù),其值只有“0”和“1”兩種。所有的位變量存儲(chǔ)在51單片機(jī)內(nèi)部RAM中的位尋址區(qū),即片內(nèi)RAM區(qū)的0x20~0x2F之間的地址,共計(jì)128?jìng)€(gè)這樣的地址。因此,程序中最多只能定義128?jìng)€(gè)位變量。下一頁(yè)返回4.3數(shù)據(jù)類型2.SFR型數(shù)據(jù)sfr?yàn)槎x存?。樱疲?,C51增加了SFR型數(shù)據(jù),相應(yīng)地增加了sfr、sfr16和sbit這3個(gè)關(guān)鍵字。sfr是為了能夠直接訪問51單片機(jī)中的SFR所提供的一個(gè)新的關(guān)鍵詞,其定義是:3.SFR型數(shù)據(jù)sfr16sfr16是用來定義16位特殊功能寄存器的。對(duì)于標(biāo)準(zhǔn)的80C51單片機(jī),只有一個(gè)16位特殊功能寄存器,即DPTR。其定義如下:sfrl6
DPTR=0x82;DPTR是兩個(gè)地址連續(xù)的8位寄存器DPH和DPL的組合。可以分開定義這兩個(gè)8位的寄存器,也可用sfr16定義16位寄存器。上一頁(yè)下一頁(yè)返回4.3數(shù)據(jù)類型4.SFR型數(shù)據(jù)sbit在C語(yǔ)言中,如果直接寫P1.0編譯器不能識(shí)別,而且P1.0也不是一個(gè)合法的C語(yǔ)言標(biāo)識(shí)符,所以必須給它起一個(gè)名,為它們建立聯(lián)系,可由KeilC增加的關(guān)鍵字sbit來定義。以上是對(duì)SFR的位的定義。如果不是SFR,則必須先使用bdata關(guān)鍵字定義這個(gè)變量后才能在該變量的基礎(chǔ)上使用sbit,如:int
bdata
ibase;//位尋址區(qū)的int型變量sbit
mybit0=ibase^0;//ibase的第0位上一頁(yè)下一頁(yè)返回4.3數(shù)據(jù)類型sbit數(shù)據(jù)類型的地址是確定的且不用編譯器分配。它可以是SFR中確定的可進(jìn)行位尋址的位,也可以是內(nèi)部RAM的20H~2FH單元中確定的位。例如我們先前定義了sfrP1=0x90,即表示寄存器P1的地址是0x90地址,又因?yàn)榧拇嫫鳎校笔强晌粚ぶ返模詓bit
LED=P1^1;//聲明LED為P1端口的P1.1引腳同樣我們可以用P1.1的地址去寫,如sbit
LED=0x91;//同樣聲明LED為P1端口的P1.1引腳這樣在后續(xù)的程序語(yǔ)句中就可以用LED來對(duì)P1.1引腳進(jìn)行讀寫操作。上一頁(yè)下一頁(yè)返回4.3數(shù)據(jù)類型4.3.2REG51.H頭文件REG51.H頭文件是51單片機(jī)C語(yǔ)言編程時(shí)經(jīng)常包含的頭文件,在該文件中預(yù)先定義好了很多基本的數(shù)據(jù)。如果使用KeilC作為C51程序的開發(fā)環(huán)境,則該文件默認(rèn)安裝在“C:\Keil\C51\INC”路徑中。上一頁(yè)返回4.4變量和C51存儲(chǔ)區(qū)域4.4.1變量的定義在C語(yǔ)言中,要求對(duì)所有的變量“先定義,后使用”。格式如下:[存儲(chǔ)種類]數(shù)據(jù)類型[存儲(chǔ)器類型]變量名表其中,存儲(chǔ)種類和存儲(chǔ)器類型是可選項(xiàng)。存儲(chǔ)種類有自動(dòng)(auto)、外部(extern)、靜態(tài)(static)和寄存器(register)四種,系統(tǒng)默認(rèn)的是自動(dòng)(auto)類型。4.4.2存儲(chǔ)器類型51單片機(jī)的存儲(chǔ)器類型較多,有片內(nèi)程序存儲(chǔ)器、片外程序存儲(chǔ)器、片內(nèi)數(shù)據(jù)存儲(chǔ)器和片外數(shù)據(jù)存儲(chǔ)器。其中,片內(nèi)數(shù)據(jù)存儲(chǔ)器又分為低128字節(jié)和高128字節(jié)。高128字節(jié)只能用間址尋址方式來使用,低128字節(jié)的數(shù)據(jù)存儲(chǔ)器中又有位尋址區(qū)、工作寄存器區(qū),這與其他CPU、MCU等有很大區(qū)別。下一頁(yè)返回4.4變量和C51存儲(chǔ)區(qū)域?yàn)槌浞种С郑担眴纹瑱C(jī)的這些特性,C51中引入了一些關(guān)鍵字,用以說明數(shù)據(jù)存儲(chǔ)位置。表4.2為KeilC51編譯器所能識(shí)別的存儲(chǔ)器類型。1.程序存儲(chǔ)器程序存儲(chǔ)器只能讀,不能寫,匯編語(yǔ)言中可以用MOVC指令來讀取程序存儲(chǔ)器中的數(shù)據(jù)。程序存儲(chǔ)器除了存放代碼外,往往還用于存放固定的表格、字型碼等不需要在程序中進(jìn)行修改的數(shù)據(jù)。程序存儲(chǔ)器的容量最大為64KB。2.內(nèi)部數(shù)據(jù)存儲(chǔ)器內(nèi)部數(shù)據(jù)存儲(chǔ)器既可以讀出,也可以寫入。對(duì)于51系統(tǒng)而言,共有128B的內(nèi)部數(shù)據(jù)存儲(chǔ)器,而對(duì)于52系列而言,共有256B的內(nèi)部數(shù)據(jù)存儲(chǔ)器。上一頁(yè)下一頁(yè)返回4.4變量和C51存儲(chǔ)區(qū)域3.外部數(shù)據(jù)存儲(chǔ)器51單片機(jī)可以擴(kuò)展外部數(shù)據(jù)存儲(chǔ)器,尤其是使用總線以后,外部I/O口和外部數(shù)據(jù)存儲(chǔ)器也是統(tǒng)一編址,采用同一指令進(jìn)行讀/寫。外部數(shù)據(jù)存儲(chǔ)器既可讀也可以寫,讀/寫外部數(shù)據(jù)存儲(chǔ)器的數(shù)據(jù)要比使用內(nèi)部數(shù)據(jù)存儲(chǔ)器慢,但外部數(shù)據(jù)存儲(chǔ)器可達(dá)64KB。匯編語(yǔ)言中使用MOVX指令來對(duì)外部存儲(chǔ)器中的數(shù)據(jù)進(jìn)行讀/寫,C51提供了兩個(gè)關(guān)鍵字pdata和xdata,可用于對(duì)外部數(shù)據(jù)存儲(chǔ)器進(jìn)行讀/寫操作。上一頁(yè)下一頁(yè)返回4.4變量和C51存儲(chǔ)區(qū)域4.定義時(shí)省略存儲(chǔ)類型標(biāo)志符如果在變量定義時(shí)略去了存儲(chǔ)類型的標(biāo)志符,則編譯器會(huì)自動(dòng)選擇默認(rèn)的存儲(chǔ)類型。設(shè)一個(gè)變量定義:charc;c被存放在何處與工程設(shè)置中Target選項(xiàng)卡的MemoryModel設(shè)置有關(guān)。如果將MemoryModel設(shè)置為SMALL模式,則變量c會(huì)被定位在data存儲(chǔ)區(qū)中;若設(shè)置為COMPACT模式,則c被定位在pdata存儲(chǔ)區(qū)中;若設(shè)置為LAEGE存儲(chǔ)模式,則c被定位在外部數(shù)據(jù)存儲(chǔ)區(qū)中。上一頁(yè)下一頁(yè)返回4.4變量和C51存儲(chǔ)區(qū)域4.4.3存儲(chǔ)器模式定義變量時(shí)如果省略存儲(chǔ)器類型,KeilC51編譯系統(tǒng)則會(huì)按編譯模式SMALL、COMPACT或LARGE所規(guī)定的默認(rèn)存儲(chǔ)器類型去指定變量的存儲(chǔ)區(qū)域。1.SMALL存儲(chǔ)模式該模式把所有函數(shù)變量和局部數(shù)據(jù)段放在51單片機(jī)系統(tǒng)的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū),因此對(duì)這種變量的訪問數(shù)據(jù)最快。SMALL存儲(chǔ)模式的地址空間受限,在寫小型應(yīng)用程序時(shí),變量和數(shù)據(jù)放在data內(nèi)部數(shù)據(jù)存儲(chǔ)器中是很好的,但在較大的應(yīng)用程序中,data區(qū)最好只存放小的變量、數(shù)據(jù)或常用變量(如循環(huán)計(jì)數(shù)、數(shù)據(jù)索引),大的數(shù)據(jù)放置在別的區(qū)域。上一頁(yè)下一頁(yè)返回4.4變量和C51存儲(chǔ)區(qū)域2.COMPACT存儲(chǔ)模式該模式把變量定義在外部數(shù)據(jù)存儲(chǔ)器中,所有缺省變量均位于外部RAM區(qū)的一頁(yè)(與顯式使用關(guān)鍵字pdata進(jìn)行定義,效果相同),外部數(shù)據(jù)存儲(chǔ)器可有最多256B(一頁(yè))。其優(yōu)點(diǎn)是空間較SMALL寬裕,速度較SMALL慢,較LARGE快,是一種中間狀態(tài)。如果在這種編譯模式下要使用多于256B的變量,變量的高8位地址(也就是具體哪一頁(yè))由P2口確定,須適當(dāng)改變啟動(dòng)程序STARTUP.A51中的參數(shù)PDATASTART和PDATALEN,用L51進(jìn)行連接時(shí)還必須采用連接控制命令PDATA來對(duì)P2口地址進(jìn)行定位,也可用pdata指定。上一頁(yè)下一頁(yè)返回4.4變量和C51存儲(chǔ)區(qū)域3.LARGE存儲(chǔ)模式該模式所有函數(shù)和過程的變量以及局部數(shù)據(jù)段都被定位在外部數(shù)據(jù)存儲(chǔ)器中,外部數(shù)據(jù)存儲(chǔ)器最多達(dá)64KB,需要用DPTR數(shù)據(jù)指針來間接訪問數(shù)據(jù)。這種訪問方式效率不高,尤其是對(duì)于兩個(gè)或多個(gè)字節(jié)的變量,用這種方式訪問數(shù)據(jù),程序的代碼可能很多。4.注意設(shè)定數(shù)組的存儲(chǔ)空間設(shè)定一個(gè)數(shù)組時(shí),C編譯器就會(huì)在存儲(chǔ)空間開辟一個(gè)區(qū)域用于存放該數(shù)組的內(nèi)容。字符數(shù)組的每個(gè)元素占用1字節(jié)的內(nèi)存空間,整型數(shù)組的每個(gè)元素占用2字節(jié)的內(nèi)存空間,而長(zhǎng)整型(long)和浮點(diǎn)型(float)數(shù)組的每個(gè)元素則需占用4字節(jié)的存儲(chǔ)空間。上一頁(yè)下一頁(yè)返回4.4變量和C51存儲(chǔ)區(qū)域4.4.4變量的分類1.全局變量和局部變量(1)全局變量是在任何函數(shù)之外說明的、可被任意模塊使用的、在整個(gè)程序執(zhí)行期間都有效的變量。(2)局部變量在函數(shù)內(nèi)部說明,只在本函數(shù)或功能塊內(nèi)有效,在該函數(shù)或功能塊以外則不能使用。2.靜態(tài)存儲(chǔ)變量和動(dòng)態(tài)存儲(chǔ)變量從變量的生存時(shí)間來區(qū)分,變量分為兩種:靜態(tài)存儲(chǔ)變量和動(dòng)態(tài)存儲(chǔ)變量。(1)靜態(tài)存儲(chǔ)變量是指該變量在程序運(yùn)行期間其存儲(chǔ)的空間固定不變。上一頁(yè)下一頁(yè)返回4.4變量和C51存儲(chǔ)區(qū)域(2)動(dòng)態(tài)存儲(chǔ)變量則指該變量的存儲(chǔ)空間不是固定的,而是在程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)地為其分配存儲(chǔ)空間。通常,全局變量為靜態(tài)存儲(chǔ)變量,局部變量為動(dòng)態(tài)存儲(chǔ)變量。當(dāng)程序退出時(shí),局部變量占用的空間釋放。上一頁(yè)返回4.5C51對(duì)絕對(duì)地址的訪問在一些情況下,可能希望把一些變量定位在51單片機(jī)的某個(gè)固定的地址空間上。C51為這些變量專門提供了一個(gè)關(guān)鍵字at。關(guān)鍵字_at_的另一個(gè)功能是:能通過給I/O器件指定變量名,從而為輸入輸出器件指定變量名。例如,在xdata段的地址0x4500處有一個(gè)輸入寄存器,那么可以通過下面的代碼段為它指定變量名。unsigned
char
xdata
inputreg
_at_
0x4500;以后在讀該寄存器時(shí)只要使用變量名inputreg就可以了。返回4.6指針指針是C語(yǔ)言中的一個(gè)重要概念,也是C語(yǔ)言的一個(gè)重要特色。正確靈活地運(yùn)用指針,第4章51單片機(jī)的C語(yǔ)言程序設(shè)計(jì)85可以有效地表示復(fù)雜數(shù)據(jù)結(jié)構(gòu),方便地使用字符串,有效地使用數(shù)組,調(diào)用函數(shù)時(shí)得到多個(gè)返回值,還能直接與內(nèi)存打交道,這對(duì)于嵌入式編程尤其重要。掌握指針的應(yīng)用,可以使程序簡(jiǎn)潔、緊湊、高效。4.6.1指針的概念、定義和引用一、指針的概念在使用匯編語(yǔ)言進(jìn)行編程時(shí),必須自行定義每一個(gè)變量的存放位置。例如:Tmp
EQU
5FH
//將5FH這個(gè)地址分配給Tmp這個(gè)變量下一頁(yè)返回4.6指針二、指針變量的定義1.定義定義指針變量的一般形式為:基本類型?指針變量名2.注意定義指針變量時(shí)需注意以下兩點(diǎn):(1)指針變量前的“?”表示該變量為指針變量。(2)定義指針變量時(shí)必須指定基本類型。上一頁(yè)下一頁(yè)返回4.6指針不同類型的數(shù)據(jù)在內(nèi)存中占用的字節(jié)數(shù)是不一樣的。對(duì)于C51而言,char或unsignedchar型變量在內(nèi)存中占用1字節(jié);int或unsignedint型變量在內(nèi)存中占用2字節(jié);long或unsignedlong和float型的變量,在內(nèi)存中占用4字節(jié)。三、指針變量的引用C語(yǔ)言提供了兩個(gè)運(yùn)算符,用來獲得變量地址,或使用指針?biāo)缸兞康闹?。(1)&:取地址運(yùn)算符。(2)?:指針運(yùn)算符(或稱“間接訪問”運(yùn)算符)。上一頁(yè)下一頁(yè)返回4.6指針4.6.2C51的指針類型C51支持“通用”和“存儲(chǔ)器專用”兩種指針類型。一、通用指針1.通用指針結(jié)構(gòu)通用指針需占用3個(gè)字節(jié),其中存儲(chǔ)器類型占1個(gè)字節(jié),偏移量占2個(gè)字節(jié),如表4.3所示。存儲(chǔ)器類型決定對(duì)象所用的C51存儲(chǔ)空間,偏移量指向?qū)嶋H地址。通用指針可以被用來指示51單片機(jī)存儲(chǔ)器中的任何類型的變量,所以在C51庫(kù)函數(shù)中通常使用這類指針類型。上一頁(yè)下一頁(yè)返回4.6指針其中,第1字節(jié)表示指針的存儲(chǔ)器類型編碼,如表4.4所示。例如,一個(gè)通用指針指向地址為0×1234的xdata類型數(shù)據(jù)時(shí),其指針值如表4.5所示。2.通用指針的定義通用指針的定義與一般的C語(yǔ)言的指針定義相同,例如:char?s;//指向字符型的指針sint?numptr;//指向int型的指針numptrlong?state;//指向long型的指針state例如,將一個(gè)數(shù)值0x12寫入地址為0x8000的外部數(shù)據(jù)存儲(chǔ)器,程序代碼如下:#define
XBYTE((char?)0x20000L)上一頁(yè)下一頁(yè)返回4.6指針XBYTE[0x8000]=0xl2;3.應(yīng)用下面的代碼顯示了使用通用指針的變量在51單片機(jī)中是如何實(shí)現(xiàn)的,請(qǐng)注意指針的各個(gè)字節(jié)的作用。在上面的代碼中,通用指針c_ptr、i_ptr和l_ptr都被存放在單片機(jī)的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)中。二、存儲(chǔ)器專用指針存儲(chǔ)器專用指針的定義一般包含了數(shù)據(jù)類型和存儲(chǔ)器類型的說明,其格式如下:基本類型存儲(chǔ)器類型?指針變量名上一頁(yè)下一頁(yè)返回4.6指針存儲(chǔ)器專用指針只需要1個(gè)字節(jié)(當(dāng)數(shù)據(jù)類型為idata、data、pdata時(shí))或者2個(gè)字節(jié)(當(dāng)數(shù)據(jù)類型為code、xdata時(shí))。因?yàn)閷S弥羔槺韧ㄓ弥羔樀淖止?jié)少,所以在程序執(zhí)行時(shí)會(huì)快一點(diǎn)。由于專用指針的一些特性在編譯時(shí)由編譯器來處理,所以優(yōu)化選項(xiàng)有時(shí)會(huì)對(duì)編譯結(jié)果產(chǎn)生一些影響。三、Keil預(yù)定義指針Keil軟件預(yù)定義了一些指針,用來對(duì)存儲(chǔ)器指定地址進(jìn)行訪問,其完整定義在absacc.h中,讀者可自行查看。上一頁(yè)返回4.7C51函數(shù)4.7.1C51函數(shù)及其定義一、函數(shù)及其分類1.函數(shù)在程序設(shè)計(jì)中,通常將一些常用的功能模塊編寫成函數(shù),并可放在函數(shù)庫(kù)中以供選用,這樣可以減少重復(fù)程序段的工作量。一個(gè)完整的C程序可由一個(gè)主函數(shù)和若干個(gè)函數(shù)組成,由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用多次。C語(yǔ)言中的主函數(shù)為main()。對(duì)于函數(shù)有如下說明:(1)一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成。(2)一個(gè)C程序由一個(gè)或多個(gè)源程序文件組成。下一頁(yè)返回4.7C51函數(shù)(3)C程序的執(zhí)行從main函數(shù)開始。(4)所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是相互獨(dú)立的,一個(gè)函數(shù)并不從屬于另一個(gè)函數(shù),即函數(shù)不能嵌套定義。函數(shù)間可相互調(diào)用,但不能調(diào)用main函數(shù)。(1)從形式看,函數(shù)可以分為以下兩種:①無(wú)參函數(shù)。即主函數(shù)不向被調(diào)用函數(shù)傳遞參數(shù),這類函數(shù)只是完成一定的操作功能。無(wú)參函數(shù)可以有返回值,但大多數(shù)的無(wú)參函數(shù)同時(shí)也沒有返回值。②有參函數(shù)。在調(diào)用函數(shù)時(shí),主函數(shù)將一些數(shù)據(jù)傳遞給被調(diào)用函數(shù),通常被調(diào)用函數(shù)會(huì)對(duì)這些數(shù)據(jù)進(jìn)行處理,然后進(jìn)行不同的操作,最后還可能有返回值。上一頁(yè)下一頁(yè)返回4.7C51函數(shù)(2)從用戶使用的角度看,函數(shù)可以分為以下兩種:①標(biāo)準(zhǔn)函數(shù),即庫(kù)函數(shù)。這是由編譯系統(tǒng)(如Keil軟件)提供的,用戶不必自己編寫這函數(shù)。如sin函數(shù)提供正弦函數(shù)計(jì)算功能。②用戶函數(shù)。這是用戶根據(jù)自己的需要而編寫的特定功能的函數(shù)。二、函數(shù)的定義1.定義C51函數(shù)的定義與ANSI-C中是相同的,唯一不同的是函數(shù)的后面可能帶若干C51專用的關(guān)鍵字。上一頁(yè)下一頁(yè)返回4.7C51函數(shù)C語(yǔ)言允許有空函數(shù),空函數(shù)的定義形式為:類型標(biāo)識(shí)符函數(shù)名(){}調(diào)用空函數(shù)表示什么工作也不做。例:void
dummy()上一頁(yè)下一頁(yè)返回4.7C51函數(shù)作用:在程序設(shè)計(jì)中往往根據(jù)需要確定若干個(gè)模塊,分別由一些函數(shù)來實(shí)現(xiàn)。而在第1階段只設(shè)計(jì)最基本的模塊,即先把架子搭起來,細(xì)節(jié)留待進(jìn)一步的完善。以這樣的方式編寫程序時(shí),可以在將來準(zhǔn)備擴(kuò)充功能的地方定上一個(gè)空函數(shù),表示這些函數(shù)未編寫好,只是先占一個(gè)位置,以后用一個(gè)編寫好的函數(shù)替代它。這樣做可使程序的結(jié)構(gòu)清楚,可讀性好,以便以后擴(kuò)充新功能,而對(duì)程序結(jié)構(gòu)影響不大。4.7.2C51的中斷服務(wù)函數(shù)中斷是指當(dāng)計(jì)算機(jī)執(zhí)行正常程序時(shí),由于系統(tǒng)中出現(xiàn)某些需要緊急處理的情況或特殊請(qǐng)求時(shí),計(jì)算機(jī)打斷當(dāng)前正在運(yùn)行的程序,轉(zhuǎn)而對(duì)這些緊急情況進(jìn)行處理,處理完畢后,再返回繼續(xù)執(zhí)行被打斷的程序。上一頁(yè)下一頁(yè)返回4.7C51函數(shù)一、中斷服務(wù)函數(shù)程序的定義KeilC51支持在C語(yǔ)言源程序中直接編寫51單片機(jī)的中斷服務(wù)程序,為此KeilC51對(duì)函數(shù)的定義進(jìn)行了擴(kuò)展,增加了一個(gè)擴(kuò)展關(guān)鍵字interrupt。其定義形式為:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù))[interrupt
m][usingn](1)函數(shù)名可以是任意合法的字母或數(shù)字組合。(2)m:關(guān)鍵字interrupt后面的中斷號(hào),取值范圍是0~4或0~5。KeilC51編譯器從8m+3處產(chǎn)生中斷向量,即當(dāng)響應(yīng)中斷申請(qǐng)時(shí),程序會(huì)根據(jù)中斷號(hào)自動(dòng)轉(zhuǎn)入地址為8m+3處,執(zhí)行相對(duì)應(yīng)的中斷服務(wù)子程序。51單片機(jī)的中斷號(hào)、中斷源和中斷入口地址如表4.6所示。上一頁(yè)下一頁(yè)返回4.7C51函數(shù)(3)n:51系列單片機(jī)可以在內(nèi)部RAM中使用4個(gè)不同的工作寄存器組,稱為第0~3組。每個(gè)寄存器組都包含有8?jìng)€(gè)工作寄存器(R0~R7)。我們可以通過關(guān)鍵字using來選擇不同的工作寄存器組。using后面的n取值為0~3之間的整數(shù),分別代表4個(gè)不同的工作寄存器組。二、規(guī)定編制中斷函數(shù)時(shí)應(yīng)遵循以下規(guī)定:(1)中斷函數(shù)不能進(jìn)行參數(shù)傳遞。(2)中斷函數(shù)沒有返回值。(3)中斷服務(wù)函數(shù)不能被其他函數(shù)調(diào)用,只能由硬件產(chǎn)生中斷后自動(dòng)調(diào)用。上一頁(yè)下一頁(yè)返回4.7C51函數(shù)(4)如果中斷函數(shù)中用到浮點(diǎn)運(yùn)算,必須保存浮點(diǎn)寄存器的狀態(tài),當(dāng)沒有其他程序執(zhí)行浮點(diǎn)運(yùn)算時(shí)可以不保存。(5)在中斷函數(shù)程序執(zhí)行過程中,對(duì)其他可能在此產(chǎn)生的中斷并不響應(yīng),因而為了系統(tǒng)能夠及時(shí)地響應(yīng)各種中斷,提高實(shí)時(shí)性能,中斷函數(shù)的執(zhí)行時(shí)間不宜過長(zhǎng),因此中斷函數(shù)應(yīng)盡量簡(jiǎn)捷。4.7.3C51庫(kù)函數(shù)庫(kù)函數(shù)并不是C語(yǔ)言的一部分,它是由編譯軟件開發(fā)公司根據(jù)需要編制并提供給用戶使用的。本節(jié)只介紹了C51提供的庫(kù)函數(shù)的一小部分,其余庫(kù)函數(shù)請(qǐng)查相應(yīng)的手冊(cè)。上一頁(yè)下一頁(yè)返回4.7C51函數(shù)一、C51庫(kù)函數(shù)的測(cè)試方法不同類型的函數(shù)運(yùn)行時(shí)要采用不同的方法觀察其測(cè)試效果。(1)如果在測(cè)試函數(shù)中用到了print函數(shù),首先要用#include<stdio.h>將頭文件stdio.h包含到源程序中,其次要在main函數(shù)中設(shè)置串行口,利用Keil軟件的串行窗口進(jìn)行輸出,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 衛(wèi)生統(tǒng)計(jì)學(xué)試題及答案
- 網(wǎng)絡(luò)安全考試題及答案
- 2023年人教版五年級(jí)語(yǔ)文下冊(cè)期中試題及答案【一套】
- 第十一章代表性傳染病的檢疫
- 2022年福建省南僑中學(xué)高考沖刺押題(最后一卷)語(yǔ)文試卷含解析
- 2026年農(nóng)產(chǎn)品品牌建設(shè)培訓(xùn)
- 安全生產(chǎn)三年行動(dòng)專項(xiàng)整治工作總結(jié)
- 電氣安全施工技術(shù)要領(lǐng)
- 2022~2023自考專業(yè)(國(guó)貿(mào))考試題庫(kù)及答案第268期
- 浙江溫嶺開翔(閬中)摩托車制造項(xiàng)目環(huán)境影響報(bào)告書
- 2025年農(nóng)業(yè)機(jī)械化智能化技術(shù)在農(nóng)業(yè)防災(zāi)減災(zāi)中的應(yīng)用報(bào)告
- 發(fā)展與安全統(tǒng)籌策略研究
- 移動(dòng)式壓力容器安全技術(shù)監(jiān)察規(guī)程(TSG R0005-2011)
- 2025年廣東省惠州市惠城區(qū)中考一模英語(yǔ)試題(含答案無(wú)聽力原文及音頻)
- 征兵體檢超聲診斷
- 高速液壓夯實(shí)地基技術(shù)規(guī)程
- 醫(yī)防融合培訓(xùn)課件
- 云南省大理白族自治州2025屆高三上學(xué)期二??荚?英語(yǔ) 含解析
- 2025年公司綜合管理部工作總結(jié)及2025年工作計(jì)劃
- 購(gòu)買古琴合同范例
- 南京師范大學(xué)中北學(xué)院《無(wú)機(jī)及分析化學(xué)實(shí)驗(yàn)實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
評(píng)論
0/150
提交評(píng)論