1樓:匿名使用者
就是為了延時啊,譬如說你讓數碼管從1變到10,一秒跳一下這就需要用到延時啊當然你可能會說用定時器就行了,但是定時器有限,而且他是通過中斷來控制,但我不需要延時時間那麼精準的時候用起中斷就不夠直接用延時程式方便了
2樓:匿名使用者
一是為了某些時序邏輯器件的時序要求。二是為了單純的等待,比如交通訊號燈的控制,紅燈綠燈黃燈都有時間控制,亮的長短就要由延時程式控制,或者cpu速度快於外設速度時,就需要用延時程式做等待!
3樓:散雲
聽名字就知道意思···延時,程式執行需要時間的,延遲程式能夠保證程式執行,不會出錯
4樓:量值溯源
當然是起到延時的作用。
兩個事件之間有的需要部分延時,就要呼叫延時子程式。
5樓:匿名使用者
延時和等待的作用。。。可以是單純的空操作,也可以是定時器進行延時。實現延時後的其他操作
6樓:du瓶邪
1.資料傳送指令 mov
資料傳送指令功能是將資料從一個地方複製、拷貝到另一個地方。
如:mov r7,#80h ;將資料80h 送到暫存器r7,這時暫存器r7 裡面存放著80h,就單這條
指令而言並沒有任何實際意義,而執行該指令則需要一個機器週期。
2.空操作指令 nop
空操作指令功能只是讓微控制器執行沒有意義的操作,消耗一個機器週期。
3.迴圈轉移指令 djnz
迴圈轉移指令功能是將第一個數進行減1 並判斷是否為0,不為0 則轉移到指定地點;為0 則往下執行。
如:djnz r7,kk ;將暫存器r7 的內容減1 並判斷暫存器r7 裡的內容減完1 後是否為0,如果
不為0 則轉移到地址標號為kk 的地方;如果為0 則執行下一條指令。這條指令需要2 個機器週期。
利用以上三條指令的組合就可以比較精確地編寫出所需要的延時程式。
在c51微控制器中延時子程式的延時時間是怎麼算的?
7樓:
知道每一步執行的時間,然後計算總共有多少步。一乘就出來了。每步的時間根據晶振不同而不同。
8樓:匿名使用者
比如說:
void delay ()
{int x;
char y;
for(x=1000;x>0;x--)
{ for(y=100;y>0;y--)};
}x每減一次,y減100次,x一共減少1000次這個子程式的延時時間是:
1000*100=100ms(預設時間是us)如果想更精確的話,可以用軟體進行除錯
for語句下面的{}還可以省略
有不清的可以多交流
9樓:匿名使用者
按每一個指令所佔有的機器週期。。再根據晶振頻率來算。。
10樓:匿名使用者
c語言不可能精確計算,只能用示波器看。彙編可以精確計算,書上有公式的,隨便一個講微控制器的書上都有的。
11樓:康泰生物
void delay (unsigned int i)
微控制器延時子程式
12樓:匿名使用者
這個其實不是實現200*250*10的 這個是實現200*250*10*2的 因為一條指令執行的時間是2納秒 程式剛開始給r7副職200 r6副職 250 r5副職10 等到l3那條指令的時候是迴圈r5的 r5副職10 所以r5迴圈10次 然後順序執行 迴圈r6 執行r6的時候跳到l2 重新給r5副職 然後再次r5迴圈10次 執行 djnz r6,l2 這句 因為已經減一了 所以r6 變成了 249 再次減一迴圈 r7也是這樣 所以最後的時間就是200*250*10*2 也就是十秒的
13樓:北海飛雪
djnz rn,*為兩個機器週期 12m的晶振執行一次就是2微秒,l3:djnz r5,l3
這個指令指行10次就是20微秒,這個延時程式所延的時間最後計算方法應該是200*250*20=1000000微秒,也就是1秒(應該是把mov rn,#*為一個機器週期忽略不計了)
14樓:尼歐趙
主要是200*250*10是最簡單的數字,另外需要說明的是,這只是一個近似值,實際延時時間大於1秒(約1.1秒)。如果要更精確的話,肯定不是這三個數字。
當r5=10,r6=202,r7=225,可以精確到0.35毫秒,精確度提高3個數量級。
15樓:羅門大佬
你可以粗略這樣看,在上面的指令中,執行次數最多的是djnz rn,那麼可以延時就是djnz指令執行時間。這裡運用了巢狀,所以要×。
它的順序是先執行djnz r5,l3 ;10次,執行djnz r6,l2 250次
但是當r6減1那麼就賦予r5初值10,所以r5又得執行10次,而每減一次1都要重複10次。同理,執行r7減一要重複前面的djnz指令10×250次,所以就有了
10×250×200×2us=1s
16樓:匿名使用者
執行上面的指令要用(1+(1+r5)*r6)*r7=(1+(1+10)*250)*200個機械週期,
一個機械週期=12/晶振頻率=1us
注意:djnz rn,#data ;暫存器rn減1,不為零則轉移。
例:djnz r6,l2
每執行一次這條指令r6就減一,如果減一後r6不為零,則跳轉到l2(即l2:mov r5,#10 )處開始往下順序執行
首先執行l2:mov r5,#10
然後執行l3:djnz r5,l3
最後又遇到djnz r6,l2
又減一判斷r6是否為零,不為零則跳轉到l2:mov r5,#10 繼續往下執行。
這就是迴圈的原理
請幫忙在51系列微控制器系統中,編寫一個延時1ms的子程式。謝謝。。
17樓:一言中
在彙編裡面可以用jnz語句,利用所賦初值,寫一個減一不為零跳轉指令,跟c語言的for迴圈一個意思
18樓:匿名使用者
這個得看你晶振的頻率了。。根據for迴圈可以計算下大致得迴圈多少次就能定。微控制器定延時不精確的。
19樓:匿名使用者
void delay_ms(unsigned int n){unsigned int i=0,j=0;
for(i=0;i這是12mhz用的ms延時程式 我用示波器測了回,很準答
20樓:匿名使用者
void delay(unsigned int x) //延時 x ms
延時1ms 即為來
源使x=1;
這程式延時約1ms(x=1時用keil測出來約 0.96831272ms,近似1ms),用c語言很難做到準確的1ms。注意晶振為11.0592mhz的時候用~
21樓:手機使用者
假設bai12mhz.誤差自
du己調,
zhi用daonop微調。
版main: mov r5,#10
del1:mov r6,權#200
del2:mov r7,#246
nopdel3:djnz r7,del3
djnz r6,del2
djnz r5,del1
sjmp $
為什麼這個微控制器延時子程式用了PUSH和POP
請你參考 高手們喜歡這樣寫,看懂了就沒有那麼可怕了,其實就是一種儲存資料的方法。下面逐句分析,先說明一下吧 push與pop必須成對出現,否則就亂了 另外誰跟誰是一對也得弄清。delay mov r2,30h 以下3行不解釋了 acall delay0 retdelay0 push 02h 把02h...
關於微控制器C語言延時程式中的空語句如何理解
去掉 怎麼行呢?那就 語法 不通 祝你順利 在這裡實際是一點作用都沒有的,cpu執行到這裡for j 0 j 125 j 的時候在是不停的做迴圈,因為是一條空語句,所以cpu視它不存在,不會執行的 但如果在for j 0 j 125 j 加了類似對變數賦值的語句後效果就完全不一樣了,本人以前還就這個...
我寫的微控制器軟體延時程式在arm中卻不能用
你可能沒有理解延時程式的實質吧 延時 cpu每執行一條指令都需要耗一定的時間,一般為主頻週期的整數倍,只要知道一些指令所耗時間,這些時間都是和cpu彙編指令系統嚴格對應的,而c 要弄清楚的話,最好反彙編一下,看它對應的彙編指令,然後準確計算 就像for i 0 i 120 i 這條 i自加,然後與1...