蓝桥杯单片机(七)NE555

上一章讲了蓝桥杯单片机如何输出PWM波
蓝桥杯单片机(六)PWM
这一章讲解蓝桥杯单片机开发板上的NE555方波发射器的频率测量,这也是近几年的考点。
首先看原理图:
蓝桥杯单片机(七)NE555_第1张图片
由数电的知识:

NE555的周期T=0.7(Ra+Rb)C
频率f=1/T

图中R8为定值电阻,所以NE555的斜率主要由Rb3这个滑动变阻器决定。图中NE555的PWM波输出引脚为NET SIG,所以测量只需要将单片机随便一个GPIO与NET SIG相连,然后向按键扫描那样读取高低电平就行了。
由于比赛通常用超声波跳线帽来连接P34和NET SIG引脚,所以本次例程同样如此。
首先来看测量程序:

unsigned int high=0,low=0,highdata=0,lowdata=0;

void time0() interrupt 1
{
	if(P34==1)
	{
		high++;
		if(low !=0)
		{
			lowdata=low;
			low=0;
		}
	}
	else if(P34==0)
	{
		low++;
		if(high !=0)
		{
			highdata=high;
			high=0;
		}
	}	
}

void Timer0Init(void)		//20微秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x23;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

让定时器每20us进行测量P34口的电平,然后将对应的高低电平的时间保存起来,然后就可以计算周期和频率了。
计算公式:

**

高电平加低电平次数乘以20us就是周期

**

time=(1000000/((highdata+lowdata)*20));

当然定时器的时间越短越精确。
实验内容:使用P34引脚测量PWM频率,使用数码管显示出来。
代码如下:

#include
#include"intrins.h"

#define uchar unsigned char
#define uint unsigned int
	

void SMG_output(void);
void init(void);
void Delay1ms(void);
void Timer0Init(void);

uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar SMG[8]={10,10,10,10,10,10,10,10};//初始显示10,全息数码管
uint high=0,low=0,highdata=0,lowdata=0;
uint time;

void main(void)
{
	init();
	Timer0Init();
	EA=1;ET0=1;
	while(1)
	{
		time=(1000000/((highdata+lowdata)*20));
		SMG[3]=time/10000;
		SMG[4]=time%10000/1000;
		SMG[5]=time%1000/100;
		SMG[6]=time%100/10;
		SMG[7]=time%10;
		SMG_output();
	}
}

void time0() interrupt 1
{
	if(P34==1)
	{
		high++;
		if(low !=0)
		{
			lowdata=low;
			low=0;
		}
	}
	else if(P34==0)
	{
		low++;
		if(high !=0)
		{
			highdata=high;
			high=0;
		}
	}	
}

void SMG_output(void)
{
	uchar i;
	for(i=0;i<8;i++)
	{
	P2=(P2&0X1F)|0Xc0;
	P0=(1<<i);
	P2=(P2&0X1F)|0Xe0;
	P0=tab[SMG[i]];
	Delay1ms();
	}
	P2=(P2&0X1F)|0Xc0;
	P0=0Xff;
	P2=(P2&0X1F)|0Xe0;
	P0=0Xff;	
}

void Timer0Init(void)		//20微秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x23;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}



void init(void)
{
	P2=(P2&0X1F)|0XA0;
	P0=0X00;
	P2=(P2&0X1F)|0X80;
	P0=0Xff;
	P2=(P2&0X1F)|0Xc0;
	P0=0Xff;
	P2=(P2&0X1F)|0Xe0;
	P0=0Xff;	
}

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

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}

最后效果如下:

调节滑动变阻器,频率发生改变。

你可能感兴趣的:(单片机,蓝桥杯,嵌入式硬件)