Keil C51精確延時程序設計
摘要 針對C語言代碼的執行時間的可預見性差,結合Keil C51開發工具,分析了在Keil C51開發工具中利用C語言實現精確的延時程序的設計,指出了常用延時方法優缺點。并通過一些實例分析了延時時間的計算方法,使C語言代碼的延時時間可以被預見。C語言中嵌套匯編語言是一種有效的方法,可以充分發揮出各語言的優勢特點、提高開發效率。
關鍵詞 Keil C51;C語言;軟件延時;單片機
C語言具有較強的數據處理能力、語言功能齊全、使用靈活方便、開發效率高,被廣泛應用于在單片機系統開發應用中。在單片機幕統開發的過程中,經常需要使用到延時程序,但C語言代碼執行時間。的可預見性和實時性較差,在開發一些具有嚴格通信時序要求的系統時,往往需要反復調試延時代碼,給開發者帶來了較大困難。比如使用DS18B20進行溫度測控時,必須按照其單總線通信協議,否則無法讀取溫度數據。針對上述問題,結合Keil C51開發工具和Proteus仿真軟件,介紹在Keil C51開發系統中,利用C語言編寫的延時程序設計及其運行的時間的計算方法。
1 常用延時程序的設計方法
1.1 利用定時器/計數器延時
利用C51單片機內部2個16位定時器/計數器實現精確的程序,由于定時器/計數器不占用CPU的運行時間,可以提高CPU的使用效率。但假設使用12 MHz晶振,定時器工作在方式1模式下,其最長定時時間也只能達到65.53 ms,由此,可以采用中斷方式進行溢出次數累加的方法進行長時間的延時程序設計。但在開發過程中要考慮C51自動對斷點的保護和重裝初值所帶來的延時誤差,也可以使用定時器工作在方式2模式下,減少重裝初值所帶來的誤差。
1.2 利用空操作實現延時
當所需的延時非常短,可以利用Keil C51自帶intrins.h頭文件中的_nop_()函數實現函數延時。
當主程序調用delay()函數時,首先執行LCALL指令,占用2個機器周期,然后執行_nop_()函數,它相當于匯編中的NOP指令,占用一個指令周期,最后執行一個RET返回指令,一共占用5個機器周期。若要增加延時時間,可以在delay()函數中增加_nop_()函數的數目。但利用這種方法進行長時間的延時,會降低成程序的可讀性。
1.3 利用C語言中嵌套匯編程序實現延時
與C語言相比,在編寫匯編程序的時候可以清楚地知道執行每一條指令所需的機器周期,從而精確確定其執行時間。Keil C51開發環境可以實現C語言中嵌入匯編語言,可以在延時程序設計時,結合匯編語言的優點,精確確定延時時間。C語言中嵌入匯編程序的方法:
#pragma asm
;匯編程序代碼
#pragma endasm
以12 MHz晶振為例,介紹C語言嵌套匯編語言設計延時程序:
delay函數采用單循環延時,主函數調用delay函數時,首先執行LJMP指令占用2個指令,delay函數執行結束后,執行一個RET返回指令。而DJNZ執行占用2個機器周期,一共執行了10次,所以在12 MHz晶振下,延時函數執行的時間為△t=2×10+1+2+2=25μs。如果需要進行長時間延時,可以采用多重循環嵌套實現。
1.4 利用for循環實現延時
在單片機開發過程中,for語句和while語句也經常用于延時程序的設計。設晶振頻率為12 MHz,在調用延時函數時,一共需要18個機器周期。當delay函數中的實參改變時,函數的延長時間變長,具體的延時時間△t=3×i+5×(i+1)+5。由于delay函數中變量的類型為unsigned char,最大值為255,不能進行長時間延時。可以通過改變變量的類型和利用for語句嵌套,實現長時間延時,但是延時時間的計算和delay函數有差異。
如表1所示,在設計延時程序時,應該考慮延時的長短,開發系統的資源利用與二次開發等情況進而確定設計延時程序設計的方法。
c語言相關文章:c語言教程
塵埃粒子計數器相關文章:塵埃粒子計數器原理 晶振相關文章:晶振原理 燃氣報警器相關文章:燃氣報警器原理
評論