這個是預編譯的寫法,符合#if后面的條件后編譯器才會編譯,否則不會占用FALSH空間,
成都網(wǎng)站建設哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設計、成都網(wǎng)站建設、微信開發(fā)、成都小程序開發(fā)、集團成都企業(yè)網(wǎng)站定制等服務項目。核心團隊均擁有互聯(lián)網(wǎng)行業(yè)多年經驗,服務眾多知名企業(yè)客戶;涵蓋的客戶類型包括:成都雨棚定制等眾多領域,積累了大量豐富的經驗,同時也獲得了客戶的一致贊許!
#if 相當于 if
#elif 相當于 else
#endif 表示上面的判斷結束。
你這個程序的意思是當晶振頻率是那個值則編譯那個for循環(huán),來達到不同頻率都可以使用這一個函數(shù)來達到更精確的延時。
首先你要知道一個指令周期是幾秒
算法是1/(晶振頻率除以12)
然后你要知道循環(huán)究竟執(zhí)行了幾個指令周期
你可以用keil里在線反匯編命令看看你的循環(huán)編譯成機器語言后到底是幾個指令周期
這樣就知道了延遲時間
當然你取近似值也可以的
比如
for(i=0,i255,i++){x=2}
這里x=2是一個指令周期
而執(zhí)行了255次
假如你的晶振是12MHZ的
則你執(zhí)行一個指令周期是1us
255次是0.255ms
C語言的延遲函數(shù)一般是利用無意義程序運行來控制時間從而達到延時的目的
舉個例子:
for(i=0;ix;i++)
for(j=0;j120;j++);
這是延時x毫秒的for循環(huán)語句。
值得注意的是記得最后的;一定得記得寫。
單片機的C語言關于延時函數(shù)主要有兩種
一種是用for循環(huán),通過單片機執(zhí)行空指令達到延時的目的
如:
for(i=0;i100;i++)
{
;
}
這個簡單的語句會執(zhí)行100次空指令
每一次指令的時間可以大概確定
因此這個是最簡單的延時函數(shù)
第二種是通過定時器的方式來實現(xiàn)
定時器是通過對單片機的晶振進行計數(shù)
然后在定時器中斷服務函數(shù)里面實現(xiàn)定時時間的計算及設置
51單片機的定時器0中斷服務函數(shù)為
void
time0()
interrupt
1
{
...
}
一般單片機在c語言中很難得到精確的延時,所以一般對時間要求高的都用計時器中斷來做了。如果時間要求不嚴格可以用for循環(huán)來做,你可以實際測試一下,把時間延時到大概一秒左右,然后燒進單片機里運行,比如一個燈亮燈滅的程序,看著燈計數(shù),同時用秒表計時,幾個幾十次后取平均值就能知道大概時間了。