51微控制器軟體延時為什麼不準確,51微控制器中 怎麼得到精確延時?

時間 2022-03-02 21:25:28

1樓:匿名使用者

因為呼叫事件函式和運算的時候,你是要計算指令週期的。但是我們一般不考慮,導致時間不夠準確,但是你如果要精確的計算時間,c語言是不行的,還是建議你用匯編。或者定時器也行!

51微控制器中 怎麼得到精確延時?

2樓:匿名使用者

10ms得到了 1秒還不好弄嗎?定義個計數的 加100次即為1秒 要精確到什麼份上?晚個1ms以下啥的允許的話 就滿100 置一標誌位 從主迴圈中判斷標誌 用完標誌清零 這樣一直迴圈就成了 如果一點不能晚 就得從中斷去顯示了 不過中斷佔用率太高 不提倡的

51微控制器程式定時器怎麼這麼不準確啊,求高手指點!

3樓:匿名使用者

這是編譯器造成的,你最好用debug模式看看生成的彙編**是什麼摸樣,比較一下你那三種方 式給th0和tl0賦的是什麼樣的值。

這是我試驗的結果:

4: th0=-780/256;

c:0x0003 758cfd mov th0(0x8c),#0xfd

5: tl0=-780%256;

c:0x0006 758af4 mov tl0(0x8a),#0xf4

6: th0=-516/256;

c:0x0009 758cfe mov th0(0x8c),#0xfe

7: tl0=-516%256;

c:0x000c 758afc mov tl0(0x8a),#0xfc

8: th0=(65536-516)/256;

c:0x000f 758cfd mov th0(0x8c),#0xfd

9: tl0=(65536-516)%256;

c:0x0012 758afc mov tl0(0x8a),#0xfc

看出差別了吧?使用-780時給t0賦值0xfdf4,使用第三種方式賦值為0xfdfc,這兩個數字相近,所以結果基本正確。但是使用-516時賦值的0xfefc,這差別就大了,結果就是不正確。

一般建議用th0=(65536-516)/256 ;tl0=(65536-516)%256;這種方式,保證不出問題。

4樓:七零後走四方

定時器是從小到大計數的,前2個設定是錯誤的。

另外,定時器中斷處理時有時間開銷,如暫存器入棧。尤其是用c編譯器,額外開銷是不可見的。

學習微控制器、cpld,請到「電子設計網dzsj」

5樓:匿名使用者

每條指令也需要時間呀,當然不是516,而是780很正常,你可以減掉這個誤差值呀,

6樓:匿名使用者

用中斷來做,指令也要佔用時間。輪詢會隨機不確定的。

一個51微控制器軟體延時問題

7樓:

程式看的不是很明白,但是我看到一共迴圈120次,每次需要8個指令週期,12m晶振的51一個指令週期是1us 所以實際是120*8*1=960us,再加上子程式呼叫的時間佔用,大約在1ms的樣子。

8樓:做而論道

c語言延時程式,沒有精確的計算方法,只能的估算,再測試修正。

軟體精確延時,只能使用組合語言。

參考

9樓:匿名使用者

dle1: mov r0,#10

dle2: mov r1,#100

djnz r1,dle2

djnz r0,dle2

你看這是1ms的彙編程式10x100x1us+4us=1ms好像你不太懂彙編。不是說語句少就不夠1ms因為其中有迴圈。

10樓:雨田丫

程式延時本來就是一個大概的數。這個也不是很準的。

中間的for迴圈120次大約是962週期,加上每次迴圈前後的「準備工作」,再加上函式呼叫/返回的時間,接近1ms.實沒為993個週期。如果把for迴圈次數改為121,則引數1的延時為1001個機器週期。

關於51微控制器的軟體延時程式的問題 5

51微控制器軟體延時和定時器的區別

11樓:mrs鹿大大

區別就是用微控制器軟體定時,cpu迴圈執行一小段延時程式,浪費cpu的精力,用定時器定時,cpu就可以幹別的。

如果是程式延時的話,時間消耗在(延時程式+剩下的**);計時器中斷則相當於把延時程式交給定時器,此時cpu可以幹別的事情,提高了效率。就類似於電腦打遊戲時把圖形處理任務交給顯示卡,cpu的壓力就小。

微控制器進中斷後執行中斷裡的程式,比如你進定時中斷,執行完後退出中斷後做其他事,但定時還在計數,這樣計數和做其他事情兩不誤。

你的程式中本來就沒做其他事情,你的led移動就是等待中斷計數到10才操作的,led動作的先決條件就是中斷計數結束。

擴充套件資料

1、軟體迴圈延時:採用迴圈語句,如for,while等,進行長時間的空操作,或者空語句。

優點:程式理解簡易,入手快,新手必備**。

缺點:時間精度不高,且佔用微控制器大量時間資源,引發其它子函式的不流暢(卡滯、遲鈍),導致系統實時反應能力下降。

2、定時延時:採用定時器定時,如t0,t1;

優點:時間精度高,提高系統程式執行的高效性,不影響子函式的正常執行。

缺點:需佔用1個定時器資源(可以複用),需良好程式構架支援,入手難。

個人建議:一旦學會定時器,就不應該再使用「迴圈延時」函式,採用定時器才是正道。如果對延時精度要求不高,建議使用結構體組成多個延時體。

12樓:匿名使用者

微控制器進中斷後執行中斷裡的程式,比如你進定時中斷,執行完後退出中斷後做其他事,但定時還在計數,這樣計數和做其他事情兩不誤。

你的程式中本來就沒做其他事情,你的led移動就是等待中斷計數到10才操作的,led動作的先決條件就是中斷計數結束

13樓:做而論道

用軟體定時,cpu 迴圈執行一小段延時程式。

浪費 cpu 的精力。

用定時器定時,cpu 就可以幹別的。

14樓:寂寞小鳥

如果是程式延時的話,時間消耗在(延時程式+剩下的**);計時器中斷則相當於把延時程式交給定時器,此時cpu可以幹別的事情,提高了效率。就類似於電腦打遊戲時把圖形處理任務交給顯示卡,cpu的壓力就小了。

15樓:匿名使用者

進入中斷後執行i++後就出來了。然後在主函式while(1)中執行。此時while(1)執行很多次,然後再進入中斷,直到進10次才左移。

如果用延時,燈閃一次while(1)才允許一次。你程式少沒感覺,如何你該一下沒用8s控制一個燈閃,10s控制寧一個燈閃.延時就不太好做。

51微控制器c語言延時函式 void delay 1ms un

杜哥是個小天才 c程式中可使用不同型別的變數來進行延時設計。經實驗測試,使用unsigned char型別具有比unsigned int更優化的 在使用時應該使用unsigned char作為延時變數。以某晶振為12mhz的微控制器為例,晶振為12mhz即一個機器週期為1us。void delay ...

51微控制器定時器初值用變數設定定時不準確,為什麼,求高手。TH0 65536 X 256,TL0 65536 X

南國有兒女 第一種用法是常用的用法,我剛看了一下你的程式,那個x在這個程式中可能就是那個a,a是uint,就是無符整型,而直接用1000,這個是int型,系統預設的,我感覺問題出在這,計算時出錯。你可以把x設成int型,再試試! 工作頻率12m,所以定時器脈衝頻率為1m 1000000 define...

51微控制器組合語言學習軟體,51微控制器用組合語言需要什麼軟體?

我想告訴你,keil可以編輯彙編的檔案.你建好一個project後,在source group 1上點右鍵,選add files to group source group 1 這時,就可以選中你的asm檔案 要選asm檔案得先把對話方塊中的檔案類弄選為 雙擊就可以新增到source group 1...