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

📄 mainc.lst

📁 基于F020单片机的简易音频信号分析仪的实现keil程序(C实现)。2007年9月全国大学生电子设计竞赛题目(获得省2等奖)所有要求功能都实现。希望对感兴趣的朋友有帮助!
💻 LST
📖 第 1 页 / 共 3 页
字号:
 223   2                      wei[1]= (qq-wei[0]*10000)/1000;
 224   2                      wei[2]= (qq-wei[0]*10000-wei[1]*1000)/100;
 225   2                      wei[3]= (qq-wei[0]*10000-wei[1]*1000-wei[2]*100)/10;
 226   2                      wei[4]= (qq-wei[0]*10000-wei[1]*1000-wei[2]*100-wei[3]*10);
 227   2              
 228   2                  if(wei[0]!=0) lcd_disp_text(5,pp,wei[0]+0x10); 
 229   2                  if((wei[1]||wei[0])!=0) lcd_disp_text(6,pp,wei[1]+0x10); 
 230   2                      if((wei[2]||wei[1]||wei[0])!=0) lcd_disp_text(7,pp,wei[2]+0x10); 
 231   2                  if((wei[3]||wei[2]||wei[1]||wei[0])!=0) lcd_disp_text(8,pp,wei[3]+0x10); 
 232   2                  lcd_disp_text(9,pp,wei[4]+0x10); 
 233   2                  }   
 234   1          
 235   1              else if(z==1){
 236   2                  woo[0]= qq/100;
 237   2                      woo[1]=(qq-woo[0]*100)/10;
 238   2              woo[2]=qq-woo[0]*100-woo[1]*10;
 239   2                      woo[3]='.';
 240   2                      woo[4]=(qq-woo[0]*100-woo[1]*10-woo[2])*10;
C51 COMPILER V7.06   MAINC                                                                 09/06/2007 21:49:07 PAGE 5   

 241   2              woo[5]=(qq-woo[0]*100-woo[1]*10-woo[2]-woo[4]*0.1)*100;
 242   2                      woo[6]=(qq-woo[0]*100-woo[1]*10-woo[2]-woo[4]*0.1-woo[5]*0.01)*1000;
 243   2                      woo[7]=(qq-woo[0]*100-woo[1]*10-woo[2]-woo[4]*0.1-woo[5]*0.01-woo[6]*0.001)*10000;
 244   2       
 245   2                  if(woo[0]!=0) lcd_disp_text(5,pp,woo[0]+0x10); 
 246   2                  if(woo[0]||woo[1]!=0) lcd_disp_text(6,pp,woo[1]+0x10);
 247   2              lcd_disp_text(7,pp,woo[2]+0x10); 
 248   2              lcd_disp_string(8,pp,".",1);
 249   2                      lcd_disp_text(9,pp,woo[4]+0x10); 
 250   2                      lcd_disp_text(10,pp,woo[5]+0x10); 
 251   2                      lcd_disp_text(11,pp,woo[6]+0x10); 
 252   2                      lcd_disp_text(12,pp,woo[7]+0x10);    
 253   2      
 254   2                }
 255   1          else if(z==2){
 256   2              poo[0]= qq/10000;
 257   2                      poo[1]= (qq-poo[0]*10000)/1000;
 258   2                      poo[2]= (qq-poo[0]*10000-poo[1]*1000)/100;
 259   2                      poo[3]= (qq-poo[0]*10000-poo[1]*1000-poo[2]*100)/10;
 260   2                      poo[4]= (qq-poo[0]*10000-poo[1]*1000-poo[2]*100-poo[3]*10);
 261   2              
 262   2                  if(poo[0]!=0) lcd_disp_text(3,pp,poo[0]+0x10); 
 263   2                  if((poo[1]||poo[0])!=0) lcd_disp_text(4,pp,poo[1]+0x10); 
 264   2                      if((poo[2]||poo[1]||poo[0])!=0) lcd_disp_text(5,pp,poo[2]+0x10); 
 265   2                  if((poo[3]||poo[2]||poo[1]||wei[0])!=0) lcd_disp_text(6,pp,poo[3]+0x10); 
 266   2                  lcd_disp_text(7,pp,poo[4]+0x10);
 267   2           }
 268   1          else if (z==3){
 269   2              goo[0]= qq/100;
 270   2                      goo[1]=(qq-goo[0]*100)/10;
 271   2              goo[2]=qq-goo[0]*100-goo[1]*10;
 272   2                      goo[3]='.';
 273   2                      goo[4]=(qq-goo[0]*100-goo[1]*10-goo[2])*10;
 274   2              goo[5]=(qq-goo[0]*100-goo[1]*10-goo[2]-goo[4]*0.1)*100;
 275   2                      goo[6]=(qq-goo[0]*100-goo[1]*10-goo[2]-goo[4]*0.1-goo[5]*0.01)*1000;
 276   2                      goo[7]=(qq-goo[0]*100-goo[1]*10-goo[2]-goo[4]*0.1-goo[5]*0.01-goo[6]*0.001)*10000;
 277   2              
 278   2       
 279   2                  if(goo[0]!=0) lcd_disp_text(8,pp,goo[0]+0x10); 
 280   2                  if(goo[0]||goo[1]!=0) lcd_disp_text(9,pp,goo[1]+0x10);
 281   2              lcd_disp_text(10,pp,goo[2]+0x10); 
 282   2              lcd_disp_string(11,pp,".",1);
 283   2                      lcd_disp_text(12,pp,goo[4]+0x10); 
 284   2                      lcd_disp_text(13,pp,goo[5]+0x10); 
 285   2                      lcd_disp_text(14,pp,goo[6]+0x10); 
 286   2                      lcd_disp_text(15,pp,goo[7]+0x10);    
 287   2           }
 288   1       }
 289          
 290          
 291          /******************** 主函数 ********************/
 292          void main ( void ) {
 293   1          unsigned char  s,n,j,k,v,p,q,m,hh,dd;
 294   1              unsigned int i,r,Number,index_Number,ff,NN,abc;
 295   1      
 296   1          unsigned int xdata adresult[1024],index_Maxf[50];
 297   1      
 298   1          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[5
             -0],abcd[50], aaa[50];
 299   1              float   sum_temp,PP,KK,n_Szd,P_Sum,Time;        
 300   1              
 301   1          bit zq_Flag;
C51 COMPILER V7.06   MAINC                                                                 09/06/2007 21:49:07 PAGE 6   

 302   1              SP = 0X80;
 303   1              WDTCN = 0XDE;   //禁止看门狗
 304   1              WDTCN = 0XAD;
 305   1      
 306   1              PortInitialization ();                          // 初始化端口
 307   1              ExternalClock ();                                       // 起振外部时钟,使它成为系统时钟
 308   1              ExternIntInit(); 
 309   1      
 310   1              ADCInit();                              //ADC0初始化
 311   1              Timer3Init();
 312   1              EA = 1;
 313   1              TMR3CN |= 0X04;
 314   1              
 315   1      
 316   1              BC7281Init();//键盘初始化
 317   1      
 318   1          chuxian();                 ////////// 显示欢迎使用
 319   1          screen();                  ///初始液晶显示 
 320   1      
 321   1          s=1;
 322   1          n=1;
 323   1              p=0;
 324   1              q=0;
 325   1          m=0;
 326   1              r=0;
 327   1          ff=4;
 328   1          dd=0;
 329   1       while(1){
 330   2          if(key_flag == 1){
 331   3      
 332   3                  while(key_flag)     key_flag = 0;                         //  将数据读入,并加延时防抖动
 333   3                      for(i=0;i<250;i++)  { Delay(120);}
 334   3      
 335   3                      Write_7281(0x13 | 0x80 );
 336   3                      key_value = Read_7281();
 337   3      /////////////////////////////////////////////
 338   3           if(key_value==0x03){
 339   4                          s=1;
 340   4                          n=1;
 341   4                              p=0;
 342   4                              q=0;
 343   4                  m=0;
 344   4                              r=0;
 345   4                  ff=4;
 346   4                  dd=0;
 347   4               screen();                  ///初始液晶显示 
 348   4             }
 349   3      /////////////////////////////////////////////////
 350   3      
 351   3            else if (key_value==0x02) ff=1;  //////20HZ档位设定
 352   3      
 353   3      /////////////////////////////////////////////////
 354   3      
 355   3            else if (key_value==0x0b) {ff=1;dd=1;}/////////////失真度显示设置
 356   3      
 357   3      /////////////////////////////////////////////////
 358   3      
 359   3                  else if(key_value==0x0c) {             //运行键
 360   4                     n=1;
 361   4                   while(n){
 362   5                      if(ff==4){Number=256;index_Number=8;}
 363   5                                      else   {Number=1024;index_Number=10;}
C51 COMPILER V7.06   MAINC                                                                 09/06/2007 21:49:07 PAGE 7   

 364   5                              AMX0SL =P2&0x07;
 365   5                          for(i=0;i< Number;i++){                    
 366   6                                              AD0INT = 0;                     //AD中断标志清0
 367   6                                              AD0BUSY = 1;            //启动AD
 368   6                                              while(AD0INT ==0);      //等待转换完毕
 369   6                                              adresult[i] = ADC0H * 0X100 + ADC0L;
 370   6                          for(j=0;j<12;j++) ;                     
 371   6                        }
 372   5           
 373   5                                      for(i=0;i<Number;i++)                   
 374   5                                      { 
 375   6                                              ram_v_I[i]=0.0;
 376   6                                              ram_v_m[i]=adresult[i];
 377   6                                      }
 378   5                                      /////////根据P口判断放大倍数
 379   5                                  PP=0;
 380   5                                      if(P2==1) KK=10;
 381   5                                        else if (P2==0) KK=5;
 382   5                                        else if (P2==2) KK=1;
 383   5                                        else if (P2==6) KK=0.2;
 384   5                      //////////////////////////              
 385   5                              sum_temp=0;
 386   5                                      for(i=0;i<Number;i++) 
 387   5                                      fr_v[i]=2.48*adresult[i]/4096/KK;//数字量转换成模拟量          
 388   5                                      for(i=0;i<Number;i++) 
 389   5                                              sum_temp=sum_temp+fr_v[i]/Number; //求平均 
 390   5                              for(i=0;i<Number;i++) 
 391   5                                      fr_v[i]=fr_v[i]-sum_temp;//降低直流电流
 392   5                      for(i=0;i<Number;i++)                        
 393   5                                              PP=PP+pow(fr_v[i],2)/50.0/Number*1000*1.2;
 394   5                                      ///////////////////////////
 395   5                                      sum_temp=0;
 396   5                                      for(i=0;i<Number;i++) 
 397   5                                              sum_temp=sum_temp+ram_v_m[i]/Number; //求平均
 398   5                                      for(i=0;i<Number;i++) 
 399   5                                  ram_v_m[i]=ram_v_m[i]-sum_temp;//降低直流电流
 400   5                                      sum_temp=0;
 401   5                                      for(i=0;i<Number;i++) 
 402   5                                              sum_temp=MAXIMUM(sum_temp,abs(ram_v_m[i]));//求最大值                   
 403   5                                      for(i=0;i<Number;i++) 
 404   5                                              ram_v_m[i]=ram_v_m[i]/sum_temp;  //数据归一化             
 405   5                                      //////////开始FFT变换//////////////////         
 406   5                                      kkfft(ram_v_m,ram_v_I,Number,index_Number,fr_v,fi_v,0,1);       
 407   5                                      for (i=0; i<=Number-1; i++)
 408   5                                              ram_v_m[i]=pow(fr_v[i],2)+pow(fi_v[i],2);       //功率谱
 409   5                                  ////////////FFT变换后开始找频点////////////
 410   5                                      hh=0;
 411   5                                      for(i=0;i<20;i++)       {data_MaxPow[i]=0;data_Maxf[i]=0;index_Maxf[i]=0;}//清零
 412   5                                      for(i=0;i<Number/2;i++)                 
 413   5                              {       
 414   6                                      if(ram_v_m[i+1]>ram_v_m[i]&&ram_v_m[i+1]>ram_v_m[i+2])//
 415   6                                      {
 416   7                            if(ff==1)//1204点 20H档位
 417   7                                                {
 418   8                                              if(ram_v_m[i+1]>3000)
 419   8                                  {
 420   9                                         data_MaxPow[hh]=ram_v_m[i+1];//存储频点功率值
 421   9                                         index_Maxf[hh]=i+1;  //存储频点索引值
 422   9                                                         data_Maxf[hh]=(float)(i+1)*20.07/Number*1000;//存储频点值
 423   9                                         hh=hh+1;                         
 424   9                                  }
 425   8                                                }else if(ff==4)//256点 20H档位
C51 COMPILER V7.06   MAINC                                                                 09/06/2007 21:49:07 PAGE 8   

 426   7                                                {                        
 427   8                                                    if(ram_v_m[i+1]>200)
 428   8                                   {
 429   9                                         data_MaxPow[hh]=ram_v_m[i+1];//存储频点功率值
 430   9                                         index_Maxf[hh]=i+1;  //存储频点索引值
 431   9                                                         data_Maxf[hh]=(float)(i+1)*20.07/Number*1000;//存储频点值
 432   9                                         hh=hh+1;                         
 433   9                                   }
 434   8                                                 }
 435   7                                              } 
 436   6                                      } 
 437   5                                      
 438   5                                    
 439   5               
 440   5      
 441   5                                      /////////根据各频点求各频点功率分量///////////////
 442   5                                      sum_temp=0;
 443   5                                      for(i=0;i<20;i++)       P_Sub[i]=0;//清零
 444   5                                      for(i=0;i<hh;i++)                       
 445   5                                        sum_temp=sum_temp+ram_v_m[index_Maxf[i]];//各频点功率总和          
 446   5                                      for(i=0;i<hh;i++)                       
 447   5                                        P_Sub[i]=PP*ram_v_m[index_Maxf[i]]/sum_temp*0.97;//各频点功率分量 
 448   5                      sum_temp=0;       
 449   5      
 450   5       
 451   5                              ///////根据频点求失真度:只针对单点正弦信号/////////

⌨️ 快捷键说明

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