|
想写一个程序,采用的芯片是MSP430f5438a,想利用ADC12采集12路数据,并通过串口发送到串口助手上,下面的程序不知道应该要怎么改
#include
#define U8 unsigned char
U8 RX_DATA = 0;
U8 TX_DATA[77] = {0};
U8 EN_ADC12 = 0;
U8 SPI_RX_DATA = 0;
U8 uart1_RX_DATA[24] = {0};
U8 uart1_RX_DATA_count = 0;
U8 TX_DATA_TEMP[48] = {0};
U8 TX_DATA_TEMP_count = 0;
void clk_init()
{
P5SEL |= BIT4 + BIT5;
UCSCTL6 &= ~(XT1OFF); //使能XT1
UCSCTL6 |= XCAP_3; //选择内部负载电容12pF
UCSCTL0 = 0x0000; //将DCOx和MODx设为最低
UCSCTL6 &= ~(XT1DRIVE_3); //减少XT1驱动能力,降低功耗
UCSCTL3 = SELREF_0 + FLLREFDIV_1; //FLL模块参考时钟源选择XT1CLK
//参考时钟分频器
//测试晶振是否产生故障失效,并清除故障失效标志位
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1&OFIFG);
__bis_SR_register(SCG0); //禁止FLL
UCSCTL1 = DCORSEL_3; //选择DCO频率范围
UCSCTL2 = 249; //设置DCO频率为8MHz
//计算公式:(249 + 1) * 32768 = 8MHz
__bic_SR_register(SCG0); //启用FLL
UCSCTL4 |= SELS_0; //SMCLK时钟来源XT1晶振
__delay_cycles(250000);
}
void adc_init()
{
P6SEL = 0x01;
ADC12CTL0 = ADC12ON + ADC12SHT0_12+ADC12MSC; //打开ADC,设置采样时间
ADC12CTL1 = ADC12SHP+ADC12CONSEQ_1+ADC12DIV_0+ADC12SSEL_3; //序列通道单次
ADC12MCTL0 |= ADC12INCH_1;
ADC12IE = 0x01; //使能ADC12IFG.0中断
ADC12CTL0 |= ADC12ENC; //使能转换
ADC12CTL0 |= ADC12SC; //开始采样转换
}
void uart1()
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P3SEL = BIT3 + BIT4;
//UCA0CTL1 |= UCSWRST;
UCA0CTL1 |= UCSSEL_2; // SMCLK 为系统时钟 1048576HZ
UCA0BR0 = 9; //波特率115200
UCA0BR1 = 0;
UCA0MCTL |= UCBRS_1 + UCBRF_0;
UCA0CTL1 &= ~UCSWRST;
UCA0IE |= UCRXIE; //使能接受中断
}
void main( void )
{
clk_init(); //系统时钟初始化
adc_init();
uart1();
_EINT();//开全局中断
TX_DATA[0] = 0xFF;
TX_DATA[1] = 0xFF;
TX_DATA[2] = 0xFF;
TX_DATA[75] = 0x0A;
TX_DATA[76] = 0x0D;
LPM3;
while(1)
{
for(U8 i = 0;i < 48; i++)
{
while (!(UCA1IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA1TXBUF = TX_DATA[i]; // TX -> RXed character
}
LPM3;
}
}
/***********************************************************
中断函数
***********************************************************/
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
switch(__even_in_range(ADC12IV,36))
//switch(ADC12IV)
{
// case 0: break; // Vector 0: No interrupt
// case 2: break; // Vector 2: ADC overflow
// case 4: break; // Vector 4: ADC timing overflow
// case 6: break; // Vector 6: ADC12IFG0
// case 8: break; // Vector 8: ADC12IFG1
// case 10: break; // Vector 10: ADC12IFG2
// case 12: break; // Vector 12: ADC12IFG3
case 0x24:
TX_DATA[0] = ADC12MEM15 >> 8;
TX_DATA[1] = ADC12MEM15 & 0xFF;
TX_DATA[2] = ADC12MEM14 >> 8;
TX_DATA[3] = ADC12MEM14 & 0xFF;
TX_DATA[4] = ADC12MEM13 >> 8;
TX_DATA[5] = ADC12MEM13 & 0xFF;
TX_DATA[6] = ADC12MEM12 >> 8;
TX_DATA[7] = ADC12MEM12 & 0xFF;
TX_DATA[8] = ADC12MEM7 >> 8;
TX_DATA[9] = ADC12MEM7 & 0xFF;
TX_DATA[10] = ADC12MEM6 >> 8;
TX_DATA[11] = ADC12MEM6 & 0xFF;
TX_DATA[12] = ADC12MEM5 >> 8;
TX_DATA[13] = ADC12MEM5 & 0xFF;
TX_DATA[14] = ADC12MEM4 >> 8;
TX_DATA[15] = ADC12MEM4 & 0xFF;
TX_DATA[16] = ADC12MEM3 >> 8;
TX_DATA[17] = ADC12MEM3 & 0xFF;
TX_DATA[18] = ADC12MEM2 >> 8;
TX_DATA[19] = ADC12MEM2 & 0xFF;
TX_DATA[20] = ADC12MEM1 >> 8;
TX_DATA[21] = ADC12MEM1 & 0xFF;
TX_DATA[22] = ADC12MEM0 >> 8;
TX_DATA[23] = ADC12MEM0 & 0xFF;
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = 0x55; // TX -> RXed character
//uart1_RX_DATA_count = 0;
break;
default: break;
}
}
|
|