msp430串口1收发程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <msp430x14x.h>
char UART1_TX_BUF[60];//串口1的发送缓冲区
char UART1_RX_BUF[60];//串口1的接收缓冲区
int nTX1_len;
char nRX1_len;
char nRX1_Len_temp; //临时文件
char nTX1_Flag;
nRX1_len=0;
}
#pragma vector = UART1TX_VECTOR
__interrupt void UART1_TXISR(void)
{Baidu Nhomakorabea
if(nTX1_len != 0)
{
nTX1_Flag = 0;//表示缓冲区里的数据没有发送完
TXBUF1 = UART1_RX_BUF[nSend_TX1];
nSend_TX1 += 1;
if(nSend_TX1 >= nTX1_len)
{
nSend_TX1 = 0;
nTX1_len = 0;
nTX1_Flag = 1;//缓冲区里没有数据要发送了
}
nTX1_len=0;
}
}
UBR0_1 = 0x03;
UBR1_1 = 0x00;
UMCTL_1 = 0x4A;//使用32khz晶振时,波特率为9600
ME2 |= UTXE1 + URXE1; //使能UART1的TXD和RXD
IE2 |= URXIE1;//使能UART1的RX中断
IE2 |= UTXIE1;//使能UART1的TX中断
//将所有的管脚设置为一般I/O口
P3SEL = 0;
return;
}
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 = 0x00; //将寄存器的内容清零//XT2震荡器开启//LFTX1工作在低频模式//ACLK的分频因子为1
//xts=0
do
{
IFG1 &= ~OFIFG; //清除OSCFault标志
P3SEL |= BIT6;//设置P3.6为UART1的TXD
P3SEL |= BIT7;//设置P3.7为UART1的RXD
P3DIR |= BIT6; //P3.6为输出管脚
return;
}
void Init_Port(void)
{
//将所有的管脚在初始化的时候设置为输入方式
P3DIR = 0;
nRX1_len=nRX1_Len_temp;
for(i = 0;i < nRX1_len;i++)
UART1_RX_Temp[i] = UART1_RX_BUF[i];//将接收到的数据拷贝到临时缓冲区。
nTX1_len= nRX1_len+1;
IFG2 |= UTXIFG1; //设置中断标志,进入发送中断程序
BCSCTL2 += SELS;//SMCLK的时钟源为TX2CLK,分频因子为1//00001000
}
///////////////////////////////////////
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
_DINT();//关闭中断
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); //如果OSCFault =1 //OFIFG振荡器错误
BCSCTL2 = 0x00;//将寄存器的内容清零
BCSCTL2 += SELM1;//MCLK的时钟源为TX2CLK,分频因子为1//10,000000
//初始化时钟
Init_CLK();
//初始化端口
Init_Port();
//初始化串口1
Init_UART1();
//打开中断
_EINT();
while(1);
}
#pragma vector = UART1RX_VECTOR
__interrupt void UART1_RXISR(void)
{
UART1_RX_BUF[nRX1_Len_temp]=RXBUF1;//将数据读入寄存器。
int nSend_TX1;
char UART1_RX_Temp[60];
int i;
void Init_UART1(void)
{
U1CTL =0x00; //将寄存器的内容清零
U1CTL &=~SWRST; //SWRDT复位,uart允许
U1CTL += CHAR;//数据位为8bit
U1TCTL |=SSEL0;//波特率发生器选择ACLK
char UART1_TX_BUF[60];//串口1的发送缓冲区
char UART1_RX_BUF[60];//串口1的接收缓冲区
int nTX1_len;
char nRX1_len;
char nRX1_Len_temp; //临时文件
char nTX1_Flag;
nRX1_len=0;
}
#pragma vector = UART1TX_VECTOR
__interrupt void UART1_TXISR(void)
{Baidu Nhomakorabea
if(nTX1_len != 0)
{
nTX1_Flag = 0;//表示缓冲区里的数据没有发送完
TXBUF1 = UART1_RX_BUF[nSend_TX1];
nSend_TX1 += 1;
if(nSend_TX1 >= nTX1_len)
{
nSend_TX1 = 0;
nTX1_len = 0;
nTX1_Flag = 1;//缓冲区里没有数据要发送了
}
nTX1_len=0;
}
}
UBR0_1 = 0x03;
UBR1_1 = 0x00;
UMCTL_1 = 0x4A;//使用32khz晶振时,波特率为9600
ME2 |= UTXE1 + URXE1; //使能UART1的TXD和RXD
IE2 |= URXIE1;//使能UART1的RX中断
IE2 |= UTXIE1;//使能UART1的TX中断
//将所有的管脚设置为一般I/O口
P3SEL = 0;
return;
}
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 = 0x00; //将寄存器的内容清零//XT2震荡器开启//LFTX1工作在低频模式//ACLK的分频因子为1
//xts=0
do
{
IFG1 &= ~OFIFG; //清除OSCFault标志
P3SEL |= BIT6;//设置P3.6为UART1的TXD
P3SEL |= BIT7;//设置P3.7为UART1的RXD
P3DIR |= BIT6; //P3.6为输出管脚
return;
}
void Init_Port(void)
{
//将所有的管脚在初始化的时候设置为输入方式
P3DIR = 0;
nRX1_len=nRX1_Len_temp;
for(i = 0;i < nRX1_len;i++)
UART1_RX_Temp[i] = UART1_RX_BUF[i];//将接收到的数据拷贝到临时缓冲区。
nTX1_len= nRX1_len+1;
IFG2 |= UTXIFG1; //设置中断标志,进入发送中断程序
BCSCTL2 += SELS;//SMCLK的时钟源为TX2CLK,分频因子为1//00001000
}
///////////////////////////////////////
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
_DINT();//关闭中断
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); //如果OSCFault =1 //OFIFG振荡器错误
BCSCTL2 = 0x00;//将寄存器的内容清零
BCSCTL2 += SELM1;//MCLK的时钟源为TX2CLK,分频因子为1//10,000000
//初始化时钟
Init_CLK();
//初始化端口
Init_Port();
//初始化串口1
Init_UART1();
//打开中断
_EINT();
while(1);
}
#pragma vector = UART1RX_VECTOR
__interrupt void UART1_RXISR(void)
{
UART1_RX_BUF[nRX1_Len_temp]=RXBUF1;//将数据读入寄存器。
int nSend_TX1;
char UART1_RX_Temp[60];
int i;
void Init_UART1(void)
{
U1CTL =0x00; //将寄存器的内容清零
U1CTL &=~SWRST; //SWRDT复位,uart允许
U1CTL += CHAR;//数据位为8bit
U1TCTL |=SSEL0;//波特率发生器选择ACLK