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

📄 uart.c

📁 58enc28j06protuesuip09.rar
💻 C
字号:
#include "reg52.h"
#include "uart.h"

extern u8_t xdata mydata[MYLEN];

extern u8_t   xdata  ComRxdBuf[COM_RXD_BUFF_SIZE];      //串口的接收缓冲区
extern u8_t   xdata  ComTxdBuf[COM_TXD_BUFF_SIZE];      //串口的发送缓冲区

u16_t 	idata ComTxdRead; 	    //串口接收读指针
u16_t 	idata ComRxdRead;   	//串口发送读指针
u16_t 	idata ComRxdWrite;  	//串口接收写指针
u16_t 	idata ComTxdWrite;  	//串口发送写指针
bit 	ComTxdBufempty; 	    //发送结束


xdata   unsigned char IpStr[4]; 

/******************************************************************************
**UART_Init
**Value:
**Return Value:
**Parameters::T1 产生波特率 9600 8/N/1
******************************************************************************/

void UART_Init()
{
    SCON   = 0x50;                     /*SCON0:模式1,8位UART,时能RX*/
	TMOD  |= 0x20;                     /*TMOD: 定时器工作再模式2, 8位重载*/
	TH1    = 0xfa;                     /*设置定时1用作波特率的重载值*/
	TL1    = 0xfa;
	TR1    = 1;                        /*开定时器1*/	
	PCON  |= 0x00;                     /*SMOD00 = 1*/                     	                     
	EA=1;
	ES=1;
    ComTxdBufempty=1;
}

/******************************************************************************
**serial(void) interrupt 4
**Value:
**Return Value:
**Parameters:
******************************************************************************/

void serial(void) interrupt 4
{ 
   u8_t temp;

if(TI) 
      {	
		 TI=0;
         if(ComTxdRead!=ComTxdWrite)
	 		{
			  SBUF=ComTxdBuf[ComTxdRead];
        	  ComTxdRead++;
        	    if(ComTxdRead==COM_TXD_BUFF_SIZE)
				    {
				     ComTxdRead=0; 
					}
				ComTxdBufempty=0;
            }
        else 
			{
			 ComTxdBufempty=1;
			}
       }


if (RI)
      { 	
		RI=0;
        temp=SBUF;
        ComRxdBuf[ComRxdWrite]=temp;
		
        ComRxdWrite++;
        if(ComRxdWrite==COM_TXD_BUFF_SIZE)
		   {
			ComRxdWrite=0;
           }

       }
       

}

/**********************************************************************
**函数原型:    void  	Printf_Char(u8_t ascii)
**参数说明:	ascii:	发送到串口的ASCII
**返 回 值:	无      
**说    明:	往串口发送一个字符
************************************************************************/

void Printf_Char(u8_t ascii)
{
  u16_t i;
  EA=0;
  ComTxdBuf[ComTxdWrite]=ascii;
  ComTxdWrite++;
   if(ComTxdWrite==COM_TXD_BUFF_SIZE)
      {
       ComTxdWrite=0;
	  }

   if(ComTxdBufempty)
       { 
	     ComTxdBufempty=0;
	     TI=1;
	   }
   for(i=0;i<200;i++);	 //登记的数据包数度要比它取走溢出慢

   EA=1;
}

/**********************************************************************
**函数原型:    void  		Printf_String(u8_t code *string)
**参数说明:	string:	字符串的起始地址
**返 回 值:	无      
**说    明:	向串口发送字符串,碰到0x00结束
************************************************************************/
void Printf_String(u8_t  *string)
{
   while(*string!=0)
   {
     Printf_Char(*string);
     string++;
   }
}



/**********************************************************************
**函数原型: void Hex2Str(u8_t mychar)
**出口参数:		无
**返 回 值:		无
**说    明: 实现16进制IP值到字符串的转换
************************************************************************/
void Hex2Str(u8_t wchar)    
{
    
    unsigned char x,y;
	unsigned char *Str;
    Str = IpStr;  

        x=wchar;
        if(x>99)
			{
            y=x/100;*Str++=y+'0';
            x=x-100*y;y=x/10;*Str++=y+'0';
            x=x-10*y;*Str++=x+'0';

            *Str++='\0';
          	
        	}
        else if(x>9)
			{
            y=x/10;*Str++=y+'0';
            x=x-10*y;*Str++=x+'0';

           *Str++='\0';
           
        	}
        else
		{
            *Str++=x+'0';

            *Str++='\0';
    		
        }
	        
	
}



/**********************************************************************
**函数原型:    void 	Printf_IPStr(union Ip_Address_Type ip)
**参数说明:	union Ip_Address_Type ip
**返 回 值:	无      
**说    明:	向串口发送字符串,碰到0x00结束
************************************************************************/
void Printf_Str(u8_t mystr)
{  
 Hex2Str(mystr);
 Printf_String(IpStr);
}
/**********************************************************************
**函数原型:    u8_t 	Get_Char()
**参数说明:	无
**返 回 值:	无      
**说    明:	从串口接收一个字符
************************************************************************/
unsigned char Get_Char()
{unsigned char temp;
temp = ComRxdBuf[ComRxdRead];
ComRxdRead++;
if(ComRxdRead == COM_RXD_BUFF_SIZE){ComRxdRead=0;}
return(temp);
}


/**********************************************************************
**函数原型:    void        Copy_Send_Data( )
**入口参数:		无
**出口参数:		u16_t ii
**返 回 值:	返回0或返回从串口接收到数据的长度
**功能说明:		检查重发缓冲区是否为空,将串口输入的数据发到发送缓冲区
***********************************************************************/
u16_t Copy_Send_Data()
{
u16_t ii;

for(ii=0;ii<1500;ii++)	
	{
	if(ComRxdRead!=ComRxdWrite)
		{
	    mydata[ii]=Get_Char();
		
	    }
	
	else{ break; };
	}
return(ii);
}

/*just end*/

⌨️ 快捷键说明

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