www.pudn.com > main.rar > main.cpp


#include   
 
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 
}