1樓:出群
你可能沒有理解延時程式的實質吧
延時:cpu每執行一條指令都需要耗一定的時間,一般為主頻週期的整數倍,只要知道一些指令所耗時間,這些時間都是和cpu彙編指令系統嚴格對應的,而c 要弄清楚的話,最好反彙編一下,看它對應的彙編指令,然後準確計算;就像for(i = 0; i < 120; i++)這條**,i自加,然後與120作比較,具體用到哪幾條指令,反彙編(disassemble)後就能看見(我也是剛開始學arm),比如說是a個週期,這a個週期對應多少時間,和主頻f有關,那麼這條for(i = 0; i < 120; i++)這條**的耗時就是a*(1/f)*120*ms 【ms是你子函式形參,120是你所謂的1ms對應的迴圈次數】
再來說如何得到arm的1ms,估計你自己也知道算了,消耗時間(延時)是靠執行指令來的,所以計算好迴圈次數也就可以對到準確的數了,也就是上面說的120,應該換成合適的數值,如果數值太大可以考慮用迴圈巢狀或者long型的數。
算出來的數應該不小,所以........這段cpu時間如果不用來延時的話就能幹很多事情了,所以就還是建議儘量改用定時來做吧,有時候cpu時間很寶貴的,像arm這種主頻又高的。不過說回來也要看你用在什麼場合了。
說了這麼多,但願幫到了你理解延時 [email protected]
2樓:煙臺逸冰
問題可能出在定義或者呼叫上:
unsigned int ms
這說明函式的形參ms是一個無符號數,你是不是呼叫它時給它傳遞了一個有符號數?而且一個無符號數減到0的時候,再執行減一,也可能出現問題。
比如while(ms--),當ms等於0時,退出while迴圈,但ms又減1了,你可以把函式這樣修改試一下,如果還不行,兄弟也沒法治了:(
void delay(int ms)//延時ms*1(ms)}
3樓:匿名使用者
你說的不能用,指的是什麼,編譯出錯?還是沒有延時?
這種軟體延時的程式,和處理器的時脈頻率有很大關係,就算在51上,使用不同的晶振,
延時也會不同。arm就更快。
軟體延時的程式,做處理器的移植,沒什麼意義,你要通過重新測試,才能確定時間。
4樓:匿名使用者
timer0() interrupt 1 // 1ms延時(12.0mhz)
main()
}採用定時中斷的1s延時,比較精確,而且不影響整個程式執行時間。
5樓:物理狂人
振盪器頻率不一樣,arm數拍子更快。
程式移植難易與晶片間的結構差異有很大的關係。
為了最簡單地達到目的,幾乎所有程式設計時都對晶片結構具有針對性的編寫,移植時針對性的程式特點在目標晶片中不能體現出來,移植不適用。
6樓:
51的晶鎮週期是11.1592mhz而arm9的是400,差別這麼大,延時時間怎麼可能一樣
51微控制器中延時程式
7樓:匿名使用者
1. sleep()是以毫秒計算的,延時5秒是sleep(5*1000);,延時5分是sleep(5*1000*60);
2.包含的標頭檔案看你用的什麼編輯軟體。
3.我用的vc++是用包含在#include標頭檔案中。
#include#include//sleep()的標頭檔案 main() //
這裡修改延時時間,
有些人說是用#include做標頭檔案你自己試下吧。
還用sleep的s是大寫的,不是小寫的。
8樓:貓貓
for(j=0;j<125;j++)
這是一個1ms基準延時程式,i=500就延時了500ms,具體的和機器核心有關,把這個程式記住就行了
9樓:
簡單的說,執行程式就有時間。執行多長程式就延時了多長時間
10樓:我不是黃鼠狼
i=500,下邊的
for(j=0;j<125;j++)
執行了500次,這樣就延時了。
11樓:匿名使用者
答非所問 ,不能解決樓主的問題
微控制器中的延時程式的延時時間怎樣計算的?
12樓:匿名使用者
把#號後面的數乘起來,計算後的結果就是延時的時間,單位是us,要花成秒要除以100000
13樓:匿名使用者
你需要延時多長?我給你個延時10ms的子程式(時鐘 6mhz)dl10ms: mov r7,#05hloop1:
mov r6,#0f9hloop2: nop nop djnz r6,loop2 djnz r7,loop1 ret
14樓:匿名使用者
微控制器因具有體積小、功能強、成本低以及便於實現分散式控制而有非常廣泛的應用領域[1]。微控制器開發者在編制各種應用程式時經常會遇到實現精確延時的問題,比如按鍵去抖、資料傳輸等操作都要在程式中插入一段或幾段延時,時間從幾十微秒到幾秒。有時還要求有很高的精度,如使用單匯流排晶片ds18b20時,允許誤差範圍在十幾微秒以內[2],否則,晶片無法工作。
用51組合語言寫程式時,這種問題很容易得到解決,而目前開發嵌入式系統軟體的主流工具為c語言,用c51寫延時程式時需要一些技巧[3]。因此,在多年微控制器開發經驗的基礎上,介紹幾種實用的編制精確延時程式和計算程式執行時間的方法
15樓:匿名使用者
謝謝"羅門大佬"提醒,djnz 後面跟暫存器的化,確實是2個指令週期;mov後面如果是立即數對暫存器操作的化也是2個指令週期,只是「大佬」的解釋還是不能苟同哦,現在修改我原先的回答如下(為了到1000分,努力,555):
不知道你的程式上的註釋究竟對不對,可以通過示波器看看嗎(延時後翻轉一個埠)? 從程式的註釋上看應該用12mhz晶振,或者程式和題目不對應。
/********************** 小心的以為 ***************************/
dly10s : mov r5,100 ;2指令 4us
dly10s1: mov r6,200 ;2指令 4us
dly10s2: mov r7,248 ;2指令 4us
dly10s3:
djnz r7,dly10s3;248*2+4----------------->2指令a = 248*2*2us
djnz r6,dly10s2;(248*2+4)*200+4 -------->2指令b =(a+2a+2b)*200*2us
djnz r5,dly10s1;[(248*2+4)*200+4]*100+4->2指令c =(b+2a+2a+2b)*100*2us
ret ;1指令 2us
總時間=c+1*2us;此處的+1是「ret」的時間;上述註釋中的「+2a」是mov指令週期,注意對應的迴圈;上述註釋的「+2b」是djnz本身的2個機器週期;應該是這樣的吧,你的程式可能有問題。
微控制器中用軟體實現延時有哪兩種方法?有何特點
16樓:映寶喲釐
一.空迴圈(nop for while等語句 ) 浪費cpu資源 二.定器優點:定精確 般晶片定器二~三定器複用 比
17樓:煙火夜空
1、迴圈延時:採用迴圈語句,如for,while等,進行長時間的空操作,或者空語句。
優點:程式理解簡易,入手快,新手必備**!
缺點:時間精度不高,且佔用微控制器大量時間資源,引發其它子函式的不流暢(卡滯、遲鈍),導致系統實時反應能力下降。
2、定時延時:採用定時器定時,如t0,t1;
優點:時間精度高,提高系統程式執行的高效性,不影響子函式的正常執行。
缺點:需佔用1個定時器資源(可以複用),需良好程式構架支援,入手難。
個人建議:一旦學會定時器,就不應該再使用「迴圈延時」函式,採用定時器才是正道。如果對延時精度要求不高,建議使用結構體組成多個延時體。
微控制器中延時子程式的作用是什麼
18樓:匿名使用者
就是為了延時啊,譬如說你讓數碼管從1變到10,一秒跳一下這就需要用到延時啊當然你可能會說用定時器就行了,但是定時器有限,而且他是通過中斷來控制,但我不需要延時時間那麼精準的時候用起中斷就不夠直接用延時程式方便了
19樓:匿名使用者
一是為了某些時序邏輯器件的時序要求。二是為了單純的等待,比如交通訊號燈的控制,紅燈綠燈黃燈都有時間控制,亮的長短就要由延時程式控制,或者cpu速度快於外設速度時,就需要用延時程式做等待!
20樓:散雲
聽名字就知道意思···延時,程式執行需要時間的,延遲程式能夠保證程式執行,不會出錯
21樓:量值溯源
當然是起到延時的作用。
兩個事件之間有的需要部分延時,就要呼叫延時子程式。
22樓:匿名使用者
延時和等待的作用。。。可以是單純的空操作,也可以是定時器進行延時。實現延時後的其他操作
23樓: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 個機器週期。
利用以上三條指令的組合就可以比較精確地編寫出所需要的延時程式。
我的微控制器用的11.0592m的晶振,想寫一個大概延時1ms的子程式,應該怎樣寫?(用c語言)
24樓:匿名使用者
void delay(uint n)
}當n=1是延時大約是1ms,就是說n等於都少就延時多少ms,當然n的值不超過uint的最大值。
標頭檔案下請定義巨集
#define uchar unsigned char#define uint unsigned int
25樓:匿名使用者
11.0592的晶振,很熟悉,51系列微控制器經常用,建議多看下書,我說下大致的原理,fosc=11.0592m,一條指令的時間是多少?
可能有分頻,可以設定,具體的微控制器不一樣,反正你要得到執行一條指令的時間,比如是1us,那麼1usx1000=1ms,例如:
for(i=0;i<998,i++)
26樓:o幽蘭葳蕤
void delay(char x)
請問微控制器高手們這個軟體延時延時了多長時間?謝謝
有一個很簡單而且很準確的方法 用keilc 在keilc主介面的左面有一個微控制器執行時間的引數。但是必須設定好晶振和微控制器型號,否者會出誤差。 迴圈了100萬次 可根據使用的晶振來計算指令週期,再來計算出延時時間 彙編啊,這個不怎麼了解啊 請問有誰懂微控制器的延時程式,幫我看看延時子程式具體延時...
為什麼這個微控制器延時子程式用了PUSH和POP
請你參考 高手們喜歡這樣寫,看懂了就沒有那麼可怕了,其實就是一種儲存資料的方法。下面逐句分析,先說明一下吧 push與pop必須成對出現,否則就亂了 另外誰跟誰是一對也得弄清。delay mov r2,30h 以下3行不解釋了 acall delay0 retdelay0 push 02h 把02h...
51微控制器程式燒寫的原理是什麼,微控制器的燒寫原理
理解這個原理需要知道幾個知識點 微控制器內部是有程式的,是出廠時固化在硬體中,使用者無法修改的 這也會被認為它內部沒有程式 這些程式可以呼叫各種通訊介面 內部儲存器等 程式設計協議 一般大廠都會公開的,在晶片的專用技術手冊中會有 儲存器 有很多種,掩膜,eprom,eerom,flash等壽命不一樣...