熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
DelayMS(3800) 是3.8s,怎么跑了0.18s ----- 軟件延時(shí),不太準(zhǔn)確,與許多都有關(guān)系,例如中斷等等.....再說(shuō),DelayMS(3800) ,你咋確定是3.8S的? |
這個(gè)是跟你的CPU的執(zhí)行速度有關(guān),假如你用的CPU一毫秒能執(zhí)行2條指令,那么循環(huán)體里面的數(shù)值為2時(shí),代表執(zhí)行一次這個(gè)函數(shù)所花的時(shí)間為1ms,數(shù)值為4的話,代表執(zhí)行一次這個(gè)函數(shù)代表花費(fèi)時(shí)間為2ms,依次來(lái)達(dá)到延時(shí)的目的,不過(guò)這種延時(shí)是不夠精準(zhǔn)的,用在要求精度不高的事件 |
延時(shí)時(shí)間和單片機(jī)的時(shí)鐘頻率有關(guān),可以去網(wǎng)上下載例如單片機(jī)小精靈之類的工具,不僅可以生成相對(duì)準(zhǔn)確的延時(shí),提供了波特率生成器等工具,簡(jiǎn)單暴力 |
一、51單片機(jī)軟件延時(shí): 1、 幾種周期介紹 周期名稱 描述 時(shí)間 振蕩 單片機(jī)提供時(shí)鐘脈沖信號(hào) 的振蕩源的周期 T=1/f 狀態(tài) 振蕩周期經(jīng)二分頻后得到 的 2T 機(jī)器 CPU 可以完成一個(gè)獨(dú)立操 作所需要的周期 12T 指令 指 CPU 完成一條操作所需 的全部時(shí)間 n*12T 2、指令: 1、MUL、DIV:僅有的 4 周期指令 2、包含 DPTR 和 PC 的指令均為 2 周期指令 3、所有的絕對(duì)跳轉(zhuǎn)和條件轉(zhuǎn)移指令,均為 2 周期指令 4、所有包括 A 寄存器的指令,均為單周期指令 5、位操作指令中,ANL 和 ORL 是 2 周期指令 6、所有包含立即地址的指令,除 INC direct 及 DEC direct 外,均為 2 周期指令 7、剩下的均為單周期指令。如: void delay(uint z) { uint i ,j; for(i = z; i> 0;i--) for(j =0; j < 921; j++) } 分析: 1.先計(jì)算你單片機(jī)的振蕩(時(shí)鐘)周期 T=1/晶振(11.0592MHZ) 2.一次 i--操作為 12T 3.忽略變量定義,上述延時(shí)函數(shù)共需時(shí)間:921*z*12T 4.帶入 T:921*12*T*z 約為 z us 3、計(jì)算誤差出現(xiàn)的原因: 1.軟件仿真時(shí),函數(shù)調(diào)用的時(shí)候入棧出棧操作的耗時(shí)。 2.指令周期隨指令的不同而不同導(dǎo)致的誤差。 3.中斷的影響。 4.變量的范圍超過(guò),從而與預(yù)計(jì)時(shí)間不一樣。 while(i--):如果 i 為 char 型,執(zhí)行一次大概為 5us 左右;如果 i 為 int 型則執(zhí)行一次大概為 10us 左右。注意:軟件延時(shí)通常用于時(shí)序要求較高的編程中,其它需延時(shí)較長(zhǎng)的地方必須采用單片機(jī)內(nèi)部定時(shí)器。 |
參與人數(shù) 1 | 黑幣 +12 | 收起 理由 |
---|---|---|
![]() | + 12 |
不是循環(huán)多少次就是多少秒的,可以直接搜delay()函數(shù),可以查到很多常用的。![]() |
機(jī)子單 發(fā)表于 2019-10-4 14:38 你可以參考這個(gè) http://www.zg4o1577.cn/bbs/dpj-4711-1.html |
有沒(méi)有大神,指導(dǎo)下,工作過(guò)程 |
Delay程式 延遲的時(shí)間和你所使用的指令週期與Delay方法有關(guān)我看你的圖片事阻塞式延遲,原理就是跑空指令,根據(jù)芯片不同每一個(gè)指令都需要花費(fèi)數(shù)個(gè)指令週期 你的Delay在副程式中視兩個(gè)空的迴圈函數(shù),裡面的for(i=0;i<y;i++) 中的y代表你每次執(zhí)行會(huì)跑幾個(gè)空迴圈 ,whie(x--) 中的x 是你可以輸入的變數(shù),意思是你要跑幾次for迴圈 , 如果你輸入x,那你執(zhí)行空迴圈的次數(shù)就是x*y次,如果你輸入x=3800那 ,就是執(zhí)行了3800*y次迴圈空迴圈. 如果使用這種方式來(lái)來(lái)完成Delay你可以去看你芯片執(zhí)行指令需要多少時(shí)間來(lái)計(jì)算實(shí)際的延遲時(shí)間,會(huì)者用其他發(fā)法一個(gè)一個(gè)嘗試來(lái)確定執(zhí)行1次for迴圈需要多久. 當(dāng)然用這種方式時(shí)間不會(huì)太準(zhǔn)確,如果時(shí)間要求精度高可以選擇使用TIM,或改用組合語(yǔ)言. |
參與人數(shù) 2 | 黑幣 +90 | 收起 理由 |
---|---|---|
![]() | + 30 | |
![]() | + 60 | 回帖助人的獎(jiǎng)勵(lì)! |
DelayMS(3800) 誰(shuí)說(shuō)是3.8s,具體多長(zhǎng)跟晶振和子程序函數(shù)都有關(guān)系 |
Powered by 單片機(jī)教程網(wǎng)