51_频率计算

 

 

 /**********************51单片机学习例程************************
*  平台:Keil U4 + STC89C52
*  名称: 频率计
*  编写:Tony
*  日期:2022-3-5
*   QQ : 674749794
*  晶体:12MHZ
*	 变更记录:无
******************************************************************/

#include <reg51.h>
#include "lcd.h"

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

 //--定义LCD显示的文字--//
uchar code EN_CHAR1[16]={"   CYMOMETER    "};
uchar code EN_CHAR2[16]={"FREQ:         HZ"};

//--声明全局函数--//
void Timer_Configuration();  //初始化定时器
//--定义全局变量--//
ulong Freq;		 //用来存放要显示的频率值
ulong TimeCount; //用于计算1S钟的

//sbit LSA=P2^2;
//sbit LSB=P2^3;
//sbit LSC=P2^4;			  //138译码器,数码管的位选
//#define		GE 	    {LSA=1;LSB=1;LSC=1;}				//打开个位位选端
//#define 	SHI  	{LSA=0;LSB=1;LSC=1;}				//打开十位位选端

/*******************************************
*函数名		:main
*功  能 	:主函数
*输	 入 	:无
*输  出		:无
*******************************************/

void main()
{
	uchar i, freqValue[6];

	LcdInit();
	Timer_Configuration();

	//显示要写的字母
	for(i=0; i<16; i++)
	{
		LcdWriteData(EN_CHAR1[i]);
	}
	LcdWriteCom(0x80+0x40);
	for(i=0; i<16; i++)
	{
		LcdWriteData(EN_CHAR2[i]);
	}
	while(1)
	{
		if(TR0==0)		   //当计数器提下的时候,表明计数完毕,定时器0定时1S
		{   Freq=Freq+TL1;		  //频率的计数是计数器1
			Freq=Freq+(TH1*256);
			LcdWriteCom(0xc8);
			//--求频率的个十百千万十万位
		    freqValue[0]='0'+Freq%1000000/100000;
			freqValue[1]='0'+Freq%100000/10000;
			freqValue[2]='0'+Freq%10000/1000;
			freqValue[3]='0'+Freq%1000/100;
			freqValue[4]='0'+Freq%100/10;
			freqValue[5]='0'+Freq%10;
			//--显示求得的数值
			for(i=0;i<5;i++)//从最高位开始查找不为0的数开始显示(最低位为0显示0)
			{
					if(freqValue[i]==0x30)
					{
						freqValue[i]=0x20;	//若为0则赋值空格键
					}
									
					else
					{
						break;
					}
						
			}
			for(i=0;i<6;i++)
			{
				LcdWriteData(freqValue[i]);	
			}
			//--显示完,重新计算下一次频率。--//	
			Freq=0;//将计算的频率清零
			TH1=0; //将计数器的值清零
			TL1=0;
			TR0=1; //开启定时器
			TR1=1; //开启计数器
	   }
    }

}

/*******************************************
*函数名		:Timer_Configuration
*功  能 	:配置定时/计数器T0和T1
*输	 入 	:无
*输  出		:无
*******************************************/

void Timer_Configuration()
{
	//--定时器T1做计数器,工作方式1(16位定时器),只由TRx打开计数器--//
	//--定时器T0做定时器,工作方式1(16位定时器),只由TRx打开定时器--//	
	TMOD=0x51;

	//--设置定时器晶振为12MHZ时定时50ms--//
	TH0=0x3C;
	TL0=0xB0;

	//--打开中断-//
	ET0=1;
	ET1=1;
	EA=1;

	//--打开定时器*/
	TR0=1;
	TR1=1;
}

/*******************************************
*函数名		:Timer0
*功  能 	:定时器0的中断函数
*输	 入 	:无
*输  出		:无
*******************************************/

void Timer0()	interrupt 1
{
	TimeCount++;
	if(TimeCount==20)//计时到1S
	{
		TR0=0;
		TR1=0;
		TimeCount=0;		
	}

	//--12MHZ设置定时50ms的初值--//
	TH0=0x3C;
	TL0=0xB0;	
}
/*******************************************
*函数名		:Timer1
*功  能 	:定时器1的中断函数
*输	 入 	:无
*输  出		:无
*******************************************/

void Timer1()	interrupt 3
{	
	//--进入一次中断,表明计数到了65536--//
	Freq=Freq+65536;		
}

 VR1最小:

VR1最大

 

 

 

 

posted @ 2022-03-06 21:01  xiaoberber  阅读(60)  评论(0编辑  收藏  举报