http://blog.sina.com.cn/s/blog_7ceb2d560102v0ds.html
2014
假設一個(gè)延時(shí)函數如下:
void delay()
{
uinti;
for(i=0;i<20000;i++);
}
我們怎么來(lái)算呢,先將20000轉成16進(jìn)制,得到4E20,然后將高字節4E乘以6得到468D,再將468+2=470,然后將470D*20HEX(即32D)=15040;所心這個(gè)延時(shí)函數總共要執行15040個(gè)周期,假設所用的晶振為12MHZ,則該段函數總延時(shí):15.04ms。
有了這個(gè)公式我們如果想要設定指定的延時(shí)長(cháng)度就可以用它的己知公式確定。即:總時(shí)間=[(6*i值的高8位)+2]*i的低8位。
例如:設要延時(shí)125ms。
我們將低字節先賦值200D*(即:C8),然后再算高低節的定值,由式中可知125ms=200*((i值的高字節*6)+2),又可推算出(高低節*6)+2的總延遲時(shí)間應等于625us,將625/6=104.1666,取整數得到104,將104轉成16進(jìn)制得到68H,再將高字節和低字節組合起來(lái)即得到了定值,即:68C8HEX,代入函數即如下:
void delay()
{
uinti;
for(i=0;i<0x68C8;i++);
}
如果寫(xiě)直進(jìn)行就要將68C8轉成10進(jìn)制,即:26824,代入后得到:
void delay()
{
uinti;
for(i=0;i<0x26824;i++);
在c語(yǔ)言中嵌入一段匯編的延時(shí)程序呀,你自己看看書(shū),很簡(jiǎn)單的
用在單片機里的可以C和匯編混合使用,因為用匯編編寫(xiě)延時(shí)要準確些,所以你不妨寫(xiě)一個(gè)匯編程序,然后再調用它好了,要用C來(lái)編精確的延時(shí)確實(shí)是比較難的哦.呵呵
誰(shuí)說(shuō)C語(yǔ)言不能精確延時(shí),用51單片機的定時(shí)/計數器一或者用定時(shí)/計數器2的工作方式2,自動(dòng)再裝入8位計數器,就可以精確延時(shí),別說(shuō)1MS了就是100um也能精確做到。
其實(shí)很簡(jiǎn)單,采用定時(shí)器,將需要定時(shí)時(shí)間算好后寫(xiě)入單片機中斷程序中即可,這種方法可以實(shí)現精確定時(shí),最終的誤差僅由晶振來(lái)確定了。
不錯,用定時(shí)器最準確。但是定時(shí)器數量有限,有時(shí)候不見(jiàn)得能夠用。比如溫度檢測(尤其是變化比較大、快的),一個(gè)定時(shí)器就得一直不停檢測。這個(gè)時(shí)候如果另外一個(gè)定時(shí)器有正好分配的其他任務(wù),就只有用其他方法延時(shí)了。
空循環(huán)就行了
如while(i--);根據i的不同決定了延時(shí)長(cháng)短
不過(guò)C的延時(shí)不是非常準確,你得根據反匯編,看匯編語(yǔ)句的數量和指令周期來(lái)計算時(shí)間
也可以是
void mDelay(unsigned int Delay) //Delay= 1000 時(shí)間為1S
{
unsigned int i;
for(;Delay>0;Delay--)
{
for(i=0;i<124;i++)
{;}
}
}
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。