我们先来看初始值计算公式:
*定时时间=(2^16-X)12/晶体振荡器频率 2^16=65536, X是未知量,定时时间和65536单位都是微秒。
假设晶体振荡器频率为11.0592MHZ,我要定时0.5s,那么计算思路是这样的:
- 首先要知道1s=1000ms,1ms=1000微秒。
- 由公式可知:(65536-0)*12/11.0592=71ms,最大只能到71ms,而0.5s=500ms,远远不够。所以我们需要退一步,算个5ms(5000微秒)循环个100次,这样就可以得到500ms(0.5s)。
- 公式:*5000=(2^16-X)12/11.0592
**得 X=60928 ** 60928转换为16进制=0xee00,分配高8位TH=0xee,低8位TL=0x00,初始值就这样算好了。 转换不熟练的同学可以用win10自带的计算器进行转换。
#include<reg51.h>
char i=100;
void main()
{
P2=0Xff;
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=0xee;
TL0=0x00;
while(1);
}
void timer0(void) interrupt 1
{
TH0=0xee;
TL0=0x00;
i--;
if(i<=0)
{
P2=~P2;
i=100;
}
}
当然,还有更方便的计算方式,在烧录软件STC-LSP找到定时计算器,选好定时器、工作方式、时钟以及定时长度(初始值),就能自动得到初始值了 注意这里定时长度,上面我们说到定时器方式一是16位,既2^16,最大只能算出71ms,我们定时单位是ms的话超出71是没有办法计算的,所以这就是为什么不直接输入500ms的原因。
我们可以输入5ms算出初始值然后循环100次再运行 也可以输入50ms得到初始值循环10次再运行,结果都是一样的。
用软件里的定时功能计算减去了我们自己计算的步骤,方便快捷准确,没用过的同学可以试一下。 定时器模式: 方式0 :2^13 方式1 :2^16 方式2 :2^8
|