1.定时器TMOD寄存器
C/T这一位用来控制定时器工作方式。本来T上面有一横表示低电平有效。c为计数,也即是及外部脉冲的个数,也会是定时器溢出及中断。GATE这一位用来设定外部中断脉冲是否可启动定时器。 意思就是当GATE=1时,定时器的启动有二个位控制,即TR0和int0(这是对定时器0来说的,T1的话上二位就是1)。定时器只有在上二位都是一的情况下才会启动。我们就可以利用这个功能来测量脉冲的宽度。
我们知道在其他单片机中我们测脉冲宽度可以利用外部中断在上升沿河下降沿各读取一次定时器值来测定。但51单片机没有上升沿中断,也就没有办法测出高电平宽度。现在我们可以这样做,令TR0=1,GATE=1,这时定时器的启动只有INT0控制。当INT0为高电平时定时器启动,为低电平时定时器关闭。我们设置下降沿中断,在中断中就可以读取高电平所占的时间了。但是这样做只能得到高电平时间按。要想得到脉冲周期,可以再开一个定时器,另外一个就正常工作,这样就可以得到脉冲周期。也就可以求出脉冲宽度了。
T0的工作方式3相信很少人记得,我还没有用过,但是我感觉做起码在我们需要用到的时候,还知道有这个功能。方式3可以把T0当作二个独立的计数器使用。在高级应用中肯定会有用吧。
定时器会存在误差,原因是在执行定时器中断的时候,会占用3到8个机器周期不等。这段时间我们并没有算到计数器初值里面。要想消除误差:1.可以把定时器低八位设为0,中断中只要给TH0赋值,因为此时定时器已经开始启动了,低八位其实已经不是0了。2.将低四位设为0.赋初值时,利用ORL TL1,# ;加上你设定的初值。还有其他方法。
还有一点T0和T1的工作方式2看似工作方式是一样的,其实T1在方式2的时候不能中断,而T0是可以中断的。