單片機編程中,延時程序使用比較多,根據其延時方式不同可分為(wei) 兩(liang) 類:
一》阻塞式延時;
二》非阻塞式延時;
阻塞式延時,最常用,通常是在原地循環若幹次,通過消耗機器周期來實現。此時,CPU再不能幹別的事(CT0/CT1/CT2/串口仍可工作,延時可被中斷暫時打斷,會(hui) 使延時加長),實時性比較差。
非阻塞式延時是在延時期間CPU仍可幹別的事,不會(hui) 在哪兒(er) 等,實時性比較好。
打個(ge) 比方,你在環形操場跑步,相當於(yu) CPU的PC指針在主程序中循環(多數程序都是這樣)。有個(ge) 延時程序要求你等100毫秒把手舉(ju) 起來一下(用此表示CPU處理一個(ge) 事件):當是阻塞式延時方式時,你就在原地踏步跑,等100毫秒後,你把手舉(ju) 起來一下再接著跑;當是非阻塞式延時方式時,你隻是在一個(ge) 地方放個(ge) 秒表,並啟動它,但你並不停下而是繼續跑。每次跑到這個(ge) 地方,你隻要看一下秒表,看是否到100毫秒,若到了,你就把手舉(ju) 起來一下,若沒到,你就繼續沿跑道跑。
從(cong) 上邊的例子可清楚看出,阻塞式延時,影響主程序循環一次的執行時間(影響實時性!);非阻塞式延時,基本不影響主程序循環周期(CPU隻是多執行一兩(liang) 條指令判斷一下時間是否到),但需要有個(ge) “秒表”。這個(ge) “秒表”可用一個(ge) 定時器完成,並作為(wei) 整個(ge) 係統的時基,供需要時基的部分使用;如單片機控製係統的人機界麵,顯示閃爍時就需要。比如,將定時器0設定為(wei) 5毫秒,由此可產(chan) 生10毫秒,25毫秒,50毫秒,100毫秒,250毫秒和500毫秒等等時鍾信號。
現在分析影響延時精度的因素:
影響阻塞式延時的因素有:
1)設計程序時計算執行機器周期數的偏差;
2)中斷處理程序的額外時延;
影響非阻塞式延時的因素有:
1)所用定時器基本時基的精度(如上例:5毫秒);
2)主程序的循環周期;這是隨機的,比如,當看秒表時,時間還沒到,
在下次看表之前時間卻到了,最壞情況是差一個(ge) 主程序循環周期;
3)其他中斷處理程序的額外時延;這是隨機的,比如,在看表之前時間已到,
這時有個(ge) 中斷也被響應,就要加上中斷處理程序的時間延遲;
在實際使用中,我們(men) 根據具體(ti) 情況選擇不同的延時方式。
這種非阻塞式延時的思想,我們(men) 成功用在許多單片機控製係統中,效果很好。