unsigned char BUF; //全局变量,存放据
//---------------------------------------------------------------------
//关于sign定义
unsigned char sign; //标记寄存器,最大8位标记
#define update sign |= BIT0 //sign位0:置1时,表示有数据更新.
#define check_update sign & BIT0
main( void )
{
WDTCTL =WDTPW+WDTHOLD; //关看门狗
BCSCTL1 =CALBC1_1MHZ; //设定DCO为1MHZ,
//[0x10FF] TX2振荡器开,高频模式,设定DCO为1MHZ
DCOCTL =CALBC1_1MHZ;
volatile unsigned int n;
do //等待晶振稳定
{
IFG1 &=~OFIFG;
for(n=5000;n>0;n--);
} while(OFIFG&IFG1);
P1DIR |=BIT1+BIT2+BIT3; //LED--D1,D2,D3
P1OUT &= ~BIT1; //P11 输出0,D1 LED亮
P3SEL |= BIT4+BIT5; //p3.4为TX,P3.5为RX
P3DIR |= BIT4; //P3.4为输出方向(TXD口)
UCA0CTL1 |=UCSSEL0; //[0x40]时钟源选择ACLK=32768晶振
UCA0BR1=0; //设置波特率32768/1200=27.3
UCA0BR0=27;
UCA0MCTL |=UCBRS1; //调整寄存器设置UCBRSx=INT(0.3*8)=2
UCA0CTL1 &=~UCSWRST; //串口状态机设置完毕,退出USCI设置
IE2 |=UCA0RXIE+UCA0TXIE; //允许收发中断
_EINT();
LPM3; //进入低功耗3并使能总中断
//或写成 _BIS_SR(LPM3_bits+GIE);
_NOP();
for(;;)
{ _DINT(); //关闭总中断
_BIS_SR(LPM3_bits+GIE);
}
}
//****************************************************************************
//USCI中断用法
//USCI_AX和USCI_BX使用同一个中断向量。接收中断标志UCAxRXIFG和UCBxRXIFG和同
//一个中断向量连接,发送中断标志UCAxTXIFG和UCBxTXIFG分享另一个中断向量。
//****************************************************************************
//接收中断服务程序
#pragma vector =USCIAB0RX_VECTOR
__interrupt void rx_isr(void)
{
BUF = UCA0RXBUF; //接收一个数据后,存入一个全局变量中
P1OUT ^= BIT2; //用D2 LED指示接收到一个数据
update;
LPM3_EXIT; //接收完一个数据后,退出低功耗模式
}
//****************************************************************************
//大家注意,MSP430F2上电后UCA0的中断标志寄存器IFG2 中UCA0TXIFG发送中断标志位就置1.
//在初始化时,只要总中断允许了,同时发送中断也允许了.初始化完后,发送中断服务程序就
//被马上执行.
//当UCA0TXBUF空闲时,中断标志寄存器IFG2 中UCA0TXIFG发送中断标志位就置1.
//发送中断服务程序
#pragma vector =USCIAB0TX_VECTOR
__interrupt void tx_isr(void)
{
if(check_update) //是否有数据更新
{ UCA0TXBUF = BUF; //是,将接收到的数据发回去
sign &= ~BIT0; //清除标志
P1OUT ^= BIT3; //用D3 LED指示发送完一个数据
}
}
//****************************************************************************
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
应该差别不大,没详细对比过。
一周热门 更多>