分析
为了将这个问题讲清楚,首先我们要了解delay和定时器这两种方式的实现原理以及实现的目的。
delay的方式
delay的方式就是使用单片机的空指令nop、单片机的逻辑指令如while if等组成的达到延时效果的函数比如
void Delay1us() //@11.0592MHz
{
_nop_();
_nop_();
_nop_();
}
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
上述程序都是delay函数,通过组合nop、while函数等达到使单片机cpu空转,也就是什么都不做但是会占用系统的时间来达到完成延时的目的,其中一个nop指令会占用一个周期,并且执行nop指令期间cpu是什么都不会执行的,相当于白白等着时间流逝,而这个时间如何算呢?一个nop指令是一个机器周期,如果用普通的AT8951单片机并且12M的晶振来看一个nop指令的时间为12*(1/12M)=1us,乘以12的原因是此款单片机是12T的单片机,也就是我们常说的12的时钟周期才是一个机器周期。那么我们stc15f2k61s2的单片机nop指令又是多少时间呢?是(1/12M),因为这款单片机是1T的单片机,这个需要结合具体的芯片手册去看。使用这种方式让cpu在一段时间内不作任何操作,达到延时的目的,这种方式就叫做delay方式。
定时器的方式
首先说一下单片机的定时器的原理,单片机的定时器是一个结合触发器、寄存器等组成的一个达到定时器效果并且可以实现中断功能的模块。
简要说一下定时器的工作的流程
定时器首先会使用寄存器来设定初始值来达到设定定时时间的目的,然后开启定时器计时后,定时器到了指定时间触发中断程序然后重载定时器的初值后,继续工作,一直循环下去,也就是每隔设定时间后就会执行指定的程序。这个时候就会有人问了?定时器在等待时间到来的时候不是也没有做什么吗?
其实不是这样的
在定时器开启后,cpu就不会再管定时器的计时部分了,这个时候cpu就去做其他你写的程序了,然后等到时间到了,中断触发程序就会通知cpu叫它去处理定时器时间到了后的中断程序了。
这样在等待时间到的这段时间cpu是在正常工作的,大大加大了cpu的效率!
结束
这里我只是简单说了一下原因,当然,对定时器的了解当然不止于此,需要自己结合芯片手册看,定时器还有计数模式,还有更高级的比如PCA定时器等,有兴趣可以自己下去了解。