因为贴子附件大小问题,wav音乐文件没有附上,请自行添加到目录,打开FFT.pdsprj文件,然后双击Audio图标指定音乐wav位置,开始运行即可,稍后再发下电脑里以前做的东东
单片机源程序如下:
- /********************************************************************************
- ;* File:FFT v1.0 *
- ;* Date:2015-10-22 *
- ;* Version:1.0 *
- ;* Author:Ben *
- ;* Wechat:feeling1791 *
- ;********************************************************************************/
- /*
- // Configuration Mask Definitions
- #define CONFIG_ADDR 0x2007
- // Oscillator
- #define EXTCLK 0x3FFF // External RC Clockout
- #define EXTIO 0x3FFE // External RC No Clock
- #define INTCLK 0x3FFD // Internal RC Clockout
- #define INTIO 0x3FFC // Internal RC No Clock
- #define EC 0x3FFB // EC
- #define HS 0x3FFA // HS
- #define XT 0x3FF9 // XT
- #define LP 0x3FF8 // LP
- // Watchdog Timer
- #define WDTEN 0x3FFF // On
- #define WDTDIS 0x3FF7 // Disabled / SWDTEN control
- // Power Up Timer
- #define PWRTDIS 0x3FFF // Off
- #define PWRTEN 0x3FEF // On
- // Master Clear Enable
- #define MCLREN 0x3FFF // MCLR function is enabled
- #define MCLRDIS 0x3FDF // MCLR functions as IO
- // Code Protect
- #define UNPROTECT 0x3FFF // Code is not protected
- #define CP 0x3FBF // Code is protected
- // Data EE Read Protect
- #define DUNPROTECT 0x3FFF // Do not read protect EEPROM data
- #define CPD 0x3F7F // Read protect EEPROM data
- // Brown Out Detect
- #define BORDIS 0x3CFF // BOD and SBOREN disabled
- #define SWBOREN 0x3DFF // SBOREN controls BOR function (Software control)
- #define BORXSLP 0x3EFF // BOD enabled in run, disabled in sleep, SBOREN disabled
- #define BOREN 0x3FFF // BOD Enabled, SBOREN Disabled
- // Internal External Switch Over Mode
- #define IESOEN 0x3FFF // Enabled
- #define IESODIS 0x3BFF // Disabled
- // Monitor Clock Fail-safe
- #define FCMEN 0x3FFF // Enabled
- #define FCMDIS 0x37FF // Disabled
- // Low Voltage Programming
- #define LVPDIS 0x2FFF // Disabled
- #define LVPEN 0x3FFF // Enabled
- // In-Circuit Debugger Mode
- #define DEBUGEN 0x1FFF // Enable ICD2 debugging
- #define DEBUGDIS 0x3FFF // Disable ICD2 debugging
- #define CONFIG_ADDR2 0x2008
- // Brown-out Reset Voltage
- #define BORV21 0x3EFF // 2.1 Volts
- #define BORV40 0x3FFF // 4.0 Volts
- // Flash Memory Write Protection
- #define WP0 0x3DFF // Protect 0h-0FFh
- #define WP1 0x3BFF // Protect lower half of flash
- #define WP2 0x39FF // Protect all of flash
- */
- #include <pic.h> //pic16f887
- __CONFIG(INTIO&WDTDIS&PWRTDIS&MCLREN&BOREN&LVPDIS&DUNPROTECT&DEBUGDIS&UNPROTECT&IESOEN&FCMEN);
- #define LOG_NUMBER 5
- unsigned char AD_count;
- const unsigned char BRTable[32] = {0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,
- 1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31};
- const char SIN_TAB[32] =
- { 0 ,25 ,49 ,71 ,90 ,106 ,117 ,125 ,127 ,
- 125 ,117 ,106 ,90 ,71 ,49 ,25 ,0 ,
- -25 ,-49 ,-71 ,-90 ,-106 ,-117 ,-125 ,-127 ,
- -125 ,-117 ,-106 ,-90 ,-71 ,-49 ,-25 };
-
- const char COS_TAB[32] =
- {127 ,125 ,117 ,106 ,90 ,71 ,49 ,25 ,0 ,
- -25 ,-49 ,-71 ,-90 ,-106 ,-117 ,-125 ,-127 ,
- -125 ,-117 ,-106 ,-90 ,-71 ,-49 ,-25 ,0 ,
- 25 ,49 ,71 ,90 ,106 ,117 ,125 };
- unsigned char disp_time;
- unsigned char Led_scan_count;
- bit AD_readed_flag = 0;
- bit AD_getonce_flag = 0;
- bank3 const unsigned char Disp_Number[8]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7
- bank3 const unsigned char Disp_peak[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//0-7
- bank3 unsigned char led_num[16];
- bank2 unsigned char MAIN_TAB[16];
- bank1 unsigned char PEAK_TAB[16];
- bank3 unsigned char Peak_speed[16];
- bank1 int Fft_Real[32];
- bank2 int Fft_Image[32];
- unsigned int FFT_value;
- /********************************************************************/
- void delay_1ms(void)
- {
- unsigned int i;
- for(i = 0;i < 65;i++);
- }
- void delay_ms(unsigned int n)
- {
- unsigned int i;
- for(i = 0;i < n;i++)
- {
- delay_1ms();
- }
- }
- /********************************************************************/
- void disp(void) //2ms scan 16 segment
- {
- PORTD = 0xff;
- PORTC = 0xff;
-
- switch(Led_scan_count)
- {
- case 1:
-
- PORTB = led_num[0] ;
- RD0 = 0;
- break;
- case 2:
-
- PORTB = led_num[1];
- RD1 = 0;
- break;
- case 3:
- PORTB = led_num[2] ;
- RD2=0;
- break;
- case 4:
-
- PORTB = led_num[3];
- RD3 = 0;
- break;
- case 5:
- PORTB = led_num[4];
- RD4 = 0;
- break;
- case 6:
- PORTB = led_num[5];
- RD5 = 0;
- break;
- case 7:
- PORTB = led_num[6];
- RD6 = 0;
- break;
- case 8:
- PORTB = led_num[7];
- RD7 = 0;
- break;
- case 9:
- PORTB = led_num[8];
- RC0 = 0;
- break;
- case 10:
- PORTB = led_num[9];
- RC1 = 0;
- break;
- case 11:
- PORTB = led_num[10];
- RC2 = 0;
- break;
- case 12:
- PORTB = led_num[11];
- RC3 = 0;
- break;
- case 13:
- PORTB = led_num[12];
- RC4 = 0;
- break;
- case 14:
- PORTB = led_num[13];
- RC5 = 0;
- break;
- case 15:
- PORTB = led_num[14];
- RC6 = 0;
- break;
- case 16:
- PORTB = led_num[15];
- RC7 = 0;
- break;
- }
- }
- /********************************************************************/
- void FFT(void)
- {
- unsigned char i,b,j,k,p;
- int Temp_Real,Temp_Imag,temp;
- for( i = 1; i <= LOG_NUMBER; i++) /* for(1) */
- {
- b = 1;
- b <<= (i-1);
- for( j = 0; j <= b-1; j++) /* for (2) */
- {
- p = 1;
- p <<= (LOG_NUMBER-i);
- p = p*j;
- for( k = j; k < 32; k = k + 2*b) /* for (3) */
- {
- Temp_Real = Fft_Real[k];
- Temp_Imag = Fft_Image[k];
- temp = Fft_Real[k+b];
- Fft_Real[k] = Fft_Real[k] + ((Fft_Real[k+b]*COS_TAB[p])>>7) + ((Fft_Image[k+b]*SIN_TAB[p])>>7);
- Fft_Image[k] = Fft_Image[k] - ((Fft_Real[k+b]*SIN_TAB[p])>>7) + ((Fft_Image[k+b]*COS_TAB[p])>>7);
- Fft_Real[k+b] = Temp_Real - ((Fft_Real[k+b]*COS_TAB[p])>>7) - ((Fft_Image[k+b]*SIN_TAB[p])>>7);
- Fft_Image[k+b] = Temp_Imag + ((temp*SIN_TAB[p])>>7) - ((Fft_Image[k+b]*COS_TAB[p])>>7);
-
- Fft_Real[k] >>= 1;
- Fft_Image[k] >>= 1;
- Fft_Real[k+b] >>= 1;
- Fft_Image[k+b] >>= 1;
-
- }
- }
- }
-
- for( j=0; j<16; j++)//16 frequency division
- {
- FFT_value=((((Fft_Real[j]* Fft_Real[j]))+((Fft_Image[j]*Fft_Image[j]))));
- if(FFT_value < 4)
- FFT_value=0;
- else if(FFT_value < 16)
- FFT_value=1;
- else if(FFT_value < 36)
- FFT_value=2;
- else if(FFT_value < 64)
- FFT_value=3;
- else if(FFT_value < 100)
- FFT_value=4;
- else if(FFT_value < 144)
- FFT_value=5;
- else if(FFT_value < 196)
- FFT_value=6;
- else if(FFT_value < 256)
- FFT_value=7;
- else FFT_value=7;
- /*
- if(FFT_value < 9)
- FFT_value=0;
- else if(FFT_value < 25)
- FFT_value=1;
- else if(FFT_value < 49)
- FFT_value=2;
- else if(FFT_value < 81)
- FFT_value=3;
- else if(FFT_value < 121)
- FFT_value=4;
- else if(FFT_value < 169)
- FFT_value=5;
- else if(FFT_value < 225)
- FFT_value=6;
- else if(FFT_value < 289)
- FFT_value=7;
- else FFT_value=7;
- */
-
- if(FFT_value > (MAIN_TAB[j]))
- {
- MAIN_TAB[j] = FFT_value;
- }
-
- if(FFT_value > (PEAK_TAB[j]))
- {
- PEAK_TAB[j] = FFT_value;
- Peak_speed[j] = 12; //peak keep time
- }
- }
-
- }
- void FFT_Process(void)
- {
- unsigned char k;
- if(AD_getonce_flag == 1)
- {
- TMR2IE = 0;
- AD_getonce_flag = 0;
-
- GODONE = 1;
- while( GODONE == 1);
- //AD_VALUE = (((unsigned int)ADRESH<<8)+ADRESL);
- Fft_Real[BRTable[AD_count]] = (((unsigned int)ADRESH<<8)+ADRESL);
-
- AD_count++;
- if(AD_count >= 32)
- {
- AD_count= 0 ;
- AD_readed_flag = 1;
- }
- else
- {
- TMR2 = 0x00;
- TMR2IE = 1;
- }
- }
- if(AD_readed_flag == 1)
- {
- for(k = 0;k < 32;k++)
- {
- Fft_Image[k] = 0;
- }
- FFT();
- AD_readed_flag = 0;
-
- TMR2 = 0x00;
- TMR2IE = 1;
- }
- }
- /*******************************************************************************************************/
- void TMR0_Init(void)
- {
- OSCCON = 0B01110111; // set timer0 as 8MS
- // "NC"----IRCF2----IRCF1----IRCF0----OSTS----HTS----LTS----SCS
- // IRCF<2:0> dis SCS = 1 --->inside
- TMR0 = 256 - 250; // 0.5us *250 *16 = 2ms
- // /RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
- OPTION = 0B00000011; // timer0,1:16 *16 = 2ms
-
- INTCON |= 0B10100000; //INT register: GIE----PEIE----T0IE----INTE----RBIE----T0IF----INTF----RBIF
- }
- /********************************************************************/
- void ADC_init(void)
- {
- TRISA0 =1; //set it to input
- //ANS0 = 1;
-
- ANSEL = 0B01110001; //set AN0 to analog;
- ADCON0 = 0B10000001; //fosc/2,AN0 on,adc enable
- // adcs1 adcs0 chs3 chs2 chs1 chs0 go/done adon
- //ADCS1 = 1; //INIT 500k/8 62KHz/32point
- //ADCS0 = 0;
- //ADCON1 = 0B10000000; //vdd & vss as vref
- VCFG0 = 0; //VSS
- VCFG1 = 0; //VDD
- ADFM = 1; // AD result right justified
- //ADON = 1;
- //ADIE = 1;
- //GODONE = 1;
-
- PEIE = 1;
- GIE = 1;
- }
- /*
- void TMR1_Init(void)
- {
- //T1CON = 0X01; //T1GINV TMR1GE T1CKPS1 T1CKPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON
-
- TMR1CS = 0; //inside Fosc / 4
- TMR1ON = 1; //enable timer1
- T1CKPS0 = 0; //1:1
- T1CKPS0 = 0;
-
-
- TMR1IE = 1;
- TMR1IF = 0;
- TMR1H = 0XFF;
- TMR1L = 0XE7; //65535-25= 0XFFe7 0.025MS 4M/4
-
- PEIE = 1;
- GIE = 1;
-
- }
- */
- void PORT_Init(void)
- {
- TRISB = 0x00;
- TRISC = 0x00;
- TRISD = 0x00;
- TRISE = 0X00;
-
- }
- void TMR2_Init(void)
- {
- T2CON = 0x00; //postscale 1:1
- TMR2ON=1;
-
- PR2 = 0xff; //30*0.25us +step = 25us
-
- TMR2 = 256-36;
- TMR2IE = 1;
- TMR2IF = 0;
-
- //PEIE = 1;
- //GIE = 1;
- }
-
- void init(void)
- {
- PORT_Init();
- TMR0_Init();
- ADC_init();
- //TMR1_Init();
- TMR2_Init();
- }
-
- void interrupt ISR(void)
- {
- unsigned char j;
-
- if(TMR2IF && TMR2IE) //25us
- {
- TMR2IF = 0;
- TMR2 = 256-36;
- AD_getonce_flag = 1;
-
- }
-
-
- if(T0IF && T0IE) //2ms
- {
- TMR0= 256 - 250;
- T0IF=0;
-
- Led_scan_count++; //2ms
- if(Led_scan_count > 16)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
PIC_FFT V0.5.rar
(166.49 KB, 下载次数: 112)
|