用c語言為單片機(jī)編程無疑十分節(jié)約時間,可在很短的時間內(nèi)開發(fā)出較高效的代碼,對于程序的維護(hù)和擴(kuò)充也較匯編語言方便許多。但c語言也有它的不足之處,那就是在時間的精確控制上。要想用c實(shí)現(xiàn)精確的延時,只能把c的函數(shù)編譯成匯編語言,然后按照匯編語言計(jì)算其執(zhí)行時間。本人就按照這種方法,編寫了幾個51單片機(jī)的c語言精確延時函數(shù)。
本文引用地址:http://m.butianyuan.cn/article/201611/322200.htm
注:1.編譯軟件為"Keil uVision3"(Keil uVision2也試用)。用其他編譯軟件的話就不準(zhǔn)了。
2.需要包含頭文件
3.所有函數(shù)的延時時間都是在12Mhz晶振下計(jì)算的,如用其他晶振需進(jìn)行換算。
4.函數(shù)的執(zhí)行時間為“函數(shù)的參數(shù)”乘以精確到的時間。例如delayms(unsigned char n)函數(shù),其精確度為1ms,如果寫入語句delayms(4),那就是延時4ms。
5.計(jì)算出來的延時時間不包括函數(shù)調(diào)用與返回的時間。如果函數(shù)的精確度較高,且參數(shù)較小,那么實(shí)際延時時間就可能與計(jì)算的時間差很遠(yuǎn)。
(1)精確到2us的延時(12MHz)
void delayus(unsigned char n)
{ while(--n);
}
(2)精確到100us的延時(12MHz)
void delay100us(unsigned char n)
{ unsigned char i;
for(;n;n--)
{ _nop_();
for(i=46;i;i--);
}
}
(3)精確的半毫秒延時函數(shù)(12MHz)
void delay1_2ms(unsigned char n)
{ unsigned char i;
for(;n!=0;n--)
{ _nop_();
for(i=246u;i!=0;i--);
}
}
(4)精確的毫秒延時函數(shù)(12MHz)
void delayms(unsigned char n)
{ unsigned char i;
for(;n!=0;n--)
{ for(i=248u;i!=0;i--);
for(i=248u;i!=0;i--);
}
}
評論