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...