/****************************************************
  功能：频率计，通过计数器引入脉冲，单片机使用定时器进行定时测量
  得到的脉冲数，从而计算出频率.
  本程序的使用方法：通过信号发生器或者其他单片机产生一个频率固定的信号
  接到本单片机的P35接口，就可以测试到频率了
*****************************************************/
#include "regx52.h"
#include "lcd.h"

#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" welcome to use ";
uchar  table1[]="                ";
long int num;
uint num1;
bit flag=0;

void disposal()
{
 	 num1=TH1*256;							//算剩余初值
	 num1=num1+TL1;
	 num=num*65536;							//算计数值
	 num=num+num1;
	 if(num<1000)								//小于1000时
	 {	 
			 									
		 table1[4]=num/100+0x30;			//百位
		 table1[5]=num%100/10+0x30;			//十位
		 table1[6]=num%100%10+0x30;			//个位
		 table1[7]=0x20;					//空格
		 table1[8]=0x20;					//空格
		 table1[9]=0x48;					//H
		 table1[10]=0x7a;					//z	
		 write_charchuan(0x80+0x40,table1);	//写缓冲		
	}
	 if(num>=1000)								 //大于等于1000时
	{
	     num=num/1000;						 //舍掉后3位  单位为KHz
//		 table1[4]=num/1000+0x30;			 //千位（M）
		 table1[5]=num/100+0x30;			 //百位
		 table1[6]=num%100/10+0x30;			 //十位
		 table1[7]=num%100%10+0x30;			 //个位
		 table1[8]=0x4b;					 //K
		 table1[9]=0x48;					 //H
		 table1[10]=0x7a;					 //z	
		 write_charchuan(0x80+0x40,table1);	 //写缓冲		
	}	
	delayms(1000);								  //1S刷新一次；
	num=0;
	num1=0;										  //清0
	TH1=0X00;
	TL1=0X00;									  
	TR1=1;										  //重新开
	TR0=1;
}

void main()
{
	IE=0x8a;
	TMOD=0x51;				   //GAME打开 由外部中断和TR0=1共同打开定时器，方式1
	//TL0=0X06;
	//TH0=0X06;				   
	TL0=(65536-50000)%256;
	TH0=(65536-50000)/256;
	lcdinitial();
	write_charchuan(0x80,table);
	TR0=1;
	TR1=1;
	while(1)
	{
	 	if(flag)
	 	{  
			disposal();
		    flag=0;
	 	}	
	}
}

void timer() interrupt 1
{
 	static uchar i;
 	TL0=(65536-50000)%256;
 	TH0=(65536-50000)/256;
 	i++;
 	if(i==20)				//STC双倍速，机器周期0.5US，所以这里为40，单倍速为20
	{
	 	TR0=0;				//关2个定时计数器
		TR1=0;
	 	i=0;
		flag=1;	 
	}
}

void signal() interrupt 3	//中断计数
{
   num++;
}