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

📄 fm.lst

📁 频率计的 电路图及 源程序
💻 LST
字号:
C51 COMPILER V7.02a   FM                                                                   03/07/2008 11:52:23 PAGE 1   


C51 COMPILER V7.02a, COMPILATION OF MODULE FM
OBJECT MODULE PLACED IN fm.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE fm.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include "reg51.h"
   2          #include "stdio.h"
   3          #include " absacc.h "
   4          #include <intrins.h>
   5          #include <math.h>
   6          
   7          
   8          /********************************************************************/
   9          void delay_nms(unsigned int n);//delay function
  10          
  11          sbit F_in=P3^6;  //测量频率管脚
  12          sbit F_out=P3^7; //发生频率管脚
  13          
  14          bit int_flag;
  15          unsigned int frequency;
  16          
  17          void Display(void);
  18          void Mcu_init(void);
  19          void Measure_F(void);
  20          void Measure_T(void);
  21          void Frequency_Measure(void);
  22          
  23          
  24          /***********************************************************************/     
  25          
  26          /********************/
  27          sbit  RCLK = P2^5;
  28          sbit  SCLK = P2^6;
  29          sbit  SDAT = P2^7;
  30          
  31          sbit  A_SEL = P2^2;
  32          sbit  B_SEL = P2^3;
  33          sbit  C_SEL = P2^4;
  34          
  35          #define         SM0             A_SEL = 0;      B_SEL = 0;      C_SEL = 0
  36          #define         SM1             A_SEL = 1;      B_SEL = 0;      C_SEL = 0
  37          #define         SM2             A_SEL = 0;      B_SEL = 1;      C_SEL = 0
  38          #define         SM3             A_SEL = 1;      B_SEL = 1;      C_SEL = 0
  39          #define         SM4             A_SEL = 0;      B_SEL = 0;      C_SEL = 1
  40          #define         SM5             A_SEL = 1;      B_SEL = 0;      C_SEL = 1
  41          #define         SM6             A_SEL = 0;      B_SEL = 1;      C_SEL = 1
  42          #define         SM7             A_SEL = 1;      B_SEL = 1;      C_SEL = 1
  43          
  44          unsigned char leddata[]={ 
  45           
  46                          0x3F,  //"0"
  47                          0x06,  //"1"
  48                          0x5B,  //"2"
  49                          0x4F,  //"3"
  50                          0x66,  //"4"
  51                          0x6D,  //"5"
  52                          0x7D,  //"6"
  53                          0x07,  //"7"
  54                          0x7F,  //"8"
  55                          0x6F,  //"9"
C51 COMPILER V7.02a   FM                                                                   03/07/2008 11:52:23 PAGE 2   

  56                          0x77,  //"A"
  57                          0x7C,  //"B"
  58                          0x39,  //"C"
  59                          0x5E,  //"D"
  60                          0x79,  //"E"
  61                          0x71,  //"F"
  62                          0x76,  //"H"
  63                          0x38,  //"L"
  64                          0x37,  //"n"
  65                          0x3E,  //"u"
  66                          0x73,  //"P"
  67                          0x5C,  //"o"
  68                          0x40,  //"-"
  69                          0x00,  //熄灭
  70                          0x00  //自定义
  71           
  72                                   };
  73          
  74          void send(unsigned char data_out)
  75          {
  76   1              unsigned char i;
  77   1              RCLK = 0;
  78   1              
  79   1              for(i=0;i<8;i++)
  80   1              {
  81   2                      if( data_out & 0x80)
  82   2                              SDAT = 1;
  83   2                      else
  84   2                              SDAT = 0;
  85   2                      SCLK = 0;
  86   2                      
  87   2                      SCLK = 1;
  88   2                      
  89   2                      data_out =  data_out<<1;          
  90   2              }
  91   1              RCLK = 1;
  92   1      }
  93          
  94          #define         delay           450
  95          
  96          
  97          
  98          /***********************************************************************/
  99          void dis_delay(void);
 100          void display(unsigned int temp);
 101          /***********************************************************************/
 102          
 103          void display(unsigned int temp) 
 104          {   
 105   1              unsigned int i;
 106   1      
 107   1              //send(0x00);
 108   1      
 109   1              SM6;
 110   1              send(0x40);
 111   1              for(i = 0; i < delay; i++);
 112   1              send(0x00);
 113   1               
 114   1              SM7;
 115   1              if(frequency<2000)
 116   1                      send(0x39);
 117   1              else
C51 COMPILER V7.02a   FM                                                                   03/07/2008 11:52:23 PAGE 3   

 118   1                      send(0x71);
 119   1              for(i = 0; i < delay; i++);
 120   1              send(0x00);
 121   1              
 122   1              SM0;
 123   1              send(leddata[temp/1000%10]);
 124   1              for(i = 0; i < delay; i++);
 125   1              send(0x00);
 126   1      
 127   1              SM1;
 128   1              send(leddata[temp/100%10]);
 129   1              for(i = 0; i < delay; i++);
 130   1              send(0x00);
 131   1      
 132   1              SM2;
 133   1              send(leddata[temp/10%10]);
 134   1              for(i = 0; i < delay; i++);
 135   1              send(0x00);
 136   1      
 137   1              SM3;
 138   1              send(leddata[temp%10]);
 139   1              for(i = 0; i < delay; i++);
 140   1              send(0x00);
 141   1      
 142   1      
 143   1      }
 144           
 145          void main()
 146          { 
 147   1       Mcu_init();   //初始化
 148   1        
 149   1       while(1)    
 150   1       {
 151   2       unsigned int i;  
 152   2       Frequency_Measure();
 153   2       
 154   2       
 155   2       for(i=100;i>0;i--)
 156   2          display(frequency);
 157   2       }
 158   1      }
 159          
 160          void time0(void)  interrupt 1 
 161          {
 162   1       int_flag=1; //计数溢出标志
 163   1      }
 164          
 165          void time1(void)  interrupt 3 
 166          {
 167   1       TH1=0xfe; //重新附值
 168   1       TL1=0x33;
 169   1       F_out=!F_out; //取反 产生频率
 170   1      }
 171          
 172          void Frequency_Measure(void)   
 173          {
 174   1       if(frequency<2000)   //小于 2k 测周
 175   1        Measure_T();
 176   1       else if(frequency>=2000) //大于2k 测频
 177   1        Measure_F();
 178   1      }
 179          
C51 COMPILER V7.02a   FM                                                                   03/07/2008 11:52:23 PAGE 4   

 180          //测频原理:
 181          //开一个标准的50ms计数闸门,对被测信号计数
 182          void Measure_F(void)  //测频子函数
 183          {
 184   1       bit state_old=0,state_new=0; //定义状态
 185   1       unsigned int f_count=0;   //计数临时值
 186   1       int_flag=0;
 187   1       TH0=0x4c; //定时器初值 50ms
 188   1       TL0=0x00;
 189   1       TR0=1;  //启动计数器
 190   1       while(1)  //死循环 测频
 191   1       {
 192   2        state_new=F_in; //取得现在的 频率发生引脚状态
 193   2        if(state_old!=state_new) //与前一个时刻 旧值 比较,如果不同
 194   2         f_count++;  //则 计数加1
 195   2        state_old=state_new; //将新值 付给 旧值
 196   2        if(int_flag)  //如果到了定时时间
 197   2        { 
 198   3         TR0=0;  //关闭定时器0 
 199   3         frequency=f_count*10; //计算频率
 200   3            //定时 50ms计数 每个周期 计2次 所以 1s内计数= f_count*10
 201   3         return;  //返回 跳出循环
 202   3        }
 203   2       }
 204   1      }
 205          
 206          //原理:以被测信号的一个周期为闸门
 207          //对单片机及其周期进行计数 读取定时器的值为计数值
 208          void Measure_T(void) //测周子函数
 209          { 
 210   1       bit state_old=0,state_new=0; //定义状态
 211   1       unsigned char temp_flag=0;
 212   1       unsigned int t_count;   //计数临时值
 213   1       
 214   1       TH0=0;
 215   1       TL0=0;
 216   1          while(1) //死循环 测周
 217   1          {
 218   2            state_new=F_in; //取得现在的 频率发生引脚状态
 219   2              if(state_old&&!state_new)  // 下降沿开始启动闸门
 220   2              {
 221   3               temp_flag++;   
 222   3               TR0=1;  //启动定时器 计数
 223   3              }
 224   2              if(temp_flag==2)
 225   2              {
 226   3               TR0=0;   //计数停止
 227   3               t_count=TH0*256+TL0;  //取得当前的计数值
 228   3               frequency=1000000/t_count;  //计算频率
 229   3               return;  //返回
 230   3              }
 231   2              state_old=state_new;
 232   2       }
 233   1      }
 234          
 235          
 236          void Mcu_init(void) //初始化函数
 237          {
 238   1       EA=1;  //开总中断
 239   1       ET0=1;  //定时器0 开
 240   1       TR0=1;    //启动定时器 0
 241   1       ET1=1;  //定时器 1 开
C51 COMPILER V7.02a   FM                                                                   03/07/2008 11:52:23 PAGE 5   

 242   1       TR1=1;  //启动定时器1 
 243   1       TMOD=0x11;  //工作状态
 244   1       TH0=0x4c; //定时器初值
 245   1       TL0=0x00;
 246   1       TH1=0xfe;
 247   1       TL1=0x33;
 248   1      
 249   1      }
 250           
 251          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    487    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     27       3
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       4
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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