|
做了一個(gè)STC15單片機(jī)驅(qū)動(dòng)的LED3264頻譜,24MHZ,代碼移植于本論壇中STC12C5A60S驅(qū)動(dòng)程序,F(xiàn)在的問題是:只顯示幅值,與頻率無關(guān)了,就是16個(gè)光柱都一般高,隨著音量大小一起跳動(dòng)。煩請(qǐng)哪位老師幫忙看一下代碼,問題出在哪?
- #include<math.h>
- #include"stc15.h"
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define ADC_POWER 0x80 //ADC 電源控制位。
- #define ADC_FLAG 0x10 //ADC 完成標(biāo)志
- #define ADC_START 0x08 //ADC 起始控制位
- #define ADC_SPEEDLL 0x00 //540 個(gè)時(shí)鐘
- #define ADC_SPEEDL 0x20 //360 個(gè)時(shí)鐘
- #define ADC_SPEEDH 0x40 //180 個(gè)時(shí)鐘
- #define ADC_SPEEDHH 0x60 //90 個(gè)時(shí)鐘
- sbit R1=P3^6; //上紅數(shù)據(jù)
- sbit R2=P3^7; //下紅數(shù)據(jù)
- sbit G1=P2^4; //上綠數(shù)據(jù)
- sbit G2=P2^5; //下綠數(shù)據(jù)
- sbit STR=P2^6; //鎖存
- sbit CLK=P2^7; //時(shí)鐘
- sbit OE=P3^5; //
- sbit IA=P2^0; //行控制線A
- sbit IB=P2^1; //行控制線B
- sbit IC=P2^2; //行控制線C
- sbit ID=P2^3; //行控制線D
- /*--------------------------------------------
- 行輸出控制
- --------------------------------------------*/
- void hang(unsigned char Value)
- {
- switch(Value)
- {
- case 0: {IA=0;IB=0;IC=0;ID=0;}break;
- case 1: {IA=1;IB=0;IC=0;ID=0;}break;
- case 2: {IA=0;IB=1;IC=0;ID=0;}break;
- case 3: {IA=1;IB=1;IC=0;ID=0;}break;
- case 4: {IA=0;IB=0;IC=1;ID=0;}break;
- case 5: {IA=1;IB=0;IC=1;ID=0;}break;
- case 6: {IA=0;IB=1;IC=1;ID=0;}break;
- case 7: {IA=1;IB=1;IC=1;ID=0;}break;
- case 8: {IA=0;IB=0;IC=0;ID=1;}break;
- case 9: {IA=1;IB=0;IC=0;ID=1;}break;
- case 10: {IA=0;IB=1;IC=0;ID=1;}break;
- case 11: {IA=1;IB=1;IC=0;ID=1;}break;
- case 12: {IA=0;IB=0;IC=1;ID=1;}break;
- case 13: {IA=1;IB=0;IC=1;ID=1;}break;
- case 14: {IA=0;IB=1;IC=1;ID=1;}break;
- case 15: {IA=1;IB=1;IC=1;ID=1;}break;
- }
-
- }
- uchar COUNT=15,COUNT1=0,LINE=15;
- uint TEMP1;
- uchar xdata LED_TAB2[16]; //記錄 漂浮物 是否需要 停頓一下
- uchar xdata LED_TAB[16]; //記錄紅色柱狀
- uchar xdata LED_TAB1[16]; //記錄 漂浮點(diǎn)
- struct compx //定義復(fù)數(shù)結(jié)構(gòu)體
- {
- float real;
- float imag;
- };
- xdata struct compx s[ 64 ]; //FFT數(shù)據(jù)緩存放在XDATA空間
- struct compx EE(struct compx,struct compx); //復(fù)數(shù)乘法函數(shù)的聲明
- void FFT(struct compx xin[],int N); //FFT函數(shù)的聲明
- /*---------------------------------------------
- ADC初始化,P1^0口音頻輸入
- --------------------------------------------*/
- void InitADC()
- {
- P1ASF =0x01; //P10口做AD 使用
- P1M0 = 0x01; //0000,0001用于A/D轉(zhuǎn)換的P1.x口,先設(shè)為開漏
- P1M1 = 0x01; //0000,0001 P1.0先設(shè)為開漏。斷開內(nèi)部上拉電阻
- ADC_RES = 0; //清除結(jié)果寄存器
- ADC_RESL = 0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDHH; //40.96K采樣率 0xC8
- }
- /*---------------------------------------------
- 讀 ADC 數(shù)據(jù)
- --------------------------------------------*/
- unsigned int GetADCResult(unsigned char ch)
- {
- ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG));
- ADC_CONTR &= ~ADC_FLAG;
- return (ADC_RES<<2+ADC_RESL);
- }
- /*--------------------------------------------------------
- 復(fù)數(shù)乘法
- ---------------------------------------------------------*/
- struct compx EE(struct compx a1,struct compx b2)
- {
- struct compx b3;
- b3.real=a1.real*b2.real-a1.imag*b2.imag;
- b3.imag=a1.real*b2.imag+a1.imag*b2.real;
- return(b3);
- }
- /*--------------------------------------------------------
- FFT函數(shù)
- ---------------------------------------------------------*/
- void FFT(struct compx xin[],int N)
- {
- int f,m,nv2,nm1,i,k,j=1,l;
- struct compx v,w,t;
- nv2=N/2;
- f=N;
- for(m=1;(f=f/2)!=1;m++){;}
- nm1=N-1;
- for(i=0;i<nm1;i++) //倒序操作
- {
- if(i<j)
- {
- t=xin[j];
- xin[j]=xin[i];
- xin[i]=t;
- }
- k=nv2; //k為倒序中相應(yīng)位置的權(quán)值
- while(k<j)
- {
- j=j-k;
- k=k/2;
- }
- j=j+k;
- }
- {
- int le,lei,ip;
- float pi;
- for(l=1;l<=m;l++)
- {
- le=pow(2,l); //乘方
- lei=le/2;
- pi=3.14159265;
- v.real=1.0;
- v.imag=0.0;
- w.real=cos(pi/lei); //旋轉(zhuǎn)因子
- w.imag=-sin(pi/lei);
-
- for(j=1;j<=lei;j++) //控制蝶形運(yùn)算的級(jí)數(shù)
- {
- for(i=j-1;i<N;i=i+le) //控制每級(jí)蝶形運(yùn)算的次數(shù)
- {
- ip=i+lei;
- t=EE(xin[ ip ],v);
- xin[ ip ].real=xin[ i ].real-t.real; //蝶形計(jì)算
- xin[ ip ].imag=xin[ i ].imag-t.imag;
- xin[ i ].real=xin[ i ].real+t.real;
- xin[ i ].imag=xin[ i ].imag+t.imag;
- }
- v=EE(v,w);
- }
- }
- }
- }
- /*--------------------------------------------------------
- 顯示模式
- ---------------------------------------------------------*/
- void showbar()
- {
- unsigned char i,j;
-
- for(j=0;j<16;j++) //讀取FFT轉(zhuǎn)換數(shù)據(jù)
- {
- TEMP1=sqrt(pow((s[i ].real+s[i+1].real),2)+pow((s[i ].imag+s[i+1].imag),2))/2;
- if(TEMP1>1)TEMP1--;
- else TEMP1=0;
- if(TEMP1>31)TEMP1=31;
- if(TEMP1>(LED_TAB[j]))LED_TAB[j]=TEMP1;
- if(TEMP1>(LED_TAB1[j]))
- {
- LED_TAB1[j]=TEMP1;
- LED_TAB2[j]=14; //提頓速度=12
- }
- }
- }
- /*------------------------------------------------
- 定時(shí)器0初始化子程序
- ------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
- ET0=1; //定時(shí)器中斷打開
- TR0=1; //定時(shí)器開關(guān)打開
- EA=1; //總中斷打開
- }
- /*------------------------------------------------
- 定時(shí)器0中斷子程序
- ------------------------------------------------*/
- void LED_Display() interrupt 1
- {
- uchar G;
- TH0=(65536-2000)/256; //重新賦值
- TL0=(65536-2000)%256;
-
- for (G=0;G<16;G++) //往點(diǎn)陣屏填充 一行的 數(shù)據(jù)
- {
- if(LED_TAB[G]<=LINE+16)R1=0;
- else R1=1;
- if(LED_TAB[G]<=LINE)R2=0;
- else R2=1;
- if(LED_TAB1[G]==LINE){G1=0;G2=1;}
- else if(LED_TAB1[G]==(LINE+16)){G1=1;G2=0;}
- else G2=G1=0;
- CLK=1;CLK=0;
- CLK=1;CLK=0;
- CLK=1;CLK=0;
- G1=0;G2=0;R1=0;R2=0;
- CLK=1;CLK=0;
- }
- STR=1;STR=0;
- if(LED_TAB[COUNT]>0)LED_TAB[COUNT]--; //柱狀遞減,
- if(COUNT>0)COUNT--;
- else COUNT=15;
- if(LED_TAB2[COUNT1]==0)
- {
- if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])LED_TAB1[COUNT1]--;
- }
- else LED_TAB2[COUNT1]--;
- COUNT1++;
- if(COUNT1>=16)COUNT1=0;
-
- OE=1;
- hang(15-LINE); //行選
- OE=0;
- if(LINE>0)LINE--;
- else LINE=15;
- }
- /*-------------------------------------------------------------------
- 主函數(shù)
- -------------------------------------------------------------------*/
- void main()
- {
-
- int N=64,i; //變量初始化,64點(diǎn)FFT運(yùn)算
- float offset;
-
- P0M1=0x00;
- P0M0=0x00;
- P1M1=0x00;
- P1M0=0x00;
- P2M1=0x00;
- P2M0=0x00;
- P3M1=0x00;
- P3M0=0x00;
- P5M1=0x00;
- P5M0=0x00;
- Init_Timer0();
- InitADC(); //ADC初始化
-
- offset=GetADCResult(0);
-
- while(1)
- {
- for(i=0;i<N;i++) //采集音頻信號(hào)
- {
- ADC_CONTR=0xC8; //40.96K采樣率
- while(!(ADC_CONTR&0x10));
- s[i].real=((float)ADC_RES*4+(float)(ADC_RESL%0x04)-offset)/4; //((((int)ADC_DATA-128)/2))*4;
- s[i].imag=0;
- }
-
- FFT(s,N); //調(diào)用FFT函數(shù)進(jìn)行變換
- showbar();
- }
- }
復(fù)制代碼
|
|