AVR 單片機UART以查詢、中斷方式發送數據
* AVR 單片機UART以查詢、中斷方式發送數據
本文引用地址:http://www.104case.com/article/201611/315940.htm* 說明:測試環境 硬件M16、開發平臺IAR for AVR V5.11B
****************************************************************************************************************/
//----------------------初始化-------------------------------------------------------------------
void Uart_init(long int baud)
{
baud=mclk/16/baud-1; //波特率最大為65K
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(0<
UBRRH=baud>>8; //設置波特率
UCSRB=(1<
}
//---------------------查詢方式 發送--start----------------------------------------------------------
/***********************************************************
*名 稱:
*功 能:從串口UART0發送一字節
*入口參數:sendB:發送的單個字節
*說 明:
***********************************************************/
void Uart_sendB(uchar sendB)
{
while(!(UCSRA&(1<
while(!(UCSRA&(1<
/***********************************************************
*名 稱:
*功 能:從串口UART0發送一字符串
*入口參數:*sendpt:字符串首地址
*說 明:
***********************************************************/
void Uart_sentstr(uchar *sendpt)
{
while(*sendpt)//字符串未結束則繼續發送
{
Uart_sendB(*sendpt++);
}
}
/***********************************************************
*名 稱:
*功 能:從串口UART0發送一組字節數據
*入口參數:*p:待發的首個字節數據,len 發送個數
*說 明:
***********************************************************/
void Uart_sentstr_Array(uchar *p,uchar len)
{
uchar i;
for(i=0;i
Uart_sendB(*p++);
}
}
//--------------------------------------------end--------------------------------------------------------
//--------------------------------------------中斷方式發送-- start-----硬件M164P----------------------------------------
/******************************************************
**由宏定義TXRX_FIFO控制此段代碼的編譯
**用于高效收發數據,收發均不阻塞CPU運行。
**函數口中包含了兩種中斷發送方式,可選擇 緩沖空中斷 || 發送結束中斷。
******************************************************/
//#if(TXRX_FIFO==1)
#define TXRXBUF_SIZE 64
uchar TXRX_BUFF[TXRXBUF_SIZE];
volatile uint UART_OutLen=0;
volatile uint TXRX_IndexR=0;
volatile uint TXRX_IndexW=0;
/***********************************************************
*名 稱:Uart_IntSentBuf
*功 能:從串口UART0發送一組字節數據
*入口參數:*p:待發的首個字節數據,len 發送個數
*出口參數:返回1:發送成功
* 返回0:發送失敗
*說 明:在發送過程中,不阻塞CPU的運行。 函數口中包含了兩種中斷發送方式,可選擇
***********************************************************/
UINT8 Uart_IntSentBuf(UINT8 *p,UINT8 len)
{
UINT8 i;
if (len <= (TXRXBUF_SIZE-UART_OutLen))//緩存區空間不小于發送字節數
{
//------------方式一 緩沖空中斷--------------------------------------
if(!(UCSR0B&(1<
UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
}
else
{
UCSR0B &= ~(1<
for ( i=0;i
UART_OutLen++;//發送字節數
UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO數據
if(++TXRX_IndexW >= TXRXBUF_SIZE)
{
TXRX_IndexW=0;//FIFO回頭
}
}
if(UCSR0A&(1<
/*
//------------方式二 發送結束中斷--------------------------------------
if(!(UCSR0B&(1<
UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
for ( i=0;i
UART_OutLen++;//發送字節數
UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO數據
if(++TXRX_IndexW >= TXRXBUF_SIZE)
{
TXRX_IndexW=0;//FIFO回頭
}
}
if(UCSR0A&(1<
--UART_OutLen;
++TXRX_IndexR;
}
else
{
UCSR0B &= ~(1<
UART_OutLen++;//發送字節數
UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO數據
if(++TXRX_IndexW >= TXRXBUF_SIZE)
{
TXRX_IndexW=0;//FIFO回頭
}
}
UCSR0B |= (1<
//----------------------end 方式二 ------------------------------------
*/
return 1;
}
else
return 0;
}
//------------方式一 緩沖空中斷--------------------------------------
#pragma vector = USART0_UDRE_vect
__interrupt void UsartUDRE(void) //串口緩沖器空中斷函數聲明
{
if(UART_OutLen>0)
{
UDR0=UART_RxTx[TXRX_IndexR];
--UART_OutLen;
if(++TXRX_IndexR >= TXRXBUF_SIZE)
{
TXRX_IndexR=0;//FIFO回頭
}
}
else //發送結束
{
//UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
UCSR0B &= ~(1<
}
//----------------------end 方式一 ------------------------------------
/*
//------------方式二 發送結束中斷--------------------------------------
#pragma vector = USART0_TX_vect
__interrupt void UsartTx(void) //串口發送結束中斷函數聲明
{
if(UART_OutLen>0)
{
UDR0=UART_RxTx[TXRX_IndexR];
--UART_OutLen;
if(++TXRX_IndexR >= TXRXBUF_SIZE)
{
TXRX_IndexR=0;//FIFO回頭
}
}
else //發送結束
{
//UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
UCSR0B &= ~(1<
}
//----------------------end 方式二 ------------------------------------
*/
#endif
//----------------------------------------------------end---------------------------------------------------------------------
評論