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