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

📄 main.c

📁 频率测量程序
💻 C
字号:
/****************************************************************************
*                                                                           *
* File:         Main.c                                                      *
*                                                                           *
* Author:       王                                                          *
*                                                                           *
* Compiler:     KEIL C51 V7.01                              
*                                                                           *
* Description:  CPU=AT89C2051    11.0592M HZ                                *
*                                                                           *
* Date:         2007/03/28                                                  *
*                                                                           *
*****************************************************************************
*                                                                           *
* Version | Date     | Description                                          *
* --------+----------+----------------------------------------------------- *
* V1.0    | 07.03.28 | 原始文本                                             *
*                                                                           *
****************************************************************************/
#define Main_GLOBALS
#include "includes.h"
bit FlagS;

/****************************************************************************
*                                                                           *
* Function:     main                                                        *
*                                                                           *
****************************************************************************/
void main(void)
{
  Uint32 FREQ_Buffer;
  Uchar buffer;
  Uint16 TimerBuf;
  char i;
  init();
  while(1)
  {
    if(TestOver==0)
	{
	   TR0=0;
	  TR1=0;
      TestOver=1; 
      ten=1;
	  hud=0;
      Test=1;
      TL1=0;
	  TH1=0;
      TH0=TH0_VAL;
      TL0=TL0_VAL;
	  Over_CNT=0;
      uc1s=19;//测试频率50ms
      TR0=1;
	  TR1=1;
	}
    if(T1sOver)
	{
	  TR0=0;
	  TR1=0;
	  T1sOver=0;
      if(Test)
	  {
	     Test=0;
		 if(Over_CNT==0)
		 {
		   TimerBuf=TL1+TH1*256;
           if(TimerBuf<31)//FREQ<200k/s
          {
		    SingleFRE=1;//置实频标志
		     Buf=1;
            ten=0;      //实频切换
		    hud=0;
		  }
		  else if((TimerBuf>30)&&TimerBuf<70)//FREQ<200k/s
		  {
		     Buf=16;
			 ten=0;      //切换为16倍分频
		     hud=1;
		  }
		  else
		  {
            SingleFRE=0;
		    Buf=256;
            ten=1;      //切换为100倍分频
		    hud=0;
		  }
		 }
		 else
		 {
		   SingleFRE=0;
		   Buf=256;
           ten=1;      //切换为100倍分频
		   hud=0;
		 }
         TL1=0;
	     TH1=0;
         TH0=TH0_VAL;
         TL0=TL0_VAL;
         Over_CNT=0;
         uc1s=0;       //测试频率1s
		 TR0=1;
         TR1=1;
	  }
	  else
	  {
        TestOver=0;
  	    FREQ=Over_CNT*65536+TH1*256+TL1;
	    FREQ=FREQ*Buf;
     }
      Over_CNT=0;
     
	}
    if(FREQ!=Old_FREQ)     //频率有变化显示
	{
	  Old_FREQ=FREQ;
	  FREQ_Buffer=FREQ;
	  for(i=0;i<8;i++)
	  {
        Led[i]=FREQ_Buffer%10;
		FREQ_Buffer=FREQ_Buffer/10;
	  }
      if(FREQ>99999)
      {
        Led_KHZ=ON;
        Led_HZ=OFF;
        buffer=FREQ/100000;
        if(buffer>9)      //FREQ>=1M
        {
          for(i=0;i<5;i++)
		  {
		    Led[i]=Led[i+2];
		  }
		  Led[1]=Led[1]|0x80;
        }
        else        //FREQ<1m && FREQ>=100000
        {
          for(i=0;i<5;i++)
		  {
		    Led[i]=Led[i+1];
		  }
		  Led[2]=Led[2]|0x80;         
        }
      }
	  else
	  {
        Led_KHZ=OFF;
        Led_HZ=ON;
	  }
      send_byte(CMD_RESET);//清除显示(消引)
      delay10ms(1);
	  UnDis_Flag=0;
	  for(i=4;i>=0;i--)
	  {
	    if(Led[i]!=0)
        {
          DisNum(i,Led[i]);
          UnDis_Flag=1;          
		}
		else
		{
		   if(UnDis_Flag==1) 
		   {
		    DisNum(i,0);
		   }
		}

	  }
      if(FREQ==0)
      {
         
	     
	      
          
          DisNum(0,1);
          
		
	
      }
 	  
	}//END if(FREQ!=Old_FREQ)
  }  //END while(1)
}    //END main
/****************************************************************************
*                                                                           *
* Function:     void init(void)                                             *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:  程序初始化                                                  *
*                                                                           *
****************************************************************************/
void init(void)
{
  Uchar j;
  Uint16 Timer;
  EA=0;
  P1=0xff;
  P3=0xff;
  ten=1;
  hud=0;
  Old_FREQ=0;
  FREQ=0;
  Over_CNT=0;
  for (tmr=0;tmr<0x2000;tmr++);	// 上电延时DisPlay
  send_byte(CMD_RESET);			// 复位HD7279A
  send_byte(CMD_TEST);			// 测试指令
  for (j=0;j<3;j++)				// 延时约3秒
  {
	delay10ms(100);
  }
  send_byte(CMD_RESET);			//清除显示
  DisNum(0,0);
  TMOD=0x51;                    //T0 timer 50ms,T1 计数。
  
//  TMOD=0x21;                    //T0 timer 50ms,T1 定时。
  Timer=65536-Fosc*T/12;
  TH0_VAL=Timer/256;
  TL0_VAL=Timer%256;
  uc1s=0;
  T1sOver=0;
  TH0=TH0_VAL;
  TL0=TL0_VAL;
  TH1=0;
  TL1=0;
  ET0=1;
  ET1=1;

  TestOver=0;
  Test=0;
  SingleFRE=0;
  EA=1;
}
/****************************************************************************
*                                                                           *
* Function:     void Timer0(void) interrupt 1                               *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:  50ms中断                                                    *
*                                                                           *
****************************************************************************/
void Timer0(void) interrupt 1
{
   TR0=0;
   TH0=TH0_VAL;
   TL0=TL0_VAL;
   TR0=1;
     uc1s++;
     if(uc1s>19)
     {
       TR0=0;
	   TR1=0;
 	   T1sOver=1;
     }
}
/****************************************************************************
*                                                                           *
* Function:     void Count1(void) interrupt 3                               *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:  T1 溢出中断                                                  *
*                                                                           *
****************************************************************************/
void Count1(void) interrupt 3
{
  Over_CNT++;
}
void EXTINT1(void) interrupt 2
{
  TR1=0;
  if(FlagS==1)
  {
     if(TH1!=0||TL0>20)
	 {
	   Over_CNT++;
	 }
  }
  else
  {
    TH1=0;
	TL1=0;
  }
  TR1=1;
  FlagS=!FlagS;
}

⌨️ 快捷键说明

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