新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR 單片機(jī)UART以查詢、中斷方式發(fā)送數(shù)據(jù)

AVR 單片機(jī)UART以查詢、中斷方式發(fā)送數(shù)據(jù)

作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
/****************************************************************************************************************

* AVR 單片機(jī)UART查詢、中斷方式發(fā)送數(shù)據(jù)

本文引用地址:http://butianyuan.cn/article/201611/315940.htm

* 說明:測(cè)試環(huán)境 硬件M16、開發(fā)平臺(tái)IAR for AVR V5.11B

****************************************************************************************************************/

//----------------------初始化-------------------------------------------------------------------

void Uart_init(long int baud)
{
baud=mclk/16/baud-1; //波特率最大為65K
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(0< UBRRL=baud;
UBRRH=baud>>8; //設(shè)置波特率
UCSRB=(1< SREG|=(1<<7); //全局中斷開放
}

//---------------------查詢方式 發(fā)送--start----------------------------------------------------------

/***********************************************************
*名 稱:
*功 能:從串口UART0發(fā)送一字節(jié)

*入口參數(shù):sendB:發(fā)送的單個(gè)字節(jié)

*說 明:

***********************************************************/
void Uart_sendB(uchar sendB)
{
while(!(UCSRA&(1<UDR=sendB; //發(fā)送數(shù)據(jù)
while(!(UCSRA&(1<UCSRA|=1<}

/***********************************************************
*名 稱:
*功 能:從串口UART0發(fā)送一字符串

*入口參數(shù):*sendpt:字符串首地址
*說 明:

***********************************************************/

void Uart_sentstr(uchar *sendpt)
{
while(*sendpt)//字符串未結(jié)束則繼續(xù)發(fā)送
{
Uart_sendB(*sendpt++);
}
}

/***********************************************************
*名 稱:
*功 能:從串口UART0發(fā)送一組字節(jié)數(shù)據(jù)
*入口參數(shù):*p:待發(fā)的首個(gè)字節(jié)數(shù)據(jù),len 發(fā)送個(gè)數(shù)
*說 明:

***********************************************************/

void Uart_sentstr_Array(uchar *p,uchar len)
{
uchar i;
for(i=0;i{
Uart_sendB(*p++);
}
}

//--------------------------------------------end--------------------------------------------------------

//--------------------------------------------中斷方式發(fā)送-- start-----硬件M164P----------------------------------------

/******************************************************
**由宏定義TXRX_FIFO控制此段代碼的編譯
**用于高效收發(fā)數(shù)據(jù),收發(fā)均不阻塞CPU運(yùn)行。

**函數(shù)口中包含了兩種中斷發(fā)送方式,可選擇 緩沖空中斷 || 發(fā)送結(jié)束中斷。
******************************************************/
//#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發(fā)送一組字節(jié)數(shù)據(jù)
*入口參數(shù):*p:待發(fā)的首個(gè)字節(jié)數(shù)據(jù),len 發(fā)送個(gè)數(shù)
*出口參數(shù):返回1:發(fā)送成功
* 返回0:發(fā)送失敗
*說 明:在發(fā)送過程中,不阻塞CPU的運(yùn)行。 函數(shù)口中包含了兩種中斷發(fā)送方式,可選擇
***********************************************************/
UINT8 Uart_IntSentBuf(UINT8 *p,UINT8 len)
{
UINT8 i;

if (len <= (TXRXBUF_SIZE-UART_OutLen))//緩存區(qū)空間不小于發(fā)送字節(jié)數(shù)
{

//------------方式一 緩沖空中斷--------------------------------------
if(!(UCSR0B&(1< {
UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
}
else
{
UCSR0B &= ~(1< }

for ( i=0;i {
UART_OutLen++;//發(fā)送字節(jié)數(shù)
UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO數(shù)據(jù)
if(++TXRX_IndexW >= TXRXBUF_SIZE)
{
TXRX_IndexW=0;//FIFO回頭
}
}

if(UCSR0A&(1< UCSR0A|=(1< UCSR0B |= (1< //----------------------end 方式一 ------------------------------------
/*

//------------方式二 發(fā)送結(jié)束中斷--------------------------------------
if(!(UCSR0B&(1< {
UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
for ( i=0;i {
UART_OutLen++;//發(fā)送字節(jié)數(shù)
UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO數(shù)據(jù)
if(++TXRX_IndexW >= TXRXBUF_SIZE)
{
TXRX_IndexW=0;//FIFO回頭
}
}
if(UCSR0A&(1< UCSR0A|=1< UCSR0B |= (1< UDR0=UART_RxTx[TXRX_IndexR];
--UART_OutLen;
++TXRX_IndexR;
}
else
{
UCSR0B &= ~(1< for ( i=0;i {
UART_OutLen++;//發(fā)送字節(jié)數(shù)
UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO數(shù)據(jù)
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) //串口緩沖器空中斷函數(shù)聲明
{
if(UART_OutLen>0)
{
UDR0=UART_RxTx[TXRX_IndexR];
--UART_OutLen;
if(++TXRX_IndexR >= TXRXBUF_SIZE)
{
TXRX_IndexR=0;//FIFO回頭
}
}
else //發(fā)送結(jié)束
{
//UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
UCSR0B &= ~(1< }

}

//----------------------end 方式一 ------------------------------------

/*

//------------方式二 發(fā)送結(jié)束中斷--------------------------------------
#pragma vector = USART0_TX_vect
__interrupt void UsartTx(void) //串口發(fā)送結(jié)束中斷函數(shù)聲明
{
if(UART_OutLen>0)
{
UDR0=UART_RxTx[TXRX_IndexR];
--UART_OutLen;
if(++TXRX_IndexR >= TXRXBUF_SIZE)
{
TXRX_IndexR=0;//FIFO回頭
}
}
else //發(fā)送結(jié)束
{
//UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
UCSR0B &= ~(1< }
}

//----------------------end 方式二 ------------------------------------

*/

#endif

//----------------------------------------------------end---------------------------------------------------------------------



評(píng)論


技術(shù)專區(qū)

關(guān)閉