原理:

蓝桥杯单片机板子上NE555电路进行频率测量时,不需要任何的配置,整个单片机测量频率的过程中,跟NE555芯片没什么关系,归根结底考察的还是定时/计数器。但需要注意:

(1)当用到NE555时,需要用跳线帽将J3的SIGNAL与P34短接,将NE555发生的信号输入到单片机的P34引脚。
(2)NE555电路是一个信号发生电路,其信号输出接到单片机的P34引脚,即单片机的T0引脚。
(3) 该信号的频率大小可以通过Rb3可调电位器改变。

题目:

单片机测量信号频率,并显示在数码管中,频率数据显示用6位数码管,单位是Hz,当显示长度不足6位时,未使用到的数码管熄灭(第十届省赛的一个要求)。
难点:TOMD的配置,设置定时器模式
设置T0为计数器,工作在方式3,为不可屏蔽的16位自动重装
设置T1为定时器,工作在方式0,为可屏蔽的16位自动重装
此时TMOD=0x07

代码实现:

#include "STC15F2K60S2.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int

uchar segCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,       //0~9的段码(不带小数点)
								 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff}; //0.~9.的段码(带小数点) 以及0xff全灭
uchar segVal[]={20,20,20,20,20,20,20,20};  //数码管初始化全灭

void SelectHC573(uchar val) 
{
	switch(val)
	{
		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;
		default: P2 = (P2 & 0x1f); break;		
	}
}
void InitSystem()//系统初始化关闭蜂鸣器、继电器、LED
{
	SelectHC573(5);
	P0 = 0xbf;      //由于不同板子的引脚接法不同,此时的初始值也不同
	SelectHC573(4);	
	P0 = 0xff;     //LED全灭
}
void TimerInit(void)		//1毫秒@12.000MHz
{
	TMOD = 0x07;	//设置定时器模式
	TL0 = 0xff;		//设置定时初值
	TH0 = 0xff;		//设置定时初值	
	TL1 = 0x18;		//设置定时初值
	TH1 = 0xFC;		//设置定时初值	
	TF0 = 0;		//清除TF0标志
	TF1 = 0;		//清除TF1标志
	ET1 = 1;    
	ET0 = 1;
	TR0 = 1;		//计数器0开始工作
	TR1 = 1;		//定时器1开始计时	
	EA = 1;	
}
uint count_f=0;  //T0计数值
uint dat_f;      //所测频率值
uchar segFlag=0;  
uint count1s=0;		//定时1s标志位
void ServiceTimer0() interrupt 1
{
	count_f++;
}
void ServiceTimer1() interrupt 3
{
	uchar pushp0,pushp2;
	pushp0 = P0;
	pushp2 = P2;//入栈
//数码管显示	
	SelectHC573(6);	
	P0=(0x01<<segFlag);
	SelectHC573(7);	
	P0=segCode[segVal[segFlag]];
	segFlag++;
	if(segFlag==8) segFlag=0;
//频率测量	
	count1s++;
	if(count1s==1000)	//1s定时到了,刷新频率
	{
		count1s=0; 
		dat_f=count_f;  //将count_f计数赋值给dat_f,dat_f值即为频率值
		count_f=0;			//计数器重新计数
	}
	P2 = pushp2;//出栈
	P0 = pushp0;
}
void main()
{
	InitSystem();
	TimerInit();
	while(1)
	{
		if(dat_f>9999)
		{
			segVal[3] = dat_f/10000;
			segVal[4] = dat_f%10000/1000;
			segVal[5] = dat_f%1000/100;
			segVal[6] = dat_f%100/10;
			segVal[7] = dat_f%10;	
		}
		else if(dat_f>999)
		{
			segVal[3] = 20;
			segVal[4] = dat_f/1000;
			segVal[5] = dat_f%1000/100;
			segVal[6] = dat_f%100/10;
			segVal[7] = dat_f%10;	
		}
		else if(dat_f>99)
		{
			segVal[3] = 20;
			segVal[4] = 20;
			segVal[5] = dat_f/100;
			segVal[6] = dat_f%100/10;
			segVal[7] = dat_f%10;	
		}
		else if(dat_f>9)
		{
			segVal[3] = 20;
			segVal[4] = 20;
			segVal[5] = 20;
			segVal[6] = dat_f/10;
			segVal[7] = dat_f%10;	
		}
		else 
		{
			segVal[3] = 20;
			segVal[4] = 20;
			segVal[5] = 20;
			segVal[6] = 20;
			segVal[7] = dat_f;	
		}		
	}
}

结果显示:

频率范围大致从80到20000多Hz。