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

📄 main.lst

📁 在c8051f015单片机上实现最小二乘法曲线拟合算法
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   MAIN                                                                  01/08/2008 15:08:10 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND TABS(2)

line level    source

   1          /*-------------------------------------------------------------------------------------------------
   2          文件名称:Main.c
   3          创建日期:07.07.30
   4          修改日期:
   5          文件说明:功能:
   6                     -基于C8051F000系列单片机的FFT试验程序
   7          创建人:  李大伟
   8          -------------------------------------------------------------------------------------------------*/
   9          #include <stdio.h>
  10          #include <intrins.h>
  11          #include <math.h>
  12          #include "C8051F000.h"
  13          #include "CalcPhase.h"
  14          //ADC0寄存器定义
  15          #define NUM_FFT 128
  16          sfr16 ADC0     =     0xBE; 
  17                      
  18          //外部XRAM数据的起始
  19          #define DATA_BEGIN      0x0000 
  20          #define EnableInt()     EIE2|=0x02
  21          #define UnEnableInt()   EIE2&=~0x02
  22          #define SendChar(charr) SBUF=charr; while(!TI); TI=0
  23          #define GoToInSide()    P1|=0x18;   P1&=~0x10                            //切换到内光路
  24          #define GoToOutSide()   P1|=0x18;   P1&=~0x08                            //切换到外光路
  25          #define RuleOne()       P1|=0x06;   AMX0SL=0x07;P2|= 0x01     //以2.5  m测尺测量
  26          #define RuleTwo()       AMX0SL=0x06;P1|=0x06;   P1&=~0x06      //以25   m测尺测量
  27          #define RuleThr()       AMX0SL=0x06;P1|=0x06;   P1&=~0x04     //以250  m测尺测量
  28          #define RuleFor()       AMX0SL=0x06;P1|=0x06;   P1&=~0x02     //以2500 m测尺测量
  29          #define RuleFir()       AMX0SL=0x06;P1|=0x06;   P1&=~0x02      //以25000m测尺测量
  30          #define JstIntLgh()     ErrSta=JudgeLightInSide()                        //调节内光路光强
  31          #define JstOutLgh(a)    ErrSta=JudgeLightOutSide(a);if(ErrSta) return 0  //外光路光强判断
  32          #define ONEPI           3.1415926535897932384626433832795                //pi
  33          #define TWOPI           6.283185307179586476925286766559                 //pi*2
  34          #define HALFPI          1.5707963267948966192313216916398                //pi/2
  35          #define ONEHALFPI       4.7123889803846898576939650749193                //pi*1.5
  36          #define RULER0          2.5274651209813304576396845723529                //2.5 m尺长
  37          #define RULER1          25.274651209813304576396845723529                //25  m尺长
  38          #define RULER2          252.74651209813304576396845723529                //250 m尺长
  39          #define RULER3          2527.4651209813304576396845723529                //2500m尺长
  40          #define HALFRULER0      1.263732560490665228819842286176
  41          #define HALFRULER1      12.63732560490665228819842286176
  42          #define HALFRULER2      126.3732560490665228819842286176
  43          
  44          
  45          #define AVGNUM  7
  46          //函数申明
  47          float MeasureDistance(void);
  48          void  SysInit(void);
  49          void  DataUnite(void);
  50          void  PrtChr(unsigned char TemChr);
  51          void  ADC0_ISR(void);
  52          float SignleMeasure(float RulerLenght);
  53          float MeasureSub(void);
  54          
  55          //全局变量
C51 COMPILER V7.50   MAIN                                                                  01/08/2008 15:08:10 PAGE 2   

  56          //FFT的XRAM空间=NUM_FFT*4字节(起始于DATA_BEGIN)
  57          int xdata Real[NUM_FFT] _at_  DATA_BEGIN;
  58          
  59          
  60          #if(NUM_FFT>=256)
               unsigned int index,ADC_Index;
              #endif
  63          
  64          #if(NUM_FFT<256)
  65           unsigned char index,ADC_Index;
  66          #endif
  67          
  68          bit   Conversion_Set_Complete; //一轮采样结束标志位
  69          int   MaxVal;                  //一轮采样中数据的最大值
  70          int   MinVal;                  //一轮采样中数据的最小值
  71          float LengthResult;            //测距结果
  72          unsigned char FlgEn;           //数据有效标志
  73          unsigned char ErrSta;          //全局错误代码
  74          unsigned char AvgeTimes;       //平均次数
  75          unsigned char SampeEnable;     //采样允许标志
  76          unsigned char MesuState;       //测量状态标志
  77          unsigned char MesuEnable;      //测量允许标志
  78          
  79          /*=================================================================================================
  80          01.名称:main
  81             入口:无
  82             出口:无
  83             功能:系统主函数
  84          =================================================================================================*/
  85          void main()
  86          {
  87   1        long  TemLVal;
  88   1        float TemFVal;
  89   1        unsigned char TemBuf;
  90   1        
  91   1        SysInit();
  92   1        while(1)
  93   1        {
  94   2          while(!RI); RI=0;
  95   2          TemBuf=SBUF;
  96   2          switch(TemBuf)
  97   2          {
  98   3            case  0xBB:
  99   3              SendChar(0xBB);
 100   3              break;
 101   3            case  0xB4:
 102   3              SendChar(0xB4);      //k=justlight();
 103   3              if(ErrSta)
 104   3              {
 105   4                if(ErrSta==1)      {ErrSta=0;PrtChr(0x11);}                  //光太弱
 106   4                else if(ErrSta==2) {ErrSta=0;PrtChr(0x22);}                  //光太强
 107   4                break;
 108   4              }
 109   3              LengthResult=MeasureDistance();                                //测距
 110   3              if(ErrSta)
 111   3              {
 112   4                if(ErrSta==1)      {ErrSta=0;PrtChr(0x11);}                  //光太弱
 113   4                else if(ErrSta==2) {ErrSta=0;PrtChr(0x22);}                  //光太强
 114   4                break;
 115   4              }
 116   3              if(FlgEn)                                                      //数据有效
 117   3              {                                                              //将数据发给主板
C51 COMPILER V7.50   MAIN                                                                  01/08/2008 15:08:10 PAGE 3   

 118   4                SendChar(0xDD);
 119   4                TemLVal=(long)LengthResult;
 120   4                SendChar(TemLVal/1000);                                      //千位
 121   4                SendChar((((TemLVal%1000)/100)<<4)|((TemLVal%1000)%100)/10); //百位和十位
 122   4                ErrSta=((TemLVal%1000)%100)%10;
 123   4                TemFVal=LengthResult-(float)TemLVal;
 124   4                TemLVal=(long)(TemFVal*1000);
 125   4                SendChar((ErrSta<<4)|(TemLVal/100));ErrSta=0;                //个位和十分位
 126   4                SendChar((((TemLVal%100)/10)<<4)|((TemLVal%100)%10));        //百分位和千分位
 127   4                SendChar(0x0d); 
 128   4              }
 129   3              else PrtChr(0x33); 
 130   3              break;
 131   3            case 0xB7:                                                       //打开关闭激光指示
 132   3              SendChar(0xB7);                                                
 133   3              if((P1&0x08)==0x08) {GoToOutSide();}                           //外光路
 134   3              else                {GoToInSide ();}                           //内光路
 135   3              break;
 136   3            case  0xB8:                                                      //发送高压值给主板
 137   3              SendChar(0xB8);
 138   3              SendChar(0xB8);
 139   3              MaxVal=(DAC0H<<8)|DAC0L;
 140   3              SendChar(((MaxVal/1000)<<4)|((MaxVal%1000)/100));
 141   3              SendChar(((((MaxVal%1000)%100)/10)<<4)|(((MaxVal%1000)%100)%10));
 142   3              SendChar(0x0D);
 143   3              break;
 144   3            default:
 145   3              break;
 146   3          }
 147   2        }
 148   1      }
 149          
 150          /*=================================================================================================
 151          02.名称:SysInit
 152             入口:tem - 要发送的字符,占一个字节
 153             出口:无
 154             功能:通过串口与主板通讯
 155          =================================================================================================*/
 156          void SysInit(void)
 157          {
 158   1        WDTCN   = 0xDE;            //关看门狗
 159   1        WDTCN   = 0xAD;
 160   1        OSCXCN  = 0x20;            //外部时钟输入@19.44MHz
 161   1        OSCICN  = 0x08;
 162   1        XBR0    = 0x07;            //配置交叉开关
 163   1        XBR2    = 0x41;
 164   1        CKCON   = 0x20;            //配置定时器2作为波特率发生器
 165   1        TMOD    = 0x30;            //8为异步
 166   1        T2CON   = 0x34;
 167   1        RCAP2L  = 0xC1;            //9600@19.44MHz
 168   1        RCAP2H  = 0xFF;            
 169   1        SCON    = 0x50;            //UART
 170   1        REF0CN  = 0x03;            //参考电压
 171   1        DAC0CN  = 0x80;            //ADC
 172   1        AMX0SL  = 0x06;
 173   1        ADC0CF  = 0x80;
 174   1        ADC0CN  = 0xC8;
 175   1        P1=0xff;
 176   1        P0=0x0; 
 177   1        P2&=~0x01;
 178   1        P1&=~0x80;
 179   1        P1&=~0x40;
C51 COMPILER V7.50   MAIN                                                                  01/08/2008 15:08:10 PAGE 4   

 180   1        DAC0L&=0x0;
 181   1        DAC0H&=0x0;                
 182   1        DAC0L|=0x6a;               //设置高压值
 183   1        DAC0H|=0x05;
 184   1        FlgEn       = 1;           //初始化变量及标志
 185   1        ErrSta      = 0;

⌨️ 快捷键说明

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