




已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第五章函數 5 1函數的定義 函數定義的一般格式如下 函數類型函數名 形式參數表 reentrant interruptm usingn 形式參數說明 局部變量定義函數體 前面部份稱為函數的首部 后面稱為函數的體 格式說明 1 函數類型函數類型說明了函數返回值的類型 2 函數名函數名是用戶為自定義函數取的名字以便調用函數時使用 3 形式參數表形式參數表用于列錄在主調函數與被調用函數之間進行數據傳遞的形式參數 4 reentrant修飾符這個修飾符用于把函數定義為可重入函數 所謂可重入函數就是允許被遞歸調用的函數 函數的遞歸調用是指當一個函數正被調用尚未返回時 又直接或間接調用函數本身 一般的函數不能做到這樣 只有重入函數才允許遞歸調用 關于重入函數 注意以下幾點 1 用reentrant修飾的重入函數被調用時 實參表內不允許使用bit類型的參數 函數體內也不允許存在任何關于位變量的操作 更不能返回bit類型的值 2 編譯時 系統(tǒng)為重入函數在內部或外部存儲器中建立一個模擬堆棧區(qū) 稱為重入棧 重入函數的局部變量及參數被放在重入棧中 使重入函數可以實現遞歸調用 3 在參數的傳遞上 實際參數可以傳遞給間接調用的重入函數 無重入屬性的間接調用函數不能包含調用參數 但是可以使用定義的全局變量來進行參數傳遞 5 interruptm修飾符 interruptm是C51函數中非常重要的一個修飾符 這是因為中斷函數必須通過它進行定義 在C51程序設計中 當函數定義時用了interruptm修飾符 系統(tǒng)編譯時把對應函數轉化為中斷函數 自動加上程序頭段和尾段 并按MCS 51系統(tǒng)中斷的處理方式自動把它安排在程序存儲器中的相應位置 在該修飾符中 m的取值為0 4 對應的中斷情況如下 0 外部中斷01 定時 計數器T02 外部中斷13 定時 計數器T14 串行口中斷其它值預留 編寫MCS 51中斷函數注意如下 1 中斷函數不能進行參數傳遞 如果中斷函數中包含任何參數聲明都將導致編譯出錯 2 中斷函數沒有返回值 如果企圖定義一個返回值將得不到正確的結果 建議在定義中斷函數時將其定義為void類型 以明確說明沒有返回值 3 在任何情況下都不能直接調用中斷函數 否則會產生編譯錯誤 因為中斷函數的返回是由8051單片機在中斷函數完成后自動返回的 如果在沒有實際中斷情況下直接調用中斷函數 操作結果會產生一個致命的錯誤 4 如果在中斷函數中調用了其它函數 則被調用函數所使用的寄存器必須與中斷函數相同 否則會產生不正確的結果 5 C51編譯器對中斷函數編譯時會自動在程序開始和結束處加上相應的內容 具體如下 在程序開始處對寄存器入棧 結束時出棧 中斷函數加usingn修飾符的 是工作寄存器組選擇位 C51編程看不到這些寄存器組 不用加usingn修飾符 6 C51編譯器根據中斷號 也即interrupt后面的數字 產生一個到中斷函數入口地址的絕對跳轉 7 中斷函數最好寫在文件的尾部 并且禁止使用extern存儲類型說明 防止其它程序調用 6 usingn修飾符修飾符usingn用于指定本函數內部使用的工作寄存器組 其中n的取值為0 3 表示寄存器組號 C51編程看不到這些寄存器組 不用加usingn修飾符 由C51編譯器自動選擇 5 2函數的調用與聲明 1 函數的調用函數調用的一般形式如下 函數名 實參列表 對于有參數的函數調用 若實參列表包含多個實參 則各個實參之間用逗號隔開 按照函數調用在主調函數中出現的位置 函數調用方式有以下三種 1 函數語句 把被調用函數作為主調用函數的一個語句 2 函數表達式 函數被放在一個表達式中 以一個運算對象的方式出現 這時的被調用函數要求帶有返回語句 以返回一個明確的數值參加表達式的運算 3 函數參數 被調用函數作為另一個函數的參數 2 自定義函數的聲明 在C51中 函數原型一般形式如下 extern 函數類型函數名 形式參數表 函數的聲明是把函數的名字 函數類型以及形參的類型 個數和順序通知編譯系統(tǒng) 以便調用函數時系統(tǒng)進行對照檢查 函數的聲明后面要加分號 如果聲明的函數在文件內部 則聲明時不用extern 如果聲明的函數不在文件內部 而在另一個文件中 聲明時須帶extern 指明使用的函數在另一個文件中 例5 1函數的調用 include includeintmax intx iny voidmain void inta b SCON ox52 串口初始化TMOD 0 x20 TH1 0 xf3 TR1 1 scanf pleaseinputa b d d 例5 2外部函數的使用程序1串口初始化 include includevoidserial init void SCON ox52 串口初始化TMOD 0 x20 TH1 0 xf3 TR1 1 程序2 include includeexternserial init 外部定義的函數externintmax inta intb 外部定義的函數voidmain viod serial init scanf pleaseinputa b d d 5 3函數的嵌套與遞歸 1 函數的嵌套在一個函數的調用過程中調用另一個函數 C51編譯器通常依靠堆棧來進行參數傳遞 堆棧設在片內RAM中 而片內RAM的空間有限 因而嵌套的深度比較有限 一般在幾層以內 如果層數過多 就會導致堆棧空間不夠而出錯 例5 3函數的嵌套調用 include includeexternserial init intmax inta intb intz z x y x y return z intadd inta intb intc intd intresult result max a b max c d return result main inty serial init y add 7 4 3 2 printf d y while 1 在主函數中調用add 而在add 中又調用max 形成嵌套調用 2 函數的遞歸遞歸調用是嵌套調用的一個特殊情況 如果在調用一個函數過程中又出現了直接或間接調用該函數本身 則稱為函數的遞歸調用 在函數的遞歸調用中要避免出現無終止的自身調用 應通過條件控制結束遞歸調用 使得遞歸的次數有限 函數的嵌套調用在實際工作中常見 但函數的遞歸調用使用較少 只用在專門的計算中 例如階乘 例5 4函數的遞歸調用 求階乘doublefact intn if n 0 n 1 return 1 elsereturn n fact n 1 main intnum printf nintputnum scanf d 5 4 1局部變量 在一個函數內部定義的變量是局部變量 它只在本函數內部有效 關于局部變量有幾點要注意 1 主函數中定義的變量也是局部變量 而不能因為是在主函數中定義的 就在程序中其它地方使用 主函數也不能使用其它函數中定義的變量 2 不同函數可以使用相同名字的變量 它們只在所定義的函數中有效 互不干擾 3 函數的形參也是局部變量 只在本函數中有效 其它函數不能引用 4 在一個函數內部 復合語句中可以定義變量 這種變量只在本復合語句中有效 例5 5局部變量的定義 intf1 inta 形參a也是局部變量 它只在函數f1中有效 intb c 變量b c只在函數f1中有效 intd 變量d只在本復合語句中有效d b c 變量b c在函數f1中定義 本復合語句在函數f1中 變量b c有效 voidmain void intb c 變量b c只在主函數中有效 它于f1中變量b c使用相同名字 互不干擾 5 4 2全局變量 在所有函數外部定義的變量叫外部變量 外部變量也叫全局變量 它的有效范圍是定義變量的位置開始到整個程序的結束 關于全局變量有幾點要注意 1 在整個程序中 每個函數都可以引用全局變量 通過全局變量各函數間建立了聯系 2 如果一個函數中改變了全局變量的值 則在整個程序中 此全局變量的值均改變 3 全局變量的名字和局部變量的名字不能相同 否則會產生干擾 4 使用全局變量可以減少函數實參和形參個數 從而可以節(jié)省內存空間 5 由于全局變量在整個程序運行期間都占有內存空間 而且函數的通用性 清晰性有所降低 所以在程序中 應盡量少用 例5 6全局變量的使用 includefloatmax min 定義全局變量voidsum void 定義sum函數voidmain void max 10 在main函數中給全局變量賦值min 0 sum 調用sum 利用全局變量傳參數 減少函數實參和形參個數 voidsum void printf max d min d sum d max min
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 拆除承重模板時混凝土強度要求一覽表
- Brand KPIs for neobanking Agibank in Brazil-英文培訓課件2025.4
- T公司智能化檢測中心建設項目進度管理研究
- 汽車傳感器與檢測技術電子教案:制動踏板位置傳感器
- 口腔教育設備管理制度
- 商業(yè)媒體宣傳管理制度
- 基層綜合文化管理制度
- 廚房七大細節(jié)管理制度
- 地鐵公司車輛管理制度
- 海南潤城投資有限公司五指山項目部管理手冊匯編82P
- 高中化學方程式大全
- 機械制圖知識培訓課件
- “國資贛將”贛州旅游投資集團2025年第一批社會公開招聘【46人】筆試參考題庫附帶答案詳解析
- 山東省濰坊市教科所2025屆物理高二下期末經典試題含解析
- 業(yè)務員合同協(xié)議書范文
- 2025年商業(yè)模式創(chuàng)立與創(chuàng)新能力考研試卷及答案
- 2025年遙測遙控系統(tǒng)項目可行性研究報告
- 25春國家開放大學《形勢與政策》專題測驗1-5+大作業(yè)參考答案
- 2024-2025人教版一年級下冊數學期末考試卷附答案 (三套)
- 2025屆高三押題信息卷(一)物理及答案
- 2025-2030中國飛機維修行業(yè)市場發(fā)展分析及發(fā)展前景與投資策略研究報告
評論
0/150
提交評論