蓝桥杯单片机比赛学习:11、频率测量的基本原理

在蓝桥杯单片机比赛中,频率测量一次都没考过,但是也不排除不考的可能。频率测量相对前面的几个模块来说相对简单,只需要两个定时器就可以实现。

频率测量的基本原理

产生脉冲的主要元件是555定时器。555定时器是一种集成电路芯片,常被用于定时器、脉冲产生器和振荡电路。本实验中555定时器就用作脉冲产生器,通过调节RB3旋钮改变电阻值的大小=改变脉冲频率(原理图如下图1)。NET SIG引脚在设计的时候是引出来的(我们这里将此引脚接到P3^4引脚

频率我们在pwm这一讲有详细讲解(3条消息) 蓝桥杯单片机比赛学习:8、PWM的基本原理之呼吸灯_Do My Best的博客-CSDN博客

频率就是1s中的脉冲个数,所以我们这里要是用两个定时器,一个测量P3^4引脚的脉冲数目(必须使用定时器0) 另一个定时1s。

图1

 频率测量的方法

在使用时我们需要使用两个定时器并且必须使用定时器0(因为定时器0的计数功能是对P3^4计数,如下图2)所以我们将定时器0设置为计数功能,定时器1设置为定时功能。此处设置的过程就不再详细讲解,如有不会请去(3条消息) 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理_Do My Best的博客-CSDN博客

图2

代码实现: 

main.c文件:

注意:在定义变量时要足够大(因为脉冲的数目比较大,一般就用unsigned int 类型)

#include "smg.h"

unsigned char count=0;
unsigned int num=0,count_f=0;

void T0T1_init(void)//T1定时,T0计数
{
	TMOD=0X16;//T0为计数模式8位自动重装;T1位定时模式16位
	TH0=0XFF;
	TL0=0XFF;
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	EA=1;
	ET0=1;
	ET1=1;
	TR0=1;
	TR1=1;
}

void Service_T0(void)		interrupt 1
{
	count_f++;
}

void Service_T1(void)		interrupt 3
{
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	
	count++;
	if(count==20)
	{
		count=0;
		num=count_f;
		count_f=0;
	}
}

void System_init(void)
{
	Select_HC573(0,0x00);
	Select_HC573(4,0xff);
	Select_HC573(5,0x00);
	SMG_Display_All(0xff);
	T0T1_init();
}
																
void main(void)
{
	System_init();
	while(1)
	{
		SMG_Display(num);
	}
}

 smg.c文件:

#include "smg.h"

unsigned char code SMG_Dot[10]={0xc0,0xf9,0xa4,0xb0,0x99,
																0x92,0x82,0xf8,0x80,0x90};

																
void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}

void delay_ms(unsigned int ms)
{
	while(ms--)
		Delay1ms();
}
																
																
void Select_HC573(unsigned char channel,unsigned char dat)
{
	P0=0x00;
	P0=dat;
	
	switch(channel)
	{
		case 4:
			P2=(P2&0X1F)|0X80;
		break;
		
		case 5:
			P2=(P2&0X1F)|0Xa0;
		break;
		
		case 6:
			P2=(P2&0X1F)|0Xc0;
		break;
		
		case 7:
			P2=(P2&0X1F)|0Xe0;
		break;
		
		case 0:
			P2=(P2&0X1F)|0X00;
		break;
	}
	
	P2=(P2&0X1F)|0X00;
}



void SMG_Display_Bit(unsigned char pos,unsigned char value)
{
	Select_HC573(6,0x01<<pos-1);
	Select_HC573(7,value);
	delay_ms(3);
	Select_HC573(6,0x01<<pos-1);
	Select_HC573(7,0xff);
}

void SMG_Display_All(unsigned char value)
{
	Select_HC573(6,0xff);
	Select_HC573(7,value);
}

void SMG_Display(unsigned int num)
{
	SMG_Display_Bit(1,0x8e);
	if(num>99999)
		SMG_Display_Bit(3,SMG_Dot[num/100000]);
	if(num>9999)
		SMG_Display_Bit(4,SMG_Dot[(num/10000)%10]);
	if(num>999)
		SMG_Display_Bit(5,SMG_Dot[(num/1000)%10]);
	if(num>99)
		SMG_Display_Bit(6,SMG_Dot[(num/100)%10]);
	if(num>9)
		SMG_Display_Bit(7,SMG_Dot[(num/10)%10]);
	if(num>0)
		SMG_Display_Bit(8,SMG_Dot[num%10]);
	
}

smg.h文件:

#ifndef __SMG_H
#define __SMG_H

#include "stc15f2k60s2.h"

void Delay1ms();
void delay_ms(unsigned int ms);
void Select_HC573(unsigned char channel,unsigned char dat);
void SMG_Display_Bit(unsigned char pos,unsigned char value);
void SMG_Display_All(unsigned char value);
void SMG_Display(unsigned int num);


#endif 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Do My Best

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值