日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
51單片機(jī) Keil C 延時(shí)程序的簡單研究
51單片機(jī) Keil C 延時(shí)程序的簡單研究
 更新時(shí)間:2008-7-26 19:59:46  點(diǎn)擊數(shù):2
【字體: 字體顏色
應(yīng)用單片機(jī)的時(shí)候,經(jīng)常會(huì)遇到需要短時(shí)間延時(shí)的情況。需要的延時(shí)時(shí)間很短,一般都是幾十到幾百微妙(us)。有時(shí)候還需要很高的精度,比如用單片機(jī)驅(qū)動(dòng)DS18B20的時(shí)候,誤差容許的范圍在十幾u(yù)s以內(nèi),不然很容易出錯(cuò)。這種情況下,用計(jì)時(shí)器往往有點(diǎn)小題大做。而在極端的情況下,計(jì)時(shí)器甚至已經(jīng)全部派上了別的用途。這時(shí)就需要我們另想別的辦法了。 
以前用匯編語言寫單片機(jī)程序的時(shí)候,這個(gè)問題還是相對容易解決的。比如用的是12MHz晶振的51,打算延時(shí)20us,只要用下面的代碼,就可以滿足一般的需要: 
MOV r0, #09h 
loop: djnz r0, loop 
51單片機(jī)的指令周期是晶振頻率的1/12,也就是1us一個(gè)周期。MOV r0, #09h需要2個(gè)極其周期,djnz也需要2個(gè)極其周期。那么存在r0里的數(shù)就是(20-2)/2。用這種方法,可以非常方便的實(shí)現(xiàn)256us以下時(shí)間的延時(shí)。如果需要更長時(shí)間,可以使用兩層嵌套。而且精度可以達(dá)到2us,一般來說,這已經(jīng)足夠了。 
現(xiàn)在,應(yīng)用更廣泛的毫無疑問是Keil的C編譯器。相對匯編來說,C固然有很多優(yōu)點(diǎn),比如程序易維護(hù),便于理解,適合大的項(xiàng)目。但缺點(diǎn)(我覺得這是C的唯一一個(gè)缺點(diǎn)了)就是實(shí)時(shí)性沒有保證,無法預(yù)測代碼執(zhí)行的指令周期。因而在實(shí)時(shí)性要求高的場合,還需要匯編和C的聯(lián)合應(yīng)用。但是是不是這樣一個(gè)延時(shí)程序,也需要用匯編來實(shí)現(xiàn)呢?為了找到這個(gè)答案,我做了一個(gè)實(shí)驗(yàn)。 
用C語言實(shí)現(xiàn)延時(shí)程序,首先想到的就是C常用的循環(huán)語句。下面這段代碼是我經(jīng)常在網(wǎng)上看到的: 
void delay2(unsigned char i) 

for(; i != 0; i--); 

到底這段代碼能達(dá)到多高的精度呢?為了直接衡量這段代碼的效果,我把 Keil C 根據(jù)這段代碼產(chǎn)生的匯編代碼找了出來: 
; FUNCTION _delay2 (BEGIN) 
; SOURCE LINE # 18 
;---- Variable ’i’ assigned to Register ’R7’ ---- 
; SOURCE LINE # 19 
; SOURCE LINE # 20 
0000 ?C0007: 
0000 EF MOV A,R7 
0001 6003 JZ ?C0010 
0003 1F DEC R7 
0004 80FA SJMP ?C0007 
; SOURCE LINE # 21 
0006 ?C0010: 
0006 22 RET 
; FUNCTION _delay2 (END) 
真是不看不知道~~~一看才知道這個(gè)延時(shí)程序是多么的不準(zhǔn)點(diǎn)~~~光看主要的那四條語句,就需要6個(gè)機(jī)器周期。也就是說,它的精度頂多也就是6us而已,這還沒算上一條 lcall 和一條 ret。如果我們把調(diào)用函數(shù)時(shí)賦的i值根延時(shí)長度列一個(gè)表的話,就是: 
i delay time/us 
0 6 
1 12 
2 18 
... 
因?yàn)楹瘮?shù)的調(diào)用需要2個(gè)時(shí)鐘周期的lcall,所以delay time比從函數(shù)代碼的執(zhí)行時(shí)間多2。順便提一下,有的朋友寫的是這樣的代碼: 
void delay2(unsigned char i) 

unsigned char a; 
for(a = i; a != 0; a--); 

可能有人認(rèn)為這會(huì)生成更長的匯編代碼來,但是事實(shí)證明: 
; FUNCTION _delay2 (BEGIN) 
; SOURCE LINE # 18 
;---- Variable ’i’ assigned to Register ’R7’ ---- 
; SOURCE LINE # 19 
; SOURCE LINE # 21 
;---- Variable ’a’ assigned to Register ’R7’ ---- 
0000 ?C0007: 
0000 EF MOV A,R7 
0001 6003 JZ ?C0010 
0003 1F DEC R7 
0004 80FA SJMP ?C0007 
; SOURCE LINE # 22 
0006 ?C0010: 
  • 上一篇: 8051系列單片機(jī)Basic開發(fā)環(huán)境
  • 下一篇: ADC0832數(shù)字電壓表數(shù)碼管顯示
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1