新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 軟件延時的誤區

        軟件延時的誤區

        作者: 時間:2016-11-13 來源:網絡 收藏
        通常在大學里學習單片機編程,老師都是教導要寫程序流程,而且寫出來的流程幾乎是一條長龍偶爾附加點分支判斷。這樣寫出來的程序條理比較清晰、易懂,但是通常問題多多,比如我突然間要加點東西進去,發現系統不正常了。

        往往這些問題都是整個流程上附加的延時過多導致的。延時程序是比較直觀明了的程序,但是也破壞單片機的整機性能,因為延時單片機處于全速運行狀態。

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

        我現在的腦海想起以前寫的流程:初始化->顯示->按鍵->其他功能->結束。

        1.比如說顯示,肉眼不可分辨是50HZ以上,所以說用4個數碼管動態顯示平均每個顯示是5ms。按照以前的觀點是這樣寫的 第一個數碼管點亮->延時幾毫秒、滅第一個、點亮第二個->...->延時、滅最后個、點亮第一個。 如果8個數碼管的動態顯示,豈不是得有 8 * 幾毫秒的 延時。

        2.還有個按鍵,按鍵得有個去除抖動,通常是軟件延時,大約在20ms, 如果在加上顯示的幾十毫秒,那這延時是相當恐怖的。

        3.其他功能函數也是有附帶延時,特別是驅動程序,比如MAX7279讀取操作都是需要一定延時,但是這種延時都是在us級別,對比與ms級別可以忽略。

        筆者建議寫程序,特別寫到延時程序,考慮下你的延時得多久,如果是ms級別,考慮用定時器中斷處理。

        比如說顯示程序。假如8個數碼管動態顯示。那么你就得考慮20ms內8個數碼管刷新一次,那么意味著每個數碼管顯示時間為2.5ms。

        那么程序如下:

        volatile unsigned char time_2500_flag; //2.5ms標志

        void TimerA(void) //定時器初始化

        {

        //初始化,配置為500us中斷一次

        }

        #pragma interrupt_handler TimerA_ISR:NUM
        void Timer1_ISR(void) //中斷服務程序

        {

        static unsigned char cnt = 0;

        //reload 重新賦值

        if (++cnt > 5)

        {

        cnt = 0;

        time_2500_flag = 1;

        }

        }

        void Display(void)

        {

        ;

        }

        void main(void)

        {

        //初始化

        for (;;)

        {

        if (time_2500_flag == 1)

        {

        time_2500_flag = 0;

        Display();

        }

        }

        }

        程序寫到這里。

        顯示程序這里要做特別處理,執行一次顯示程序,數碼管依次點亮就OK。



        關鍵詞: 軟件延時誤

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 庐江县| 洛阳市| 汝州市| 调兵山市| 满城县| 东安县| 贵德县| 冀州市| 桐柏县| 山阳县| 鲁甸县| 剑河县| 巧家县| 保靖县| 新邵县| 高淳县| 民和| 砚山县| 毕节市| 兴安县| 胶州市| 平陆县| 镇安县| 东乡县| 中卫市| 双鸭山市| 托克托县| 潮安县| 探索| 邵阳市| 长阳| 山阴县| 郴州市| 赤水市| 曲麻莱县| 昌图县| 勃利县| 射阳县| 双辽市| 松江区| 大同市|