新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機Keil C 延時程序

        51單片機Keil C 延時程序

        作者: 時間:2013-03-04 來源:網絡 收藏

        0004 70FA JNZ ?C0004

        ; SOURCE LINE

        # 16

        0006 ?C0006:

        0006 22 RET

        ; FUNCTION _delay1 (END)

        雖說生成的代碼跟用for語句是不大一樣,不過我可以毫無疑問的說,這兩種方法的效率是一樣的。似乎到此為止了,因為我實在想不出來源程序還有什么簡化的余地。看來我就要得出來這個結論了:“如果需要us級的延時精度,需要時用匯編語言。”但是真的是這樣嗎?我還是不甘心。因為我不相信大名鼎鼎的

        Keil C 編譯器居然連 djnz 都不會用???因為實際上程序體里只需要一句 loop: djnz r7,

        loop。近乎絕望之際(往往人在這種情況下確可以爆發出來,哦呵呵呵~~~),我隨手改了一下:

        void delay1(unsigned char i)

        {

        while(--i);

        }

        心不在焉的編譯,看源碼:

        ; FUNCTION _delay1 (BEGIN)

        ; SOURCE LINE

        # 13

        ;---- Variable 'i' assigned to Register 'R7' ----

        ; SOURCE LINE

        # 14

        0000 ?C0004:

        ; SOURCE LINE

        # 15

        0000 DFFE DJNZ R7,?C0004

        ; SOURCE LINE

        # 16

        0002 ?C0006:

        0002 22 RET

        ; FUNCTION _delay1 (END)

        天~~~奇跡出現了......我想這個程序應該已經可以滿足一般情況下的需要了。如果列個表格的話:

        i delay time/us

        1 5

        2 7

        3 9

        ...

        計算延時時間時,已經算上了調用函數的lcall語句所花的2個時鐘周期的時間。

        終于,結果已經明了了。只要合理的運用,C還是可以達到意想不到的效果。很多朋友抱怨C效率比匯編差了很多,其實如果對Keil

        C的編譯原理有一個較深入的理解,是可以通過恰當的語法運用,讓生成的C代碼達到最優化。即使這看起來不大可能,但還是有一些簡單的原則可循的:1.盡量使用unsigned型的數據結構。2.盡量使用char型,實在不夠用再用int,然后才是long。3.如果有可能,不要用浮點型。4.使用簡潔的代碼,因為按照經驗,簡潔的C代碼往往可以生成簡潔的目標代碼(雖說不是在所有的情況下都成立)。5...想不起來了,哦呵呵呵~~~(惡寒~~)


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 石棉县| 贵阳市| 连南| 驻马店市| 齐齐哈尔市| 珲春市| 绿春县| 报价| 武义县| 信丰县| 新丰县| 龙陵县| 云林县| 凌海市| 宿州市| 阿尔山市| 华安县| 扎鲁特旗| 香格里拉县| 西城区| 鄂伦春自治旗| 繁昌县| 齐齐哈尔市| 海淀区| 恩施市| 蒙阴县| 锡林郭勒盟| 勐海县| 彭泽县| 丁青县| 峨山| 广丰县| 百色市| 江阴市| 宜良县| 山阳县| 通化市| 太原市| 巴林左旗| 武汉市| 阳西县|