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

📄 main.c

📁 2007年全国赛题A题音频信号分析仪的源码
💻 C
字号:
#include "msp430x22x4.h"
#include "FFT.h"
#include "math.h"
#include "ocj4x8.h"
#include "stdio.h"
#define   N  64

unsigned char numbuf[4];
//unsigned char datakp0,datakp1,datakp2,datakp3;
//*****************************************************************遥控定义变量
unsigned int  operate_code;//接受操作码
unsigned char bitcnt,key;// 进入中断次数 ,按键码
unsigned char first = 1;//第一次进入遥控中断标志位
unsigned int  last,temp;
//**************************************************************AD转换定义的变量
unsigned char adc_flag=0;//转换完结束标志
unsigned char Start=0;//AD转换开好控制键
//**********************************************************傅立叶变换定义的变量
float Re[64],Im[64];//转换结果村于Re[N]中
float tatal_max;
//unsigned char max1,max2;
//float  datekp[10];//数据存储 

//***************************函数声明*******************************************
//void Signal(void);
void Mix(void);
//void Cycle(void);

void Inint()
{
  
  WDTCTL=WDTPW+WDTHOLD;//关看们狗
  BCSCTL1=CALBC1_1MHZ; //设定DCO 为1MHZ 
  DCOCTL=CALDCO_1MHZ; 
//*******************************遥控解码***************************************
  P4SEL|=0x01;//P4.0选择第二功能下降沿捕获发生中断  用于红海外接收一体化
  P1DIR|=0x04;//P1.2方向寄存器选择输出
  P1OUT|=0x04;//P1.2输出高电平,蜂鸣器不叫
//********************液晶显示控制位********************************************
  P4DIR|=0x02;
  P3DIR|=0x0a; 
//*****************TA定时器用于决定AD的采样率***********************************
  P2SEL|=0x01;//设置P2.0为模拟通道A0
  ADC10CTL0&=~(ENC);//修改ADC寄存器的值
  
  ADC10CTL1|=INCH_0+ADC10SSEL_3+CONSEQ_0 ;//选择A0输入通道,时钟源为MCLK,单通道单次转换
  ADC10CTL0|=SREF_0 +ADC10ON+MSC;//vcc参考源,转换模块开启
    
  ADC10AE0|=0x01;//通道A0允许
  ADC10CTL0|=ENC;//使能转换
  
  
  TACTL|=TASSEL_2 +TACLR ;
  TACCTL0|=CCIE;
  TACCR0=40000;//决定AD的采样率
  
  TACTL|=MC_1;

//***********************TB定时用于遥控解码************************************  
  TBCTL=0x0220;//选择时钟源为系统时钟,不分频,为连续计数模式,溢出中断禁止
  TBCCTL0=0x8918;//下降沿捕获,选择CCI0A做为输入源,同步捕获,捕获模块允许中断为捕获模式
//***************************************************************************
    _EINT();
    
 }
//*******************************主函数由此开始*********************************

                        

void main( void )
{ 
  Inint();
  key=0;
  init_lcd();clrram ();
  while(key==0) {dprintf(0,0,"音频信号分析仪");
                 dprintf(1,2,"HUBU小组");
                 dprintf(2,3,"制作");
                 dprintf(3,0,"开始>>>");}
 // while(key!=0){dprintf(0,1,"请按开始键!");key=0;}
  clrram ();
  while(1)
   {
     if(key==0x01){ Start=1;dprintf(3,0,"数据采集中...");}
//******************************************************************************
     if(adc_flag==1)//数据采集完毕标志
     { clrram ();
      // dprintf(0,0,"采集完毕");
      // delay(60000);
       clrram ();
       dprintf(0,0,"分析方式选择");
       dprintf(1,0,"1.单频信号-T");//key=0x11,单频信号
       dprintf(2,0,"2.混频信号-T");//key=0x12,混频信号
                                   //key=0x13,周期性分析
       while(1)
       {
         if(key==0x0a){WDTCTL = WDTPW|0xff00;}     //系统复位
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&选择单频信号分析方式&&&&&&&&&&&&&&&&&&&&&&         
         if(key==0x11){clrram();}
         while(key==0x11)
          {
            //Signal();
            switch(key)
            {case 0x13:{key=0x11;break;}//周期性分析Cycle();
             case 0x07:{Start=0;while(key==0x07);break;}//此键设为暂停键,可按任意键返回
             case 0x0a:{WDTCTL = WDTPW|0xff00;}     //系统复位
            }  
          }
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&选择混频信号分析方式&&&&&&&&&&&&&&&&&&&&&&&&&         
         if(key==0x12){clrram();}
         while(key==0x12)
          {
            Mix();
            while(1){if(key==0x0a)WDTCTL = WDTPW|0xff00;}
            switch(key)
            {case 0x13:{key=0x12;break;}//Cycle();break;}
             case 0x07:{Start=0;while(key==0x07);break;}//此键设为暂停键,可按任意键返回
             case 0x0a:{WDTCTL = WDTPW|0xff00;}     //系统复位
            }
          }  
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&       
       }
       
     } //if(adc_flag==1)//数据采集完毕标志
//******************************************************************************   
  } 
}
//########################Timer_B interrupt 遥控解码部分########################
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B(void)
{
  if(first ==1)
   { 
     TBCTL=0x0224;//定时器清零
     P2OUT&=0xfe;
     last=TBCCR0;
     last=0;
     first=0;
   }
  else if(first==0)
  {
      TBCTL=0x0224;//定时器清零
      temp=TBCCR0-last;
      if(temp>1024&&temp<1225){ temp=0;} 			//	判断数据0信号    
      else if(temp>2145&&temp<2345){ temp=0x8000;} 		//	判断数据1信号
      else if(temp>13400&&temp<14600) 		//	判断引导码信号
           { bitcnt=0;//user_code0=0;user_code1=0;
             operate_code=0; return;}		//	返回,等待下次开始接收                	
      else { first=1;return; }			//	干扰信号
      
      bitcnt++;
      if(bitcnt<13){_NOP();}//user_code0|=temp; user_code0>>=1;} //开始接收前13位用户识别码
      else if(bitcnt==13){_NOP();}// user_code0|=temp;}
      else if(bitcnt<26){_NOP();}//user_code1|=temp;user_code1>>=1;} //开始接收后13位用户识别码
      else if(bitcnt==26){_NOP();}//user_code1|=temp;} 
      else if(bitcnt<42){operate_code|=temp;operate_code>>=1;} //开始接收16位(8位操作码和8位操作反码)
      else if(bitcnt==42){  bitcnt=0;
                            operate_code|=temp;
                            key=operate_code&0x00ff;
                              P1OUT&=0xfb;//P1.2输出低电平,蜂鸣器叫
                              delay(40000);
                              P1OUT|=0x04;//P1.2输出高电平,蜂鸣器不叫
                          }                     
  }
}
//##########################Timer_A interrupt 确定采样频率######################
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
 static unsigned char i;
  if(Start==1)
  {  
    ADC10CTL0&=~ENC;
    Re[i]=(float)( (ADC10MEM)*3/1023);
    i++;
    if(i==64)
    {adc_flag=1; Start=0;} 
    ADC10CTL0|=ENC+ADC10SC; 
  }   
}
//*****************混频信号分析************************************************

void Mix(void)
{
   FFT(1,6,Re,Im);
   //Apower(Re,Im);
   tatal_max=Wpower(Re,Im);
   dprintf(0,0,"总功率:");
   sprintf(numbuf,"%0.3fmw",tatal_max);
   dprintf(0,4,numbuf);
   
}





 //ref_num(Re,datekp);
    /*
    datakp0=(unsigned char)(tatal_max);
    datakp1=(unsigned char)((tatal_max-datakp0)*100);
    dprintf(0,2,"测试结果");
    dprintf(1,0,"总功率:");
    dis_num(1,4,datakp0);
    dprintf(1,5,".");
    dis_num(1,6,datakp1);
    
    datakp2=(unsigned char)(Re[1]);
    datakp3=(unsigned char)((Re[1]-datakp2)*100);
    dprintf(2,0,"频率1:    100Hz");
    dprintf(3,0,"功率1:");
    dis_num(3,4,datakp2);
    //dprintf(3,5,".");
    //dis_num(3,6,datakp3);
    */

   /*
    while(page1==0);                   //遥控翻页1
    page1=0;
    clrram ();
    dprintf(0,0,"频率2:");
    sprintf(numbuf,"%0.0fHz",datekeep[2]);
    dprintf(0,3,numbuf);
    dprintf(1,0,"功率2:");
    sprintf(numbuf,"%0.3fmw",datekeep[3]);
    dprintf(1,3,numbuf);

    dprintf(2,0,"频率3:");
    sprintf(numbuf,"%0.0fHz",datekeep[4]);
    dprintf(2,3,numbuf);
    dprintf(3,0,"功率3:");
    sprintf(numbuf,"%0.3fmw",datekeep[5]);
    dprintf(3,3,numbuf);

    while(page2==0);                    //遥控翻页2
    page2=0;    
    clrram ();
    dprintf(0,0,"频率4:");
    sprintf(numbuf,"%0.0fHz",datekeep[6]);
    dprintf(0,3,numbuf);
    dprintf(1,0,"功率4:");
    sprintf(numbuf,"%0.3fmw",datekeep[7]);
    dprintf(1,3,numbuf);

    dprintf(2,0,"频率5:");
    sprintf(numbuf,"%0.0fHz",datekeep[8]);
    dprintf(2,3,numbuf);
    dprintf(3,0,"功率5:");
    sprintf(numbuf,"%0.3fmw",datekeep[9]);
    dprintf(3,3,numbuf);
}
void Signal(void)
{
   FFT(6,Re,Im);     //对采样频率做FFT   
   Apower(Re,Im);
   
   
 }*/

⌨️ 快捷键说明

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