Java教程

蓝桥杯NE555定时器与频率测量

本文主要是介绍蓝桥杯NE555定时器与频率测量,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

使用的是蓝桥杯单片机CT107D实训平台:

555定时器内部,有3个5K的电阻分压。

NE555是一个纯硬件的设计,一旦电路确定了,其功能也就定了。

在蓝桥杯的板子上,555定时器是一个信号发生电路,通过定位器Rb3可改变输出信号的频率。

频率就是信号1s产生的信号或者周期。

1HZ就是1s有一个信号(脉冲)

P34引脚计算外部脉冲的个数,但是有时间要求,1s之内。

我们需要两个定时器,一个用来计数,一个用来定时。

定时器最多能计时间65.355ms 所以需要先50ms 然后✖20就是1s。

计数我们可以选择8位自动重装计数,只要来一个脉冲,他就溢出,溢出就会来到中断函数。

按照上述思路,首先,我们需要三个变量,一个变量count_f用来计数,一个count_t用来作为计时,一个dat_f用来最后显示到数码管上的数。

其次,我们初始化定时器:

void init_Timer()

{

TH0=0xff;

TL0=0xff;

TH1=(65535-50000+1)/256;

TL1=(65535-50000+1)%256;

TMOD=0x16;

ET0=1;

ET1=1;

EA=1;

TR0=1;

TR1=1;

}

定时器0用来计数,定时器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)

{

dat_f=count_f;

count_f=0;

count_t=0;

}

}

大体思路就是上述这些,下面是这些完整代码

首先SMG.h

#ifndef __SMG_H
#define __SMG_H
#include "reg52.h"
void DelaySMG(unsigned char t);
void DisPlaySMG_Bit(unsigned char pos,unsigned char dat);
void DisPlay_All(unsigned char dat);
#endif

 SMG.c

#include "SMG.h"
#include "reg52.h"
void DelaySMG(unsigned char t)
{
	while(t--);
}
void DisPlaySMG_Bit(unsigned char pos,unsigned char dat)
{
	P0=0xff;
	P2=P2&0x1f|0xe0;
	P2=P2&0x1f;
	P0=0x01<<pos;
	P2=P2&0x1f|0xc0;
	P2=P2&0x1f;
	P0=dat;
	P2=P2&0x1f|0xe0;
	P2=P2&0x1f;
}
void DisPlay_All(unsigned char dat)
{
	P0=0xff;
	P2=P2&0x1f|0xc0;
	P2=P2&0x1f;
	P0=dat;
	P2=P2&0x1f|0xe0;
	P2=P2&0x1f;
}
	
	

最后是主函数:

#include  "reg52.h"
#include  "SMG.h"
unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,
                               0x99,0x92,0x82,0xf8,
	                             0x80,0x90,0x88,0x80,
                               0xc6,0xc0,0x86,0x8e,
                               0xbf,0x7f};
unsigned int count_f=0;
unsigned int dat_f=0;
unsigned char count_t=0;
void init_Timer()
{
	TH0=0xff;
	TL0=0xff;
	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)
	{
		dat_f=count_f;
		count_f=0;
		count_t=0;
	}
}
void DisPlaySMG_F()
{
	DisPlaySMG_Bit(0,0x8e);
	DelaySMG(100);
	DisPlaySMG_Bit(1,0xff);
	DelaySMG(100);
	DisPlaySMG_Bit(2,0xff);
	DelaySMG(100);
	if(dat_f>9999)
	{
	DisPlaySMG_Bit(3,SMG_duanma[dat_f/10000]);
	DelaySMG(100);
	}
	if(dat_f>999)
	{
	DisPlaySMG_Bit(4,SMG_duanma[(dat_f/1000)%10]);
	DelaySMG(100);
	}
	if(dat_f>99)
	{
	DisPlaySMG_Bit(5,SMG_duanma[(dat_f/100)%10]);
	DelaySMG(100);
	}
	if(dat_f>9)
	{
	DisPlaySMG_Bit(6,SMG_duanma[(dat_f/10)%10]);
	DelaySMG(100);
	}
	DisPlaySMG_Bit(7,SMG_duanma[dat_f%10]);
	DelaySMG(100);
  DisPlay_All(0xff);	
}
void init()
{
	P0=0xff;
	P2=P2&0x1f|0x80;
	P2=P2&0x1f;
	P0=0;
	P2=P2&0x1f|0xa0;
	P2=P2&0x1f;
}
void main()
{
	init_Timer();
	init();
	while(1)
	{
		DisPlaySMG_F();
	}
}

记得要将J3上SIGNAL与P34连接上。

这篇关于蓝桥杯NE555定时器与频率测量的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!