8051單片機C語言開發(fā)(五)_第1頁
8051單片機C語言開發(fā)(五)_第2頁
8051單片機C語言開發(fā)(五)_第3頁
8051單片機C語言開發(fā)(五)_第4頁
8051單片機C語言開發(fā)(五)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章函數(shù)程序的一般組成形式#include<xx.h>main(){……..}function_1(數(shù)據(jù)類型形參1,數(shù)據(jù)類型形參2,…….){

執(zhí)行語句;

}function_n(數(shù)據(jù)類型形參1,數(shù)據(jù)類型形參2,…….){

執(zhí)行語句;

}1精選課件ppt一、函數(shù)的分類1、用戶使用角度分:標(biāo)準(zhǔn)庫函數(shù)用戶定義(無參、有參、空函數(shù))

2、函數(shù)使用范圍分:靜態(tài)函數(shù)(內(nèi)部函數(shù)):只能在定義它的文件中被調(diào)用

static類型說明函數(shù)名(形參)外部函數(shù)(默認(rèn)):可以在定義它的文件和其他文件中被調(diào)用

[extern]類型說明函數(shù)名(形參)

2精選課件ppt二、函數(shù)的定義C51對函數(shù)的功能進行了擴展,函數(shù)定義的完整形式如下:函數(shù)類型函數(shù)名(形式參數(shù)列表)[small|compact|large][reentrant][interruptn][usingn]說明:1、[small|compact|large]:在用keilC中,當(dāng)project設(shè)置好后,可不必在函數(shù)中說明模式,若想說明,二者必須一致,否則出錯;2、函數(shù)定義位置主函數(shù)之前定義;(1)主函數(shù)之前原型聲明,主函數(shù)之后定義;(2)聲明格式:類型說明函數(shù)名(形參類型1,形參類型2)或者函數(shù)名(數(shù)據(jù)類型形參1,…….,數(shù)據(jù)類型形參n)(3)形參定義:函數(shù)名(數(shù)據(jù)類型形參1,…….,數(shù)據(jù)類型形參n)。

3精選課件ppt3、[reentrant]可重入函數(shù)

可重入函數(shù)可以在同一個時刻由多個進程共享。當(dāng)一個進程正在執(zhí)行一個可重入函數(shù),另一個進程可以中斷該進程,并可以開始執(zhí)行同一個可重入函數(shù),而不影響函數(shù)的運行結(jié)果。例:函數(shù)A正在調(diào)用函數(shù)B,此時中斷來了,執(zhí)行中斷函數(shù)C,C恰好又要調(diào)用B。

ANSIC語言中,調(diào)用函數(shù)時會把函數(shù)的參數(shù)和函數(shù)中使用的局部變量入棧。因為8051內(nèi)部堆棧空間的限制,為了提高效率,C51沒有提供這種堆棧,而是提供一種壓縮棧。每個函數(shù)有一個給定存儲空間,用于存放局部變量。函數(shù)中的每個變量都存放在這個空間的固定位置。當(dāng)遞歸調(diào)用該過程時會導(dǎo)致變量被覆蓋,所以通常情況下C51中的函數(shù)是不能重入。必須使用reentrant函數(shù)屬性來聲明函數(shù)是可重入的。

C51編譯器為再入函數(shù)生成一個模擬棧,通過這個模擬棧來完成參數(shù)傳遞和存放局部變量(每個變量有其單獨的空間)??芍厝牒瘮?shù)占用內(nèi)存空間較大,運行較慢,并且不允許傳遞bit類型的變量,也不能定義局部位變量??芍厝牒瘮?shù)經(jīng)常在實時應(yīng)用系統(tǒng)中應(yīng)用,也可在中斷函數(shù)和非中斷函數(shù)同時調(diào)用同一個函數(shù)時使用。4精選課件ppt可使用using函數(shù)說明屬性來規(guī)定函數(shù)所使用的寄存器組。格式如下:usingn

:n為0-3這個參數(shù)表示使用的寄存器組的編號.using屬性只能在函數(shù)定義中使用,不能在函數(shù)原型聲明中使用。使用using屬性的函數(shù)將自動完成以下操作:a、進入函數(shù)前,將當(dāng)前使用的寄存器組的標(biāo)號保存在堆棧中。改PSW的寄存器組選擇位,選擇設(shè)定的寄存器組作為當(dāng)前的寄存器組。b、函數(shù)退出時,將寄存器組恢復(fù)成進入函數(shù)前的寄存器組。

intalarm; intalarm_count; externvoidalfunc(intiValue); voidfalarm(void)using3{ alarm_count++;

alfunc(alarm=1);} 5精選課件ppt三、函數(shù)的參數(shù)1、形參與實參:實參-〉形參:單向傳遞(值傳遞);實參、形參類型必須一致;數(shù)組作為參數(shù),是“地址傳遞”。即傳遞的為實參數(shù)數(shù)組的起始地址,故實參、形參數(shù)組占用同一段單元,互相影響。2、參數(shù)的傳遞規(guī)則:參數(shù)傳遞的途徑有:寄存器、存儲器、堆棧。返回值均通過寄存器傳遞。利用寄存器傳遞參數(shù)(例)intf(inta,intb,char*c)傳遞參數(shù)char,指針(單字節(jié))int,指針(雙字節(jié))long,float通用指針參數(shù)1R7R6,R7R4-R7R1(L),R2(H)R3:存儲類型參數(shù)2R5R4,R5使用固定地址同上參數(shù)3R3R2,R3使用固定地址同上6精選課件ppt返回參數(shù)傳遞返回類型寄存器描述bit進位標(biāo)志(CF)charR7unsignedchar單字節(jié)指針intR6&R7高字節(jié)在R6,低字節(jié)在R7unsignedint雙字節(jié)指針longR4-R7高字節(jié)R4,低字節(jié)在R7unsignedlongfloatR4-R732位IEEE格式通用指針R1-R3存儲器類型在R3,高字節(jié)在R2,低字節(jié)R17精選課件ppt四、函數(shù)的調(diào)用1、函數(shù)指針調(diào)用函數(shù):編譯器為函數(shù)分配一個入口地址,即指針函數(shù)。指針變量定義

函數(shù)值返回類型

(*指針變量名)(函數(shù)形參表)#include<reg51.h>#include<stdio.h>unsignedlongc;

unsignedlongf(intn)reentrant{unsignedlongresult;if(n==0)result=1;elseresult=n*f(n-1);return(result);}8精選課件pptvoidmain(){intj;longint(*p)(int);#ifndefMONITOR51SCON=0x50;/*SCON:mode1,8-bitUART,enablercvr*/TMOD|=0x20;/*TMOD:timer1,mode2,8-bitreload*/TH1=221;/*TH1:reloadvaluefor1200baud@16MHz*/TR1=1;/*TR1:timer1run*/TI=1;/*TI:setTItosendfirstcharofUART*/#endif

p=f;for(j=0;j<10;j++){c=(*p)(j);printf("%2d!=%lu\n",j,c); if(j==8)P1=0;//調(diào)試用

}}9精選課件ppt2、幾點說明(*p)()定義一個指向函數(shù)的指針變量,在未賦值前不特定指

向某函數(shù),賦

溫馨提示

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

評論

0/150

提交評論