#include <msp430x14x.h>
//定义全局变量
//模拟采集变量
int nADC_Flag;
int nADC_Count;
//串口发送变量
int nSend_TX1;
static int nTX1_Len;
static int nTX1_Flag;
//模拟采集缓冲区
int ADC_BUF_Temp0[10];
int ADC_BUF0[10];
//发送缓冲区
char UART1_TX_BUF[50];
//子程序声明
void Init_CLK(void);
void Init_ADC(void);
void Init_TimerA(void);
void Init_UART1(void);
void main(void)
{ int i;
WDTCTL = WDTPW + WDTHOLD; // 停止WDT
P1DIR |= 0x01;
P1OUT |= 0x0f; //LED设置
_DINT(); //关闭中断
//初始化
Init_CLK();
Init_ADC();
Init_TimerA();
//初始化变量
nADC_Flag=0;
nADC_Count=0;
nSend_TX1=0;
nTX1_Len=0;
nTX1_Flag=0;
_EINT(); //打开中断
//开始循环
for(;;)
{
//处理模拟量采集并发送
if(nADC_Flag==1)
{
nADC_Flag=0;
while(1) //等待缓冲区里的数据发送完毕
{
if(nTX1_Flag==1) break;
}
//将数据由字转换成字节
for(i=0;i <10;i++)
{
UART1_TX_BUF[2*i]=(char)(ADC_BUF_Temp0[i]&0x00ff);
UART1_TX_BUF[2*i+1]=(char)((ADC_BUF_Temp0[i]> > 8)&0x00ff);
}
//设置帧结束标记
UART1_TX_BUF[20]=0xaa;
UART1_TX_BUF[21]=0xaa;
nTX1_Len=22; //发送数据的长度
IFG2|=UTXIFG1; //设置中断标志
}
}
}
//时钟初始化
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 &= ~XT2OFF; //启动XT2,
do
{ IFG1 &= ~OFIFG; //清OSCFault标志
for(i=0xFF;i> 0;i--); //延时等待
}
while((IFG1 & OFIFG) != 0); //查OSCFault,为0时转换完成
BCSCTL2 |= SELS; //SMCLK为XT2
return;
}
//ADC12初始化
void Init_ADC(void)
{
//ADC12设置**************************
P6SEL |= 0x01; //使用A/D通道 A0
ADC12CTL0 &= ~ENC ; //转换允许(上升沿)
ADC12CTL0 = ADC12ON+MSC+SHT0_2 ; //开ADC12内核,设SHT0=2 (N=4)
ADC12CTL1 = SHP+CONSEQ_2 ; //SAMPCON信号选为采样定时器输出,单口连发
//ADC12内部参考电压设置
ADC12CTL0 |= REF2_5V; //选用内部参考电压为2.5V
ADC12CTL0 |= REFON; //内部参考电压打开
ADC12MCTL0 |= SREF_1+INCH_0; //R+=2.5V R-=VSS,A0输入
ADC12CTL1 = ADC12SSEL_1; //SMCLK
ADC12CTL1 = ADC12DIV_0; //时钟分频为1
//转换允许
ADC12IE =0x01; //使能中断ADC12IFG A0
return;
}
//定时器TimerA初始化
void Init_TimerA(void)
{
TACTL=TASSEL1+TACLR; //选择SMCLK,清除TAR
TACTL+=ID1;
TACTL+=ID0; //1/8SMCLK
CCTL0=CCIE; //CCR0 中断允许
CCR0=4000; //时间间隔为250Hz
//CCR0=0x01; //连续计数方式
//TACTL|=MC1;
TACTL|=MC0; //增计数模式
return;
}
//定时器中断,完成ADC转换
interrupt [TIMERA0_VECTOR] void TimerA_ISR(void)
{
int i;
ADC12CTL0 &=~ENC; //关闭转换
ADC_BUF0[nADC_Count]=ADC12MEM0; //读出转换结果
nADC_Count +=1;
if(nADC_Count==10)
{
nADC_Flag=1; //设置标志
nADC_Count=0;
//将数据倒向数据缓冲区
for(i=0;i <10;i++)
ADC_BUF_Temp0[i]=ADC_BUF0[i];
}
ADC12CTL0 |=ENC+ADC12SC; //开启转换
}
//UART1初始化
void Init_UART1(void)
{
U1CTL=0x00; //将寄存器的内容清零
UCTL0=CHAR; // 数据位为8bit
U1TCTL=0x00; //将寄存器的内容清零
U1TCTL+=SSEL1; //波特率发生器选择SMCLK
UBR0_1=0x45; //波特率为115200
UBR1_1=0x00;
UMCTL_1=0x00;
ME2|=UTXE1 + URXE1; // Enable Tx1,Rx1
IE1|=URXIE1; // RX使能
IE1|=UTXIE1; // TX使能
P3SEL |= 0xc0; // 将P3.6,7使用外围模块 = USART1 TXD/RXD
P3DIR |= 0x40; // 将P3.6设为输出(发),P3.7默认为输入(收)
return;
}
//处理来自串口1的发送中断
interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void)
{
if(nTX1_Len !=0)
{
nTX1_Flag=0; //表示缓冲区里的数据没有发送完
TXBUF1=UART1_TX_BUF[nSend_TX1];
nSend_TX1 +=1;
if(nSend_TX1> =nTX1_Len)
{
nSend_TX1=0;
nTX1_Len=0;
nTX1_Flag=1;
}
}
}