資源描述:
《單片機(jī)C語言精確延時值的計算》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、一般如果是用循環(huán)延時使用12M的晶振要方便些,如果是定時器則是用11.0592的要方便和精確一些關(guān)于單片機(jī)C語言的精確延時,網(wǎng)上很多都是大約給出延時值沒有準(zhǔn)確那值是多少,也就沒有達(dá)到精確高的要求,而51hei給出的本函數(shù)克服了以上缺點(diǎn),能夠精確計數(shù)出要延時值且精確達(dá)到1us,本舉例所用CPU為STC12C5412系列12倍速的單片機(jī),只要修改一下參數(shù)值其它系例單片機(jī)也通用,適用范圍寬。?共有三條延時函數(shù)說明如下:函數(shù)調(diào)用分兩級:一級是小于10US的延時,二級是大于10US的延時//====================小于10US的【用1US級
2、延時】====================//----------微秒級延時---------for(i=X;i>X;i--)延時時間=(3+5*X)/12??提示(單位us,?X不能大于255)?//================大于10US<小于21.9955Ms的可用【10US級延時函數(shù)】===========voidDelay10us(ucharMs){???uchardatai;???for(;Ms>0;Ms--)???????????????????????for(i=26;i>0;i--);}i=[(延時值-1.75)*12/
3、Ms-15]/4如想延時60US則?i=[(60-1.75)*12/6-15]/4=25.375≈26;修改i的值=26,再調(diào)用上面的【10US級延時函數(shù)】Delay10us(6);則就精確延時60US;如果想延時64US可以用這二種函數(shù)組合來用:Delay10us(6);for(i=9;i>X;i--)?共延時64US?//==============對于大于20Ms的可用中斷來實(shí)現(xiàn)程序運(yùn)行比較好===============中斷用定時器0,1Ms中斷:voidtimer0(void)interrupt1????????????????????
4、?????????????{????????????????????????????????????????????????????????????????TL0=(0xffff-1000+2)%0x100;TH0=(0xffff-1000+2)/0x100;//每毫秒執(zhí)行一次???if(DelayMs_1>0)DelayMs_1--;//大于20Ms延時程序?}函數(shù)調(diào)用voidDelayMs(uinta)//延時a×1(ms)的時間。{???DelayMs_1=a;???while(DelayMs_1);}如果延時50Ms則函數(shù)值為?Delay
5、Ms(50)//+++++++++++++++++++++++++公式推算來由++++++++++++++++++++++++++++二級延時C語言反匯編見上傳圖1:?//=======================STC單片機(jī)延時指令時間====================?指今??????????????時間(1us)??????????????指今??????????????時間(1us)MOV??A??Rn??????1???????????????????????SETB?C????????????1MOV??Rn?#data??
6、??2???????????????????????SUBB?A??#data????2?DJNZ?Rn?rel??????4Dec??Rn???????????3????????????????????????SJMP?rel???????????3JC???rel???????????3????????????????????????MOV??Rndirect?????4??????Lcalladdr16?????????6????????????????????????RET????????????????4??//------------
7、--JNZ????????????????3????????????????????????XRL????????????????2SUBB??????????????3???使用Delay10us(ucharMs)最多能延時21995.5us;其中循環(huán)外函數(shù)調(diào)用與返回用的時間=(6+4)進(jìn)入+退出(1+1+2+3+,4)=10+11=21/12=1.75us;循環(huán)內(nèi)函數(shù)時間MS=Ms*(1+1+2+3,+2+4*I+3+3)/12=Ms*(15+4*I)/12;所以如果延時60us時用【10US級延時函數(shù)】I的值為:60=循環(huán)外時間+循環(huán)內(nèi)時間
8、=1.75us+Ms*(15+4*I)/12;則i=[(60-1.75)*12/6-15]/4=25.375≈26即如果Ms=6,i=2