首先看一个代码:
//定时器初始化函数
void Init_Timer0(){
TMOD=0X01; //定时器T0,工作方式2为16位定时/计数器;
TH0=(65536-5000)/256; //高四位寄存器的值;
TL0=(65536-5000)%256; //低四位寄存器的值;
ET0=1; //能定时/计数器中断;
TR0=1; //启动定时器T0 ;
EA=1; //开启总中断;
}
//定时器T0中断服务函数
void time() interrupt 1
{
TH0=(65536-5000)/256; //5000us=5ms
TL0=(65536-5000)%256; //5000us=5ms
count++;
if(count==100){
P00=~P00;//每隔0.5秒实现LED灯交替闪烁
count=0;
}
1.-设置定时器的工作模式
TMOD=0X01;
TMOD-定时器的工作模式设定
0X00 : 13位定时/计数器
0X01 : 16位定时/计数器,最大计数值65536
0X10 : 自动重装8位定时计数器,最大计数值255
0X11 : T0分为两个独立的8为定时/计数器,T1无计数
常用:0X10 模式
2.-初始化定时器的高八位和低八位的寄存器的时间
TH0=(65536-5000)/256; //高四位寄存器的值;
TL0=(65536-5000)%256; //低四位寄存器的值;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
3.-允许定时器中断
ET0=1; //能定时/计数器中断;
ET0:定时/计数器T0中断控制位。ET0=1,允许T0中断;ET0=0,禁止T0中断。
4.-打开定时器
TR0=1; //启动定时器T0 ;
5.-开总中断
EA=1; //开启总中断;
EA:中断总控制位。EA=1,CPU开放所有中断;EA=0,CPU禁止所有中断。
小结:
TF:定时器溢出标志。溢出时该位自动置1。中断执行时硬件清0或软件清0
//如果没有开启中断,则用TF溢出来判断。
代码示例:
void main()
{
TMOD = 0x10; //定时器 工作模式1
TH0=(65536-50000)/256; //高四位寄存器的值;
TL0=(65536-50000)%256; //低四位寄存器的值;
TR1 = 1; //启动定时器
while(1)
{
if(TF1 == 1)
{
TF1 = 0;
TH0=(65536-50000)/256; //高四位寄存器的值;
TL0=(65536-50000)%256; //低四位寄存器的值;
counter ++;
}
if(counter == 20) //1秒 50000us=50ms 50*20ms=1s
{
counter = 0;
P00 = ~P00;//每隔一秒LED灯闪烁
}
}
}
TR:定时器运行控制位。置1开始计时,清0停止计