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

📄 main.cpp

📁 msp430单片机声音采集程序
💻 CPP
字号:
#include  <msp430x14x.h>

void Init_ADC(void);
void Init_TimerB(void);
void Init_UTR(void);
void Init_CLK(void);

  int ADC12buf = 0;
  int sign = 0;			/* Current adpcm sign bit */
  unsigned int delta = 0;			/* Current adpcm output value */
  int diff = 0;			/* Difference between val and valprev */
  int step = 0;			/* Stepsize */
  long valpred = 0  ;		   /* Predicted output value */
  long vpdiff = 0;			/* Current change to valpred */
  int index = 0;			/* Current step change index */
  unsigned int outputbuffer = 0;		/* place to keep previous 4-bit value */
  int bufferstep = 1;		/* toggle between outputbuffer/output */
 // int j = 0;
 // static short test[10] = {0,0,1,2,4,6,9,12,16,20};
  static short test = 0;
  static int myi = -1;
  static int ll = 0;
  static int indexTable[16] = {
    -1, -1, -1, -1, 2, 4, 6, 8,
    -1, -1, -1, -1, 2, 4, 6, 8,
};

static char wavarray[906]={
0x80,0x85,0x96,0xA8,0xB6,0xB7,0xA8,0x8D,0x7E,0x7B,0x88,0x9C,0xA0,0x90,0x6C,0x54,
0x4D,0x56,0x62,0x5C,0x4C,0x2E,0x1D,0x24,0x3B,0x4F,0x4E,0x4B,0x45,0x4B,0x61,0x8C,
0xC0,0xE0,0xEA,0xDA,0xC9,0xC4,0xD3,0xF2,0xFF,0xF3,0xC8,0x93,0x77,0x73,0x88,0x8F,
0x7B,0x56,0x28,0x18,0x20,0x38,0x45,0x3C,0x2E,0x1E,0x29,0x47,0x7B,0xB0,0xCC,0xCD,
0xB3,0xA5,0xAA,0xC4,0xEB,0xF4,0xDC,0xA2,0x70,0x5D,0x64,0x7D,0x7F,0x6A,0x3F,0x20,
0x22,0x3A,0x55,0x57,0x4F,0x3B,0x2F,0x3F,0x64,0x9E,0xC8,0xDC,0xCF,0xB5,0xB2,0xC0,
0xE4,0xFF,0xFA,0xCE,0x8E,0x66,0x5D,0x78,0x8B,0x81,0x5F,0x2E,0x1A,0x24,0x45,0x5C,
0x5A,0x4B,0x32,0x2D,0x3E,0x68,0x9B,0xB6,0xB8,0x9E,0x8C,0x8F,0xAD,0xDB,0xF0,0xE0,
0xAD,0x7B,0x63,0x6B,0x8B,0x95,0x83,0x5B,0x38,0x36,0x4C,0x6D,0x77,0x6F,0x57,0x42,
0x46,0x5E,0x8B,0xB0,0xC0,0xB2,0x97,0x8D,0x95,0xB6,0xD5,0xD8,0xB9,0x85,0x62,0x5A,
0x72,0x8B,0x8B,0x73,0x49,0x35,0x3E,0x59,0x72,0x75,0x67,0x4C,0x3F,0x4A,0x6D,0x9A,
0xB4,0xB2,0x9B,0x94,0xA6,0xC9,0xD9,0xC8,0xAD,0x98,0x89,0x78,0x60,0x52,0x57,0x65,
0x61,0x47,0x32,0x32,0x4E,0x79,0x9A,0x9F,0x91,0x89,0x95,0xB6,0xD1,0xC6,0x99,0x73,
0x67,0x69,0x63,0x4D,0x37,0x3D,0x51,0x54,0x4A,0x49,0x57,0x79,0xA1,0xB9,0xB9,0xAF,
0xB3,0xCE,0xF4,0xFF,0xDC,0xA9,0x8D,0x8C,0x8C,0x71,0x44,0x24,0x28,0x39,0x39,0x2E,
0x27,0x31,0x52,0x7B,0x91,0x8F,0x8A,0x99,0xC0,0xE9,0xEA,0xC3,0x9F,0x9B,0xA6,0xA1,
0x7D,0x50,0x41,0x54,0x64,0x5A,0x47,0x38,0x40,0x62,0x86,0x90,0x85,0x7C,0x92,0xC2,
0xE6,0xD9,0xAC,0x92,0x9A,0xAA,0x9D,0x72,0x4A,0x48,0x5F,0x6B,0x5F,0x4C,0x41,0x4F,
0x72,0x8E,0x8E,0x7D,0x78,0x8E,0xBA,0xCD,0xB1,0x86,0x79,0x89,0x92,0x7C,0x52,0x39,
0x4A,0x69,0x75,0x6B,0x5A,0x55,0x6E,0x98,0xAF,0xA9,0x98,0x96,0xAE,0xD1,0xD3,0xAF,
0x8C,0x87,0x8F,0x8A,0x69,0x42,0x35,0x4A,0x60,0x5F,0x51,0x41,0x48,0x6A,0x90,0x9D,
0x93,0x88,0x90,0xB1,0xCF,0xC8,0xA8,0x92,0x92,0x95,0x87,0x6B,0x52,0x52,0x64,0x6B,
0x61,0x51,0x4A,0x5B,0x7D,0x8F,0x8E,0x9E,0xB6,0xB5,0xB6,0xC9,0xC1,0x94,0x75,0x6D,
0x58,0x42,0x4A,0x5E,0x69,0x7D,0xA2,0xBF,0xBE,0xAF,0xA8,0x92,0x62,0x3C,0x26,0x0A,
0x00,0x21,0x4E,0x67,0x81,0xB0,0xDB,0xE5,0xDE,0xD9,0xC1,0x92,0x71,0x62,0x49,0x37,
0x45,0x65,0x7D,0x8E,0xAE,0xD0,0xD6,0xCD,0xCC,0xB8,0x8A,0x68,0x53,0x34,0x20,0x31,
0x50,0x64,0x73,0x96,0xBE,0xC9,0xBE,0xB7,0x9D,0x6D,0x4A,0x37,0x1F,0x10,0x25,0x50,
0x73,0x90,0xBA,0xE1,0xE8,0xDE,0xD6,0xBB,0x88,0x61,0x4A,0x31,0x28,0x3E,0x63,0x81,
0x98,0xB9,0xDB,0xDE,0xCF,0xBD,0x9D,0x71,0x4F,0x3B,0x21,0x18,0x31,0x58,0x79,0x94,
0xB5,0xD2,0xD8,0xCF,0xC3,0xA1,0x70,0x49,0x32,0x1E,0x1B,0x31,0x52,0x71,0x8F,0xB5,
0xD5,0xD8,0xCD,0xC2,0xA5,0x7B,0x5B,0x44,0x30,0x30,0x49,0x6A,0x86,0x9D,0xBB,0xD6,
0xDB,0xCE,0xBB,0x97,0x6F,0x54,0x41,0x2B,0x27,0x3A,0x57,0x73,0x8D,0xAA,0xC2,0xC7,
0xC2,0xB7,0x9B,0x77,0x60,0x4E,0x3B,0x37,0x46,0x5D,0x74,0x8D,0xA9,0xBD,0xBF,0xB8,
0xB0,0x97,0x77,0x62,0x52,0x43,0x43,0x56,0x70,0x89,0xA0,0xB8,0xC9,0xC7,0xB9,0x9D,
0x7E,0x77,0x7A,0x67,0x58,0x5C,0x50,0x3E,0x47,0x59,0x6A,0x7B,0x88,0x92,0x98,0x9B,
0x9F,0x9F,0x9A,0x99,0x97,0x8F,0x8D,0x90,0x93,0x96,0x95,0x94,0x93,0x89,0x78,0x6C,
0x61,0x55,0x52,0x57,0x5C,0x65,0x71,0x7B,0x80,0x7A,0x72,0x6D,0x67,0x61,0x62,0x68,
0x6E,0x76,0x81,0x8B,0x94,0x9D,0xA7,0xAE,0xAE,0xAB,0xA9,0xA3,0x9C,0x98,0x96,0x8F,
0x85,0x80,0x7D,0x7C,0x7F,0x82,0x85,0x84,0x80,0x7E,0x79,0x71,0x6C,0x69,0x64,0x61,
0x63,0x67,0x6B,0x71,0x78,0x80,0x84,0x83,0x82,0x83,0x82,0x80,0x7C,0x77,0x77,0x79,
0x7E,0x81,0x83,0x87,0x8F,0x95,0x98,0x9A,0x9B,0x9C,0x9D,0x9A,0x95,0x8E,0x86,0x80,
0x7D,0x7B,0x76,0x73,0x71,0x71,0x75,0x79,0x7B,0x7B,0x7A,0x78,0x75,0x73,0x6F,0x6F,
0x71,0x73,0x77,0x7B,0x7E,0x83,0x88,0x8D,0x8E,0x8A,0x86,0x84,0x85,0x85,0x86,0x85,
0x83,0x83,0x87,0x8A,0x8C,0x8D,0x8E,0x8F,0x8E,0x8B,0x87,0x82,0x7C,0x79,0x77,0x72,
0x6E,0x6F,0x74,0x7B,0x80,0x82,0x84,0x85,0x85,0x86,0x85,0x80,0x7A,0x78,0x78,0x79,
0x7C,0x7F,0x82,0x83,0x84,0x87,0x88,0x84,0x82,0x80,0x80,0x7D,0x7B,0x7A,0x79,0x7D,
0x83,0x88,0x8B,0x8E,0x92,0x96,0x94,0x8F,0x8A,0x82,0x7B,0x75,0x71,0x6D,0x69,0x6A,
0x70,0x76,0x7B,0x81,0x86,0x87,0x87,0x88,0x86,0x81,0x7C,0x7A,0x78,0x75,0x75,0x7A,
0x7F,0x82,0x87,0x8B,0x8B,0x88,0x87,0x85,0x80,0x7B,0x78,0x75,0x74,0x79,0x81,0x86,
0x89,0x8E,0x95,0x95,0x91,0x8E,0x89,0x80,0x78,0x73,0x6E,0x69,0x69,0x6E,0x73,0x78,
0x7F,0x86,0x89,0x8A,0x8D,0x8D,0x89,0x82,0x7E,0x7A,0x77,0x78,0x7D,0x7F,0x7F,0x83,
0x87,0x89,0x88,0x88,0x86,0x80,0x7A,0x78,0x76,0x75,0x78,0x7E,0x83,0x85,0x8A,0x91,
0x94,0x95,0x95,0x90,0x86,0x7D,0x78,0x74,0x6E,0x6B,0x6D,0x6E,0x71,0x78,0x81,0x86,
0x89,0x8C,0x8B,0x86,0x81,0x80,0x7E,0x7B,0x7A,0x7C,0x7C,0x7C,0x80,0x86,0x89,0x89,
0x89,0x87,0x84,0x81,0x81,0x80,0x7D,0x7C,0x7E,0x7F,0x80,0x84,0x89,0x8B,0x8B,0x8A,
0x89,0x85,0x80,0x7D,0x7A,0x76,0x74,0x75,0x77,0x79,0x7F,0x85,0x8A,0x8B,0x8D,0x8D,
0x8A,0x85,0x81,0x7E,0x79,0x76,0x76,0x77,0x76,0x75
};

static int stepsizeTable[89] = {
    7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
    19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
    50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
    130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
    337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
    876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
    2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
    5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
    15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
};

int main()
{
  // 关闭看门狗
  WDTCTL = WDTPW + WDTHOLD;

  // 关闭中断
  _DINT();		

  Init_ADC();
  Init_TimerB();
  Init_CLK();
  Init_UTR();

  // 打开中断
  _EINT();

  //中断处理完成后就关闭CPU,进入低功耗状态
  for(;;)
  {
    // Enter LPM0 w/ interrupt
    _BIS_SR(CPUOFF + GIE);

  }

}


//选择MCLK,SMCLK的时钟源为XT2
void Init_CLK(void)
{
    unsigned int i;

    //启动XT2震荡器
    BCSCTL1 &= ~XT2OFF;			

    // 清除OSCFault标志
    do
    {
	IFG1 &= ~OFIFG;
	for (i = 0x20; i > 0; i--);
    }
    while ((IFG1 & OFIFG) == OFIFG);


    //MCLK 的时钟源为XT2,分频因子为1 , DIVM0
    //SMCLK的时钟源为XT2,分频因子为1, DIVS0
    //XT2的频率范围是450KHz到8MHz,
    //XT2的频率是7.3728MHz,所以SMLK也是7.3728MHz
    BCSCTL2 = SELM_2 + SELS ;		
                          		

}

//TimerB 是ADC的采样时钟
void Init_TimerB(void)
{

   // 选择SMCLK,清除TAR
   //modified,可能没有分频,等于SMCLK
    TBCTL = TBSSEL_2 + TBCLR;

   //TB输出频率为:8192HZ=7.3728MHz/900
   // TBCCR0 = 900;
   //TBCCR1 = 450;
   TBCCR0 = 450;
   TBCCR1 = 225;
   //CCR1 Compare mode
   //TBCL0-TBCL1等于方波的1宽,TBCL1等于0宽,周期还是TBCL0
   TBCCTL1 = OUTMOD_3 ;

   // 增记数模式
   //TBCTL |= MC0;		
   TBCTL |= MC1;//MODIFIED

}


void Init_ADC(void)
{
    //P6.0 ADC option select
    P6SEL = 0x08;

   //设置ENC为0,从而修改ADC12寄存器的值
    ADC12CTL0 &= ~(ENC);

    //单通道通道重复模式
    //转换内核时钟SMCLK
    //转换时钟8分频:7.3728MHz/8=921.6KHz,近1M,
    //而转换频率是:921.6KHz/13=70.892kHz
    //采样输入时钟信号 :SHS_3是TimerB_1

    ADC12CTL1 = CONSEQ_2 + ADC12SSEL_3 + ADC12DIV_7 + SHS_3 + SHP;

    //转换的起始地址为:ADCMEM0
    //ADC12CTL1 |= CSTARTADD_0;	
    ADC12CTL1 |= CSTARTADD_3;

    // Enable ADCIFG15 interrupt
    //转换完成中断使能
    ADC12IE = 0x0001;

    //设置参考电压分别为AVSS和AVCC,输入通道为A3
    ADC12MCTL0 = INCH_3 + EOS + SREF_1;

    //采样周期=SAMPCON,  SHT00
    //ADC12CTL0 |= ADC12ON + SHT00 + SHT01 + SHT02 + REFON;
    //MODIFIED
    //SHT00表示ADCMEM0采样周期是采样时钟周期的4倍
    //那采样频率为:(TimerB时钟)8192HZ/4=2048HZ
    //可以看出转换频率是采样频率的35倍,所以时间可以忽略不计
    ADC12CTL0 |= ADC12ON + SHT00 + REFON;
    //ADC12CTL0 |= MSC;//to modify


    //使能ADC转换
    ADC12CTL0 |= ENC;		


    return;
}

// 定时器中断,完成 ADC 转换
#pragma vector=ADC_VECTOR
__interrupt void ADC12_ISR (void)
{
     // ADC12buf = ADC12MEM0;
  ADC12buf = ADC12MEM3;
      test = ADC12buf;

     /*myi=myi+1;

     // if(myi>10) {myi=1;  }
     // test = (myi*myi);
     if(myi>905) {myi=0;}
      test = wavarray[myi];

      //test = test*8;
      //test = 0x12;
    // while (!(IFG2 & UTXIFG1)); // USART0 TX buffer ready?
    //    TXBUF1 = test & 0xff;*/
    	

     test = test*8;

      step = stepsizeTable[index];

      diff = test - valpred;
      sign = (diff < 0) ? 8 : 0;
      if ( sign ) diff = (-diff);

      // Step 2 - Divide and clamp
      delta = 0;
      vpdiff = (step >> 3);
      if ( diff >= step )
      {
	delta = 4;
	diff -= step;
	vpdiff += step;
      }
      step >>= 1;
      if ( diff >= step  )
      {
	delta |= 2;
	diff -= step;
	vpdiff += step;
      }
      step >>= 1;
      if ( diff >= step )
      {
        delta |= 1;
	vpdiff += step;
       }
      // Step 3 - Update previous value
      if ( sign )
	  valpred -= vpdiff;
      else
	  valpred += vpdiff;
       // Step 4 - Clamp previous value to 16 bits
        if ( valpred > 32767 )
	  valpred = 32767;
	else if ( valpred < -32768 )
	  valpred = -32768;
         // Step 5 - Assemble value, update index and step values
	delta |= sign;
	index += indexTable[delta];
	if ( index < 0 ) index = 0;
	if ( index > 88 ) index = 88;
	step = stepsizeTable[index];

        if ( bufferstep ) {
            //TXBUF1=0;
	    outputbuffer = (delta << 4) & 0xf0;
	} else {
	    outputbuffer |= (delta & 0x0f) ;

            //缓冲区为空时写入下一个值
            while (!(IFG2 & UTXIFG1)); // USART0 TX buffer ready?
  	     TXBUF1 = outputbuffer & 0xff;

	}
	bufferstep = !bufferstep;

        // Clear CPUOFF bit from 0(SR)
       _BIC_SR_IRQ(CPUOFF);
}

void Init_UTR(void)//设串口一控制寄存
{
  //串口baud rate:?
  //当采样,转换,压缩完成后,往串口发送缓冲区中发送一个值;当缓冲区满时,产生一个中断,发送
  //数据发完,中断标志清0
  //必须保证采样的速度小于发送的速度,不然当标志没有清0的时候,中断中写了while语句,会等待

 //允许软件复位
  UCTL1 |= SWRST;

  P3SEL |= 0xC0;

  //串口发送和接收使能
  ME2 |= UTXE1 + URXE1;

  //停止位1位
  UCTL1 &= ~SPB;

  //奇偶校验位无
  UCTL1 &= ~PENA;

  //数据位长度:8位
  UCTL1 |= CHAR;

  //串口发送时钟源选择:ACLK=32,768 Hz
 // UTCTL1 |= SSEL1 ;
  //MODIFIED
    //串口发送时钟源选择:SMCLK=7.3728MHz, 则N=7.3728MHz/115200=64
    UTCTL1 |= 0x30 ;


  //波特率=115200,N=7.3728MHz/115200=64
  UBR01 = 0x40;
   //UBR01 = 0xC0;//38400
  UBR11 = 0x00;
  UMCTL1 = 0x00;


  //不允许软件复位
  UCTL1 &= ~SWRST;

  //接收中断使能
  IE2 |= URXIE1;
  TXBUF1 = 0;//modified by daniel
}

⌨️ 快捷键说明

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