📄 usart.c
字号:
# include <reg52.h>
# include <intrins.h>
# include "cmd_list.h"
# define USART_RX_BUFFER_SIZE 64 /* 1,2,4,8,16,32,64,128 or 256 bytes */
# define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 )
# define USART_TX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */
# define USART_TX_BUFFER_MASK ( USART_TX_BUFFER_SIZE - 1 )
unsigned char idata USART_RxBuf[USART_RX_BUFFER_SIZE];
unsigned char USART_RxHead;
unsigned char USART_RxTail;
unsigned char idata USART_TxBuf[USART_TX_BUFFER_SIZE];
unsigned char USART_TxHead;
unsigned char USART_TxTail;
bit g_bCmdSending;
unsigned char g_ucCmdCount;
void InitUSART( void )
{
SCON = 0xd0;
TMOD = 0x21;
TH1 = 0xfd;
TL1 = 0xfd;
//SCON = 0xd0;
//T2CON = 0x30;
//RCAP2L = 0xff;
//RCAP2H = 0xdc;
USART_RxTail = 0;
USART_RxHead = 0;
USART_TxTail = 0;
USART_TxHead = 0;
//TR2 = 1;
TR1 = 1;
EA = 1;
ES = 1;
}
/*从接收缓冲区中提取一个字符*/
unsigned char ReceiveByte( void )
{
unsigned char tmptail;
while ( USART_RxHead == USART_RxTail ) /* wait for incomming data */
{
g_ucCmdCount = 0;
return(0x0d);
}
tmptail = ( USART_RxTail + 1 ) & USART_RX_BUFFER_MASK; /* calculate buffer index */
USART_RxTail = tmptail; /* store new index */
return USART_RxBuf[tmptail]; /* return data */
}
/*将数据放入发送缓冲区,如果串行口不再发送状态则启动发送*/
void TransmitByte( unsigned char ucSendData )
{
unsigned char tmphead;
tmphead = ( USART_TxHead + 1 ) & USART_TX_BUFFER_MASK; /* calculate buffer index */
while ( tmphead == USART_TxTail ) /* wait for free space in buffer */
{
;
}
USART_TxBuf[tmphead] = ucSendData; /* store data in buffer */
USART_TxHead = tmphead; /* store new index */
if ( !g_bCmdSending )
{
g_bCmdSending = 1;
TI = 1;
}
}
/* 串行中断处理程序 */
void Serial_int( void ) interrupt 4 using 1
{
unsigned char ucReceiveData;
unsigned char tmphead;
unsigned char tmptail;
if ( _testbit_(RI) )
{
ucReceiveData = SBUF;
tmphead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK; /*calculate buffer index */
if ( tmphead == USART_RxTail )
{
return; /* ERROR! Receive buffer overflow*/
}
USART_RxHead = tmphead; /* store new index */
USART_RxBuf[tmphead] = ucReceiveData; /* store received data in buffer */
if (ucReceiveData == CR)
{
g_ucCmdCount++;
}
}
if ( _testbit_(TI))
{
if ( USART_TxHead != USART_TxTail ) /* check if all data is transmitted */
{
tmptail = ( USART_TxTail + 1 ) & USART_TX_BUFFER_MASK; /*calculate buffer index */
USART_TxTail = tmptail; /* store new index */
SBUF = USART_TxBuf[tmptail]; /* start transmition */
}
else
{
g_bCmdSending = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -