函數定義好以后,要被其它函數調用了才能被執行。C
創新互聯專注骨干網絡服務器租用十年,服務更有保障!服務器租用,服務器托管 成都服務器租用,成都服務器托管,骨干網絡帶寬,享受低延遲,高速訪問。靈活、實現低成本的共享或公網數據中心高速帶寬的專屬高性能服務器。
語言的函數是能相互調用的,
但在調用函數前,必須對函數的類型進行說明,就算是標準庫函數也不例外。標準庫函數的
說明會被按功能分別寫在不一樣的頭文件中,使用時只要在文件最前面用#include
預處理語
句引入相應的頭文件。如前面一直有使用的
printf
函數說明就是放在文件名為
stdio.h
的
頭文件中。調用就是指一個函數體中引用另一個已定義的函數來實現所需要的功能,這個時候函
數體稱為主調用函數,函數體中所引用的函數稱為被調用函數。一個函數體中能調用數個
其它的函數,這些被調用的函數同樣也能調用其它函數,也能嵌套調用。筆者本人認為
主函數只是相對于被調用函數而言。在
c51
語言中有一個函數是不能被其它函數所調用的,
它就是
main
主函數。調用函數的一般形式如下:
函數名
(實際參數表)
“函數名”就是指被調用的函數。實際參數表能為零或多個參數,多個參數時要用逗
號隔開,每個參數的類型、位置應與函數定義時所的形式參數一一對應,它的作用就是把參
數傳到被調用函數中的形式參數,如果類型不對應就會產生一些錯誤。調用的函數是無參函
數時不寫參數,但不能省后面的括號。
在以前的一些例子我們也能看不一樣的調用方式:
1.函數語句
如
printf
("Hello
World!n");
這是在
我們的第一個程序中出現的,它以
"Hello
World!n"為參數調用
printf
這個庫函數。在這里函數調用被看作了一條語句。
2.函數參數
“函數參數”這種方式是指被調用函數的返回值當作另一個被調用函數的實際參
數,如
temp=StrToInt(CharB(16));CharB
的返回值作為
StrToInt
函數的實際參數傳遞。
3.函數表達式
而在上一篇的例子中有
temp
=
Count();這樣一句,這個時候函數的調用作為一個運算
對象出現在表達式中,能稱為函數表達式。例子中
Count()返回一個
int
類型的返回
值直接賦值給
temp。注意的是這種調用方式要求被調用的函數能返回一個同類型的值,
不然會出現不可預料的錯誤。
前面說到調用函數前要對被調用的函數進行說明。標準庫函數只要用#include
引入已
寫好說明的頭文件,在程序就能直接調用函數了。如調用的是自定義的函數則要用如下形
式編寫函數類型說明
類型標識符
函數的名稱(形式參數表);
這樣的說明方式是用在被調函數定義和主調函數是在同一文件中。你也能把這些寫到
文件名.h
的文件中用#include
"文件名.h"引入。如果被調函數的定義和主調函數不是在同
一文件中的,則要用如下的方式進行說明,說明被調函數的定義在同一項目的不一樣文件之上,
其實庫函數的頭文件也是如此說明庫函數的,如果說明的函數也能稱為外部函數。
extern
類型標識符
函數的名稱(形式參數表);
函數的定義和說明是完全不一樣的,在編譯的角度上看函數的定義是把函數編譯存放在
ROM
的某一段地址上,而函數說明是告訴編譯器要在程序中使用那些函數并確定函數的地
址。如果在同一文件中被調函數的定義在主調函數之前,這個時候能不用說明函數類型。也就
是說在
main
函數之前定義的函數,在程序中就能不用寫函數類型說明了。能在一個函
數體調用另一個函數(嵌套調用),但不允許在一個函數定義中定義另一個函數。還要注意
的是函數定義和說明中的“類型、形參表、名稱”等都要相一致。
#define uint16 unsigned int - typedef unsigned int uint16;
#define uchar8 unsigned char - typedef unsigned char uchar8;
重入函數,又叫再入函數,是一種可以在函數體內不直接或間接調用其自身的一種函數。
再入函數可被遞歸調用,無論何時,包括中斷函數在內的任何函數都可以調入。再入函數在
C51編譯時使用的是模擬棧。
函數說明: 函數名(形式參數表) reentrant
注意事項:
1、再入函數不能傳遞bit類型參數。
2、與PL/M51兼容的函數不能具有reentrant,這樣也不能調用再入函數。
3、在編譯時:再入函數建立的是模擬堆棧區,small模式下模擬堆棧區位于idata
區,compact模式下模擬堆棧區位于pdata區,large模式下模擬堆棧區位于xdata區.
4、在同一程序中可以定義和使用不同存儲器模式的再入函數,任意模式的再入函數不能調
用不同存儲器模式的再入函數,但可以調用普通函數。
5、實際參數可以傳遞給間接調用的再入函數。無再入屬性的間接調用函數不能包含調用參
數
定義和聲明的語句不影響程序的運行
單片機上電就找main執行
而定義和聲明的語句是給編譯軟件用的
delay函數是一般自己定義的一個延時函數。
c語言定義延時函數主要通過無意義指令的執行來達到延時的目的。下面給出一個經典的延時函數。
// 定義一個延時xms毫秒的延時函數
void delay(unsigned int xms) // xms代表需要延時的毫秒數
{
unsigned int x,y;
for(x=xms;x0;x--)
for(y=110;y0;y--);
}
定義一個延時xms毫秒的延時函數
void delay(unsigned int xms) // xms代表需要延時的毫秒數
{
unsigned int x,y;
for(x=xms;x》0;x--)
for(y=110;y》0;y--);
}
使用:
void Delay10us(uchar Ms)
{
uchar data i;
for(;Ms》0;Ms--)
for(i=26;i》0;i--);
}
i=[(延時值-1.75)*12/Ms-15]/4
擴展資料
1、在C51中進行精確的延時子程序設計時,盡量不要或少在延時子程序中定義局部變量,所有的延時子程序中變量通過有參函數傳遞。
2、在延時子程序設計時,采用do…while,結構做循環體要比for結構做循環體好。
3、在延時子程序設計時,要進行循環體嵌套時,采用先內循環,再減減比先減減,再內循環要好。
當前題目:單片機c語言函數定義,單片機c語言函數大全
分享路徑:http://vcdvsql.cn/article22/hedicc.html
成都網站建設公司_創新互聯,為您提供Google、App開發、網站改版、企業網站制作、網站收錄、微信小程序
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯