<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Keil C51精確延時(shí)程序設計

Keil C51精確延時(shí)程序設計

作者: 時(shí)間:2013-05-16 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要 針對C語(yǔ)言代碼的執行時(shí)間的可預見(jiàn)性差,結合 開(kāi)發(fā)工具,分析了在 開(kāi)發(fā)工具中利用C語(yǔ)言實(shí)現程序的設計,指出了常用方法優(yōu)缺點(diǎn)。并通過(guò)一些實(shí)例分析了時(shí)間的計算方法,使C語(yǔ)言代碼的延時(shí)時(shí)間可以被預見(jiàn)。C語(yǔ)言中嵌套匯編語(yǔ)言是一種有效的方法,可以充分發(fā)揮出各語(yǔ)言的優(yōu)勢特點(diǎn)、提高開(kāi)發(fā)效率。
關(guān)鍵詞 ;C語(yǔ)言;軟件延時(shí);單片機

C語(yǔ)言具有較強的數據處理能力、語(yǔ)言功能齊全、使用靈活方便、開(kāi)發(fā)效率高,被廣泛應用于在單片機系統開(kāi)發(fā)應用中。在單片機幕統開(kāi)發(fā)的過(guò)程中,經(jīng)常需要使用到延時(shí)程序,但C語(yǔ)言代碼執行時(shí)間。的可預見(jiàn)性和實(shí)時(shí)性較差,在開(kāi)發(fā)一些具有嚴格通信時(shí)序要求的系統時(shí),往往需要反復調試延時(shí)代碼,給開(kāi)發(fā)者帶來(lái)了較大困難。比如使用DS18B20進(jìn)行溫度測控時(shí),必須按照其單總線(xiàn)通信協(xié)議,否則無(wú)法讀取溫度數據。針對上述問(wèn)題,結合Keil C51開(kāi)發(fā)工具和Proteus仿真軟件,介紹在Keil C51開(kāi)發(fā)系統中,利用C語(yǔ)言編寫(xiě)的延時(shí)及其運行的時(shí)間的計算方法。

1 常用延時(shí)程序的設計方法
1.1 利用定時(shí)器/計數器延時(shí)
利用C51單片機內部2個(gè)16位定時(shí)器/計數器實(shí)現的程序,由于定時(shí)器/計數器不占用CPU的運行時(shí)間,可以提高CPU的使用效率。但假設使用12 MHz晶振,定時(shí)器工作在方式1模式下,其最長(cháng)定時(shí)時(shí)間也只能達到65.53 ms,由此,可以采用中斷方式進(jìn)行溢出次數累加的方法進(jìn)行長(cháng)時(shí)間的延時(shí)。但在開(kāi)發(fā)過(guò)程中要考慮C51自動(dòng)對斷點(diǎn)的保護和重裝初值所帶來(lái)的延時(shí)誤差,也可以使用定時(shí)器工作在方式2模式下,減少重裝初值所帶來(lái)的誤差。
1.2 利用空操作實(shí)現延時(shí)
當所需的延時(shí)非常短,可以利用Keil C51自帶intrins.h頭文件中的_nop_()函數實(shí)現函數延時(shí)。
當主程序調用delay()函數時(shí),首先執行LCALL指令,占用2個(gè)機器周期,然后執行_nop_()函數,它相當于匯編中的NOP指令,占用一個(gè)指令周期,最后執行一個(gè)RET返回指令,一共占用5個(gè)機器周期。若要增加延時(shí)時(shí)間,可以在delay()函數中增加_nop_()函數的數目。但利用這種方法進(jìn)行長(cháng)時(shí)間的延時(shí),會(huì )降低成程序的可讀性。
1.3 利用C語(yǔ)言中嵌套匯編程序實(shí)現延時(shí)
與C語(yǔ)言相比,在編寫(xiě)匯編程序的時(shí)候可以清楚地知道執行每一條指令所需的機器周期,從而確定其執行時(shí)間。Keil C51開(kāi)發(fā)環(huán)境可以實(shí)現C語(yǔ)言中嵌入匯編語(yǔ)言,可以在延時(shí)時(shí),結合匯編語(yǔ)言的優(yōu)點(diǎn),精確確定延時(shí)時(shí)間。C語(yǔ)言中嵌入匯編程序的方法:
#pragma asm
;匯編程序代碼
#pragma endasm
以12 MHz晶振為例,介紹C語(yǔ)言嵌套匯編語(yǔ)言設計延時(shí)程序:
a.JPG
delay函數采用單循環(huán)延時(shí),主函數調用delay函數時(shí),首先執行LJMP指令占用2個(gè)指令,delay函數執行結束后,執行一個(gè)RET返回指令。而DJNZ執行占用2個(gè)機器周期,一共執行了10次,所以在12 MHz晶振下,延時(shí)函數執行的時(shí)間為△t=2×10+1+2+2=25μs。如果需要進(jìn)行長(cháng)時(shí)間延時(shí),可以采用多重循環(huán)嵌套實(shí)現。
1.4 利用for循環(huán)實(shí)現延時(shí)
在單片機開(kāi)發(fā)過(guò)程中,for語(yǔ)句和while語(yǔ)句也經(jīng)常用于延時(shí)程序的設計。設晶振頻率為12 MHz,在調用延時(shí)函數時(shí),一共需要18個(gè)機器周期。當delay函數中的實(shí)參改變時(shí),函數的延長(cháng)時(shí)間變長(cháng),具體的延時(shí)時(shí)間△t=3×i+5×(i+1)+5。由于delay函數中變量的類(lèi)型為unsigned char,最大值為255,不能進(jìn)行長(cháng)時(shí)間延時(shí)??梢酝ㄟ^(guò)改變變量的類(lèi)型和利用for語(yǔ)句嵌套,實(shí)現長(cháng)時(shí)間延時(shí),但是延時(shí)時(shí)間的計算和delay函數有差異。
如表1所示,在設計延時(shí)程序時(shí),應該考慮延時(shí)的長(cháng)短,開(kāi)發(fā)系統的資源利用與二次開(kāi)發(fā)等情況進(jìn)而確定設計延時(shí)程序設計的方法。

本文引用地址:http://dyxdggzs.com/article/170502.htm

b.JPG

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


塵埃粒子計數器相關(guān)文章:塵埃粒子計數器原理
晶振相關(guān)文章:晶振原理
燃氣報警器相關(guān)文章:燃氣報警器原理

上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: 程序設計 延時(shí) 精確 C51 Keil

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>