[蓝桥杯国赛]NE555

博客围绕单片机测频率展开,介绍了定时器的分配方式,其中定时器0采用计数器0模式,定时器1用12T模式定时50ms,还提及了计数器0和定时器1的中断服务函数,最后探讨了如何获得频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值