这是个基于单片机的音乐频谱显示程序,大家帮我看下为什么仿真不出来,

2019-07-18 08:52发布

本帖最后由 chinaukuk 于 2011-8-26 23:49 编辑

#include<reg51.h>#include<stdio.h>#include<absacc.h>#include<math.h>#defineIN0 XBYTE[0x7FF8];#definePI 3.1415926;typedefunsigned char uchar;ucharI=0;ucharj=0;uchARM=4;           //进行16点DFTucharN=16;floatMAX;                 //取DFT_FFT变换中幅度的最大值ucharK;                     //最大值所对应的K即频率ucharxdata *ad_adr;ucharflag=0;staticfloat xdata ar[16];  //***** 1.6ms内对通道0的采样数据的存储区    staticfloat xdata ai[16]; staticfloat xdatahk[16];                 sbitp1_0=P1^0; sbitp1_1=P1^1; sbitp1_2=P1^2; sbitp1_3=P1^3; sbitp1_4=P1^4; sbitp1_5=P1^5; sbitp1_6=P1^6;                  sbitp1_7=P1^7;sbitp3_0=P3^0;sbitp3_1=P3^1;voidsig_G(float Ar[],float Ai[]);voidDFT_FFT(float AR[],float AI[],uchar m,uchar n);voidfp_G (float aR[],float aI[],uchar n);voiddisplay(float max,uchar k);voidmain(void){IT1=0;                  //***** 驱动0809 利用中断进行采样,采样时间(即采样点数)有定时器T0决定EX1=1;TMOD=0x11;           // *****定时器0计时方式1             TH0=0xF9;TL0=0xC0;     ET0=1;              //****定时器0开中断TR0=1;EA=1;              //********CPU开中断ad_adr=&IN0;*ad_adr=j;while(1){if(flag==1){DFT_FFT(ar,ai,M,N);fp_G(ar,ai,N);display(MAX,K);flag=0;EX1=1;TR0=1;}elseif(flag==0);}}//*************外部中断子程序*即*读取0809转换结果********voidint_serv(void) interrupt 2{p3_0=0;             //*********测试中端信号产生ar[I]=*ad_adr;I++;*ad_adr=j;p3_0=1;}            //********确定终端产生//***************时钟0中断子程序***************voidtime0_int(void) interrupt 1{{flag=1;            //**********置标志位p3_1=0;TR0=0;EX1=0;sig_G(ar,ai);p3_1=1;}}//*************适合DFT的信号产生子程序************voidsig_G(float Ar[],float Ai[]){ucharn;for(n=I;n<N;n++)Ar[n]=0;for(n=0;n<N;n++)Ai[n]=0;I=0;}//********************************DFT子程序**************************voidDFT_FFT(float AR[],float AI[],uchar m,uchar n){inti,il,jl,j,LH,nl,k,b;floattr,ti,p,p1;LH=(int)n/2;j=LH;nl=n-2;for(i=1;i<=nl;i++){if(i<j){il=i;jl=j;tr=AR[il];ti=AI[il];AR[il]=AR[jl];AI[il]=AI[jl];AR[jl]=tr;AI[jl]=ti;}k=LH;while(j>=k){j=j-k;k=(int)k/2;}j=j+k;}for(i=1;i<=m;i++){b=(int)pow(2,(i-1));for(j=0;j<=(b-1);j++){p1=(float)pow(2,(m-i))*j*2.0*PI;p=p1/(float)n;for(k=j;k<=(n-1);){tr=(float)(AR[k+b]*cos(p)+AI[k+b]*sin(p));ti=(float)(AI[k+b]*cos(p)-AR[k+b]*sin(p));AR[k+b]=AR[k]-tr;AI[k+b]=AI[k]-ti;AR[k]=AR[k]+tr;AI[k]=AI[k]+ti;k+=b*2;}}}}//**************显示幅度与所对应频率的产生******************voidfp_G (float aR[],float aI[],uchar n){inti;for(i=0;i<n;i++){hk=sqrt(pow(aR,2)+pow(aI,2));}MAX=hk[0];K=0;for(i=1;i<n;i++){if(hk>MAX){MAX=hk;K=i;}}}//**************显示子程序*********************************voiddisplay(float max,uchar k){if((k>=0)&&(k<3)){p1_0=0;p1_1=0;p1_2=0;}if((k>=3)&&(k<5)){p1_0=1;p1_1=0;p1_2=0;}if((k>=5)&&(k<7)){p1_0=0;p1_1=1;p1_2=0;}if((k>=7)&&(k<9)){p1_0=1;p1_1=1;p1_2=0;}if((k>=9)&&(k<11)){p1_0=0;p1_1=0;p1_2=1;}if((k>=11)&&(k<13)){p1_0=1;p1_1=0;p1_2=1;}if((k>=13)&&(k<17)){p1_0=0;p1_1=1;p1_2=1;}if((max>=0)&&(max<=0.2)){p1_3=1;p1_4=0;p1_5=0;p1_6=0;p1_7=0;}if((max>0.2)&&(max<=0.5)){p1_3=1;p1_4=1;p1_5=0;p1_6=0;p1_7=0;}if((max>0.5)&&(max<=0.9)){p1_3=1;p1_4=1;p1_5=1;p1_6=0;p1_7=0;}if((max>0.9)&&(max<=1.5)){p1_3=1;p1_4=1;p1_5=1;p1_6=1;p1_7=0;}if((max>1.5)&&(max<=5)){p1_3=1;p1_4=1;p1_5=1;p1_6=1;p1_7=1;}}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。