/**************宏定义***********************/
#define uchar unsigned char
#define uint unsigned int
uchar Buffer_Rx[40];
uchar Buffer_TX[40]="串口程序调试"; //定义发送缓冲区
uchar Rx_long;
uchar Flag=0; //一旦我们进入中断,就改变此标志位,控制灯闪烁
/**************串口初始化,采用查询方式***********************/
/*************注意:串口初始化完成后,是处于复位状态**********************/
void Init_usart(void)
{
P3SEL|=0XC0; //串口1的I/O口选择位外围模块功能
P3DIR|=0X40; //P3.6为输出,P3.7为输入
U1TCTL=SSEL1+SSEL0; //选择SMCLK
U1CTL=SWRST+CHAR; //先将串口处于复位状态,8位数据,无校验,停止位1位
// U1RCTL|=URXEIE; //接收出错中断允许位
U1TXBUF=0x00; //先将发送缓冲区和接收缓冲区清0
// U1RXBUF=0x00;
U1BR1=0;
U1BR0=208; //波特率为38400
U1MCTL=0x89;
ME2|=UTXE1+URXE1; //允许发送和接收
IE2|=URXIE1; //接收中断使能
}
void main()
{
volatile unsigned int i=0; // volatile to prevent optimization
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P4DIR |= 0x04; // Set P4.3 当接收完成后置位
BCSCTL1&=~XT2OFF; //开启XT2
BCSCTL2|=SELM1+SELS; //选择XT2CLK为MCLK和SMCLK时钟源
do
{
IFG1&=~OFIFG; //清除振荡器失效标志
for(i=255;i>0;i--);
}while(IFG1&OFIFG);//判断XT2是否起振
Init_usart();
//SR|=GIE; //开总中断
U1CTL&=~SWRST; //关闭串口的复位
_BIS_SR(GIE); //开总中断
// _EINT();
while(Buffer_TX!='\0')
{
while((IFG2&UTXIFG1)==0);
U1TXBUF=Buffer_TX;
// UTXIFG1=0;
i++;
}
while(1)
{
if(Rx_long==8)
{
i=0;
while(Rx_long!=i)
{
while((IFG2&UTXIFG1)==0);
U1TXBUF=Buffer_TX;
i++;
}
Rx_long=0;
}
if(Flag==1)
{
P4OUT ^= 0x04; // Toggle P4.2 using exclusive-OR
i = 5000; // SW Delay
do i--;
while (i != 0);
P4OUT ^= 0x04; // Toggle P4.2 using exclusive-OR
i = 5000; // SW Delay
do i--;
while (i != 0);
}
}
}
/************串口接收中断服务子程序**********************/
#pragma vector=USART1RX_VECTOR
__interrupt void UART1RXINT(void)
{
_DINT(); //关闭全局中断
Flag=1;
if((IFG2&URXIFG1)!=0)
{
Buffer_Rx[Rx_long]=U1RXBUF;
Rx_long++;
}
_EINT(); //恢复全局中断
} |