偶得一塊3264雙色的點陣屏,想用STC15的單片機做一個音樂頻譜,頻率24M。可整了幾天也整不出來,煩請老師幫忙看一下問題出在哪?該如何改?代碼中:ADC讀取部分移植于12864音樂頻譜顯示,好用,顯示部分就簡單了?傻揭黄鹁筒缓糜昧恕V詻]有用定時器控制顯示,是不會計算ADC的時序,怕程序出現問題。 另:本論壇中也有音樂頻譜的相關資料,可沒有一個上機能用的,為此我還專門買了STC12的單片機,不知問題出在哪。- #include<math.h>
- #include <STC15.h>
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define ADC_POWER 0x80
- #define ADC_FLAG 0x10
- #define ADC_START 0x08
- #define ADC_SPEEDLL 0x00
- #define ADC_SPEEDL 0x20
- #define ADC_SPEEDH 0x40
- #define ADC_SPEEDHH 0x60
- struct compx
- {
- float real;
- float imag;
- };
- xdata struct compx s[ 64 ];
- struct compx EE(struct compx,struct compx);
- void FFT(struct compx xin[],int N);
- sbit R1=P3^6;
- sbit R2=P3^7;
- sbit G1=P2^4;
- sbit G2=P2^5;
- sbit STB=P2^6;
- sbit SCK=P2^7;
- sbit OE=P3^5;
- sbit IA=P2^0;
- sbit IB=P2^1;
- sbit IC=P2^2;
- sbit ID=P2^3;
- uchar data row;
- void xianshi();
- void hang();
- void InitADC()
- {
- P1ASF =0x01;
- P1M0 = 0x01;
- P1M1 = 0x01;
- ADC_RES = 0;
- ADC_RESL = 0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
- }
- 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);
- }
- 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);
- }
- 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;
- 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);
- w.imag=-sin(pi/lei);
-
- for(j=1;j<=lei;j++)
- {
- for(i=j-1;i<N;i=i+le)
- {
- ip=i+lei;
- t=EE(xin[ ip ],v);
- xin[ ip ].real=xin[ i ].real-t.real;
- 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 main (void)
- {
- int N=64,i;
- float offset;
- P1M0=0x00;
- P1M1=0x00;
- P3M0=0x00;
- P3M1=0x00;
- P2M0=0x00;
- P2M1=0x00;
- InitADC();
- offset=GetADCResult(0);
-
- while (1)
- {
- for(i=0;i<N;i++)
- {
- ADC_CONTR=0xC8;
- while(!(ADC_CONTR&0x10));
- s[i].real=((float)ADC_RES*4+(float)(ADC_RESL%0x04)-offset)/4;
- s[i].imag=0;
- }
-
- FFT(s,N);
- xianshi();
- }
- }
- 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;
- }
-
- }
- void xianshi()
- {
- unsigned char i,j;
- unsigned char dis_rdata[16];
- for(i=0;i<16;i++)
- {
- float t0=0;
- t0=sqrt(pow((s[i ].real+s[i+1].real),2)+pow((s[i ].imag+s[i+1].imag),2))/2;
- dis_rdata[i]=(unsigned char)t0;
- }
- for(j=0;j<64;j++)
- {
- SCK=0;
- SCK=1;
- if(dis_rdata[j]<=row+16) R1=1;
- else R1=0;
- if(dis_rdata[j]<=row) R2=1;
- else R2=0;
- }
- STB=1;
- STB=0;
- row++;
- if(row>15)row=0;
- OE=1;
- hang(row);
- OE=0;
- }
復制代碼
|