Timer/Counter

版权声明: https://blog.csdn.net/JRK_CSDN/article/details/87698165

虽说是定时/计数器,其实还是计数器,计数*机器周期=定时

TMOD
Timer 1 Timer 0
GATE C/T M1 M0 GATE C/T M1 M0
0:TR1 = 1时启动T1 0:定时 00:13位(8192) 0:TR0 = 1时启动T0 0:定时 00:13位(8192)
01:16位(65536) 01:16位(65536)
1:TR1 · INTR1 = 1时启动T1 1:计数 10:8位重载 1:TR1 · INTR1 = 1时启动T1 1:计数 8位重载
无方式3 11:8位×2(256×2)
  • 常用:
    16位定时器0:TMOD = (TMOD & 0xF0) | 0x01
    16位定时器1:TMOD = (TMOD & 0x0F) | 0x10

Time.c

//1 ~ 70ms内定时计数

extern u8 shift = 0x01;
extern u8 buff = 0;

void ConfigTimer0(u16 ms) //less than 70ms 
{
 u32 onetime;

 onetime = 11059200 /12;
 onetime = (onetime * ms) / 1000;

 onetime = 65536 - onetime;
 T0_H = (u8)(onetime>>8);
 T0_L = (u8)onetime;

 TMOD = (TMOD & 0xF0) | 0x01;
 TH0 = T0_H;
 TL0 = T0_L;
 ET0 = 1;
 TR0 = 1;
}
//超70ms可用中断计数法实现

void Interrupt_Timer0() interrupt 1
{
 static u16 count_LED = 0;
 TH0 = T0_H;		//方式1 记得程序手动重载
 TL0 = T0_L;
 
 if(count_LED > 100)
 {
    Flow_LED();
    count_LED = 0;
 }
   
 count_LED++;
}

注意:

① STC-ISP的Timer程序不带总中断开启EA=1,切记加上。
② 本例程基于12T模式下,仔细调整STC-ISP参数,或修改变量onetime。
③ 循环计时的情况下,中断切记程序手动重载初值。
④ SEG、KBD的扫描程序均可使用定时器中断,推荐时间1ms。

猜你喜欢

转载自blog.csdn.net/JRK_CSDN/article/details/87698165