機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
初淺研究PIC之延時(shí)函數(shù)和循環(huán)體優(yōu)化
初淺研究PIC之延時(shí)函數(shù)和循環(huán)體優(yōu)化
 更新時(shí)間:2009-7-22 16:41:15  點(diǎn)擊數(shù):0
【字體: 字體顏色
/script>

初淺研究PIC之延時(shí)函數(shù)和循環(huán)體優(yōu)化  
  
  很多朋友說(shuō)C中不能精確控制延時(shí)時(shí)間,不能象匯編那樣直觀。

其實(shí)不然,對(duì)延時(shí)函數(shù)深入了解一下就能設(shè)計(jì)出一個(gè)理想的框價(jià)出來(lái)。

一般的我們都用

for(x=100;--x;){;}此句等同與x=100;while(--x){;};

或for(x=0;x<100;x++){;}

來(lái)寫一個(gè)延時(shí)函數(shù)。

在這里要特別注意:X=100,并不表示只運(yùn)行100個(gè)指令時(shí)間就跳出循環(huán)。

可以看看編譯后的匯編:

x=100;while(--x){;}

匯編后:

    movlw 100
    bcf 3,5
    bcf 3,6
    movwf        _delay
    l2    decfsz         _delay
    goto l2

    return

從代碼可以看出總的指令是是303個(gè),其公式是8+3*(X-1)。注意其中循環(huán)周期是X-1是99個(gè)。

這里總結(jié)的是x為char類型的循環(huán)體,當(dāng)x為int時(shí)候,其中受X值的影響較大。

建議設(shè)計(jì)一個(gè)char類型的循環(huán)體,然后再用一個(gè)循環(huán)體來(lái)調(diào)用它,可以實(shí)現(xiàn)精確的長(zhǎng)時(shí)間的延時(shí)。

下面給出一個(gè)能精確控制延時(shí)的函數(shù),此函數(shù)的匯編代碼是最簡(jiǎn)潔、最能精確控制指令時(shí)間的:

void delay(char x,char y){
                  char z;
             do{
                           z=y;
                          do{;}while(--z);
                  }while(--x);
}

其指令時(shí)間為:7+(3*(Y-1)+7)*(X-1)

如果再加上函數(shù)調(diào)用的call指令、頁(yè)面設(shè)定、傳遞參數(shù)花掉的7個(gè)指令。

則是:14+(3*(Y-1)+7)*(X-1)。

如果要求不是特別嚴(yán)格的延時(shí),可以用這個(gè)函數(shù):

void delay(){
 unsigned int d=1000;
 while(--d){;}
}

此函數(shù)在4M晶體下產(chǎn)生10003us的延時(shí),也就是10MS。

如果把D改成2000,則是20003us,以此類推。

有朋友不明白,為什么不用while(x--)后減量,來(lái)控制設(shè)定X值是多少就循環(huán)多少周期呢?

現(xiàn)在看看編譯它的匯編代碼:

    bcf 3,5
    bcf 3,6 
    movlw 10
    movwf  _delay

  l2
    decf    _delay
    incfsz   _delay,w

   goto l2

   return

可以看出循環(huán)體中多了一條指令,不簡(jiǎn)潔。所以在PICC中最好用前減量來(lái)控制循環(huán)體。

再談?wù)勥@樣的語(yǔ)句:

for(x=100;--x;){;}和for(x=0;x<100;x++){;}

從字面上看2者意思一樣,但可以通過(guò)匯編查看代碼。后者代碼雍長(zhǎng),而前者就很好的匯編出了簡(jiǎn)潔的代碼。

所以在PICC中最好用前者的形式來(lái)寫循環(huán)體,好的C編譯器會(huì)自動(dòng)把增量循環(huán)化為減量循環(huán)。因?yàn)檫@是由處理器硬件特性決定的。

PIC并不是一個(gè)很智能的C編譯器,所以還是人腦才是第一的,掌握一些經(jīng)驗(yàn)對(duì)寫出高效,簡(jiǎn)潔的代碼是有好處的。

  • 上一篇: PIC 8位單片機(jī)特點(diǎn)
  • 下一篇: 基于PIC的無(wú)線數(shù)據(jù)傳輸發(fā)射機(jī)設(shè)計(jì)
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(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ī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(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ì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

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