plj.lst

来自「用2051制作的测试1HZ到1M的频率测试C程序」· LST 代码 · 共 262 行

LST
262
字号
C51 COMPILER V8.08   PLJ                                                                   07/11/2008 00:03:34 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE PLJ
OBJECT MODULE PLACED IN plj.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE plj.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h> // SFR声明
   2          #include <intrins.h>
   3          #include <math.h>
   4          #define ulong unsigned long
   5          #define  uchar unsigned char
   6          #define uint unsigned int
   7          #define udouble unsigned double
   8          
   9          #define         SYSCLK  24000 // 系统时钟频率kHz
  10          #define         STACK_START 0x60//堆栈底部
  11          #define         STACK_END 0xAF//堆栈顶部
  12          #define         disp_bit_hide   0x60 //显示位消隐
  13          
  14          #define         ts_2ms (0xffff-7962/2)//2ms              24MHz*2  0xf073
  15          #define         ts_025s 124//0.25S=2mS*124
  16          #define         ts_05s 249//0.5S=2mS*249
  17          #define         ts_1s 501//1S=2mS*500
  18          uint code JN[5]={10000,1000,100,10,1};
  19          
  20          uint  time_ref;
  21          uint  time_refs=ts_025s;
  22          uchar   xn=2,xnb=2;       //xnb=计数时间的倒数
  23          uchar led;
  24          uchar led_bit;    
  25          
  26          uint freq_alu_word=0;  //频率计数值 
  27          uint freq_alu_hb;
  28          uint freq_alu_lb;
  29          
  30          idata uchar freqh_word=0;               // 频率值
  31          idata ulong flowc_word=0;               // 中间比较值
  32          idata uchar dispbuf_bcd[5];             //显示缓冲区放5个值
  33          idata uchar disp_bcd[5];                //显示缓冲地址
  34          
  35          sbit cs245=P3^7;                                //位选74HC245,“0”有效
  36          bit  start=0;                                   //频率计数开始标志
  37          bit  busy=0;                                    //在一个时基内,频率计数完,频率计算开始标志
  38          uchar code tabchar[64]={
  39          
  40                  0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16,   //0~7,+00H
  41                  0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5,   //8~F,+08H   
  42                                                                                                     //数码显示:CHR 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
  43                  0xbf,0x1a,0x6f,0x7e,0xda,0xfc,0xfd,0x1e,   //0.~7.  +10h
  44                  0xff,0xfe,0xdf,0xf9,0xad,0x7b,0xed,0xcd,   //8.~f.  +18h        
  45                                                                                                     //数码显示带点:CHR 0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,A.,B.,C.,D.,E.,F.
  46                  0x00,0x50,0x12,0x85,0x41,0x71,0xc7,0x97,   // 灭 ,'-',-1 ,'R','r' ,'o','P','N','L'+20h
  47                  0xa1,0x51,0xd3,0x00,0x00,0x00,0x00,0x00,   //L,n,H +28h
  48                                                                                                     //字符显示:  灭 ,'-',-1 ,'R','r' ,'o','P','N','L','n','H'
  49                  0x08,0x58,0x1a,0x8d,0x49,0x79,0xcf,0x9f,   // 灭. ,'-.',-1. ,'R.','r.' ,'o.','P.','N.'+30h
  50                  0xa9,0x59,0xdb,0x00,0x00,0x00,0x00,0x00    //L.,n.H.+38h
  51                                                                                                  };//字符带点:  灭. ,'-.',-1. ,'R.','r.' ,'o.','P.','N.','L.','n.','H.
  52          void disp_scan()
  53          {       idata uchar buf;
  54   1              static uint k=0;
  55   1              k++;
C51 COMPILER V8.08   PLJ                                                                   07/11/2008 00:03:34 PAGE 2   

  56   1              if(k==500)
  57   1                      {k=0;   P2=~P2;}
  58   1              //led=4;                                //5个数码管
  59   1              //led_bit=1;                    //LED位控制位,最低位选中,
  60   1              cs245=0;
  61   1              P3=disp_bit_hide;       //显示位消隐
  62   1              _nop_();
  63   1              P3=0x7f&led_bit;                //开第一个数码管
  64   1              _nop_();
  65   1              P1=0x00;
  66   1              buf=dispbuf_bcd[led];
  67   1              P1=tabchar[buf];
  68   1              led--;                           //扫描位计数,更新下一个数码管缓冲区里显示数值
  69   1              led_bit=led_bit<<1;      //数码管位控移位,16进制数为,0x01,0x02,0x04,0x08,0x10,再回到0x01
  70   1              //if((led_bit==0x10)|(led==0))
  71   1               //{led_bit=1;led=4;}   ////一次五位显示循环完毕,重新赋扫描初值
  72   1               if(led>4|led_bit>0x10 |led_bit==0x00)
  73   1                      {led=4;led_bit=1;}      //一次五位显示循环完毕,重新赋扫描初值
  74   1      }
  75          void disp_start()               //显示(0.--9.)
  76          {       uchar i;
  77   1              for(i=0;i<5;i++)
  78   1              { dispbuf_bcd[i]=i+16;}//显示缓冲数据区里的值从0---4
  79   1              //delay(500);
  80   1              //for(j=5;j<10;j++)
  81   1              //{dispbuf_bcd[j-5]=j+16;}
  82   1      
  83   1      }
  84          void freq_alu() //频率计算
  85          {       ulong freq_reg; // 最终频率计算值 32位数
  86   1              freq_reg=freq_alu_hb;   //存高16位
  87   1              freq_reg=freq_reg<<16;  //移动16次 到32位的高16值
  88   1              freq_reg=freq_reg+freq_alu_lb;  //高16+低16位
  89   1              freq_reg=freq_reg<<xnb;//计数值freq_reg/计数时间        (xnb=计数时间的倒数)
  90   1              flowc_word=freq_reg;   //计算出来的频率值
  91   1              if(xn!=xnb){xnb=xn;}                                                                                             
  92   1      }
  93          void freq_bcd_n(ulong N)
  94          {       ulong M;
  95   1              uchar i,j,dot;
  96   1              //N=flowc_word;
  97   1              dot=3;  //小数点默认在第3位(0000.0)K
  98   1              if(N<100000)    
  99   1                      { dot=1;        //小数点第一位
 100   2                              time_refs=ts_1s; //频率低于10,时基改变为1S
 101   2                              xnb=0;}
 102   1              else if (N<1000000)
 103   1                      {               dot=2; //小数点定位在位2(000.00kHz)
 104   2                                      time_refs=ts_05s;       //默认时基
 105   2                                      xn=1;
 106   2                                      M=N%10;
 107   2                                      N=N/10;
 108   2                                      if(M>4){N++;}   //末位四舍五入
 109   2              
 110   2                      
 111   2                       }
 112   1              else    //if(N<10000000)
 113   1                      {               dot=3;                          //小数点定位在位3(0000.0kHz)
 114   2                                      time_refs=ts_025s;      //默认时基
 115   2                                      xn=2;
 116   2                                      M=N%100;
 117   2                                      N=N/100;
C51 COMPILER V8.08   PLJ                                                                   07/11/2008 00:03:34 PAGE 3   

 118   2                                      if(M>49){N++;}          //末位四舍五入
 119   2                      }
 120   1               //BCD码转化成5位十进制数,最高位从disp_bcd[0]开始
 121   1               for(i=0;i<=4;i++)
 122   1                      {disp_bcd[i]=N/JN[i];
 123   2                              N=N%JN[i];
 124   2                      }
 125   1                      disp_bcd[dot]=disp_bcd[dot]+0x10;//小数点位置 加16
 126   1      
 127   1               if(dot=1&(disp_bcd[0]==0))     //如果小数点在第一位并且第一个数码管的值为0
 128   1                      {disp_bcd[0]=0x20;}             //消隐
 129   1      
 130   1               for(j=0;j<5;j++)
 131   1                      {dispbuf_bcd[j]=disp_bcd[j];}
 132   1      
 133   1      }
 134          void delay(uint n)
 135          {       uint i;
 136   1              uchar j;
 137   1              for(i=0;i<n;i++)
 138   1                      for(j=0;j<255;j++)
 139   1                      {;;}
 140   1      }
 141          void freq_start()
 142          {       //cs245=0;
 143   1              EX0=0;//外中断0禁止
 144   1              ET0=1;
 145   1              ET1=1;
 146   1              TR1=0;//停止计数
 147   1              TF1=0;//清溢出标志
 148   1              TH1=0;//清计数初值
 149   1              TL1=0;
 150   1              TH0=0xf0;               //2毫秒定时初值
 151   1              TL0=0x60;
 152   1              freq_alu_word=0;
 153   1              time_ref=time_refs;
 154   1              TR0=1;
 155   1              TR1=1;
 156   1              PT0=1;
 157   1              start=1;
 158   1      
 159   1      }
 160          
 161          void Timer0() interrupt 1 using 1
 162          {       
 163   1              TF0=0;                          //中断溢出标志清0
 164   1              TH0=0xf0;               //2毫秒定时初值 
 165   1              TL0=0x60;
 166   1              if(start)               //如果频率计数开始
 167   1                              {if(time_ref--==0)
 168   2                                      {freq_alu_lb=TH1*256+TL1;
 169   3                                      freq_alu_hb=freq_alu_word;}
 170   2                                      busy=1;
 171   2                                      time_ref=time_refs;
 172   2                                      freq_start();
 173   2                              }
 174   1              disp_scan();
 175   1      
 176   1      }
 177          
 178          
 179          
C51 COMPILER V8.08   PLJ                                                                   07/11/2008 00:03:34 PAGE 4   

 180          void Timer1()interrupt 3 using 1
 181          {freq_alu_word++;}      
 182          
 183          void timer0_count1_init()
 184          {       TMOD=0x51;              //T0用来定时 T1用来计数
 185   1              TH0=0xf0;               //2毫秒定时初值
 186   1              TL0=0x60;
 187   1              TH1=0;                  //计数器1初值
 188   1              TL1=0;
 189   1              TR0=1;
 190   1              TF0=0;
 191   1              IT0=0;  //下降沿有效
 192   1              PT0=1;  //中断0优先
 193   1              EA=0;
 194   1      } 
 195          
 196          
 197          void main()
 198          {       led=4;
 199   1              led_bit=1;
 200   1              TMOD=0x51;              //T0用来定时 T1用来计数
 201   1              TH0=0xf0;               //2毫秒定时初值
 202   1              TL0=0x60;
 203   1              TH1=0;                  //计数器1初值
 204   1              TL1=0;
 205   1              TR0=1;
 206   1              ET0=1;
 207   1              PT0=1;
 208   1              timer0_count1_init(); //定时/计数初始化
 209   1              EA=1;
 210   1              disp_start();   //开始显示(0.-9.)
 211   1              delay(1000);    //延迟1S
 212   1              freq_start();   //频率计数开始
 213   1              for(;;)
 214   1                      {if(busy)
 215   2                              {freq_alu();     //频率计算
 216   3                               freq_bcd_n(flowc_word);//计算的频率值转化成10进制数 }
 217   3                               busy=0;        
 218   3                       }
 219   2                       freq_start();
 220   2      }
 221   1      
 222   1               
 223   1      
 224   1      
 225   1      
 226   1      
 227   1      
 228   1      
 229   1      
 230   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    906    ----
   CONSTANT SIZE    =     74    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16      14
   IDATA SIZE       =     15       1
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.

C51 COMPILER V8.08   PLJ                                                                   07/11/2008 00:03:34 PAGE 5   


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

⌨️ 快捷键说明

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