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

📄 430_contest.c

📁 1024fft用MSP430设计的音频信号分析仪
💻 C
📖 第 1 页 / 共 3 页
字号:
void main (void)
{
    int i;
    float f_t ;
    uchar fft_on ;
    initmsp430();   

   

    ADC12CTL0 &= ~ENC;                    // Enable conversions
    ADC12CTL0  = SHT1_0 + SHT0_0 + ADC12ON   +  REFON +REF2_5V ;
    ADC12CTL1  = SHP  ;
    ADC12MCTL0 = SREF_1;                  // Vr+=Vref+
    ADC12CTL0 |= ENC;                     // Enable conversions
    P6SEL |= 0x01;                        // P6.0 ADC option select
    ADC12CTL0 |= ADC12SC;
  /* /////////
    for(i=0;i<128;i++)
        {
        while ((ADC12IFG & BIT0)==0);
        fft_r[i] = ADC12MEM0;
        ADC12CTL0 |= ADC12SC;
        delay(10);
        _NOP();
        _NOP();
        _NOP();
        }
      
   for ( i = 0 ; i < 128 ; i++ )
        {
          fft_r[i] = fft_r[i] / 4095 ; 
          fft_r[i] = fft_r[i] * 2.5 ;          
          //fft_r[i] = ( fft_r[i] - Bm ) / Am ;
          temp[i]=fft_r[i];
          wave_data[i]=temp[i]/(2.0/40.0);
        }
        
       
 
 //lcd_display_wave(wave_data);
    //////////
    */
    lcd_initial() ;                           // 初始化液晶
    lcd_clear() ;                             // 液晶清屏
    Init_Keyboard() ; // 初始化键盘
    
    //*****************************
   // lcd_display_wave(wave_data);
    //*****************************
   // while(1);
    Show_Title() ;                            // 显示初始界面
    delay_ms(3000) ;                          // 等待两秒
    lcd_clear() ;                             // 液晶清屏
        p = 0 ;
    vmax = 0 ;
    fft_on = 0 ;
    step = 20 ;                              // 初始步进20Hz
    state = 0 ;                               // 菜单状态

    while (1)
    {
       switch ( state ) 
     {
     case 0:
       Show_Menu() ;
       break ;
     case 2:
       if ( fft_on )
       {
        for(i=0;i<128;i++)
        {
        while ((ADC12IFG & BIT0)==0);
        fft_r[i] = ADC12MEM0;
        ADC12CTL0 |= ADC12SC;
        delay(10);
        _NOP();
        _NOP();
        _NOP();
        }
        for ( i = 0 ; i < 128 ; i++ )
        {
          fft_r[i] = fft_r[i] / 4095 ; 
          fft_r[i] = fft_r[i] * 2.5 ;          
          fft_r[i] = ( fft_r[i] - Bm ) / Am ;
        }
        fft();
        Harmonic();
        fft_r[46] = harm[46] ;
        f_t = fft_r[46] / 4096 ;
        f_t = f_t * 4.175 ;
        _NOP();
       }
       Write_Fre_Data() ;
       break ;
     case 1:
       if ( fft_on )
       {
        for(i=0;i<128;i++)
        {
        while ((ADC12IFG & BIT0)==0);
        fft_r[i] = ADC12MEM0;
        ADC12CTL0 |= ADC12SC;
        delay(10);
        _NOP();
        _NOP();
        _NOP();
        }
      
      ave=0;
      fjgz=0;
   for ( i = 0 ; i < 128 ; i++ )
        {
          fft_r[i] = fft_r[i] / 4095 ; 
          fft_r[i] = fft_r[i] * 2.5 ;          
          //fft_r[i] = ( fft_r[i] - Bm ) / Am ;
          wave_data[i]=fft_r[i];
          wave_data[i]=wave_data[i]/(2.0/40.0);
        }
        for (i=0;i<128;i++)
        { ave+=wave_data[i];
          fjgz+=wave_data[i]*wave_data[i];
          if (wave_data[i] > vmax )
          {
            vmax = fft_r[i] ;
          }
        }
       
       }
       
       
       Write_wave_Data(ave,fjgz,vmax);//
       break ;
     case 3:
       Show_T() ;
       break ;
     
     case 5:
       Show_Fre_Map() ;
       if ( step == 20 )
       {
         x1 = (p+px1)*20 ;
         x2 = (p+px2)*20 ;
       }
       else
       {
         x1 = 20*(p+px1*5) ;
         x2 = 20*(p+px2*5) ;
       }
       if ( x1 > x2 )
       {
         dx = x1 - x2 ;
       }
       else
       {
         dx = x2 - x1 ;
       }
       y1 = py1 ;
       y2 = py2 ;
       if ( y1 > y2 ) 
       {
         dy = y1 - y2 ;
       }
       else
       {
         dy = y2 - y1 ;
       }
       Write_Zuobiao() ;
       Del_Rul(qx1,qy1) ;
       Del_Rul(qx2,qy2) ;
       Draw_Rul(px1,py1) ;
       Draw_Rul(px2,py2) ;
       break ;
     case 6:
       lcd_display_wave(wave_data);
       if ( step == 20 )
       {
         x1 = (p+px1)*20 ;
         x2 = (p+px2)*20 ;
       }
       else
       {
         x1 = 20*(p+px1*5) ;
         x2 = 20*(p+px2*5) ;
       }
       if ( x1 > x2 )
       {
         dx = x1 - x2 ;
       }
       else
       {
         dx = x2 - x1 ;
       }
       y1 = py1 ;
       y2 = py2 ;
       if ( y1 > y2 ) 
       {
         dy = y1 - y2 ;
       }
       else
       {
         dy = y2 - y1 ;
       }
       Write_Zuobiao() ;
       Del_Rul(qx1,qy1) ;
       Del_Rul(qx2,qy2) ;
       Draw_Rul(px1,py1) ;
       Draw_Rul(px2,py2) ;
       break ;
     }
     Key_Event() ;
     switch ( state ) 
     {
     case 0:
       if ( key_value == 2 ) 
       {
         state = 2 ;
         fft_on = 1 ;
         lcd_clear() ;
         Show_Fre() ;
       }
       if ( key_value == 1 ) 
       {
         state = 1 ;
         fft_on = 1 ;
         lcd_clear() ;
         Show_Pow() ;
       }
       if ( key_value == 3 ) 
       {
         state = 3 ;
         fft_on = 1 ;
         lcd_clear() ;
       }
      
     case 2:
       if ( key_value == 11 )   // 按暂停键
       {
         if ( fft_on )
         {
           fft_on = 0 ;
         }
         else
         {
           fft_on = 1 ;
         }
       }
       if ( key_value == 12 )   // 按返回键
       {
         state = 0 ; 
         vmax = 0 ;
         fft_on = 0 ;
         lcd_clear() ;
         p = 0 ;
       }
       if ( key_value == 7 && !fft_on )   // 切换键
       {
         state = 5 ;
         lcd_clear() ;
         Show_Zuobiao() ;
         px1 = qx1 = 1 ;
         px2 = qx2 = 5 ;
         py1 = py2 = 10 ;
         qy1 = qy2 = 10 ;
       }
       break ;
     case 1:
       if ( key_value == 11 )   // 按暂停键
       {
         if ( fft_on )
         {
           fft_on = 0 ;
         }
         else
         {
           fft_on = 1 ;
         }
       }
       if ( key_value == 12 )   // 按返回键
       {
         state = 0 ;
         vmax = 0 ;
         fft_on = 0 ;
         lcd_clear() ;
         p = 0 ;
       }
       if ( key_value == 7 && !fft_on )    // 切换键
       {
         state = 6 ;
         lcd_clear() ;
         Show_Zuobiao() ;
         px1 = qx1 = 1 ;
         px2 = qx2 = 5 ;
         py1 = py2 = 10 ;
         qy1 = qy2 = 10 ;
       }
       break ;
     case 3:
       if ( key_value == 12 )   // 按返回键
       {
         state = 0 ;
         fft_on = 0 ;
         lcd_clear() ;
       }
       break ;
   
     case 5:
       if ( key_value == 7 )   // 按切换键
       {
         state = 2 ;
         lcd_clear() ;
         Show_Fre() ;
       }
       if ( key_value == 12 )   // 按返回键
       {
         state = 0 ;
         lcd_clear() ; 
       }
       if ( key_value == 10 )   //  向上翻页
       {
         if ( p > 2 && step == 20 )
         {
           p -= 3 ;
         }
         if ( p > 14 && step == 100 ) 
         {
           p -= 15 ;
         }
       }
       if ( key_value == 14 )   //  向下翻页
       {
         if ( p < N - 3 && step == 20 ) 
         {
           p = p + 3 ;
         }
         if ( p < N - 15 && step == 100 ) 
         {
           p = p + 15 ;
         }
       }
       if ( key_value == 13 )   //  步进改为20
       {
         step = 20 ;
       }
       if ( key_value == 15 )   //  步进改为100
       {
         step = 100 ;
       } 
       if ( key_value == 1 )    //  标尺1左移
       {
         if ( px1 > 0 ) 
         {
           qx1 = px1 ;
           qy1 = py1 ;
           px1 -- ;
         }
       }
       if ( key_value == 3 )    //  标尺1右移
       {
         if ( px1 < 24 ) 
         {
           qx1 = px1 ;
           qy1 = py1 ;
           px1 ++ ;
         }
       }
       if ( key_value == 2 )    //  标尺1上移
       {
         if ( py1 < 40 ) 
         {
           qx1 = px1 ;
           qy1 = py1 ;
           py1 ++ ;
         }
       }
       if ( key_value == 6 )     //   标尺1下移
       {
         if ( py1 > 1 )
         {
           qx1 = px1 ;
           qy1 = py1 ;
           py1 -- ;
         }
       }
       if ( key_value == 4 )     //   标尺2左移
       {
         if ( px2 > 0 ) 
         {
           qx2 = px2 ;
           qy2 = py2 ;
           px2 -- ;
         }
       }
       if ( key_value == 5 )     //  标尺2右移
       {
         if ( px2 < 24 )
         {
           qx2 = px2 ;
           qy2 = py2 ;
           px2 ++ ;
         }
       }
       if ( key_value == 0 )     //   标尺2上移
       {
         if ( py2 < 40 )
         {
           qx2 = px2 ;
           qy2 = py2 ;
           py2 ++ ;
         }
       }
       if ( key_value == 8 )      //   标尺2下移
       {
         if ( py2 > 1 )
         {
           qx2 = px2 ;
           qy2 = py2 ;
           py2 -- ;
         }
       }
       break ; 
     case 6:
       if ( key_value == 7 )   // 按切换键
       {
         state = 1 ;
         lcd_clear() ;
         //lcd_display_wave(wave_data);
       }
       if ( key_value == 12 )   // 按返回键
       {
         state = 0 ;
         lcd_clear() ; 
       }
       if ( key_value == 10 )   //  向上翻页
       {
         if ( p > 2 && step == 20 )
         {
           p -= 3 ;
         }
         if ( p > 14 && step == 100 ) 
         {
           p -= 15 ;
         }
       }
       if ( key_value == 14 )   //  向下翻页
       {
         if ( p < N - 3 && step == 20 ) 
         {
           p = p + 3 ;
         }
         if ( p < N - 15 && step == 100 ) 
         {
           p = p + 15 ;
         }
       }
       if ( key_value == 13 )   //  步进改为20
       {
         step = 20 ;
       }
       if ( key_value == 15 )   //  步进改为100
       {
         step = 100 ;
       } 
       if ( key_value == 1 )    //  标尺1左移
       {
         if ( px1 > 0 ) 
         {
           qx1 = px1 ;
           qy1 = py1 ;
           px1 -- ;
         }
       }
       if ( key_value == 3 )    //  标尺1右移
       {
         if ( px1 < 24 ) 
         {
           qx1 = px1 ;
           qy1 = py1 ;
           px1 ++ ;
         }
       }
       if ( key_value == 2 )    //  标尺1上移
       {
         if ( py1 < 40 ) 
         {
           qx1 = px1 ;
           qy1 = py1 ;
           py1 ++ ;
         }
       }
       if ( key_value == 6 )     //   标尺1下移
       {
         if ( py1 > 1 )
         {
           qx1 = px1 ;
           qy1 = py1 ;
           py1 -- ;
         }
       }
       if ( key_value == 4 )     //   标尺2左移
       {
         if ( px2 > 0 ) 
         {
           qx2 = px2 ;
           qy2 = py2 ;
           px2 -- ;
         }
       }
       if ( key_value == 5 )     //  标尺2右移
       {
         if ( px2 < 24 )
         {
           qx2 = px2 ;
           qy2 = py2 ;
           px2 ++ ;
         }
       }
       if ( key_value == 0 )     //   标尺2上移
       {
         if ( py2 < 40 )
         {
           qx2 = px2 ;
           qy2 = py2 ;
           py2 ++ ;
         }
       }
       if ( key_value == 8 )      //   标尺2下移
       {
         if ( py2 > 1 )
         {
           qx2 = px2 ;
           qy2 = py2 ;
           py2 -- ;
         }
       }
       break ;
     }
     key_value = 17 ;
    }
}

⌨️ 快捷键说明

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