如果使用了测频率的话
定时器按照如下分配
定时器0:计数器0模式
定时器0 | 定时器1 | 定时器2 | |
---|---|---|---|
模式选择 | 计数 | 定时 | 定时 |
功能 | 中断中统计脉冲数 | 数码管显示和按键扫描 |
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD = 0x04; //设置技数模式
TL0 = 0xff; //设置定时初值 //一加就溢出
TH0 = 0xff; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
}
定时器1用12T模式定时50ms
void Timer1Init(void) //50毫秒@11.0592MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0x4C; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
}
void Timer2Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xCD; //设置定时初值
T2H = 0xD4; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2 |= (1<<2); //允许中断
EA = 1;
}
计数器0的中断服务函数
//这个pulse_count一定要定义成u16
void timer0_int (void) interrupt 1
{
pulse_count++;
}
定时器1的中断服务函数
void timer1_int (void) interrupt 3
{
t1_count++;
if(t1_count==20)
{
t1_count=0;
ET0=0;
ET1=0;
TR0=0;
TR1=0;
over_flag=1;
}
}
如何获得频率
if(over_flag==1)
{
over_flag=0;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
freq=pulse_count;
//freq_cicle=1000000/freq;
pulse_count=0;
}