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

📄 usart.c

📁 一个串口通信程序,采用循环队列的方式进行接收和发送,
💻 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 + -