STC89C52单片机有3个定时器,分别是T0,T1和T2。一般够用,一个串口波特率发生,2个计时。其中T2有捕捉功能。由于定时器较少,一般用法都是在一个定时器中,设置不同的时间位,如1ms定时,在中断中进行计数,通过计数周期不同来产生不同的时间位,设置10ms定时时间位flag10ms,设置100ms定时时间位flag100ms,设置1s定时时间位flag1s。但这也有缺点,当计数周期为倍数关系时,软件就要额外处理,该怎么协调时间位的处理,如1s定时到,其实10ms和100ms的标志位都会置位。
确实定时器资源少,会影响使用,软件处理也会复杂,建议还是更换升级的单片机,如STC12系列,有2个定时器,2路PCA可以作为定时器,还有独立的波特率发生器,不占用定时器。
或者更高一级,STC15系列,有5个定时器,2路PCA,共有7个定时器,足够使用。这些定时器的应用基本一致,配置好寄存器,就可以工作了。而且中断等级分了四等,方便处理多中断任务。
附图一,89C52的内部结构。附图二,STC12的配置。附图三,STC15的配置。附图四,STC15中断结构。
两路定时器用在三个任务,理论上是没问题的。但是如果用C写代码,按个人经验,出来的效果比较差,特别是中断时间较短的时候。强烈建议用汇编来完成中断内的程序,基本上我在写这类代码时需要计算各个状态的代码时长,很多地方是要用nop指令去平衡的。如果时序达到微秒级,就不要用51单片机了,建议用时钟较高的ARM芯片或者用CPLD解决。