51单片机的定时器T0和T1是可以同时使用的,但是在编程的时候需要注意一下,防止寄存器的设置被覆盖以及定时溢出问题。详细介绍如下:
1.注意事项之一:寄存器设置
在使用单片机的定时器寄存器时,有两个寄存器非常重要,是TMOD和TCON,TMOD寄存器包含寄存器的工作模式、定时模式等,TCON包含了中断允许、定时器启动、中断标志等的设置。
在设置TMOD时建议直接操作TMOD,防止T0和T1单独按位操作引起,防止寄存器的设置被覆盖。比如T0和T1都是用作定时器,且工作在方式1,则TMOD=0x11;中断总开关EA=1;定时器中断允许ET0=1;ET1=1;定时器启动TR0=1;TR1=1等。
2.注意事项之二:定时器初值的计算
51单片机的定时器是加法寄存器,在设置定时器初值时需要计算一下。以16位定时方式举例,最大可以计数65535,假设采用f=12M的时钟频率,那么单片机的机器周期为:T=1/f=1us。如果计时50ms的话,需要50000/1=50000个机器周期,则定时50ms需要的初值为(65536-50000),所以初值如下:
TH = (65536-50000)/256;
TL = (65536-50000)%256;
3.注意事项之三:定时器防溢出
定时器的寄存器设置好之后,可以设置定时器使用过程中的定时变量,必须要注意定时变量的数据类型,我在编程时多次犯过这种错误,比如变量的类型是char型,但是在定时器判断时,却和1000进行比较。因为char型最大值是255,这样就永远到不了1000,所以永远等不到定时器的触发。
4.注意事项之四:中断优先级
定时器T0和定时器T1在同时使用时,不会同时触发定时器中断,中断只有一个,哪一个先触发,会涉及到中断优先级的问题,需要配置IP寄存器,默认的中断优先级如下:
外部中断0>定时器T0>外部中断1>定时器T1>串口中断。
如果没有特殊优先级要求,则可以选择默认设置。