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

📄 pinlvji3.c

📁 频率计 闸门时间0.1s 1s 10s 频率范围0~99khz 可以切换 里面有四个源程序
💻 C
字号:
#include<reg51.h>
unsigned char data key,flag_ft,point,buffer,j,INT1_ready,couter,couter0,bus0,bus1,cycle;
//键盘,频率判决结果,判决频率寄存,小数点位置标志,显示缓冲变量,显示循环变量,边沿触发界定,定时器0定时寄存,定时器1定时寄存,显示刷新循环寄存CT0计数值寄存,CT1计数值寄存
unsigned int data Z,delay,k,turn;//脉宽,占空比,程序延迟循环变量,
float data T,F,T_T,F_F,W;//周期,频率
unsigned char code BitTab[4]={0x7f,0xbf,0xdf,0xef};//位驱动码
unsigned char code DispTab[]={0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,0xf7};//字形码
/*                              0    1    2    3    4    5    6    7    8    9    -   */
unsigned char data DispBuf[4];//待显示数据寄存
sbit P0_0=P0^0;//位变量定义
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;

sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;

sbit P2_5=P2^5;

sbit P3_3=P3^3;
///////////////////////////////////////////////////////////////////
void Ft();//1KHZ/16KHZ门限频率判决函数
void Ft_10();//10KH门限频率判决函数
void test_af();//小于1KHZ的频率测量函数
void test_w();//小于10KHZ脉冲宽度测量函数
void test_bf();//1KHZ~16KHZ频率测量函数
void test_z();//占空比测量函数
void test_at();//小于1KHZ的周期测量函数
void test_bt();//1KHZ~16KHZ周期测量函数
void test_cf();//16KHZ以上频率测量函数
void test_ct();//16KHZ以上周期测量函数
void Display();//显示驱动函数
void Delay_5m();//软件延迟约5ms函数
void Measure();//按键处理与对应测量函数
/////////////////////////////////////////////////////////////////////
void Ft()//判决1KHZ/16KHZ
{
    //unsigned char p;
    TMOD=0x15;
    TL1=0xb0;
    TH1=0x3c;
    TH0=0;
 TL0=0;

    TR1=1;
    TR0=1;

    for(;TF1==0;);

 TF1=0;
 for(;TF1==0;);
    TR0=0;
    TR1=0;

    k=TL0|(TH0<<8);

    if(k>131) flag_ft=3;//p=1;
    else if(k>10) flag_ft=2;//p=2;
    else flag_ft=1;//p=3;
 //return(p);
}
////////////////////////////////////////////////////////////////////////////////
void Ft_10()//判决10KHZ函数
{
    TMOD=0X15;
    TL1=0XC0;
    TH1=0XE0;
 TH0=0;
 TL0=0;
    
    TR1=1;
    TR0=1;

    for(;TF1==0;);

 TF1=0;
    TR0=0;
    TR1=0;

    k=TL0|(TH0<<8);
    
    if(k<=5) flag_ft=4;
    else flag_ft=5;
}
////////////////////////////////////////////////////////////////////////////////
void test_af(void)//测量小于1KHZ的频率,用INT1和CT0。
{
    F=0;
 test_at();
 P1=P1|0xff;//情上次单位指示
    F=1000000/T_T;
    
    if(F<10) 
 {
     F*=1000;point=1;
 }
    else if(F<100) 
 {
     F*=100;point=2;
    }
    else if(F<1000) 
 {
     F*=10;point=3;
 }
    else 
 {
     point=4;
 }
 P1_2=0;//HZ指示灯亮
}
/////////////////////////////////////////////////////////////////////////////////////
void test_w()//测量脉冲宽度
{
    W=0;
    TMOD=0x90;//初始化
    TH1=0x00;
    TL1=0x00;
 ET1=1;//开中断
 EA=1;

 bus1=0;

    for(;P3_3==1;);//等待无效高电平过去
    TR1=1;
    for(;P3_3==0;);//等待高电平
    for(;P3_3==1;);//等待低电平关闭计数器
    TR1=0;
 W=bus1*65536;
    W+=TL1|(TH1<<8);

 if(W<100)
 {
     W*=100;point=2;P1_1=0;//us指示灯亮
    }
 else if(W<1000)
 {
     W*=10;point=3;P1_1=0;//us指示灯亮
 }
 else if(W<10000)
 {
     point=4;P1_1=0;//us指示灯亮
 }
    else if(W<100000) 
 {
     W/=10;point=2;P1_0=0;//ms指示灯亮
 }
    else if(W<1000000) 
 {
     W/=100;point=3;P1_0=0;//ms指示灯亮
    }
 else if(W<10000000)
 {
     W/=1000;point=4;P1_0=0;//ms指示灯亮
    }
    else 
 {
     point=0;
 }
}
//////////////////////////////////////////////////////////////////
void test_bf(void)//测量测量1~16KHZ频率T1记数,T0定时
{
    F=0;
    TMOD=0x51;
 TL1=0x00;
 TH1=0x00;
 TL0=0xbc;
 TH0=0xbd;

 ET0=1;
 ET1=1;
 EA=1;

    TR0=1;
 TR1=1;
 couter=0;
 bus1=0;

    for(;couter<16;);
    TR1=0;
 TR0=0;
 F=bus1*65536;//取CT1记数值
    F+=TL1|(TH1<<8);
 F_F=F;

 if(F<10000)
 {
     point=1;
 }
    else if(F<100000) 
 {
     F/=10;point=2;
 }
    else 
 {
     point=0;
 }
 P1_3=0;//KHZ指示灯亮
}
///////////////////////////////////////////
void test_z()
{
    Z=0;
    Ft();//flag_ft=Ft();

    if(flag_ft==1) test_at();
    else test_bt();
    test_w();
 P1=P1|0xff;//情上次单位指示
    Z=(unsigned int)((W/T)*100);
    if(Z<10) 
 {
      Z*=1000;point=1;
 }
    else if(Z<=100) 
 {
     Z*=100;point=2;
 }
    /*else if(Z<1000) 
 {
      Z*=10;point=3;
 }*/
 else
 {
     point=2;
  }
}
///////////////////////////////////////////////////////////////////////////////////
void test_at(void)//测量小于1KHZ的周期
{
    T=0;
    TMOD=0x01;
    IT1=1;
    EX1=1;
 ET0=1;
 EA=1;


 TL0=0x00;
    TH0=0x00;
    bus0=0;

    TR0=0;//新加的

    INT1_ready=0;
    for(;INT1_ready<2;);
 EX1=0;//关INT1中断

 T=bus0*65536;
    T+=TL0|(TH0<<8);
 T_T=T;//传递给频率测量函数

 if(T<1000)
 {
     T=T*10;point=3;P1_1=0;//us指示灯亮
 }
 else if(T<10000)
 {
     point=4;P1_1=0;//us指示灯亮
 }
    else if(T<100000) 
 {
     T/=10;point=2;P1_0=0;//ms指示灯亮
 }
    else if(T<1000000) 
 {
     T/=100;point=3;P1_0=0;//ms指示灯亮
    }
 else if(T<10000000)
 {
     T/=1000;point=4;P1_0=0;//ms指示灯亮
    }
    else 
 {
     point=0;
 }
}
//////////////////////////////////////////////////////////////////////////////////

void test_bt(void)//测量测量1~16KHZ周期
{
    T=0;

    test_bf();
 P1=P1|0xff;//情上次单位指示
    T=1000000/F_F;

    if(T<1000) 
 {
     T=T*10;point=3;
 }
 else if(T<10000)
 {
     point=4;
    }
 else
 {
     point=0;
 }
 P1_1=0;//us指示灯亮
}
//////////////////////////////////////////////////////////////////////////////////////
void test_cf(void)/*大于16KHZ频率,分频,T0记数,T1定时*/
{
    F=0;
    TMOD=0x15;
 TL0=0x00;
 TH0=0x00;
 TL1=0xbc;
 TH1=0xbd;

 ET0=1;
 ET1=1;
 EA=1;

    TR1=1;
 TR0=1;
 couter0=0;

 bus0=0;

    for(;couter0<16;);
    TR0=0;
 TR1=0;
 F=bus0*65536;
    F+=TL0|(TH0<<8);
 F=F*16;
 F_F=F;

 if(F<100000)
 {
     F/=10;point=2;
 }
    else if(F<1000000) 
 {
     F/=100;point=3;
 }
 else if(F<10000000)
 {
     F/=1000;point=4;
 }
    else 
 {
     point=0;
 }
 P1_3=0;//KHZ指示灯亮
}
void test_ct(void)//大于16KHZ频率
{
    T=0;
    test_cf();
 P1=P1|0xff;//情上次单位指示
    T=1000000/F_F;
    if(T<10)
    {
     T*=1000;point=1;
    }
    else if(T<100)
 {
     T*=100;point=2;
    }
    else if(T<1000)
 {
      T*=10;point=3;
 }
    else
    {
     point=0;
 }
    P1_1=0;//us指示灯亮
}
/////////////////////////////////////////////////////////////////////////////////////////////
void Display()//显示驱动程序
{
    buffer=BitTab[j];
    P0=P0|0xf0;
    P0=P0&buffer;
    buffer=DispBuf[j];
    buffer=DispTab[buffer];
    P2=buffer;

    switch(point)
    {
        case 1:if(j==0) P2_5=0;//第一位小数点亮
               break;
        case 2:if(j==1) P2_5=0;//第二位小数点亮
               break;
        case 3:if(j==2) P2_5=0;//第三位小数点亮
               break;
        default:break;
    }

    j++;
    if(j==4) j=0;
}
////////////////////////////////////////////////////////////////
void Delay_5m()
{
    for(delay=0;delay<800;delay++);
}
/////////////////////////////////////////////////////////////////
void Measure()
{
    TH0=0;
 TL0=0;
 TH1=0;
 TL1=0;
 F=0;
 T=0;
 W=0;
 Z=0;

    switch(key)
    {
        case 0xef:P0=P0|0x0f;
                  P0_1=0;//F指示灯亮
                  Ft();//flag_ft=Ft();///////////////////////////////////?????????????????
                  switch(flag_ft)
                  {
                      case 1:test_af();//测量小于1KHZ频率
                             break;
                      case 2:test_bf();//测量1~16KHZ频率
                             break;
                      case 3:test_cf();//测量大于16KHZ频率
                             break;
                      default://DispBuf[3]=10;
               //DispBuf[2]=10;
               //DispBuf[1]=10;
               //DispBuf[0]=10;//超量程处理
                              break;
                   }
                break;
        case 0xdf:P0=P0|0x0f;
                  P0_2=0;//T指示灯亮
                  Ft();//flag_ft=Ft();
                  switch(flag_ft)
                  {
                      case 1:test_at();//测量小于1KHZ周期
                             break;
                      case 2:test_bt();//测量1~16KHZ周期
                             break;
                      case 3:test_ct();//测量大于16KHZ周期
                             break;
                      default://DispBuf[3]=10;//超量程处理
               //DispBuf[2]=10;
               //DispBuf[3]=10;
               //DispBuf[0]=10;
                              break;
                   }
                break;
        case 0xbf:P0=P0|0x0f;
                  P0_3=0;//W指示灯亮
                  Ft_10();
                  switch(flag_ft)
                  {
                      case 4:test_w();//测量脉冲宽度
                             break;
                      default://DispBuf[3]=10;//超量程处理
               //DispBuf[2]=10;
               //DispBuf[1]=10;
               //DispBuf[0]=10;
                              break;
                   }
                break;
        case 0x7f:P0=P0|0x0f;
                  P0_0=0;//Z知指示灯亮
                  Ft_10();
                  switch(flag_ft)
                  {
                      case 4:test_z();//测量占空比
                             break;
                      default://DispBuf[3]=10;//超量程处理
               //DispBuf[2]=10;
               //DispBuf[1]=10;
               //DispBuf[0]=10;
                              break;
                   }
                break;
        default://DispBuf[3]=10;
          //DispBuf[2]=10;
    //DispBuf[1]=10;
    //DispBuf[0]=10;//Over_flow();//超量程处理
                break;
     }
}
////////////////////////////////////////////////////////////////////////////////
void INT_0(void) interrupt 0
{
    P1=0xff;
    key=P1;
    Measure();
}
/////////////////////////////////////////////////////////////////////////////////
void CT1(void) interrupt 3
{
    bus1+=1;

 couter0++;
}
/////////////////////////////////////////////////////////////////////////////////
void INT_1(void) interrupt 2
{
    TR0=~TR0;
    INT1_ready=INT1_ready+1;
}
/////////////////////////////////////////////////////////////////////////////////
void CT0(void) interrupt 1
{
    bus0+=1;//用于记数

 couter++;//用于1S定时
}
/////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////
void main(void)
{
    P1=0xff;

    P0=0xff;//开关状态标志灯灭,三极管关闭

    IT0=0;
    EX0=1;
    EA=1;

 IP=0x0e;//设定中断优先级INT0最低,两层嵌套时允许打断按键中断


    //显示主循环
    for(;;)
    {
        P1=P1|0xf0;
  TH0=0;
  TL0=0;
  TH1=0;
  TL1=0;

        switch(key)
        {
  case 0xef:turn=(unsigned int)F;
                  DispBuf[3]=turn%10;
                  turn=turn/10;
                  DispBuf[2]=turn%10;
                  turn=turn/10;
                  DispBuf[1]=turn%10;
                  DispBuf[0]=turn/10;
                  Display();
                  Delay_5m();
      break;
  case 0xdf:turn=(unsigned int)T;
                  DispBuf[3]=turn%10;
                  turn=turn/10;
                  DispBuf[2]=turn%10;
                  turn=turn/10;
                  DispBuf[1]=turn%10;
                  DispBuf[0]=turn/10;
                  Display();
                  Delay_5m();
      break;
  case 0xbf:turn=(unsigned int)W;
                  DispBuf[3]=turn%10;
                  turn=turn/10;
                  DispBuf[2]=turn%10;
                  turn=turn/10;
                  DispBuf[1]=turn%10;
                  DispBuf[0]=turn/10;
                  Display();
                  Delay_5m();
      break;
  case 0x7f:turn=Z;
                  DispBuf[3]=turn%10;
                  turn=turn/10;
                  DispBuf[2]=turn%10;
                  turn=turn/10;
                  DispBuf[1]=turn%10;
                  DispBuf[0]=turn/10;
                  Display();
                  Delay_5m();
      break;
   default:DispBuf[3]=10;
                  DispBuf[2]=10;
                  DispBuf[1]=10;
                  DispBuf[0]=10;
                  Display();
                  Delay_5m();
                  break;
   }
   cycle++;
   if(cycle==500)
   {
       Measure();
          cycle=0;
   }
    }
}

⌨️ 快捷键说明

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