在蓝桥杯单片机比赛中,频率测量一次都没考过,但是也不排除不考的可能。频率测量相对前面的几个模块来说相对简单,只需要两个定时器就可以实现。
频率测量的基本原理
产生脉冲的主要元件是555定时器。555定时器是一种
集成电路芯片
,常被用于
定时器
、脉冲产生器和振荡电路。本实验中555定时器就用作脉冲产生器,通过调节RB3旋钮改变电阻值的大小=改变脉冲频率(原理图如下图1)。NET SIG引脚在设计的时候是引出来的(
我们这里将此引脚接到P3^4引脚
)
频率我们在pwm这一讲有详细讲解
(3条消息) 蓝桥杯单片机比赛学习:8、PWM的基本原理之呼吸灯_Do My Best的博客-CSDN博客
频率就是1s中的脉冲个数,所以我们这里要是用两个定时器,一个测量P3^4引脚的脉冲数目(
必须使用定时器0
) 另一个定时1s。

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

代码实现:
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