www.pudn.com > GPS.rar > UART.c


#include  
#include "uart.h" 
 
//定义串口操作变量 
// 串口 1 的接收标志 
char nRev_UART1;			 
// 串口 1 的发送缓冲区 
char UART1_TX_BUF[80];	 
// 串口 1 的接收缓冲区	 
char UART1_RX_BUF[80];	 
int nSend_TX1; 
int nTX1_Len; 
char nRX1_Len; 
char nRX1_Len_temp; 
char nTX1_Flag; 
int nRes_UART1; 
 
void Init_UART1(void) 
{ 
    //将寄存器的内容清零 
    U1CTL = 0X00;	 
    //数据位为8bit 
    U1CTL += CHAR;			 
     
    //将寄存器的内容清零 
    U1TCTL = 0X00;	 
    //波特率发生器选择SMCLK 
    U1TCTL += SSEL1;			 
     
    //波特率为9600 
    UBR0_1 = 0X41;			 
    UBR1_1 = 0X03; 
    //调整寄存器 
    UMCTL_1 = 0X00;			 
 
    //使能UART1的TXD和RXD 
    ME2 |= UTXE1 + URXE1;  
    //使能UART1的RX中断 
    IE2 |= URXIE1;	 
    //使能UART1的TX中断 
    IE2 |= UTXIE1;			 
     
    //设置P3.6为UART1的TXD 
    P3SEL |= BIT6;	 
    //设置P3.7为UART1的RXD 
    P3SEL |= BIT7;			 
     
    //P3.6为输出管脚 
    P3DIR |= BIT6;			 
    return; 
} 
void Init_Port(void) 
{ 
    //将所有的管脚在初始化的时候设置为输入方式 
    P3DIR = 0; 
 
    //将所有的管脚设置为一般I/O口 
    P3SEL = 0; 
    return; 
} 
void Init_CLK(void) 
{ 
    unsigned int i; 
    //将寄存器的内容清零 
    //XT2震荡器开启 
    //LFTX1工作在低频模式 
    //ACLK的分频因子为1 
    BCSCTL1 = 0X00;	 
					 
    do  
    { 
	IFG1 &= ~OFIFG;                       // 清除OSCFault标志 
	for (i = 0x20; i > 0; i--);                 
    } 
    while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1    
					 
    BCSCTL2 = 0X00;			//将寄存器的内容清零 
    BCSCTL2 += SELM1;		//MCLK的时钟源为TX2CLK,分频因子为1 
    BCSCTL2 += SELS;		//SMCLK的时钟源为TX2CLK,分频因子为1 
} 
/////////////////////////////////////// 
// 处理来自串口 1 的接收中断 
#pragma vector=UART1RX_VECTOR 
__interrupt void UART1_RX_ISR(void) 
{ 
    //接收来自的数据 
    UART1_RX_BUF[nRX1_Len_temp] = RXBUF1;	 
     
    nRX1_Len_temp += 1; 
         
    if(UART1_RX_BUF[nRX1_Len_temp - 1] == '*') 
    { 
    	nRX1_Len = nRX1_Len_temp; 
    	nRev_UART1 = 1; 
    	nRX1_Len_temp = 0; 
    } 
} 
 
/////////////////////////////////////// 
// 处理来自串口 1 的发送中断 
#pragma vector=UART1TX_VECTOR 
__interrupt void UART1_TX_ISR(void) 
{ 
    if(nTX1_Len != 0) 
    { 
        // 表示缓冲区里的数据没有发送完 
    	nTX1_Flag = 0;			 
    	 
    	TXBUF1 = UART1_TX_BUF[nSend_TX1]; 
    	nSend_TX1 += 1; 
    	 
    	if(nSend_TX1 >= nTX1_Len) 
    	{ 
    	    nSend_TX1 = 0; 
    	    nTX1_Len = 0; 
    	    nTX1_Flag = 1; 
    	} 
    } 
} 
 
void delay_us(unsigned int t) 
{ 
  while(--t>0) 
  { 
    _NOP(); 
    _NOP(); 
    _NOP(); 
    _NOP(); 
  } 
} 
 
void delay_ms(unsigned int t) 
{ 
  while(t-->0) 
    delay_us(999); 
} 
 
void main(void) 
{ 
    int i;     
    char UART1_RX_Temp[80]; 
 
    // 关闭看门狗 
    WDTCTL = WDTPW + WDTHOLD;    
     
    nRev_UART1 = 0; 
    nSend_TX1 = 0; 
    // 关闭中断 
    _DINT(); 
	 
    // 初始化时钟 
    Init_CLK(); 
    // 初始化端口 
    Init_Port(); 
	// 初始化串口1 
    Init_UART1(); 
 
    // 打开中断 
    _EINT(); 
 	 
    // 进入处理循环 
    for(;;) 
    { 
    	if(nRev_UART1 == 1) 
    	{ 
             nRev_UART1 = 0; 
	    // 将接收到的数据拷贝到临时缓冲区 
	    for(i = 0;i < nRX1_Len;i++)  
            { 
		UART1_RX_Temp[i] = UART1_RX_BUF[i]; 
            } 
             
	    for(i = 0;i < nRX1_Len;i++)  
            { 
		UART1_TX_BUF[i] = UART1_RX_Temp[i]; 
            } 
    	    UART1_TX_BUF[nRX1_Len] = 'O'; 
    	    UART1_TX_BUF[nRX1_Len+1] = 'K'; 
    	    UART1_TX_BUF[nRX1_Len+2] = 13; 
    	    nTX1_Len = nRX1_Len + 3; 
	    // 设置中断标志,进入发送中断程序 
	    IFG2 |= UTXIFG1;		 
    	    nRX1_Len = 0;          
	}//if(nRev_UART1 == 1) 
    }//for(;;) 
}