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

  • Post author:
  • Post category:其他


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

频率测量的基本原理

产生脉冲的主要元件是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 



版权声明:本文为qq_58872950原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。