版权声明: 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。