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

📄 频率计.lst

📁 单片机的频率计
💻 LST
字号:
C51 COMPILER V8.05a   频率计                                                               02/14/2007 22:59:12 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE 频率计
OBJECT MODULE PLACED IN 频率计.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 频率计.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg52.h>
   2          unsigned char t=0,yichu=0,fenpin;
   3          sbit B153=P2^0;
   4          sbit A153=P2^1;
   5          sbit GATE=P2^6;
   6          sbit CLR=P2^7;
   7          sbit P33=P3^3;
   8          
   9          
  10          void t0(void)interrupt 1
  11          {t++;
  12   1      yichu=2;                                                                //定时器0溢出,yichu=2
  13   1      }
  14          
  15          void t1(void)interrupt 3                                //计数器1溢出,yichu=1
  16          {TCON=0;
  17   1      yichu=1;
  18   1      TH1=0xff;
  19   1      TL1=0xff;
  20   1      }
  21          
  22          void delay(void)                                                //1s软件延时
  23          {unsigned int i=500,j;
  24   1      while(i)
  25   1              {i--;
  26   2              j=250;
  27   2              while(j)
  28   2                      {j--;}
  29   2              }
  30   1      }
  31          unsigned char table(unsigned char x)    //软件查表输出
  32          {unsigned char code n[10]={0xee,0x82,0xdc,0xd6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6};
  33   1      return(n[x]);
  34   1      }
  35          
  36          display(float f)                                                //以测出的频率串行输出
  37          {unsigned long x;
  38   1      unsigned char a[5]={0,0,0,0,0},i=0,j;
  39   1      if(f!=0){
  40   2      if((f<10000)&&(f>1))                                    //正常显示
  41   2              {if(f>1000)f=f-1;                                       //软件修正频率偏差
  42   3              while(f<1000)
  43   3                      {f=f*10;
  44   4                      i++;
  45   4                      }
  46   3              x=f*10;
  47   3              a[4]=x%10;
  48   3              if(a[4]>=5)f=f+1;;
  49   3              x=f;
  50   3              a[1]=x%10;
  51   3              a[2]=(x/10)%10;
  52   3              a[3]=(x/100)%10;
  53   3              a[4]=(x/1000)%10;
  54   3              for(j=0;j<5;j++)
  55   3                      {a[j]=table(a[j]);}
C51 COMPILER V8.05a   频率计                                                               02/14/2007 22:59:12 PAGE 2   

  56   3              a[i+1]++;
  57   3              a[0]=0;
  58   3              }
  59   2      else if(f>=10000)                                               //以科学计数法显示
  60   2              {while(f>=1000)
  61   3                      {f=f/10;
  62   4                      i++;
  63   4                      }
  64   3              x=f;
  65   3              a[4]=(unsigned char)((float)((f-x))*10);
  66   3              if(a[4]>=5)x++;                                         //四舍五入
  67   3              a[2]=x%10;
  68   3              a[3]=(x/10)%10;
  69   3              a[4]=(x/100)%10;
  70   3              a[0]=i+2;
  71   3              for(j=0;j<5;j++)
  72   3                      {a[j]=table(a[j]);}
  73   3              a[4]++;
  74   3              a[1]=0x7c;
  75   3              }
  76   2      else
  77   2              {x=f*10000;                                                     //频率值小于1
  78   3              if((x%10)>=5)x=x+10;    //四舍五入
  79   3              x=x/10;
  80   3              a[1]=x%10;
  81   3              a[2]=(x/10)%10;
  82   3              a[3]=(x/100)%10;
  83   3              a[4]=(x/1000)%10;
  84   3              for(j=0;j<5;j++)                
  85   3                      {a[j]=table(a[j]);}
  86   3              a[4]++;
  87   3              a[0]=0;
  88   3              }
  89   2              
  90   2      }
  91   1      for(j=0;j<5;j++)                        //串行
  92   1              {SBUF=a[j];
  93   2              while(TI==0);}
  94   1      
  95   1      }
  96          
  97          cepin()
  98          {unsigned char i;
  99   1      float sj;
 100   1      unsigned long js;//时间、计数的拼音首字母
 101   1      float f;                //f为频率
 102   1      TMOD=0xd9;
 103   1      t=0;
 104   1      TH0=0;
 105   1      TL0=0;
 106   1      TH1=0;
 107   1      TL1=0;
 108   1      GATE=0;
 109   1      TCON=0x50;
 110   1      GATE=1;
 111   1      delay();
 112   1      GATE=0;
 113   1      for(i=0;i<250;i++){}                            //延时1ms
 114   1      sj=((float)(TH0*256+t*65536+TL0))/1000000.0;
 115   1      js=(long)TH1*256+TL1+1;
 116   1      f=(js/sj)*fenpin;
 117   1      display(f);
C51 COMPILER V8.05a   频率计                                                               02/14/2007 22:59:12 PAGE 3   

 118   1      }
 119          
 120          
 121          
 122          panduan()
 123          {float zhouqi;
 124   1      B153=1;
 125   1      A153=1;
 126   1      TMOD=0x51;              
 127   1      TH0=0xce;               //定时器0=12.8ms
 128   1      TL0=0;
 129   1      TH1=0xff;               //计数器1=100个脉冲
 130   1      TL1=0x9c;
 131   1      TCON=0x50;
 132   1      while(yichu==0);
 133   1      TCON=0;
 134   1      if(yichu==1)    //计数器先溢出:在12.8ms内测得的脉冲过多,说明频率较高
 135   1              {fenpin=128;//转为测128分频后的频率
 136   2              cepin();}
 137   1      else                    //计时器先溢出:100个脉冲的时间比较短,即频率较低,可以减少分频数
 138   1              {yichu=0;
 139   2              B153=1;
 140   2              A153=0;
 141   2              TH0=0xc1;       //定时器0=16ms
 142   2              TL0=0x80;
 143   2              TH1=0xff;       //计数器1=100个脉冲
 144   2              TL1=0x9c;
 145   2              TCON=0x50;
 146   2              while(yichu==0);
 147   2              TCON=0;
 148   2              if(yichu==1)   //计数器先溢出:在16ms内测得的脉冲过多,说明频率较高
 149   2                      {fenpin=16;//转为测16分频后的频率
 150   3                      cepin();}
 151   2              else             //计时器先溢出:100个脉冲的时间比较短,即频率较低,用2分频测周期
 152   2                      {B153=0; //以下是测周期部分
 153   3                      A153=0;
 154   3                      TH0=0;
 155   3                      TL0=0;
 156   3                      t=0;
 157   3                      TMOD=0x09;
 158   3                      TR0=1;
 159   3                      GATE=1;
 160   3                      while(P33==0);
 161   3                      GATE=0;
 162   3                      while(P33==1);
 163   3                      TR0=0;
 164   3                      zhouqi=(TH0*256+t*65536+TL0)/1000000.0;
 165   3                      if(zhouqi<0.001)        //若周期太小,则转为测原频率
 166   3                              {fenpin=1;
 167   4                              B153=0;
 168   4                              A153=0;
 169   4                              cepin();}
 170   3                      else{display((1.0/zhouqi));}
 171   3                      }
 172   2              }
 173   1      }
 174          
 175          
 176          
 177          main()
 178          {
 179   1      IE=0x8a;
C51 COMPILER V8.05a   频率计                                                               02/14/2007 22:59:12 PAGE 4   

 180   1      while(1)
 181   1              {
 182   2              panduan();      //判断原频率属于哪个范围,并调用相应函数测其频率
 183   2              delay();
 184   2              }
 185   1      
 186   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1478    ----
   CONSTANT SIZE    =     15    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3      23
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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