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

📄 mainc.c

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

		Write_7281(0x13 | 0x80 );
		key_value = Read_7281();
/////////////////////////////////////////////
     if(key_value==0x03){
		    s=1;
		    n=1;
			p=0;
			q=0;
            m=0;
			r=0;
            ff=4;
            dd=0;
         screen();                  ///初始液晶显示 
       }
/////////////////////////////////////////////////

      else if (key_value==0x02) ff=1;  //////20HZ档位设定

/////////////////////////////////////////////////

      else if (key_value==0x0b) {ff=1;dd=1;}/////////////失真度显示设置

/////////////////////////////////////////////////

	    else if(key_value==0x0c) {             //运行键
               n=1;
             while(n){
                if(ff==4){Number=256;index_Number=8;}
				else   {Number=1024;index_Number=10;}
                	AMX0SL =P2&0x07;
	            for(i=0;i< Number;i++){                    
					AD0INT = 0;			//AD中断标志清0
					AD0BUSY = 1;		//启动AD
					while(AD0INT ==0); 	//等待转换完毕
					adresult[i] = ADC0H * 0X100 + ADC0L;
                    for(j=0;j<12;j++) ;                     
                  }
     
			   	for(i=0;i<Number;i++)			
				{ 
					ram_v_I[i]=0.0;
					ram_v_m[i]=adresult[i];
				}
 				/////////根据P口判断放大倍数
			    PP=0;
				if(P2==1) KK=10;
				  else if (P2==0) KK=5;
				  else if (P2==2) KK=1;
				  else if (P2==6) KK=0.2;
                //////////////////////////		
		    	sum_temp=0;
				for(i=0;i<Number;i++) 
			    	fr_v[i]=2.48*adresult[i]/4096/KK;//数字量转换成模拟量	       
				for(i=0;i<Number;i++) 
					sum_temp=sum_temp+fr_v[i]/Number; //求平均 
		        for(i=0;i<Number;i++) 
			        fr_v[i]=fr_v[i]-sum_temp;//降低直流电流
                for(i=0;i<Number;i++) 			     
					PP=PP+pow(fr_v[i],2)/50.0/Number*1000*1.2;
				///////////////////////////
				sum_temp=0;
				for(i=0;i<Number;i++) 
					sum_temp=sum_temp+ram_v_m[i]/Number; //求平均
				for(i=0;i<Number;i++) 
		            ram_v_m[i]=ram_v_m[i]-sum_temp;//降低直流电流
		  		sum_temp=0;
				for(i=0;i<Number;i++) 
					sum_temp=MAXIMUM(sum_temp,abs(ram_v_m[i]));//求最大值			
				for(i=0;i<Number;i++) 
					ram_v_m[i]=ram_v_m[i]/sum_temp;  //数据归一化		  
				//////////开始FFT变换//////////////////		
				kkfft(ram_v_m,ram_v_I,Number,index_Number,fr_v,fi_v,0,1); 	
		 		for (i=0; i<=Number-1; i++)
					ram_v_m[i]=pow(fr_v[i],2)+pow(fi_v[i],2);	//功率谱
			    ////////////FFT变换后开始找频点////////////
  				hh=0;
				for(i=0;i<20;i++)	{data_MaxPow[i]=0;data_Maxf[i]=0;index_Maxf[i]=0;}//清零
				for(i=0;i<Number/2;i++)			
	        	{ 	
		        	if(ram_v_m[i+1]>ram_v_m[i]&&ram_v_m[i+1]>ram_v_m[i+2])//
		        	{
                      if(ff==1)//1204点 20H档位
					  {
			        	if(ram_v_m[i+1]>3000)
             		    {
                 		   data_MaxPow[hh]=ram_v_m[i+1];//存储频点功率值
                 		   index_Maxf[hh]=i+1;	//存储频点索引值
						   data_Maxf[hh]=(float)(i+1)*20.07/Number*1000;//存储频点值
                 		   hh=hh+1;			    
                	    }
					  }else if(ff==4)//256点 20H档位
					  {                        
					      if(ram_v_m[i+1]>200)
             		     {
                 		   data_MaxPow[hh]=ram_v_m[i+1];//存储频点功率值
                 		   index_Maxf[hh]=i+1;	//存储频点索引值
						   data_Maxf[hh]=(float)(i+1)*20.07/Number*1000;//存储频点值
                 		   hh=hh+1;			    
                	     }
					   }
					} 
				} 
				
			      
         

				/////////根据各频点求各频点功率分量///////////////
   				sum_temp=0;
				for(i=0;i<20;i++)	P_Sub[i]=0;//清零
  				for(i=0;i<hh;i++)			
         			  sum_temp=sum_temp+ram_v_m[index_Maxf[i]];//各频点功率总和          
				for(i=0;i<hh;i++)			
          			  P_Sub[i]=PP*ram_v_m[index_Maxf[i]]/sum_temp*0.97;//各频点功率分量 
                sum_temp=0;       

 
    			///////根据频点求失真度:只针对单点正弦信号/////////
    			if(dd==1)//按下失真度键处理
				{
				P_Sum=0;
   				sum_temp=0;
   			    MM=0;
                NN=0;
                for(i=0;i<hh;i++) 
					MM=MAXIMUM(MM,data_MaxPow[i]);
                for(i=0;i<hh;i++)  
                       if(data_MaxPow[i]==MM)
                          NN=i;

    			for(i=0;i<Number/2;i++)
                   	   P_Sum=P_Sum+ram_v_m[i];//求整个频谱上所有功率
                   
    			for(i=0;i<10;i++)
       					   sum_temp= sum_temp+ram_v_m[index_Maxf[NN]+i];
    			for(i=0;i<10;i++)
       					   sum_temp= sum_temp+ram_v_m[index_Maxf[NN]-i-1];//求单个频点周围功率
    			n_Szd=(P_Sum-sum_temp)/P_Sum;//计算失真度
  				n_Szd=sqrt(n_Szd)*100;				
				}
		        /////////求频谱分量功率////////////////////
		        sum_temp=0;	
				for(i=0;i<Number/2;i++) 
					sum_temp=sum_temp+ram_v_m[i];//得到频谱功率总和
                for(i=0;i<Number/2;i++) 
					ram_v_I[i]=PP/sum_temp*ram_v_m[i];
                /////////频谱处理:归一化,供LCD显示频谱////////////////////
				sum_temp=0;	
				for(i=0;i<Number/2;i++) 
					sum_temp=MAXIMUM(sum_temp,ram_v_m[i]);
                for(i=0;i<Number/2;i++) 
					ram_v_m[i]=ram_v_m[i]/sum_temp*64;

////////////////////////////////////////////////////////////
             for(i=0;i<hh;i++)
                { 
				   sum_temp=0;     		       
				      for(k=0;k<hh;k++)
				       if(sum_temp<P_Sub[k])
					   {
					     abc=k;				  
					     sum_temp=P_Sub[k];	
					    }
                      abcd[i]= data_Maxf[abc];

                     aaa[i]=sum_temp;
                     P_Sub[abc]=0;
                }
                for(i=0;i<hh;i++)  
			    {
				   P_Sub[i]=aaa[i];
                   data_Maxf[i]=abcd[i];
				}  
			
			//2. 调用数据处理和显示部分  如:
			//但如果运行完的时间小于5MS则加延时使其达5MS
	         for(v=0;v<3;v++)
			    for(k=0;k<5;k++){
	                lcd_disp_text(3+k,4+v,0);
				 }
		     for(v=0;v<3;v++)
			    for(k=0;k<3;k++){
	                lcd_disp_text(11+k,4+v,0);
				 }
		    dealdata(PP,1,3); //LCD显示总功率
		    dealdata(data_Maxf[0],2,2); //LCD显示频点
		    dealdata(data_Maxf[1],3,2); //LCD显示频点
	        dealdata(P_Sub[0],2,3); //LCD显示频点1功率分量
		    dealdata(P_Sub[1],3,3); //LCD显示频点2功率分量

			if(dd==1){
                    lcd_disp1616(0,32,8); lcd_disp1616(2,32,9); lcd_disp1616(4,32,10);
                      lcd_disp1608(6,32,9); dealdata(n_Szd,5,3);
               }       //LCD显示失真度 

             if(key_flag == 1) n=0;
        }
  } 
////////////////////////////////////////////////////////////////////
        else  if(key_value==0x0f) n=0;         //暂停
///////////////////////////////////////////////////////////////////
	    else if(key_value==0x00){          //显示频谱
				lcd_initial();				//液晶初始化
				lcd_clear_ram();

			     for(i=0;i<128;i++)
                   for(j=0;j<=ram_v_m[i];j++){                  
	                 showdot(i,j);
		          }
          }
////////////////////////////////////////////////////////////////////
        else if(key_value==0x01){   //左移
	       p++;
 	      if(p<=24){
		    lcd_initial();				//液晶初始化
	        lcd_clear_ram();  
		    for(i=0;i<128;i++)
              for(j=0;j<=ram_v_m[i+p*16];j++){                  
               showdot(i,j);
             }
           m=128+p*16;
		   }
	    }
////////////////////////////////////////////////////////
	    else if(key_value==0x02){         //右移		   
	       r++;
	       if(p>=0){
		     lcd_initial();				//液晶初始化
	         lcd_clear_ram();  
		      for(i=0;i<128;i++)
               for(j=0;j<=ram_v_m[m-r*16];j++){                  
	                 showdot(i,j);
		      }
			}
        }
 //////////////////////////////////////////////////////////       

        else if(key_value==0x0e){        //回放显示 

	    	lcd_initial();				//液晶初始化
            lcd_clear_ram();
      
		  for(i=0;i<4;i++){
                lcd_disp_string(0,i*2,"f   :",5);dealdata(data_Maxf[i],i*2,0); 
               lcd_disp_text(1,i*2,i+0x10);
                lcd_disp_string(0,i*2+1,"p   :",5);dealdata(P_Sub[i],i*2+1,1); 
               lcd_disp_text(1,i*2+1,i+0x10);
			}
          q=0;
          } 
/////////////////////////////////////////////////////////
	   else if(key_value==0x0d){          //下一屏
		    q++;
		    if(q<5){
			lcd_initial();				//液晶初始化
		    lcd_clear_ram();
	  		 for(i=0;i<4;i++){
	            lcd_disp_string(0,i*2,"f   :",5);dealdata(data_Maxf[i+q*4],i*2,0); 
	
	            if(i+q*4<10) lcd_disp_text(1,i*2,i+q*4+0x10);
	
	            else if(i+q*4<20 && i+q*4>=10) {
	                   lcd_disp_text(1,i*2,(i+q*4)/10+0x10);
	                   lcd_disp_text(2,i*2,(i+q*4)%10+0x10);
	             }
	 
	            lcd_disp_string(0,i*2+1,"p   :",5);dealdata(P_Sub[i+q*4],i*2+1,1);
	
	            if(i+q*4<10) lcd_disp_text(1,i*2+1,i+q*4+0x10);
	            else if(i+q*4<20 && i+q*4>=10) {
	                   lcd_disp_text(1,i*2+1,(i+q*4)/10+0x10);
	                   lcd_disp_text(2,i*2+1,(i+q*4)%10+0x10);
	             }
				}
		  }
         else if(q>=5){
            lcd_initial();				//液晶初始化
	        lcd_clear_ram();
            lcd_disp1616(2,32,5);
            lcd_disp1616(4,32,6);///显示已完毕
            lcd_disp1616(6,32,7);
          }
	}
//////////////////////////////////////
      else if(key_value==0x07) {            //判断周期性

                if(ff==1){Number=256;index_Number=8;}
				else   {Number=1024;index_Number=10;}
                	AMX0SL =P2&0x07;
	            for(i=0;i< Number;i++){                    
					AD0INT = 0;			//AD中断标志清0
					AD0BUSY = 1;		//启动AD
					while(AD0INT ==0); 	//等待转换完毕
					adresult[i] = ADC0H * 0X100 + ADC0L;
                    for(j=0;j<12;j++) ;                     
                  }
     
			   	for(i=0;i<Number;i++)			
					ram_v_m[i]=adresult[i];
				sum_temp=0;
				for(i=0;i<Number;i++) 
					sum_temp=sum_temp+ram_v_m[i]/Number; //求平均
				for(i=0;i<Number;i++) 
		            ram_v_m[i]=ram_v_m[i]-sum_temp;//降低直流电流
		  		sum_temp=0;
				for(i=0;i<Number;i++) 
					sum_temp=MAXIMUM(sum_temp,abs(ram_v_m[i]));//求最大值			
				for(i=0;i<Number;i++) 
					ram_v_m[i]=ram_v_m[i]/sum_temp;  //数据归一化
				//////////周期性判断//////////////////		
			    Time=zqpd(ram_v_m);		      
			lcd_initial();				//液晶初始化
			lcd_clear_ram();

		    if(Time==0){
			    lcd_disp1616(0,0,13);lcd_disp1616(2,0,11);lcd_disp1616(4,0,12);
			  }
			else if(Time!=0){
			    lcd_disp1616(0,0,11);lcd_disp1616(2,0,12);//显示周期Time数值
				lcd_disp_string(5,0,":",1);
				dealdata(Time,2,1);
			  }	
				  
		}

      }
   }
}


⌨️ 快捷键说明

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