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

📄 main.lst

📁 在c8051f015单片机上实现最小二乘法曲线拟合算法
💻 LST
📖 第 1 页 / 共 2 页
字号:
 186   1        ADC_Index   = 0;
 187   1        SampeEnable = 0;
 188   1        MesuState   = 0;
 189   1        IE = 0x80;                 //中断使能
 190   1      }
 191          /*=================================================================================================
 192          02.名称:PrtChr
 193             入口:tem - 要发送的字符,占一个字节
 194             出口:无
 195             功能:通过串口与主板通讯
 196          =================================================================================================*/
 197          void PrtChr(unsigned char TemChr)
 198          {
 199   1        SendChar(0xDD);   //无效
 200   1        SendChar(TemChr); //千位
 201   1        SendChar(TemChr);
 202   1        SendChar(TemChr);
 203   1        SendChar(TemChr);
 204   1        SendChar(0x0D);
 205   1      }
 206          /*=================================================================================================
 207          01.名称:MeasureDistance
 208             入口:无
 209             出口:DisVal0:返回单次测距值
 210             功能:单次测量函数
 211          =================================================================================================*/
 212          float MeasureDistance(void)
 213          {
 214   1        float xdata DisVal0,DisVal1,DisVal2,DisVal3;//;
 215   1        unsigned char N0,N1,N2;
 216   1      
 217   1        RuleFor(); 
 218   1        DisVal3=RULER3-SignleMeasure(RULER3);
 219   1      
 220   1        RuleThr();
 221   1        DisVal2=SignleMeasure(RULER2);
 222   1      
 223   1        RuleTwo();
 224   1        DisVal1=SignleMeasure(RULER1);
 225   1      
 226   1        RuleOne();
 227   1        DisVal0=SignleMeasure(RULER0);
 228   1      
 229   1      
 230   1      
 231   1      /*
 232   1        RuleOne();
 233   1       //JstOutLgh();
 234   1        DisVal0=SignleMeasure(RULER0);
 235   1        P2&=~0x01;
 236   1        //SelChlZer();
 237   1      
 238   1        RuleTwo();
 239   1        DisVal1=SignleMeasure(RULER1);
 240   1        //SelChlSix();
 241   1       
C51 COMPILER V7.50   MAIN                                                                  01/08/2008 15:08:10 PAGE 5   

 242   1        RuleThr();
 243   1        DisVal2=SignleMeasure(RULER2);
 244   1        //SelChlSix();
 245   1      
 246   1        RuleFor(); 
 247   1        DisVal3=SignleMeasure(RULER3);
 248   1        //SelChlSix();
 249   1        */
 250   1        DisVal3+=((float)HALFRULER2-DisVal2/2);
 251   1        DisVal2+=((float)HALFRULER1-DisVal1/2);
 252   1        DisVal1+=((float)HALFRULER0-DisVal0/2);
 253   1      
 254   1        N0=(unsigned char)(((DisVal1-DisVal0)/RULER0)+0.5);
 255   1        N1=(unsigned char)(((DisVal2-DisVal1)/RULER1)+0.5);
 256   1        N2=(unsigned char)(((DisVal3-DisVal2)/RULER2)+0.5);
 257   1        DisVal0+=(10*N1+N0)*RULER0;//100*N2+ 
 258   1      
 259   1        return DisVal0;
 260   1      }
 261          /*=================================================================================================
 262          01.名称:SignleMeasure
 263             入口:RulerLenght: 测尺长度
 264             出口:返回单测尺测距值
 265             功能:单测尺一次测量函数
 266          =================================================================================================*/
 267          float SignleMeasure(float rl)
 268          {
 269   1        float xdata Ph1,Ph2,Ph3;
 270   1        long DelayA,DelayB;
 271   1        unsigned char i;
 272   1      
 273   1        DelayA=65000;
 274   1        DelayB=65000;
 275   1        ADC_Index = 0;                          
 276   1        SampeEnable=0;
 277   1        MesuState=0;
 278   1        MesuEnable=0;
 279   1      
 280   1        for(i=0;i<NUM_FFT;i++)
 281   1        {
 282   2          Real[i]=0;
 283   2        }
 284   1        GoToInSide();//内
 285   1        while(DelayA--);
 286   1        MesuState=1;
 287   1        AvgeTimes=AVGNUM;
 288   1        EnableInt();
 289   1        while(MesuState);
 290   1        for(i=0;i<NUM_FFT;i++)
 291   1        {
 292   2          Real[i]=(int)(((float)Real[i]/AVGNUM)+0.5);//Real[i]/AVGNUM;
 293   2        }
 294   1        Ph1=rl*(GetPhaseFromMeasDat(Real)/2500.0);
 295   1        for(i=0;i<NUM_FFT;i++)
 296   1        {
 297   2          Real[i]=0;
 298   2        }
 299   1        GoToOutSide();//外
 300   1        while(DelayB--);
 301   1        MesuState=1;
 302   1        AvgeTimes=AVGNUM;
 303   1        while(MesuState);
C51 COMPILER V7.50   MAIN                                                                  01/08/2008 15:08:10 PAGE 6   

 304   1        UnEnableInt();
 305   1        for(i=0;i<NUM_FFT;i++)
 306   1        {
 307   2          Real[i]=(int)(((float)Real[i]/AVGNUM)+0.5);//Real[i]/AVGNUM;
 308   2        }
 309   1        Ph2=rl*(GetPhaseFromMeasDat(Real)/2500.0);
 310   1      
 311   1        if(Ph1-Ph2<0.0000001) Ph3=Ph2-Ph1; //NOW
 312   1        else Ph3=rl-(Ph1-Ph2);
 313   1      
 314   1        return Ph3; 
 315   1      }
 316          
 317          /*=================================================================================================
 318          12.名称:ADC0_ISR
 319             入口:无
 320             出口:无
 321             功能:ADC0中断服务子程序
 322          =================================================================================================*/
 323          void ADC0_ISR(void) interrupt 15 using 3
 324          {
 325   1        int ADCSamp;
 326   1      
 327   1        ADCINT=0;                                               //清ADC转换标志位
 328   1        if(SampeEnable==1)
 329   1        {
 330   2          ADCSamp=ADC0;                                //存ADC的转换值
 331   2          if(MaxVal<=ADCSamp) MaxVal=ADCSamp;    
 332   2          if(MinVal>=ADCSamp) MinVal=ADCSamp;
 333   2          Real[ADC_Index]+=ADCSamp;
 334   2          ADC_Index++;                                         //采样次数加1
 335   2          if(ADC_Index>=NUM_FFT)                               //达到采样数
 336   2          {
 337   3            ADC_Index=0;
 338   3            AvgeTimes--;
 339   3            if(AvgeTimes==0)
 340   3            {
 341   4              SampeEnable=0;
 342   4              MesuState=0;
 343   4            }
 344   3          }
 345   2        }
 346   1        else
 347   1        {
 348   2          ADC_Index++;
 349   2          if(ADC_Index>=NUM_FFT||MesuState==1)
 350   2          {
 351   3            if(MesuState==1&&ADC_Index==NUM_FFT)
 352   3            {
 353   4              SampeEnable=1;
 354   4              MaxVal=0;
 355   4              MinVal=4096;
 356   4              ADC_Index=0;
 357   4            }
 358   3            else if(ADC_Index==NUM_FFT) ADC_Index=0; 
 359   3          }
 360   2        }
 361   1      }
 362          /*-----------------------------------------------------------------------------------------------*/
 363          //End FFT_New_test.c


C51 COMPILER V7.50   MAIN                                                                  01/08/2008 15:08:10 PAGE 7   

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2214    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----      28
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16      24
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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