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

📄 usart.c

📁 430做的一种门控系统的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
{
    if(comnum==COM1)//选择COM1
    {
        while ((IFG1&URXIFG0)==0);	//查询是否发送完毕
        return RXBUF0;//TXBUF0=databyte;//TXBUF0=*pBuffer;
    } 	
    if(comnum==COM2)//选择COM2
    {    
        while ((IFG2&URXIFG1)==0);	//查询是否发送完毕
	return RXBUF1;//TXBUF1=databyte;//TXBUF0=*pBuffer;
    }
    return 0;	    
}

/*****************************************************************************
发送字节函数。采用查询方式。
 *  comnum:输入:COM1       :初始化com1 port.
 *         输入:COM2       :初始化com2 port.
pBuffer:指向发送数据缓冲区的指针
databyte:发送的字节
******************************************************************************/
void SendUartByte(uint8 comnum,uint8 databyte) 
{
    if(comnum==COM1)//选择COM1
    {
        while ((IFG1&UTXIFG0)==0);	//查询是否发送完毕
        TXBUF0=databyte;//TXBUF0=*pBuffer;
    }
    	
    if(comnum==COM2)//选择COM2
    {    
        while ((IFG2&UTXIFG1)==0);	//查询是否发送完毕
	TXBUF1=databyte;//TXBUF0=*pBuffer;
    }	    
}

/*****************************************************************************
//发送字符串函数
void SendUartChar(uint8 comnum,uint8 DataChar) 
{
   SendUartByte(comnum,DataChar);
}
******************************************************************************/
/*****************************************************************************/
//发送字符串函数
void SendUartString(uint8 comnum,uint8 *datastring) 
{
      while (*datastring)  // 写显示字符
      {
        SendUartByte(comnum,*datastring);
	datastring++;
      }
}
/******************************************************************************/
void UsartNewLine( uint8 comnum, uchar n )//回车 换 N 行
{
  while(n--)
  {
      SendUartByte(comnum, 0x0d );
      SendUartByte(comnum, 0x0a );  
  }
}  
/******************************************************************************/
void Usart_N_Space(uint8 comnum, uchar n )// N 个空格
{
  while(n--)
  {
      SendUartByte(comnum, ' ' ); 
  }
}    
/*****************************************************************************
发送函数。采用查询方式。
 *  comnum:输入:COM1       :初始化com1 port.
 *         输入:COM2       :初始化com2 port.
pBuffer:指向发送数据缓冲区的指针
n_byte:发送的字节数
******************************************************************************/
void SendUart(uint8 comnum,uint8 *pBuffer,uint8 n_byte)//,uint8 n_byte
{
    unsigned char q0;
    RS485_Set(ConstManageIC, RS485_TRAN);//485设置 为发送
    if(comnum==COM1)//选择COM1
    {
        for(q0=0;q0<n_byte;q0++)//while(*pBuffer)//直到发送完毕
	{
		while ((IFG1&UTXIFG0)==0);	//查询是否发送完毕
		TXBUF0=*pBuffer;//TXBUF0=*pBuffer;
		pBuffer++;
	}
    }
    	
    if(comnum==COM2)//选择COM2
    {
        for(q0=0;q0<n_byte;q0++)//while(*pBuffer)//直到发送完毕
	{
		while ((IFG2&UTXIFG1)==0);	//查询是否发送完毕
		TXBUF1=*pBuffer;//TXBUF0=*pBuffer;
		pBuffer++;
	}
    }	
    RS485_Set(ConstManageIC, RS485_REC);//485设置 为接收
}





/*****************************************************
//取消USART的中断操作
Stop_COM(COM1,UsartRXD)  //stop COM1's  RXD
Stop_COM(COM2,UsartRXD)  //stop COM2's  RXD
*****************************************************/
void Stop_COM(uint8 comnum,uint8 UsartTXDorRXD)//stop COMX's TXD or RXD
{
    if(comnum==COM1)//选择COM1
    {
	if(UsartTXDorRXD==UsartTXD)
	{IE1 &= ~UTXIE0;} //取消UART1的TX中断
	else if(UsartTXDorRXD==UsartRXD)
	{IE1 &= ~URXIE0;} //取消UART1的RX中断
	else if(UsartTXDorRXD==UsartAll)
	{IE1 &= ~UTXIE0; IE1 &= ~URXIE0;} //取消UART1的RX和TX中断
    }
    if(comnum==COM2)//选择COM2
    {
	if(UsartTXDorRXD==UsartTXD)
	{IE2 &= ~UTXIE1;} //取消UART1的TX中断
	else if(UsartTXDorRXD==UsartRXD)
	{IE2 &= ~URXIE1;} //取消UART1的RX中断
	else if(UsartTXDorRXD==UsartAll)
	{IE2 &= ~UTXIE1; IE2 &= ~URXIE1;} //取消UART1的RX和TX中断
    }
}
/*****************************************************
//取消USART的中断操作
Start_COM(COM1,UsartRXD)  //start COM1's  RXD
Start_COM(COM2,UsartRXD)  //start COM2's  RXD
*****************************************************/
void Start_COM(uint8 comnum,uint8 UsartTXDorRXD)//start COMX's TXD or RXD
{
    if(comnum==COM1)//选择COM1
    {
	if(UsartTXDorRXD==UsartTXD)
	{IE1 |= UTXIE0;} //取消UART1的TX中断
	else if(UsartTXDorRXD==UsartRXD)
	{IE1 |= URXIE0;} //取消UART1的RX中断
	else if(UsartTXDorRXD==UsartAll)
	{IE1 |= UTXIE0; IE1 |= URXIE0;} //取消UART1的RX和TX中断
    }
    if(comnum==COM2)//选择COM2
    {
	if(UsartTXDorRXD==UsartTXD)
	{IE2 |= UTXIE1;} //取消UART1的TX中断
	else if(UsartTXDorRXD==UsartRXD)
	{IE2 |= URXIE1;} //取消UART1的RX中断
	else if(UsartTXDorRXD==UsartAll)
	{IE2 |= UTXIE1; IE2 |= URXIE1;} //取消UART1的RX和TX中断
    }
}

//HEX型转CHAR型函数
void SendUartHextoChar(uint8 comnum, uchar datt)
{
    SendUartString( comnum, "0x" );
    SendUartByte( comnum, Tab_Char[datt/16] );
    SendUartByte( comnum, Tab_Char[datt%16] );
    Usart_N_Space( comnum, 4 );//4个空格
}

//数组元素的HEX型转String型函数
void SendUartHextoString(uint8 comnum,uint8 *datastring) 
{
          while (*datastring)  // 写显示字符
      {
        SendUartHextoChar(comnum,*datastring);
	datastring++;
      }
}

//多机通信  //地址位多机通信模式
void InitCom_MutiMode( uint8 comnum, uint8 MutiMode )
{
  if(comnum==COM1)//选择COM1
  {
    if(MutiMode == MutiMode_Addr) //地址位多机协议
    {
      UCTL0 = CHAR+MM+SWRST;    	//8位数据,1位停止位,地址位多机协议
      U0RCTL |= URXWIE;		//只有地址字符使URXIFG置位
      UCTL0 &= ~SWRST;  //设置结束
    }
    if(MutiMode == MutiMode_Idle) //空闲位多机协议
    {
      UCTL0 = CHAR+SWRST;    	//8位数据,1位停止位,地址位多机协议
      UCTL0 &= ~MM;
      U0RCTL |= URXWIE;		//只有地址字符使URXIFG置位
      UCTL0 &= ~SWRST;  //设置结束
    }
  }
  
  if(comnum==COM2)//选择COM2
  {
    if(MutiMode == MutiMode_Addr) //地址位多机协议
    {
      UCTL1 = CHAR+MM+SWRST;    	//8位数据,1位停止位,地址位多机协议
      U1RCTL |= URXWIE;		//只有地址字符使URXIFG置位
      UCTL1 &= ~SWRST;  //设置结束
    }
    if(MutiMode == MutiMode_Idle) //空闲位多机协议
    {
      UCTL1 = CHAR+SWRST;    	//8位数据,1位停止位,地址位多机协议
      UCTL1 &= ~MM;
      U1RCTL |= URXWIE;		//只有地址字符使URXIFG置位
      UCTL1 &= ~SWRST;  //设置结束
    }
  }  
  
  
}

/******************************************************************
//检测引导码
uchar COM2_Lead_flag=0;
void UartTestLead(void)
{
  if(RXBUF1 == 0xf0)//如果检测到数据都是0XF0,则不做处理
  {
    //COM2_Lead_flag = 1;
    COM2_Lead_cnt++;
    if(COM2_Lead_cnt>=4)
    {
      COM2_R_Data_flag = 1;
    }
    else
    {
      COM2_R_Data_flag = 0;
    }
  }
  else
  {
    //COM2_Lead_flag = 2;
    if(COM2_R_Data_flag == 1)
    COM2_Lead_cnt=0;
  } 
}

//串口接收函数
{
        g_aRecvBuf[g_bRxdPos++]=RXBUF1;
        if(g_bRxdPos >= RecDataLen)
        {
          g_bRxdPos=0;
          COM2_R_flag=1;
        }
}
******************************************************************/

/********************关于RS485方面*******************************/  
void RS485_Set(uchar ucIC, uchar ucT_or_R)
{
    //delay_nms(50);//延迟一点
    if(ucIC == ConstManageIC)
    {
        P5_GPIOInit(BIT1,OUT);
        if(ucT_or_R == RS485_TRAN)
        {
            P5OUT |=BIT1;
        }
        if(ucT_or_R == RS485_REC)
        {
            P5OUT &=~BIT1;
        }
    }
    if(ucIC == RotManageIC)
    {
        P4_GPIOInit(BIT0,OUT);
        if(ucT_or_R == RS485_TRAN)
        {
            P4OUT |=BIT0;
        }
        if(ucT_or_R == RS485_REC)
        {
            P4OUT &=~BIT0;
        }
    }
    delay_nms(1000);//延迟一点
}

⌨️ 快捷键说明

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