#include <msp430x42x.h>
#define TXBUF_SIZE 32 /*一帧最多能发送的数据字节数*/
unsigned char TX_BUFF[TXBUF_SIZE]; /*发送缓冲区*/
unsigned char TX_NUM; /*发送字节总数变量*/
unsigned char TX_CNT; /*发送字节计数变量*/
/*****************************************************************
* 名 称:UART0_ PutFrame ()
* 功 能:从串口发送1帧数据
* 入口参数:Ptr:待发送数组的首地址(数组名)
* Lenth:数据帧长度
* 出口参数:返回1表示发送成功,
返回0表示发送失败。
* 说 明: 发送过程中,不阻塞CPU运行
*****************************************************************/
char UART0_PutFrame(unsigned char * Ptr, unsigned int Lenth)
{
int i;
if(IE1 & UTXIE0) return(0); //如果上一帧没发送完,返回0
if(Lenth>TXBUF_SIZE) return(0); //长度超过最大缓冲区,返回0
for(i=0;i<Lenth;i++)
{
TX_BUFF[i]=Ptr[i]; // 待发送数据装入发送缓冲区
}
TX_CNT=0; // 发送字节计数清零
TX_NUM=Lenth; // 发送字节总数
IFG1|=UTXIFG0; // 人为制造第一次发生中断
IE1 |= UTXIE0; // 允许UART0的发送中断
return (1); // 返回发送成功
}
#pragma vector=UART0TX_VECTOR
__interrupt void UART_TX (void) //串口发送中断
{
U0TXBUF=TX_BUFF[TX_CNT]; //将本次应该发送的数据送入TXBUF
TX_CNT++; //下一次依次发送后续字节
if(TX_CNT >=TX_NUM) //发送字节计数值到达发送总数
{
IE1 &=~ UTXIE0; // 禁止UART0的发送中断,停止发送
}
}
void main( void )
{
unsigned char TxTestBuff[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
U0CTL = CHAR; // 异步通讯模式,8位数据,无校验,1位停止位。
ME1 |= UTXE0 + URXE0; // 开启串口0收发模块
U0TCTL |= SSEL0; // 选择ACLK作为串口波特率时钟源。
U0BR1 = 0; //
U0BR0 = 13; // 分频系数整数部分=13
U0MCTL = 0x6B; // 分频系数小数部分调制=5/8。(2400bps)
P2SEL |= BIT4 + BIT5; // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
_EINT(); // 总中断允许
while(1)
{
UART0_PutFrame(TxTestBuff,8); //发送一个数据帧
__delay_cycles(1000000); //约一秒发送一次
}
}