單片機延時大家程序中都會用到,那么怎么實現呢?通常我們有軟件實現,就是語句循環;或者硬件實現,通過定時器/計數器。
對于精準而言,從實現語言方向看,底層語言有匯編和C語言,通常我們單片機程序用C語言比較多,但是相對而言匯編更精準。從實現方式來看,有軟件方式和硬件方式,那么對于C語言延時的方法哪種更精準呢?自然是定時器計數器的方式了,為什么呢?一起來看看吧。
1、軟件延時-循環實現
在很多時候,定時器會被用作其他用途,不方便再用作計數了,所以這個時候就只能用軟件方法延時。軟件方法延時就是循環語句來實現。
通過使用帶_NOP_();語句的函數實現,定義一系列不同的延時函數。我們都知道C語言最終通過編譯生成匯編,所以一條C語言可能會反匯編成多條匯編語句,每條匯編指令都有指令周期,比如我們時鐘是8Mhz的,那么一個指令周期就是125ns,那么NOP是一個空指令,占用一個指令周期。假如我們定義一個1ms的延時函數,那么函數里面全部用NOP指令也需要循環多次,那么循環語句也可能會有多條匯編實現,具體的根據編譯器不同也不同,我們就很難精確的計算出實際的延時,那么計算大概也可以,然后最有效直接的方法就是通過示波器去測試然后再去調整循環數。不要太糾結計算數值,可以調試的。示波器測試方法更簡單,在延時前后加一個引腳的輸出反轉信號就可以了。
到這里大家是不是覺得其實用匯編寫延時函數就能做到精確了呢?相比較C語言,的確是匯編可以做到很精確的數值,因為我們可以確定每條指令的指令周期是多少,根據延時函數用到的所有指令都可以計算出來,最終計算得出比較精準的循環數值。
2、硬件延時-定時器/計數器實現
當然在大多情況下,我們還是會選擇定時器來做延時處理,首先我們可以通過時鐘配置定時器工作,獲得精準計數,具體精準程度要看給定時器用的時鐘了,內部時鐘或者外部晶振的精度。可以實現極短時間的精確延時。
在實際應用中,定時常采用中斷方式,通過對定時器的配置,獲得中斷方式和定時時間,然后通過判斷計數值獲得想要的延時效果,用這種方法從程序的執行效率和穩定性方面考慮都是最佳的方案。大部分項目主循環需要處理很多事情,如果在主循環中用軟件延時方法難免需要等待過程,尤其是長延時的時候不能處理其他,如果好多外設在工作,會造成通信不上或者響應不及時。
總結:大部分程序中我們可以寫個小的軟件延時,必須等待的小延時可以用軟件的實現,就可以省去對延時時間的判斷了,等待就可以了。但是需要測試延時時間是否準確,或者可以直接用匯編寫延時函數。硬件延時也有必要實現,根據實際需求去應用。
大部分延時應用過程中還是會有些誤差的,這個是在多個小的誤差基礎上疊加的,是可以接受的。
責任編輯:haq
-
單片機
+關注
關注
6039文章
44583瀏覽量
636507 -
軟件
+關注
關注
69文章
4973瀏覽量
87734 -
C語言
+關注
關注
180文章
7608瀏覽量
137144
原文標題:單片機延時的兩種實現方法
文章出處:【微信號:gh_e7f294a514ca,微信公眾號:單片機匠人】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論