www.pudn.com > main.rar > main.cpp
#includevoid 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 }