?? 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 + -