模块代码
void Timer0Init(void)
{
AUXR |= 0x80;
TMOD = 0x06;
TL0 = 0xff;
TH0 = 0xff;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer1Init(void)
{
AUXR |= 0x40;
TMOD &= 0x0F;
TL1 = 0x20;
TH1 = 0xD1;
TR1 = 1;
ET1 = 1;
}
void time0() interrupt 1
{
cnt_f++;
}
void time1() interrupt 3
{ if(++cnt_fre==500)
{
cnt_fre=0;ET0=0;
fre=cnt_f*2;
T=1000000/fre;
cnt_f=0; ET0=1;
}
}
代码中的重点
- 记录脉冲的定时器0,需要 TH0= TL0 = 0xff; 目的是为了每来一次脉冲就发生一次中断然后计数加一,当定时器1计时到了500ms,先将ET0=0;关闭中断,读取记录的脉冲次数乘以2,就得到了每秒的频率。
- 由于是记录外部脉冲,所以需要将定时器改为计数器模式(定时器和计数器本质上是一个东西,都是记录脉冲数量),令 **TMOD = 0x06;**对应的含义可在上图中查看。