⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chepin.c

📁 利用51单片机进行测频
💻 C
字号:
#include <reg52.H> 
unsigned char code Tab[]={ 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,
						   0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00,}; 

unsigned char cfDispPos=0;
unsigned long  ifTimes=0;
unsigned long Freq=0;
unsigned long DispNow;
bit bfComplete=0;
bit bfTesting=0;
unsigned char Method=0;
sbit KEY=P3^7;
void Delay(int t)          
{
  while(t--);
}
void StartFreq(unsigned char Method)
{
  switch(Method)
  {
    case 0:
	{
	  EX0=1;	 //从中断开定时器,测周法
	  IT0=1;
	  TMOD=0x51; //Timer0 for precise Time 
	  EA=1;
	  break;
	}
	case 1:
	{
	  //计数测频法
	  TH0=0xf8;TL0=0x30;  //1ms
	  ifTimes=0;
	  TMOD=0x51; //Time0 for precise Time ,Timer1 for counter
	  TH1=0;TL1=0;
      EA=1; ET0=1; TR0=1;TR1=1;ET1=1;
      PT1=1;
	}
	default:break;
  }
}
void timer0 (void) interrupt 1 	 
{
  switch(Method)
  {
    case 0:			   //用于计数功能  
	  ifTimes++;
	  break;
	case 1:				//work with T1 
	  TH0=0xf8; TL0=0x30; //1ms
	  ifTimes++;
	  if(ifTimes>2000)	  //2s
	  {
	    TR1=0;
		TR0=0;
	    EA=0;
		ET0=0;
		ET1=0;
		Freq+=(TH1*256+TL1);
		Freq=Freq*10/2;   //Keep One bit for '.'
		if(Freq>900000)Freq=0;
		bfComplete=1;
	  }
	  break;
	default:break;
  }
}
void timer1(void) interrupt 3 
{
  Freq+=65536; 
}
void EX0_IRQ(void) interrupt 0 	  //测周法使用
{
  if(!bfTesting)  //first falling edge
  {
	TH0=0x0;TL0=0x0;  //1ms
	ifTimes=0;
    ET0=1; TR0=1;     //Timer0 for Time
    bfTesting=1;
  }
  else			 //second falling edge
  {
  	EA=0;TR0=0;	ET0=0; EX0=0;
	Freq=(ifTimes*65536+256*TH0+TL0)*1/2;//  us S
	Freq=10000000/Freq; //Keep one bit for '.'
	bfComplete=1;
  }
}
void SystemInitial(void)
{

  SCON=0X00;
  //TH0=0xfc;TL0=0x18;  //0.5ms
	
  StartFreq(Method);
}

void main(void)
{
  SystemInitial();
  while(1)
  {
    if(!KEY)
	{
	  Delay(2000);
	  if(!KEY)
	  {
	    while(!KEY);
		if(Method)
		  Method=0;
		else Method=1;
		DispNow=0;
		StartFreq(Method);
	  }
	}
  	if(bfComplete)//开始测量
	{
	  DispNow=Freq;
	  Freq=0;
	  bfComplete=0;
	  bfTesting=0;
	  StartFreq(Method); 
	}  
	{//显示
	   switch(cfDispPos)
      {
		case 0:P2=0x6E; 						P0=0xFE;break;
	    case 1:P2=Tab[DispNow/1%10];			P0=0xFD;break;
	    case 2:P2=Tab[DispNow/10%10]|(~Tab[8]);	P0=0xFB;break;
	    case 3:P2=Tab[DispNow/100%10];			P0=0xF7;break;
		case 4:P2=Tab[DispNow/1000%10];			P0=0xEF;break;
	    case 5:P2=Tab[DispNow/10000%10];		P0=0xDF;break;
	    case 6:P2=Tab[DispNow/100000%10];		P0=0xBF;break;	
	    case 7:if(Method)P2=0x02;else P2=0;		P0=0x7F;break;
      }
	   Delay(100);cfDispPos++;
      if(cfDispPos>=8){cfDispPos=0;}
	} 
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -