精確的延時函數(shù),最大誤差0.5%

精確的延時函數(shù),最大誤差0.5%

ID:13713479

大?。?2.00 KB

頁數(shù):6頁

時間:2018-07-24

精確的延時函數(shù),最大誤差0.5%_第1頁
精確的延時函數(shù),最大誤差0.5%_第2頁
精確的延時函數(shù),最大誤差0.5%_第3頁
精確的延時函數(shù),最大誤差0.5%_第4頁
精確的延時函數(shù),最大誤差0.5%_第5頁
資源描述:

《精確的延時函數(shù),最大誤差0.5%》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、精確的延時函數(shù),最大誤差0.5%/*下面是一個精確的延時程序,延時范圍為[1ms,255ms]誤差范圍為(0,0.5%],隨著延時時間的增強,相對誤差越來越低,在延時1毫秒時誤差最大0.5%,在延時255毫秒時誤差趨向于0下面就講講我是如何寫出這個延時函數(shù)的:首先我要確定在延時函數(shù)里,用什么語法結(jié)構(gòu)作為延時體有兩類結(jié)構(gòu)第一類,直接用for循環(huán),格式如下這是最簡單的一層,如果多重嵌套的話就很復(fù)雜了for(i=0;i<10;--i);匯編翻譯代碼如下C:0x1F22E4CLRAC:0x1F23FEMOVR6,AC:0x1F24EEMOVA,R6C:0x1F25C3CLRCC

2、:0x1F26940ASUBBA,#0x0AC:0x1F285003JNCC:1F2DC:0x1F2A1EDECR6C:0x1F2B80F7SJMPC:1F24第二類,用while循環(huán)或do...while循環(huán),格式如下do//第一層{j=y;do//第二層{i=x;do//第三層,里面有N個_nop_(){_nop_();_nop_();_nop_();...}while(--i);}while(--j);}while(--btXms);匯編翻譯代碼如下C:0x1FBF7D02MOVR5,#0x02C:0x1FC27EA5MOVR6,#0xA5C:0x1FC400NO

3、PC:0x1FC5DEFDDJNZR6,C:1FC4C:0x1FC7DDF9DJNZR5,C:1FC2C:0x1FC9DFF4DJNZR7,C:1FBF//從上面可以看到,第二類循環(huán)翻譯成匯編最簡單,整個三重循環(huán)就6條指令,平攤到每一個循環(huán)就兩句話,由此我選擇do...while作為延時體(當(dāng)然你也可以用while循環(huán)),接下來就是計算出總延時,這個在C函數(shù)里是最難的:首先我們計算出第三層的延時總周期,C=nx+2x;第三層有N個_nop_()循環(huán)了x次所以是nx個周期,DJNZ指令有x次每次兩個周期,所以是2x個周期第二層的延時總周期,B=y+Cy+2y;第二層有個M

4、OV賦值指令循環(huán)了y次所以是y個周期,DJNZ指令有y次每次兩個周期,所以是2y個周期,第三層循環(huán)也循環(huán)了y次所以是Cy個周期第一層的延時總周期,A=btXms+BbtXms+2btXms;第一層也有個MOV賦值指令循環(huán)了btXms次所以是btXms個周期,DJNZ指令有btXms次每次兩個周期,所以是2btXms個周期,第二層循環(huán)也循環(huán)了btXms次所以是BbtXms個周期由此可以得出中的循環(huán)周期為t=A+5;末尾的5個周期是,傳參MOV指令一個周期,函數(shù)返回RET兩個周期,函數(shù)調(diào)用LCALL兩個周期于是總的周期就出來了t=[3y+(2+n)xy+3]btXms+5如

5、果晶振為12MHz那么每一個周期的時間為1us,于是總延時為T={[3y+(2+n)xy+3]btXms+5}(us)現(xiàn)在就是要求出當(dāng)btXms為1時我們要保證延時是1000us,于是有等式為3y+(2+1)xy+3==1000//注意那額外的5個周期已經(jīng)被忽略了,因為這個5個周期不會隨著btXms德變化而變化,我們無法消除這5個周期的誤差,為了使函數(shù)最簡單,這里令n=1;于是有3y+3xy==997因為997無法整除3,所以這個等式xy沒有整數(shù)解,那么我們能不能夠造出一個等式使得xy有整數(shù)解呢,這就要我們仔細(xì)觀察了。我們發(fā)現(xiàn)997不能出以3但996卻可以,所以我們就想

6、如果我們的延時函數(shù)執(zhí)行總周期為t=[3y+(2+n)xy+4]btXms+5,那就一切OK了很快我們發(fā)現(xiàn),變成這樣很容易,最簡單的就是在最外層循環(huán)中加上一個nop就行了,于是乎我們的延時函數(shù),被稍微的修改如下do//第一層{j=y;_nop_();do//第二層{i=x;do//第三層,里面有N個_nop_(){_nop_();_nop_();_nop_();...}while(--i);}while(--j);}while(--btXms);t=[3y+(2+n)xy+4]btXms+5同樣令n=1,最后化簡變?yōu)?y+3xy==996y+xy==332這時我們很容易求

7、得一組解x=165y=2;還有一組解為x=82y=4;至此我們的延時函數(shù)就出來了,就整個函數(shù)體來說,它延時剛才我們已經(jīng)推導(dǎo)出來是絕對的延時btXms毫秒,沒有任何誤差,但由于多了那5個固定周期,使得函數(shù)整體來講還是有5個周期的誤差,但幸好這個誤差是固定不變的,并且是很微小可以忽略不計的,相對誤差為(5/10btXms)%它會隨著延時的增大而漸趨于0如果你覺得好,那就頂一下吧*/voidDelayXms(BYTEbtXms){BYTEi,j;do{j=2;_nop_();do{i=165;do{_nop_();}while(--i);}wh

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。