从上图可以看到,GATE先经过非门,再和INT0引脚作为或门的输入。这里简单提一下数字电路中的与门、或门和非门。顾名思义,与门当且仅当所有输入都位高电平时输出才是高电平,或门只要有其中之一输入是高电平则输出就是高电平,非门的输出电平状态刚好和输入电平状态相反。因此从定时器0方式1的逻辑结构图中,当GATE=0,且TR0=1时,TL0低8位寄存器便在机器周期的作用下开始加1计数。当TL0计满之后向TH0进位,直到TH0也计满,此时再来一个计数,计数器便溢出TF0置1,发出定时器0中断申请。
在清楚定时器的工作方式之后,重点就是如何让定时器定时我们想要的时间呢?这就涉及到定时器的初值问题。定时器一旦启动,便在TL0和TH0原来的基础上开始每隔一个机器周期加1操作直到溢出。假设在程序开始执行时TL0和TH0的初值都是0,单片机的晶振是12MHz,那么该单片机的机器周期就是1us,计满TL0和TH0一共需要(2的16次方减1=65535)个数,再来一个加1就溢出。也就是说定时器最多可以定时的时间是65536us(65.536ms),可想而知如果我们需要定时器能够定时50ms的话,那么TL0和TH0必须有一定的初值。通俗的理解就是定时器的16位计数器是个水桶,这个水桶最多能够倒满65.536斤水,而我们只需要往水桶里到50斤水就把水桶倒满,这个时候水桶里必须要有15.536斤水,这就是初值。
这里我们就正式开始如何确定定时器的初值,我们要让定时器定时50ms就产生一次中断,这个时候TL0和TH0装入的总数就是65536-50000=15536,把15536对256取模:15536/256=60装入TH0中,把15536对256求余:15536%256=176装入TL0中。这样就得到我们想要的初值了。