定时器的几种工作方式中,除0和前面的1类似都需要初始化计数值,然后开始计数,计数溢出后,需要再次控制计数的初值,但工作模式2不同于此,工作方式2将THx和TLx分开处理,将初值存放在THx中,计数时只处理TLx的8位,所以计数最大值为2^8=256,方式2的另一个特点是,当计数溢出后,不需要控制初值,而是会自动将THx中的值做为计数初值重新开始计数。用工作方式2,实现1s延时程序如下:
查询方式
#include <reg52.h> sbit LED = P0^;
unsigned int vT = ; void main()
{
LED = ; // 初始亮灯
TMOD = 0x02; // 工作模式2 最大计数值256
TH0 = 0x06; // 从6开始 256-6=250 * 1us = 0.25ms
TL0 = 0x06;
TR0 = ; // 启动定时器0
while()
{
if (TF0 == ) // 如果定时器计数溢出
{
TF0 = ;
vT++;
if (vT == ) // 0.25ms * 4000 = 1000ms = 1s
{
LED = !LED;
vT = ;
}
}
}
}
中断方式
#include <reg52.h> sbit LED = P0^;
unsigned int vT = ; void main()
{
LED = ; // 初始亮
TMOD = 0x02; // 模式2
TH0 = 0x06; // 256-6=250 * 1us = 0.25ms
TL0 = 0x06;
ET0 = ; // 定时器0中断开启
EA = ; // 总中断开
TR0 = ; // 定时器0开启
while();
} void MyInterrupt(void) interrupt // 中断服务程序
{
vT++;
if (vT == ) // 4000*0.25ms=1000ms=1s
{
LED = !LED;
vT = ;
}
}