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

📄 mainc.c

📁 基于F020单片机的简易音频信号分析仪的实现keil程序(C实现)。2007年9月全国大学生电子设计竞赛题目(获得省2等奖)所有要求功能都实现。希望对感兴趣的朋友有帮助!
💻 C
📖 第 1 页 / 共 2 页
字号:
// 包含文件

#define   MAINC_GLOBALS
#include "includes.h"
#include "charbank.h"
#include "math.h"


#define   MAXIMUM(x,y) (x>y)?x:y


//sbit bb=P0^6;
//外部中断6(键盘用)
void ExtentInt6 (void) interrupt 18 {
	_nop_();
	P3IF &= 0XBF;//清中断标志
	key_flag = 1;

}

//定时器3中断
void Timer3Int(void) interrupt 14 {
	TMR3CN &= 0X7F;	//清中断标志
	Timer3Counter1++;
}



//ADC初始化程序
ADCInit(void){
	AMX0CF = 0;	//各通道单独输入
	AMX0SL = 0;	//通道选择
	ADC0CF = 0x48;	//系统时钟24M,SAR时钟2M,AD0SC=11,PGA=1
	ADC0CN = 0x80;	//ADC0使能,一直处于跟踪,向AD0BUSY写1启动转换,数据右对齐
	REF0CN = 0x07;	//ADC0基准取VREF0,内部温度传感器、内部偏压发生器、缓冲器工作
}
///////fft////////////////////
void kkfft(pr,pi,n,k,fr,fi,l,il)
  int   n,k,l,il;
  float   pr[],fr[];//修改
  float   pi[],fi[];

  { int   it,m,is,i,j,nv,l0;
    float  p,q,s,vr,vi,poddr,poddi;
    for (it=0; it<=n-1; it++)
      { m=it; is=0;
        for (i=0; i<=k-1; i++)
          { j=m/2; is=2*is+(m-2*j); m=j;}
        fr[it]=pr[is]; fi[it]=pi[is];
      }
    pr[0]=1.0; pi[0]=0.0;
    p=6.283185306/(1.0*n);
    pr[1]=cos(p); pi[1]=-sin(p);
    if (l!=0) pi[1]=-pi[1];
    for (i=2; i<=n-1; i++)
      { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
        s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
        pr[i]=p-q; pi[i]=s-p-q;
      }
    for (it=0; it<=n-2; it=it+2)
      { vr=fr[it]; vi=fi[it];
        fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];
        fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1];
      }
    m=n/2; nv=2;
    for (l0=k-2; l0>=0; l0--)
      { m=m/2; nv=2*nv;
        for (it=0; it<=(m-1)*nv; it=it+nv)
          for (j=0; j<=(nv/2)-1; j++)
            { p=pr[m*j]*fr[it+j+nv/2];
              q=pi[m*j]*fi[it+j+nv/2];
              s=pr[m*j]+pi[m*j];
              s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
              poddr=p-q; poddi=s-p-q;
              fr[it+j+nv/2]=fr[it+j]-poddr;
              fi[it+j+nv/2]=fi[it+j]-poddi;
              fr[it+j]=fr[it+j]+poddr;
              fi[it+j]=fi[it+j]+poddi;
            }
      }
    if (l!=0)
      for (i=0; i<=n-1; i++)
        { fr[i]=fr[i]/(1.0*n);
          fi[i]=fi[i]/(1.0*n);
        }
    if (il!=0)
      for (i=0; i<=n-1; i++)
        { pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
          if (fabs(fr[i])<0.000001*fabs(fi[i]))
            { if ((fi[i]*fr[i])>0) pi[i]=90.0;
              else pi[i]=-90.0;
            }
          else
            pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;
        }
    return;
  }

///////zqxpd////////////////////
float zqpd(si)
  float   si[];
{     
    float xdata dataR[512],dataI[512],fr_v[512],fi_v[512],Pyy1[512],Pyy2[512],data_Maxf[50],data_MaxPow[50],index_Maxf[50];
    int i,k,Number,index_Number,hh; 
    float data_sum,data_temp,MM;
    float  Time=0;

    Number=1024;index_Number=10;
	for (i=0; i<Number/2; i++)
	{   
         dataR[i] = si[i];
         dataI[i] = 0;
     }

    kkfft(dataR,dataI,Number/2,index_Number-1,fr_v,fi_v,0,1); 

	for (i=0; i<Number/2; i++)
		 Pyy1[i]=sqrt(pow(fr_v[i],2)+pow(fi_v[i],2));

    /////////////////////////////////////////////
   for (i=Number/2; i<Number; i++)
	     dataR[i-Number/2]= si[i];

 	for (i=0; i<Number/2; i++)
         dataI[i]=0;

    kkfft(dataR,dataI,Number/2,index_Number-1,fr_v,fi_v,0,1); 

	for (i=0; i<Number/4; i++)
		 Pyy2[i]=sqrt(pow(fr_v[i],2)+pow(fi_v[i],2));

     data_sum=0;    
     for(k=0;k<Number/4;k++)
        {               
              data_temp=pow(Pyy1[k],2)-pow(Pyy2[k],2);
              data_temp=pow(data_temp,2);
              data_temp=sqrt(data_temp);
              data_sum=data_sum+data_temp;
         }
     if(data_sum>15000)
	       Time=0; //非周期信号	
     else
     {     //周期信号
				hh=0;
				for(i=0;i<20;i++)	data_Maxf[i]=0;//清零
				for(i=0;i<Number/4;i++)			
	        	{ 	
		        	if(Pyy1[i+1]>Pyy1[i]&&Pyy1[i+1]>Pyy1[i+2])//
		        	{
			        	if(Pyy1[i+1]>30)
             		   {
                 		   data_MaxPow[hh]=Pyy1[i+1];//存储频点功率值
                 		   index_Maxf[hh]=i+1;	//存储频点索引值
						   //data_Maxf[hh]=(float)(i+1)*20.07/Number/2*1000;//存储频点值
                 		   hh=hh+1;			    
                	   }
					} 
				}			
               for(i=0;i<hh;i++) 
					data_Maxf[i]=(float)index_Maxf[i]*20.07/512*1000;
	   			MM=0;
                for(i=0;i<hh;i++) 
					MM=MAXIMUM(MM,data_MaxPow[i]);
                for(i=0;i<hh;i++)  
                   if(data_MaxPow[i]==MM)
                       	Time=1/data_Maxf[i]*1000;				

	   }
      return Time;
}



void chuxian(void){
    unsigned char i;
	Write_7281(0x14);Write_7281(0x70);		//hex译码,显示0

	lcd_initial();				//液晶初始化
	lcd_clear_ram();

    lcd_disp3232(0,16,0);          //显示欢迎使用
	lcd_disp3232(4,16,1); 
	lcd_disp3232(8,16,2); 
    lcd_disp3232(12,16,3); 
     
	for(i=0;i<5;i++){
	  	Timer3Counter1 = 0;
	   while(Timer3Counter1 < 200);
    }
}


void  screen(void){                  //主屏显示

	lcd_initial();				//液晶初始化
	lcd_clear_ram();

   lcd_disp1616(0,0,0);lcd_disp1616(2,0,1);lcd_disp1616(4,0,2);lcd_disp1608(6,0,9);//总功率
 
   lcd_disp_string(0,2,"f1:",3);          //二个频率分量
   lcd_disp_string(8,2,";",1);         

   lcd_disp_string(0,3,"f2:",3);
   lcd_disp_string(8,3,";",1);         



   lcd_disp1616(0,48,3);lcd_disp1616(2,48,4);lcd_disp1608(4,48,9);     //单位:Hz,mW
   lcd_disp1608(6,48,11);lcd_disp1608(7,48,6);
   lcd_disp_string(8,7,";",1);lcd_disp1608(9,48,8);lcd_disp1608(10,48,7);
 
}


void dealdata(float qq,unsigned char pp,unsigned char z){//q是数据,p是行数, z是种类区分频率和功率
    unsigned char wei[5];
	unsigned char woo[8];
    unsigned char poo[5];
    unsigned char goo[8];

	if(z==0){
		wei[0]= qq/10000;
		wei[1]= (qq-wei[0]*10000)/1000;
		wei[2]= (qq-wei[0]*10000-wei[1]*1000)/100;
		wei[3]= (qq-wei[0]*10000-wei[1]*1000-wei[2]*100)/10;
		wei[4]= (qq-wei[0]*10000-wei[1]*1000-wei[2]*100-wei[3]*10);
	
	    if(wei[0]!=0) lcd_disp_text(5,pp,wei[0]+0x10); 
	    if((wei[1]||wei[0])!=0) lcd_disp_text(6,pp,wei[1]+0x10); 
		if((wei[2]||wei[1]||wei[0])!=0) lcd_disp_text(7,pp,wei[2]+0x10); 
	    if((wei[3]||wei[2]||wei[1]||wei[0])!=0) lcd_disp_text(8,pp,wei[3]+0x10); 
	    lcd_disp_text(9,pp,wei[4]+0x10); 
	    }   
    
	else if(z==1){
	    woo[0]= qq/100;
		woo[1]=(qq-woo[0]*100)/10;
        woo[2]=qq-woo[0]*100-woo[1]*10;
		woo[3]='.';
		woo[4]=(qq-woo[0]*100-woo[1]*10-woo[2])*10;
        woo[5]=(qq-woo[0]*100-woo[1]*10-woo[2]-woo[4]*0.1)*100;
		woo[6]=(qq-woo[0]*100-woo[1]*10-woo[2]-woo[4]*0.1-woo[5]*0.01)*1000;
		woo[7]=(qq-woo[0]*100-woo[1]*10-woo[2]-woo[4]*0.1-woo[5]*0.01-woo[6]*0.001)*10000;
 
	    if(woo[0]!=0) lcd_disp_text(5,pp,woo[0]+0x10); 
	    if(woo[0]||woo[1]!=0) lcd_disp_text(6,pp,woo[1]+0x10);
        lcd_disp_text(7,pp,woo[2]+0x10); 
        lcd_disp_string(8,pp,".",1);
		lcd_disp_text(9,pp,woo[4]+0x10); 
		lcd_disp_text(10,pp,woo[5]+0x10); 
		lcd_disp_text(11,pp,woo[6]+0x10); 
		lcd_disp_text(12,pp,woo[7]+0x10);    

	  }
    else if(z==2){
        poo[0]= qq/10000;
		poo[1]= (qq-poo[0]*10000)/1000;
		poo[2]= (qq-poo[0]*10000-poo[1]*1000)/100;
		poo[3]= (qq-poo[0]*10000-poo[1]*1000-poo[2]*100)/10;
		poo[4]= (qq-poo[0]*10000-poo[1]*1000-poo[2]*100-poo[3]*10);
	
	    if(poo[0]!=0) lcd_disp_text(3,pp,poo[0]+0x10); 
	    if((poo[1]||poo[0])!=0) lcd_disp_text(4,pp,poo[1]+0x10); 
		if((poo[2]||poo[1]||poo[0])!=0) lcd_disp_text(5,pp,poo[2]+0x10); 
	    if((poo[3]||poo[2]||poo[1]||wei[0])!=0) lcd_disp_text(6,pp,poo[3]+0x10); 
	    lcd_disp_text(7,pp,poo[4]+0x10);
     }
    else if (z==3){
        goo[0]= qq/100;
		goo[1]=(qq-goo[0]*100)/10;
        goo[2]=qq-goo[0]*100-goo[1]*10;
		goo[3]='.';
		goo[4]=(qq-goo[0]*100-goo[1]*10-goo[2])*10;
        goo[5]=(qq-goo[0]*100-goo[1]*10-goo[2]-goo[4]*0.1)*100;
		goo[6]=(qq-goo[0]*100-goo[1]*10-goo[2]-goo[4]*0.1-goo[5]*0.01)*1000;
		goo[7]=(qq-goo[0]*100-goo[1]*10-goo[2]-goo[4]*0.1-goo[5]*0.01-goo[6]*0.001)*10000;
        
 
	    if(goo[0]!=0) lcd_disp_text(8,pp,goo[0]+0x10); 
	    if(goo[0]||goo[1]!=0) lcd_disp_text(9,pp,goo[1]+0x10);
        lcd_disp_text(10,pp,goo[2]+0x10); 
        lcd_disp_string(11,pp,".",1);
		lcd_disp_text(12,pp,goo[4]+0x10); 
		lcd_disp_text(13,pp,goo[5]+0x10); 
		lcd_disp_text(14,pp,goo[6]+0x10); 
		lcd_disp_text(15,pp,goo[7]+0x10);    
     }
 }


/******************** 主函数 ********************/
void main ( void ) {
    unsigned char  s,n,j,k,v,p,q,m,hh,dd;
	unsigned int i,r,Number,index_Number,ff,NN,abc;

    unsigned int xdata adresult[1024],index_Maxf[50];

    float xdata MM,ram_v_m[1024],ram_v_I[1024],fr_v[1024],fi_v[1024],data_MaxPow[50],data_Maxf[50],P_Sub[50],abcd[50], aaa[50];
	float 	sum_temp,PP,KK,n_Szd,P_Sum,Time;	
	
    bit zq_Flag;
	SP = 0X80;
   	WDTCN = 0XDE;  	//禁止看门狗
	WDTCN = 0XAD;

	PortInitialization ();				// 初始化端口
	ExternalClock ();					// 起振外部时钟,使它成为系统时钟
	ExternIntInit(); 

	ADCInit();				//ADC0初始化
	Timer3Init();
	EA = 1;
	TMR3CN |= 0X04;
	

	BC7281Init();//键盘初始化

    chuxian();                 ////////// 显示欢迎使用
    screen();                  ///初始液晶显示 

    s=1;
    n=1;
	p=0;
	q=0;
    m=0;
	r=0;
    ff=4;
    dd=0;
 while(1){
    if(key_flag == 1){

	    while(key_flag)	key_flag = 0;                         //  将数据读入,并加延时防抖动

⌨️ 快捷键说明

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