单片机延时程序的设计思想
单片机编程中,延时程序使用比较多,根据其延时方式不同可分为两类:
一》阻塞式延时;
二》非阻塞式延时;
阻塞式延时,最常用,通常是在原地循环若干次,通过消耗机器周期来实现。此时,CPU再不能干别的事(CT0/CT1/CT2/串口仍可工作,延时可被中断暂时打断,会使延时加长),实时性比较差。
非阻塞式延时是在延时期间CPU仍可干别的事,不会在哪儿等,实时性比较好。
打个比方,你在环形操场跑步,相当于CPU的PC指针在主程序中循环(多数程序都是这样)。有个延时程序要求你等100毫秒把手举起来一下(用此表示CPU处理一个事件):当是阻塞式延时方式时,你就在原地踏步跑,等100毫秒后,你把手举起来一下再接着跑;当是非阻塞式延时方式时,你只是在一个地方放个秒表,并启动它,但你并不停下而是继续跑。每次跑到这个地方,你只要看一下秒表,看是否到100毫秒,若到了,你就把手举起来一下,若没到,你就继续沿跑道跑。
从上边的例子可清楚看出,阻塞式延时,影响主程序循环一次的执行时间(影响实时性!);非阻塞式延时,基本不影响主程序循环周期(CPU只是多执行一两条指令判断一下时间是否到),但需要有个“秒表”。这个“秒表”可用一个定时器完成,并作为整个系统的时基,供需要时基的部分使用;如单片机控制系统的人机界面,显示闪烁时就需要。比如,将定时器0设定为5毫秒,由此可产生10毫秒,25毫秒,50毫秒,100毫秒,250毫秒和500毫秒等等时钟信号。
现在分析影响延时精度的因素:
影响阻塞式延时的因素有:
1)设计程序时计算执行机器周期数的偏差;
2)中断处理程序的额外时延;
影响非阻塞式延时的因素有:
1)所用定时器基本时基的精度(如上例:5毫秒);
2)主程序的循环周期;这是随机的,比如,当看秒表时,时间还没到,
在下次看表之前时间却到了,最坏情况是差一个主程序循环周期;
3)其他中断处理程序的额外时延;这是随机的,比如,在看表之前时间已到,
这时有个中断也被响应,就要加上中断处理程序的时间延迟;
在实际使用中,我们根据具体情况选择不同的延时方式。
这种非阻塞式延时的思想,我们成功用在许多单片机控制系统中,效果很好。