定时器0是16位定时器,40MHz下最大约能定时19ms,若配合8位预分频器,可组成24位定时器,最大约定时5s。
主要寄存器/控制位
TM0PS(8位预分频器):不使用时,设置为0即可。
T0_CT(定时器/计数器选择位):0为定时器,1位计数器。
T0x12(定时器速度控制位):0为12分频模式(分频后可以定时更长),1为不分频模式。
TH0|TL0(定时器计数值):两个8位寄存器共同组成16位寄存器。
TMOD[b0-b1](定时器/计数器模式选择位):
0为16位自动重装载模式,即16位计数值溢出时,硬件自动为定时器赋予计数值,并重新开始计数(常用)
1为16位不自动重装载模式,当计数值溢出时,若不进行软件赋予计数值,将从0开始计数
2为8位自动重装载模式,只使用TL0一个8位寄存器,进行计数工作
3为不可屏蔽中断的16位自动重装载模式,与模式0相同,全场最高中断优先级,且不可屏蔽,常用于操作系统的系统节拍定时器
重装载值计算(16位)
手册中介绍的定时器周期T与16位重装载值的关系公式如下:
T = {{65536 - [TH0,TL0]} \over {SYSclk/(TM0PS + 1)}} \times T0x12
对我们而言,系统时钟SYSclk为已知变量,TM0PS和T0x12为预设置变量。
因此,可以通过等式变换得到:
65536 - [TH0,TL0] = {T \over {T0x12}} \times {{SYSclk} \over {(TM0PS + 1)}}
最终能够得到一个预期时间为自变量(秒),16位重装载值为因变量的公式:
[TH0,TL0] = 65536 - ({{SYSclk \times T} \over {T0x12 \times (TM0PS + 1)}})
定时器初始化函数
综合以上所有条件,写出一个定时器0的初始化函数就不难了

对于中断函数,这里作时基定时器:
1倍时基B_1T,每次溢出时置1;
10倍时基B_10T,溢出10次时置1;
以此类推.........

定时器应用
// 这里使用16位重装载模式,12T分频,定时1ms
Timer0_Init(TIM_16BitAutoReload, TIM_CLOCK_12T, 1, TIM_ms); // 1ms定时
// 主循环中每秒+1,并使用数码管显示个位数,串口打印数值
if (B_1000T)
{
B_1000T = 0;
d++;
SMG_Show_Num(SEG3, d % 10, 0);
printf("count=%d\r\n", d);
}
串口打印:1秒误差大约在10ms左右,1分钟误差大约在100ms左右
[23:16:56.396]接收←欢迎使用AI8051U开发板【火烛】!
[23:16:57.296]接收←count=1
[23:16:58.287]接收←count=2
[23:16:59.293]接收←count=3
[23:17:00.284]接收←count=4
[23:17:01.289]接收←count=5
[23:17:02.280]接收←count=6
[23:17:03.285]接收←count=7
[23:17:04.276]接收←count=8
[23:17:05.281]接收←count=9
[23:17:06.271]接收←count=10
[23:17:07.277]接收←count=11
[23:17:08.267]接收←count=12
[23:17:09.272]接收←count=13
[23:17:10.278]接收←count=14
[23:17:11.268]接收←count=15
[23:17:12.273]接收←count=16
[23:17:13.263]接收←count=17
[23:17:14.268]接收←count=18
[23:17:15.260]接收←count=19
[23:17:16.265]接收←count=20
[23:17:17.256]接收←count=21
[23:17:18.261]接收←count=22
[23:17:19.251]接收←count=23
[23:17:20.256]接收←count=24
[23:17:21.247]接收←count=25
[23:17:22.252]接收←count=26
[23:17:23.243]接收←count=27
[23:17:24.249]接收←count=28
[23:17:25.240]接收←count=29
[23:17:26.245]接收←count=30
[23:17:27.235]接收←count=31
[23:17:28.240]接收←count=32
[23:17:29.231]接收←count=33
[23:17:30.236]接收←count=34
[23:17:31.227]接收←count=35
[23:17:32.232]接收←count=36
[23:17:33.222]接收←count=37
[23:17:34.228]接收←count=38
[23:17:35.233]接收←count=39
[23:17:36.224]接收←count=40
[23:17:37.229]接收←count=41
[23:17:38.219]接收←count=42
[23:17:39.225]接收←count=43
[23:17:40.215]接收←count=44
[23:17:41.220]接收←count=45
[23:17:42.211]接收←count=46
[23:17:43.216]接收←count=47
[23:17:44.207]接收←count=48
[23:17:45.212]接收←count=49
[23:17:46.202]接收←count=50
[23:17:47.208]接收←count=51
[23:17:48.198]接收←count=52
[23:17:49.204]接收←count=53
[23:17:50.194]接收←count=54
[23:17:51.200]接收←count=55
[23:17:52.205]接收←count=56
[23:17:53.196]接收←count=57
[23:17:54.200]接收←count=58
[23:17:55.190]接收←count=59
[23:17:56.196]接收←count=60
[23:17:57.187]接收←count=61
[23:17:58.193]接收←count=62
[23:17:59.183]接收←count=63
[23:18:00.189]接收←count=64
[23:18:01.180]接收←count=65
[23:18:02.185]接收←count=66
[23:18:03.176]接收←count=67
[23:18:04.181]接收←count=68
[23:18:05.171]接收←count=69
[23:18:06.177]接收←count=70
数码管演示