|
|
DelayMS(3800) 是3.8s,怎么跑了0.18s ----- 軟件延時,不太準確,與許多都有關系,例如中斷等等.....再說,DelayMS(3800) ,你咋確定是3.8S的? |
| 這個是跟你的CPU的執行速度有關,假如你用的CPU一毫秒能執行2條指令,那么循環體里面的數值為2時,代表執行一次這個函數所花的時間為1ms,數值為4的話,代表執行一次這個函數代表花費時間為2ms,依次來達到延時的目的,不過這種延時是不夠精準的,用在要求精度不高的事件 |
| 延時時間和單片機的時鐘頻率有關,可以去網上下載例如單片機小精靈之類的工具,不僅可以生成相對準確的延時,提供了波特率生成器等工具,簡單暴力 |
|
一、51單片機軟件延時: 1、 幾種周期介紹 周期名稱 描述 時間 振蕩 單片機提供時鐘脈沖信號 的振蕩源的周期 T=1/f 狀態 振蕩周期經二分頻后得到 的 2T 機器 CPU 可以完成一個獨立操 作所需要的周期 12T 指令 指 CPU 完成一條操作所需 的全部時間 n*12T 2、指令: 1、MUL、DIV:僅有的 4 周期指令 2、包含 DPTR 和 PC 的指令均為 2 周期指令 3、所有的絕對跳轉和條件轉移指令,均為 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.先計算你單片機的振蕩(時鐘)周期 T=1/晶振(11.0592MHZ) 2.一次 i--操作為 12T 3.忽略變量定義,上述延時函數共需時間:921*z*12T 4.帶入 T:921*12*T*z 約為 z us 3、計算誤差出現的原因: 1.軟件仿真時,函數調用的時候入棧出棧操作的耗時。 2.指令周期隨指令的不同而不同導致的誤差。 3.中斷的影響。 4.變量的范圍超過,從而與預計時間不一樣。 while(i--):如果 i 為 char 型,執行一次大概為 5us 左右;如果 i 為 int 型則執行一次大概為 10us 左右。注意:軟件延時通常用于時序要求較高的編程中,其它需延時較長的地方必須采用單片機內部定時器。 |
不是循環多少次就是多少秒的,可以直接搜delay()函數,可以查到很多常用的。![]() |
機子單 發表于 2019-10-4 14:38 你可以參考這個 http://www.raoushi.com/bbs/dpj-4711-1.html |
| 有沒有大神,指導下,工作過程 |
|
Delay程式 延遲的時間和你所使用的指令週期與Delay方法有關我看你的圖片事阻塞式延遲,原理就是跑空指令,根據芯片不同每一個指令都需要花費數個指令週期 你的Delay在副程式中視兩個空的迴圈函數,裡面的for(i=0;i<y;i++) 中的y代表你每次執行會跑幾個空迴圈 ,whie(x--) 中的x 是你可以輸入的變數,意思是你要跑幾次for迴圈 , 如果你輸入x,那你執行空迴圈的次數就是x*y次,如果你輸入x=3800那 ,就是執行了3800*y次迴圈空迴圈. 如果使用這種方式來來完成Delay你可以去看你芯片執行指令需要多少時間來計算實際的延遲時間,會者用其他發法一個一個嘗試來確定執行1次for迴圈需要多久. 當然用這種方式時間不會太準確,如果時間要求精度高可以選擇使用TIM,或改用組合語言. |
|
DelayMS(3800) 誰說是3.8s,具體多長跟晶振和子程序函數都有關系 |