版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、c語言delay的用法在單片機(jī)應(yīng)用中,經(jīng)常會(huì)遇到需要短時(shí)間延時(shí)的情況,一般都是 幾十到幾百& mu;s,并且需要很高的精度(比如用單片機(jī)驅(qū)動(dòng) DS18B20時(shí),誤差容許的范圍在十幾μs以內(nèi),不然很容易出錯(cuò)); 而某些情況下延時(shí)時(shí)間較長,用計(jì)時(shí)器往往有點(diǎn)小題大做。另外在特 殊情況下,計(jì)時(shí)器甚至已經(jīng)全部用于其他方面的定時(shí)處理, 此時(shí)就只 能使用軟件定時(shí)了。下面就和大家分享下 c語言delay的用法1C語言程序延時(shí)Keil C51的編程語言常用的有2種:一種是匯編語言;另一種是 C語言。用匯編語言寫單片機(jī)程序時(shí),精確時(shí)間延時(shí)是相對容易解 決的。比如,用的是晶振頻率為12 MHz
2、的AT89C51,打算延時(shí)20 μs,51單片機(jī)的指令周期是晶振頻率的1/12,即一個(gè)機(jī)器周期 為1 μs; “ MOV R0,#X ”需要2個(gè)機(jī)器周期,DJNZ也需要2個(gè) 機(jī)器周期,單循環(huán)延時(shí)時(shí)間t=2X+3(X為裝入寄存器R0的時(shí)間常 數(shù))2。這樣,存入R0里的數(shù)初始化為8即可,其精度可以達(dá)到1 μs。用這種方法,可以非常方便地實(shí)現(xiàn) 512 μs以下時(shí)間的 延時(shí)。如果需要更長時(shí)間,可以使用兩層或更多層的嵌套,當(dāng)然其精 度誤差會(huì)隨著嵌套層的增加而成倍增加。雖然匯編語言的機(jī)器代碼生成效率很高,但可讀性卻并不強(qiáng),復(fù)雜一點(diǎn)的程序就更難讀懂;而
3、C語言在大多數(shù)情況下,其機(jī)器代碼生成效率和匯編語言相當(dāng),但可讀性和可移植性卻遠(yuǎn)遠(yuǎn)超過匯編語言,且C語言還可以嵌入?yún)R編程序來解決高時(shí)效性的代碼編寫問題。就 開發(fā)周期而言,中大型軟件的編寫使用C語言的開發(fā)周期通常要比匯編語言短很多,因此研究C語言程序的精確延時(shí)性能具有重要的意義。C程序中可使用不同類型的變量來進(jìn)行延時(shí)設(shè)計(jì)。經(jīng)實(shí)驗(yàn)測試,使用unsigned char 類型具有比unsigned int 更優(yōu)化的代碼,在使 用時(shí)應(yīng)該使用unsigned char作為延時(shí)變量。2單層循環(huán)延時(shí)精度分析下面是進(jìn)行μs級(jí)延時(shí)的while程序代碼。延時(shí)函數(shù):void delay1( un sig
4、ned char i) while(i );主函數(shù):void mai n() while(1) delay1(i);使用Keil C51的反匯編功能,延時(shí)函數(shù)的匯編代碼如下:C:0x00E6AE07MOVR6,0x07C:0x00E81FDECR7C:OxOOE9EEMOVA,R6C:0x00EA70FAJNZC:00E6C:0x00EC22RET圖1斷點(diǎn)設(shè)置位置圖通過對i賦值為10,在主程序中圖1所示的位置設(shè)置斷點(diǎn)。經(jīng) 過測試,第1次執(zhí)行到斷點(diǎn)處的時(shí)間為457 μs,再次執(zhí)行到該 處的時(shí)間為531 μs,第3次執(zhí)行到斷點(diǎn)處的時(shí)間為605 μs , 1
5、0次while循環(huán)的時(shí)間為74 μs,整個(gè)測試結(jié)果如圖2所示。圖2使用i-方式測試仿真結(jié)果圖通過對匯編代碼分析,時(shí)間延遲 t=7X+4(其中X為i的取值)。 測試表明,for循環(huán)方式雖然生成的代碼與用 while語句不大一樣, 但是這兩種方法的效率幾乎相同。C語言中的自減方式有兩種,前面 都使用的是i-的方式,能不能使用-i方式來獲得不同的效果呢?將 前面的主函數(shù)保持不變,delay1函數(shù)修改為下面的方式:void delay1( un sig ned char i) while(-i);同樣進(jìn)行反匯編,得到如下結(jié)果:C:0x00E3DFFEDJNZR7,C:00E3C:0x00
6、E522RET比較發(fā)現(xiàn),-i的匯編代碼效率明顯高于i-方式。由于只有1條 語句DJNZ,執(zhí)行只需要2個(gè)時(shí)鐘周期,1個(gè)時(shí)鐘周期按1 μs 計(jì)算,其延時(shí)精度為2 μs;另外,RET需要2個(gè)時(shí)鐘周期,能夠達(dá)到匯編語言代碼的效率。按前面的測試條件進(jìn)行測試,第1次執(zhí)行 到斷點(diǎn)處的時(shí)間為 437 μs,再次執(zhí)行到該處的時(shí)間為465μs,第3次執(zhí)行到斷點(diǎn)處的時(shí)間為 493 μs ,10次while 循環(huán)的時(shí)間為28 μs,整個(gè)測試結(jié)果如圖3所示。圖3使用-i方式測試仿真結(jié)果圖調(diào)整i的取值,i取8時(shí)延時(shí)時(shí)間為24 &m
7、u;s,i取9時(shí)延時(shí)時(shí) 間為26 μs。通過分析得出,10次循環(huán)為28 μs是由于外 層循環(huán)造成的,其精度可以達(dá)到2 μs。在設(shè)計(jì)時(shí)應(yīng)該考慮參數(shù)傳遞和RET語句執(zhí)行所需要的時(shí)間周期。實(shí)驗(yàn)分析發(fā)現(xiàn),for語句使 用-i方式,同樣能夠達(dá)到與匯編代碼相同的精度。i取不同值時(shí)延時(shí) 仿真結(jié)果如圖4所示。圖4 i取不同值時(shí)延時(shí)仿真結(jié)果圖3多重嵌套下的C程序延時(shí)在某些情況下,延時(shí)較長,僅使用單層循環(huán)方式是不能完成的。此時(shí),只能使用多層循環(huán)方式,那么多重循環(huán)條件下,C程序的精度如何呢?下面是一個(gè)使用for語句實(shí)現(xiàn)1 s延時(shí)的函數(shù)。延時(shí)函數(shù)void delay1s(vo
8、id) for(k=100;k>0;k-)/ 定時(shí) 1 sfor(i=20;i>O;i-)for( j=248;j>0;j-);主函數(shù)調(diào)用延時(shí)函數(shù)代碼段:while(1) delay1s();scond+=1;為了直接衡量這段代碼的效果,利用Keil C找出這段代碼產(chǎn)生的匯編代碼:C:0x00B37002JNZC:00B7C:0x00B5150CDEC0x0CC:0x00B7E50DMOVA,0x0DC:0x00B9450CORLA,0x0CC:0x00BB70DEJNZC:009BC:0x00BDE50BMOVA,0x0BC:0x00BF150BDE
9、C0x0BC:0x00C17002JNZC:00C5C:0x00C3150ADEC0x0AC:0x00C5E50BMOVA,0x0BC:0x00C7450AORLA,0x0AC:0x00C970CAJNZC:0095C:0x00CB22RET分析匯編代碼,其他匯編代碼使用的不是DJNZ跳轉(zhuǎn)方式,而是DEC和JNZ語句來實(shí)現(xiàn)循環(huán)判斷。1條JNZ指令要花費(fèi)2個(gè)時(shí)鐘周 期,3條指令就需要6個(gè)機(jī)器周期,MOV指令和DEC指令各需要1 小時(shí)鐘周期,1個(gè)時(shí)鐘周期按1 μs算,其精度最多達(dá)到8 μs , 最后加上一條LCALL和一條RET語句,所以整個(gè)延時(shí)精度較差4。利用Keil
10、 C的測試工具,在一處設(shè)置一個(gè)斷點(diǎn)。第1次執(zhí)行到中斷處的時(shí)間為0.000 513 s,第2次執(zhí)行到中斷處的時(shí)間為 1.000 922 s,時(shí)間延遲為1.000 409 s,測試結(jié)果如圖5所示。對于上面的 3種循環(huán)嵌套,循環(huán)次數(shù)為100×20×248=496000,每次循環(huán)的時(shí)間約為2 μs。圖5三重嵌套循環(huán)1 s實(shí)現(xiàn)時(shí)間測試結(jié)果為獲取與匯編語言延時(shí)的差距,同樣進(jìn)行1s的延時(shí),程序代碼段如下:LCALL DEL Y1SINC Seco ndDEL Y1S:MOV R5,#100D2:MOV R6,#20D1:MOV R7,#248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2RET通過Keil C51測試,其實(shí)際延遲時(shí)間為 0.997 943 s。雖然C 語言實(shí)現(xiàn)延時(shí)方式的匯編代碼復(fù)雜度增加,但是與匯編語言
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 社區(qū)活動(dòng)中心裝修施工組織設(shè)計(jì)方案
- 政府行業(yè)政務(wù)服務(wù)平臺(tái)升級(jí)與智能化改進(jìn)方案
- 幼兒園多元文化交流活動(dòng)方案
- 通信設(shè)備制造業(yè)智能制造與質(zhì)量控制改進(jìn)計(jì)劃方案
- B2B電子商務(wù)平臺(tái)銷售合同
- 互聯(lián)網(wǎng)行業(yè)內(nèi)容風(fēng)控管理方案
- 快遞行業(yè)智能分揀與配送系統(tǒng)方案
- 農(nóng)業(yè)資源綜合利用與可持續(xù)發(fā)展方案
- 農(nóng)業(yè)智能倉儲(chǔ)管理系統(tǒng)建設(shè)方案
- 食品行業(yè)質(zhì)量安全追溯體系建立方案
- 腎膿腫護(hù)理查房
- 2023-2024學(xué)年全國小學(xué)四年級(jí)上語文人教版期末試卷(含答案解析)
- 華潤雙鶴財(cái)務(wù)報(bào)表分析報(bào)告
- 牙科診所傳染病報(bào)告制度
- 以諾書-中英對照
- 《義務(wù)教育數(shù)學(xué)課程標(biāo)準(zhǔn)(2022年版)》數(shù)學(xué)新課標(biāo)解讀
- 精神科護(hù)士進(jìn)修匯報(bào)
- 2024年新人教版四年級(jí)數(shù)學(xué)上冊《第5單元第6課時(shí) 平行四邊形和梯形復(fù)習(xí)》教學(xué)課件
- 《北斗每一顆星都在閃亮》教案- 2023-2024學(xué)年高教版(2023)中職語文職業(yè)模塊
- 咪咕在線測評(píng)題
- 專職消防隊(duì)和義務(wù)消防隊(duì)的組織管理制度
評(píng)論
0/150
提交評(píng)論