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

📄 mainc.lst

📁 基于F020单片机的简易音频信号分析仪的实现keil程序(C实现)。2007年9月全国大学生电子设计竞赛题目(获得省2等奖)所有要求功能都实现。希望对感兴趣的朋友有帮助!
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   MAINC                                                                 09/06/2007 21:49:07 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MAINC
OBJECT MODULE PLACED IN mainc.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE mainc.c LARGE OPTIMIZE(0,SPEED) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          // 包含文件
   2          
   3          #define   MAINC_GLOBALS
   4          #include "includes.h"
   5          #include "charbank.h"
   6          #include "math.h"
   7          
   8          
   9          #define   MAXIMUM(x,y) (x>y)?x:y
  10          
  11          
  12          //sbit bb=P0^6;
  13          //外部中断6(键盘用)
  14          void ExtentInt6 (void) interrupt 18 {
  15   1              _nop_();
  16   1              P3IF &= 0XBF;//清中断标志
  17   1              key_flag = 1;
  18   1      
  19   1      }
  20          
  21          //定时器3中断
  22          void Timer3Int(void) interrupt 14 {
  23   1              TMR3CN &= 0X7F; //清中断标志
  24   1              Timer3Counter1++;
  25   1      }
  26          
  27          
  28          
  29          //ADC初始化程序
  30          ADCInit(void){
  31   1              AMX0CF = 0;     //各通道单独输入
  32   1              AMX0SL = 0;     //通道选择
  33   1              ADC0CF = 0x48;  //系统时钟24M,SAR时钟2M,AD0SC=11,PGA=1
  34   1              ADC0CN = 0x80;  //ADC0使能,一直处于跟踪,向AD0BUSY写1启动转换,数据右对齐
  35   1              REF0CN = 0x07;  //ADC0基准取VREF0,内部温度传感器、内部偏压发生器、缓冲器工作
  36   1      }
  37          ///////fft////////////////////
  38          void kkfft(pr,pi,n,k,fr,fi,l,il)
  39            int   n,k,l,il;
  40            float   pr[],fr[];//修改
  41            float   pi[],fi[];
  42          
  43            { int   it,m,is,i,j,nv,l0;
  44   1          float  p,q,s,vr,vi,poddr,poddi;
  45   1          for (it=0; it<=n-1; it++)
  46   1            { m=it; is=0;
  47   2              for (i=0; i<=k-1; i++)
  48   2                { j=m/2; is=2*is+(m-2*j); m=j;}
  49   2              fr[it]=pr[is]; fi[it]=pi[is];
  50   2            }
  51   1          pr[0]=1.0; pi[0]=0.0;
  52   1          p=6.283185306/(1.0*n);
  53   1          pr[1]=cos(p); pi[1]=-sin(p);
  54   1          if (l!=0) pi[1]=-pi[1];
  55   1          for (i=2; i<=n-1; i++)
C51 COMPILER V7.06   MAINC                                                                 09/06/2007 21:49:07 PAGE 2   

  56   1            { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
  57   2              s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
  58   2              pr[i]=p-q; pi[i]=s-p-q;
  59   2            }
  60   1          for (it=0; it<=n-2; it=it+2)
  61   1            { vr=fr[it]; vi=fi[it];
  62   2              fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];
  63   2              fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1];
  64   2            }
  65   1          m=n/2; nv=2;
  66   1          for (l0=k-2; l0>=0; l0--)
  67   1            { m=m/2; nv=2*nv;
  68   2              for (it=0; it<=(m-1)*nv; it=it+nv)
  69   2                for (j=0; j<=(nv/2)-1; j++)
  70   2                  { p=pr[m*j]*fr[it+j+nv/2];
  71   3                    q=pi[m*j]*fi[it+j+nv/2];
  72   3                    s=pr[m*j]+pi[m*j];
  73   3                    s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
  74   3                    poddr=p-q; poddi=s-p-q;
  75   3                    fr[it+j+nv/2]=fr[it+j]-poddr;
  76   3                    fi[it+j+nv/2]=fi[it+j]-poddi;
  77   3                    fr[it+j]=fr[it+j]+poddr;
  78   3                    fi[it+j]=fi[it+j]+poddi;
  79   3                  }
  80   2            }
  81   1          if (l!=0)
  82   1            for (i=0; i<=n-1; i++)
  83   1              { fr[i]=fr[i]/(1.0*n);
  84   2                fi[i]=fi[i]/(1.0*n);
  85   2              }
  86   1          if (il!=0)
  87   1            for (i=0; i<=n-1; i++)
  88   1              { pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
  89   2                if (fabs(fr[i])<0.000001*fabs(fi[i]))
  90   2                  { if ((fi[i]*fr[i])>0) pi[i]=90.0;
  91   3                    else pi[i]=-90.0;
  92   3                  }
  93   2                else
  94   2                  pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;
  95   2              }
  96   1          return;
  97   1        }
  98          
  99          ///////zqxpd////////////////////
 100          float zqpd(si)
 101            float   si[];
 102          {     
 103   1          float xdata dataR[512],dataI[512],fr_v[512],fi_v[512],Pyy1[512],Pyy2[512],data_Maxf[50],data_MaxPow[50
             -],index_Maxf[50];
 104   1          int i,k,Number,index_Number,hh; 
 105   1          float data_sum,data_temp,MM;
 106   1          float  Time=0;
 107   1      
 108   1          Number=1024;index_Number=10;
 109   1              for (i=0; i<Number/2; i++)
 110   1              {   
 111   2               dataR[i] = si[i];
 112   2               dataI[i] = 0;
 113   2           }
 114   1      
 115   1          kkfft(dataR,dataI,Number/2,index_Number-1,fr_v,fi_v,0,1); 
 116   1      
C51 COMPILER V7.06   MAINC                                                                 09/06/2007 21:49:07 PAGE 3   

 117   1              for (i=0; i<Number/2; i++)
 118   1                       Pyy1[i]=sqrt(pow(fr_v[i],2)+pow(fi_v[i],2));
 119   1      
 120   1          /////////////////////////////////////////////
 121   1         for (i=Number/2; i<Number; i++)
 122   1                   dataR[i-Number/2]= si[i];
 123   1      
 124   1              for (i=0; i<Number/2; i++)
 125   1               dataI[i]=0;
 126   1      
 127   1          kkfft(dataR,dataI,Number/2,index_Number-1,fr_v,fi_v,0,1); 
 128   1      
 129   1              for (i=0; i<Number/4; i++)
 130   1                       Pyy2[i]=sqrt(pow(fr_v[i],2)+pow(fi_v[i],2));
 131   1      
 132   1           data_sum=0;    
 133   1           for(k=0;k<Number/4;k++)
 134   1              {               
 135   2                    data_temp=pow(Pyy1[k],2)-pow(Pyy2[k],2);
 136   2                    data_temp=pow(data_temp,2);
 137   2                    data_temp=sqrt(data_temp);
 138   2                    data_sum=data_sum+data_temp;
 139   2               }
 140   1           if(data_sum>15000)
 141   1                     Time=0; //非周期信号     
 142   1           else
 143   1           {     //周期信号
 144   2                                      hh=0;
 145   2                                      for(i=0;i<20;i++)       data_Maxf[i]=0;//清零
 146   2                                      for(i=0;i<Number/4;i++)                 
 147   2                              {       
 148   3                                      if(Pyy1[i+1]>Pyy1[i]&&Pyy1[i+1]>Pyy1[i+2])//
 149   3                                      {
 150   4                                              if(Pyy1[i+1]>30)
 151   4                                 {
 152   5                                         data_MaxPow[hh]=Pyy1[i+1];//存储频点功率值
 153   5                                         index_Maxf[hh]=i+1;  //存储频点索引值
 154   5                                                         //data_Maxf[hh]=(float)(i+1)*20.07/Number/2*1000;//存储频点值
 155   5                                         hh=hh+1;                         
 156   5                                 }
 157   4                                              } 
 158   3                                      }                       
 159   2                     for(i=0;i<hh;i++) 
 160   2                                              data_Maxf[i]=(float)index_Maxf[i]*20.07/512*1000;
 161   2                                      MM=0;
 162   2                      for(i=0;i<hh;i++) 
 163   2                                              MM=MAXIMUM(MM,data_MaxPow[i]);
 164   2                      for(i=0;i<hh;i++)  
 165   2                         if(data_MaxPow[i]==MM)
 166   2                              Time=1/data_Maxf[i]*1000;                               
 167   2      
 168   2                 }
 169   1            return Time;
 170   1      }
 171          
 172          
 173          
 174          void chuxian(void){
 175   1          unsigned char i;
 176   1              Write_7281(0x14);Write_7281(0x70);              //hex译码,显示0
 177   1      
 178   1              lcd_initial();                          //液晶初始化
C51 COMPILER V7.06   MAINC                                                                 09/06/2007 21:49:07 PAGE 4   

 179   1              lcd_clear_ram();
 180   1      
 181   1          lcd_disp3232(0,16,0);          //显示欢迎使用
 182   1              lcd_disp3232(4,16,1); 
 183   1              lcd_disp3232(8,16,2); 
 184   1          lcd_disp3232(12,16,3); 
 185   1           
 186   1              for(i=0;i<5;i++){
 187   2                      Timer3Counter1 = 0;
 188   2                 while(Timer3Counter1 < 200);
 189   2          }
 190   1      }
 191          
 192          
 193          void  screen(void){                  //主屏显示
 194   1      
 195   1              lcd_initial();                          //液晶初始化
 196   1              lcd_clear_ram();
 197   1      
 198   1         lcd_disp1616(0,0,0);lcd_disp1616(2,0,1);lcd_disp1616(4,0,2);lcd_disp1608(6,0,9);//总功率
 199   1       
 200   1         lcd_disp_string(0,2,"f1:",3);          //二个频率分量
 201   1         lcd_disp_string(8,2,";",1);         
 202   1      
 203   1         lcd_disp_string(0,3,"f2:",3);
 204   1         lcd_disp_string(8,3,";",1);         
 205   1      
 206   1      
 207   1      
 208   1         lcd_disp1616(0,48,3);lcd_disp1616(2,48,4);lcd_disp1608(4,48,9);     //单位:Hz,mW
 209   1         lcd_disp1608(6,48,11);lcd_disp1608(7,48,6);
 210   1         lcd_disp_string(8,7,";",1);lcd_disp1608(9,48,8);lcd_disp1608(10,48,7);
 211   1       
 212   1      }
 213          
 214          
 215          void dealdata(float qq,unsigned char pp,unsigned char z){//q是数据,p是行数, z是种类区分频率和功率
 216   1          unsigned char wei[5];
 217   1              unsigned char woo[8];
 218   1          unsigned char poo[5];
 219   1          unsigned char goo[8];
 220   1      
 221   1              if(z==0){
 222   2                      wei[0]= qq/10000;

⌨️ 快捷键说明

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