[蓝桥杯国赛]NE555

如果使用了测频率的话
定时器按照如下分配
定时器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;			
}

你可能感兴趣的:(蓝桥杯)