📄 uart.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 + -