一、原理分析
频率(frequency)是单位时间内完成周期性变化的次数,是描述周期运动频繁程度的量,常用符号f或ν表示,单位为秒分之一,符号为s-1,符号为Hz。
NE555模块是一个纯硬件的设计,不需要底层驱动。其编程非常简单,主要是计算一秒钟之内有多少个频率响应,所说的频率响应即计数器计数时溢出的个数。在蓝桥杯的板子上,NE555是一个信号发生电路,通过滑动变阻器Rb3可以改变输出信号的频率。
二、程序编写
实现功能:
1.上电开机运行时,关闭蜂鸣器、继电器和8个LED指示灯。
2.用跳线帽将J3中的SIGNAL与P34短接,使NE555发生的信号输入到单片机的P34引脚。
3.单片机测量信号频率,并显示在数码管中,频率数据显示用5位数码管,单位是Hz,当显示长度不足5位时,未使用到的数码管熄灭,在最左边的1位数码管用“F”作为提示符。
#include <reg52.h>
unsigned int count_f=0;// 存放临时得出的频率值
unsigned int dat_f=0; // 存放1s的频率最终值
unsigned char count_t=0; // 定时1s的计数变量
unsigned char smg_nodot[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char smg_dot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void Init_timer()//定时、计数器初始化
{
//定时器0用作计数,8位重装方式
TH0=0XFF;
TL0=0XFF;
//定时器1用作定时,定时时间是50ms
TH1=(65535-50000+1)/256;
TL1=(65535-50000+1)%256;
TMOD=0X16;
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
}
void service_T0() interrupt 1
{
count_f++;
}
void service_T1() interrupt 3
{
TH1=(65535-50000+1)/256;
TL1=(65535-50000+1)%256;
count_t++;
if(count_t==20) //1s
{
dat_f=count_f;//取出这1s的频率
count_f=0;
count_t=0;
}
}
//数码管显示模块
void Delay_SMG(unsigned int t)
{
while(t--);
}
void DisplaySMG_Bit(unsigned char pos,unsigned char dat)
{
P2=0XE0;P0=0xff;//先全部关掉数码管,避免显示不正常
P2=0xC0;P0=0x01<<pos;
P2=0xE0;P0=dat;
}
void DisplaySMG()
{
DisplaySMG_Bit(0,0x8e);
Delay_SMG(100);
DisplaySMG_Bit(1,0xff);
Delay_SMG(100);
DisplaySMG_Bit(2,0xff);
Delay_SMG(100);
if(dat_f>9999)
{
DisplaySMG_Bit(3,smg_nodot[dat_f/10000]);//万位
Delay_SMG(100);
}
if(dat_f>999)
{
DisplaySMG_Bit(4,smg_nodot[(dat_f/1000)%10]);//千位
Delay_SMG(100);
}
if(dat_f>99)
{
DisplaySMG_Bit(5,smg_nodot[(dat_f/100)%10]);//百位
Delay_SMG(100);
}
if(dat_f>9)
{
DisplaySMG_Bit(6,smg_nodot[(dat_f/10)%10]);//十位
Delay_SMG(100);
}
DisplaySMG_Bit(7,smg_nodot[dat_f%10]);//个位
Delay_SMG(100);
P2=0xC0;P0=0xff;//消隐
P2=0xE0;P0=0xff;
}
void main()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;//关闭蜂鸣器,LED等
Init_timer();
while(1)
{
DisplaySMG();
}
}