微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR 单片机UART以查询、中断方式发送数据

AVR 单片机UART以查询、中断方式发送数据

时间:11-18 来源:互联网 点击:
/****************************************************************************************************************

* AVR 单片机UART查询中断方式发送数据

* 说明:测试环境 硬件M16、开发平台IAR for AVR V5.11B

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

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

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

//---------------------查询方式 发送--start----------------------------------------------------------

/***********************************************************
*名 称:
*功 能:从串口UART0发送一字节

*入口参数:sendB:发送的单个字节

*说 明:

***********************************************************/
void Uart_sendB(uchar sendB)
{
while(!(UCSRA&(1UDR=sendB; //发送数据
while(!(UCSRA&(1UCSRA|=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&(1UCSR0A|=(1UCSR0B |= (1//----------------------end 方式一 ------------------------------------
/*

//------------方式二 发送结束中断--------------------------------------
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&(1UCSR0A|=1UCSR0B |= (1UDR0=UART_RxTx[TXRX_IndexR];
--UART_OutLen;
++TXRX_IndexR;
}
else
{
UCSR0B &= ~(1for ( i=0;i{
UART_OutLen++;//发送字节数
UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO数据
if(++TXRX_IndexW >= TXRXBUF_SIZE)
{
TXRX_IndexW=0;//FIFO回头
}
}
UCSR0B |= (1}

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top