#include <msp430x14x.h>
// 系统时钟初始化,外部8M晶振
void Clock_Init()
{
uchar i;
BCSCTL1&=~XT2OFF; //打开XT2振荡器
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
do{
IFG1&=~OFIFG; //清楚振荡器错误标志
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待
IFG1&=~OFIFG;
}
//*************************************************************************
// MSP430串口初始化
//*************************************************************************
void UART_Init()
{
P5DIR |= BIT2; //P52口为RS485控制口,输出模式
P5OUT &= ~BIT2 ; //置低P52 RS485接收状态
P3SEL|= BIT6 + BIT7; //设置IO口为第二功能模式,启用UART功能
U1CTL|=SWRST + CHAR; //复位SWRST,8位数据模式
U1TCTL|=SSEL1; //SMCLK为串口时钟
U1BR1=0x00;
U1BR0=0x03;
U1MCTL=0x4A; //波特率9600bps
ME2|=UTXE1; //UART1发送使能
ME2|=URXE1; //UART1接收使能
U1CTL&=~SWRST;
IE2|=URXIE1; //打开接收中断
}
//*************************************************************************
// 主函数
//*************************************************************************
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
Clock_Init(); //系统时钟设置
UART_Init(); //串口设置初始化
for (;;)
{
_BIS_SR(LPM3_bits + GIE); // 进入 LPM3 模式/允许总中断
while (!(IFG2 & UTXIFG1)); // USART0 发送缓冲器是否准备?
P5OUT |= BIT2 ; // 使发送
U1TXBUF = U1RXBUF; // 从接收缓冲器写入发送缓冲器
delay_ms(5);
P5OUT &= ~BIT2 ; // 使接收
}
}
// UART1 接收中断将从 LPM3 模式退出
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_rx (void)
{
_BIC_SR_IRQ(LPM3_bits); // 退出 LPM3
} |