新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機C語言延時程序和循環子程序

        PIC單片機C語言延時程序和循環子程序

        作者: 時間:2016-11-13 來源:網絡 收藏
        很多朋友說C中不能精確控制延時時間,不能象匯編那樣直觀。

        其實不然,對延時函數深入了解一下就能設計出一個理想的框價出來。

        本文引用地址:http://www.104case.com/article/201611/316098.htm

        一般的我們都用

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

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

        來寫一個延時函數。

        在這里要特別注意:X=100,并不表示只運行100個指令時間就跳出循環。

        可以看看編譯后的匯編:

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

        匯編后:

        movlw 100

        bcf 3,5

        bcf 3,6

        movwf_delay

        l2 decfsz _delay

        goto l2

        return

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

        這里總結的是x為char類型的循環體,當x為int時候,其中受X值的影響較大。

        建議設計一個char類型的循環體,然后再用一個循環體來調用它,可以實現精確的長時間的延時。

        下面給出一個能精確控制延時的函數,此函數的匯編代碼是最簡潔、最能精確控制指令時間的:

        void delay(char x,char y){

        char z;

        do{

        z=y;

        do{;}while(--z);

        }while(--x);

        }

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

        如果再加上函數調用的call指令、頁面設定、傳遞參數花掉的7個指令。

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

        如果要求不是特別嚴格的延時,可以用這個函數:

        void delay(){

        unsigned int d=1000;

        while(--d){;}

        }

        此函數在4M晶體下產生10003us的延時,也就是10MS。

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

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

        現在看看編譯它的匯編代碼:

        bcf 3,5

        bcf 3,6

        movlw 10

        movwf _delay

        l2

        decf _delay

        incfsz _delay,w

        goto l2

        return

        可以看出循環體中多了一條指令,不簡潔。所以在PICC中最好用前減量來控制循環體。

        再談談這樣的語句:

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

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

        所以在PICC中最好用前者的形式來寫循環體,好的C編譯器會自動把增量循環化為減量循環。因為這是由處理器硬件特性決定的。

        PIC并不是一個很智能的C編譯器,所以還是人腦才是第一的,掌握一些經驗對寫出高效,簡潔的代碼是有好處的。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 山东省| 云和县| 马关县| 南昌市| 西乌珠穆沁旗| 若尔盖县| 漳平市| 英吉沙县| 永济市| 文昌市| 桐梓县| 共和县| 梁河县| 封开县| 梧州市| 凤阳县| 广丰县| 南和县| 承德县| 车险| 若羌县| 剑河县| 大冶市| 游戏| 惠东县| 平陆县| 平南县| 清原| 淄博市| 巴中市| 盘锦市| 红原县| 西青区| 延津县| 砚山县| 贵德县| 元谋县| 吉林省| 平陆县| 兴化市| 宜都市|