⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usart.c

📁 430做的一种门控系统的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************** 
文件名称: USART.c 
作 者: ADVANCE-007
版 本: V1.0
说 明: 关于串口的最底层函数,供上层调用 , 晶体:4MHZ
修改记录: 
***********************************************************/ 

/***************************************************************
 **********              预定义说明区       ********************
 ***************************************************************/
#include <msp430x14x.h>
#include "USART.H"
#include "DATATYPE.H"
#include "GPIO.h"
#include "Delay.h"

/***************************************************************
 **********          常,变量定义区 *        *********************
 ***************************************************************/
                               //Note:It must be 1. COM1 & COM2
uchar g_bRxdPos=0;//接收定位计数器
uchar g_bRxdLen=0;//等待接收字节数
uchar g_aRecvBuf[RecDataLen];//接收数据缓冲区

const uchar Tab_Char[11]={'0','1','2','3','4','5','6','7','8','9','.'}; 
/***************************************************************
 **********              函数说明           ********************
 ***************************************************************/

/**************************************************************
 **********          函数 定义区 *        *********************
 ***************************************************************/
/*  com 的初始工作           *****************************************************
 *  comnum:输入:COM1       :初始化com1 port.
 *         输入:COM2       :初始化com2 port.
 *  bps:   输入:BPSASK      只返回现有bps 
 *              BPS4800     设置BPS:4800
 *              BPS9600     设置BPS:9600
 *              BPS19200            19200
 *              BPS28800            28800
 *              BPS57600            57600
 *              BPS115200           115200
 *              其他数值    只返回现有bps 
 *  返回:返回现有bps,值范围:BPSASK,BPS4800,BPS9600,BPS19200,BPS28800,BPS57600,115200 ****/
void InitCom(uint8 comnum, uint8 bps) //注意: 晶体:4MHZ
{
  //static uchar oldbps1=BPSASK;		
  //static uchar oldbps2=BPSASK;		
  
  if(comnum==COM1){
    switch(bps){
      case BPS4800:            
        UBR10=0x03;
        UBR00=0x41;
        UMCTL0=0x2a;
        break;
        
      case BPS9600:
        UBR10=0x01;
        UBR00=0xa0;
        UMCTL0=0xab;
        break;
      case BPS19200:
        UBR10=0x00;
        UBR00=0xd0;
        UMCTL0=0x2a;
        break;
      case BPS28800:
        UBR10=0x00;
        UBR00=0x8a;
        UMCTL0=0xbf;
        break;
      case BPS57600:
        UBR10=0x00;
        UBR00=0x45;
        UMCTL0=0xaa;
        break;
      case BPS115200:
	UBR10=0x00;
        UBR00=0x22;
        UMCTL0=0xbb;
        break;
      default:break;
        //return oldbps1;      
    }
    //oldbps1=bps;	
    	
//*********    COM1设置,   20070308  ADVANCE    
UCTL0 = CHAR;   // 设串口控制寄存器,数据位为8bit

    UTCTL0 = SSEL1;  //设串口发送控制寄存器的所用时钟,UCLK = SMCLK

  // START COM1
    ME1 |= URXE0 + UTXE0;   //使能UART1的RXD和TXD
    IE1 |= URXIE0 + UTXIE0; //使能UART1的RX和TX中断

    P3SEL |= BIT5 + BIT4;   //设置P3.5为URXD1,P3.4为UTXD1
    P3DIR |= BIT4;	      //P3.4为UTXD1,输出管脚 

    //return oldbps1;      
  }
  else if(comnum==COM2){
    switch(bps){
      case BPS4800:            //注意: 晶体:11.0592MHZ
        UBR11=0x03;
        UBR01=0x41;
        UMCTL1=0x2a;
        break;
      case BPS9600:
        UBR11=0x01;
        UBR01=0xa0;
        UMCTL1=0xab;
        break;
      case BPS19200:
        UBR11=0x00;
        UBR01=0xd0;
        UMCTL1=0x2a;
        break;
      case BPS28800:
        UBR11=0x00;
        UBR01=0x8a;
        UMCTL1=0xbf;
        break;
      case BPS57600:
        UBR11=0x00;
        UBR01=0x45;
        UMCTL1=0xaa;
        break;
      case BPS115200:
	UBR11=0x00;
        UBR01=0x22;
        UMCTL1=0xbb;
        break;
      default:break;
        //return oldbps2;      
    }
    //oldbps2=bps;				

 //*********    COM2设置,与COM1 完全相同  20070308  ADVANCE
    //UCTL1 = 0X00;	//将寄存器的内容清零
    UCTL1 = CHAR;   // 设串口控制寄存器,数据位为8bit

    //UTCTL1 = 0X00;	  //将串口发送控制寄存器的内容清零
    UTCTL1 = SSEL1;  //设串口发送控制寄存器的所用时钟,UCLK = SMCLK


  // START COM2
    ME2 |= URXE1 + UTXE1;   //使能UART1的RXD和TXD
    IE2 |= URXIE1;// + UTXIE1; //使能UART1的RX和TX中断

    P3SEL |= BIT7 + BIT6;   //设置P3.7为URXD1,P3.6为UTXD1
    P3DIR |= BIT6;	      //P3.6为UTXD1,输出管脚

    //return oldbps2;      
  }
  //else 
    //return BPSASK;
}

/**************************************************/


void UartRxd0_Int_test(void)
{
    TXBUF0 = ~RXBUF0;
    IE1 |= UTXIE0;
}
//串口中断服务子程序  COM1 Port
// 处理来自串口 0 的接收中断
uchar COM1_R_flag=0;
interrupt [UART0RX_VECTOR] void usart0_rx(void)
{

        g_aRecvBuf[g_bRxdPos++]=RXBUF0;
        if(g_bRxdPos>=RecDataLen)
        {
          g_bRxdPos=0;
          COM1_R_flag=1;
        }
   /*
  unsigned char xdata * data t;
    t=inRxBuf;  t++;
     if(t==RxBuf+LenRxBuf) 
        t=RxBuf;
     if(t==outRxBuf) 			//RxBuf Full
	return;
     *inRxBuf=SBUF;
     inRxBuf=t;
   */
}

//串口中断服务子程序  COM2 Port. Addr: 0x4b
// 处理来自串口 0 的发送中断
interrupt [UART0TX_VECTOR] void usart0_tx(void)
{

/*
  unsigned char xdata * data t;
    if(inTxBuf==outTxBuf)                //TxBuf Empty 
    {	
	TIflag=1;
	return;
    }
    SBUF=*outTxBuf; 
    outTxBuf++;
    if(outTxBuf==TxBuf+LenTxBuf) 
      outTxBuf=TxBuf;	
*/
}

// 处理来自串口 1 的接收中断
uchar COM2_R_flag = 0;
uchar Lead_flag = 0;
uchar Begin_flag = 0;//开始接收数据帧的标志;//曹修改
interrupt [UART1RX_VECTOR] void usart1_rx(void)
{
        /*g_aRecvBuf[g_bRxdPos++] = RXBUF1;
        if(g_bRxdPos>=RecDataLen)
        {
            g_bRxdPos = 0;
            COM2_R_flag = 1;
        }*/
////////////////////////////////////由此向下为曹跃东试验用代码////////////////////////////////////////////////////
       if(RXBUF1 == 0xF0)
       {
           Lead_flag++;
       }
       if((RXBUF1 != 0xF0)&&(Lead_flag > 3))
       {
           //if((RXBUF1 == 0xAA)|(RXBUF1 == 0x55))
           //{
               //g_aRecvBuf[g_bRxdPos++] = RXBUF1;
               
               Begin_flag = 1;
           //}
           //Lead_Flag = 0;Lead_flag-1)+
                      
       }
       if(Begin_flag)
       {
           g_aRecvBuf[g_bRxdPos++] = RXBUF1;
       
           if(g_bRxdPos >= (g_aRecvBuf[4]+6))
           {
                g_bRxdPos = 0;
                COM2_R_flag = 1;  
                Lead_flag = 0;   
                Begin_flag = 0;       
           }
        }
//////////////////////////////////////////////由此向上为曹跃东试验用代码///////////////////////////////////////////
/*
  unsigned char xdata * data t;
    t=inRxBuf;  t++;
     if(t==RxBuf+LenRxBuf) 
        t=RxBuf;
     if(t==outRxBuf) 			//RxBuf Full
	return;
     *inRxBuf=SBUF;
     inRxBuf=t;
*/
}
///////////////////////////////////////
// 处理来自串口 1 的发送中断
interrupt [UART1TX_VECTOR] void usart1_tx(void)
{

/*  unsigned char xdata * data t;
    if(inTxBuf==outTxBuf)                //TxBuf Empty 
    {	
	TIflag=1;
	return;
    }
    SBUF=*outTxBuf; 
    outTxBuf++;
    if(outTxBuf==TxBuf+LenTxBuf) 
      outTxBuf=TxBuf;	
*/
}
///////////////////////////////////////
/*****************************************************************************
接收字节函数。采用查询方式。
 *  comnum:输入:COM1       :初始化com1 port.
 *         输入:COM2       :初始化com2 port.
******************************************************************************/
uchar RecUartByte(uint8 comnum) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -