欢迎光临MCUWAY! 本站网名:单片机之路  永久域名:www.mcuway.com

设为首页

加入收藏

电子基础 初学MCU 单片机类型 MCU程序 MCU应用 设计软件 测控电路 技术论坛
 您现在的位置: 单片机之路 >> 单片机类型 >> AVR系列 >> 文章正文

一个非常棒的串口程序

#include <iom128v.h>
#include <macros.h>
#include "uart.h"

/* USART Buffer Defines */
#define USART_RX_BUFFER_SIZE 16 /* 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 )

#if ( USART_RX_BUFFER_SIZE & USART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif

/* Static Variables */
static unsigned char USART_RxBuf[USART_RX_BUFFER_SIZE];
static volatile unsigned char USART_RxHead;
static volatile unsigned char USART_RxTail;
static unsigned char USART_TxBuf[USART_TX_BUFFER_SIZE];
static volatile unsigned char USART_TxHead;
static volatile unsigned char USART_TxTail;

/* 串口初始化 */
void InitUSART(INT8U  baudrate)
{
INT8U x;
UBRR0L = baudrate;
UCSR0B = ( (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0) );/*RX Complete
Interrupt Enable, Receiver Enable and Transmitter Enable*/
x = 0; /* flush receive buffer */
USART_RxTail = x;
USART_RxHead = x;
USART_TxTail = x;
USART_TxHead = x;
}

/* 接收中断 */
void USART_RX_interrupt( void )
{
unsigned char data;
unsigned char tmphead;
data = UDR0; /* read the received data */
tmphead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK;/* calculate
buffer index */
USART_RxHead = tmphead; /* store new index */
if ( tmphead == USART_RxTail )
{
return;/* ERROR! Receive buffer overflow, you can use
flux cortorl */
}
USART_RxBuf[tmphead] = data; /* store received data in buffer */
}

/* 发送中断 */
void USART_TX_interrupt( void )
{
unsigned char tmptail;

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 */
UDR0 = USART_TxBuf[tmptail]; /* start transmition */
}//单片机之路的永久域名:www.mcuway.com
else
{
UCSR0B &= ~(1<<UDRIE0); /* disable UDRE interrupt */
}
}

/* 读取数据函数 */
unsigned char ReceiveByte( void )
{
unsigned char tmptail;

while ( USART_RxHead == USART_RxTail ) /* wait for incomming data */
;
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 data )
{
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] = data; /* store data in buffer */
USART_TxHead = tmphead; /* store new index */
UCSR0B |= (1<<UDRIE0); /* enable UDRE interrupt */
}

/* 查询是否有数据 */
unsigned char DataInReceiveBuffer( void )
{
return ( USART_RxHead != USART_RxTail ); /* return 0 (FALSE) if the
receive buffer is empty */
}

/* 中断中只做很少的事情,通常我是在接收中断中post一个信号量,触发别的任务读数据
*/ 

普通文章28课:单片机音乐汇编程序设计
普通文章27课:单片机的一些基本概念
普通文章26课:单片机矩阵式键盘接口技术
普通文章非常详细的51单片机引脚介绍
普通文章图解使用Keil C51软件的九个步骤
普通文章哈佛(Harvard)结构的单片机的原理图
普通文章单片机引脚及功能说明
普通文章c51单片机c语言教程介绍
普通文章第一课 建立你的第一个KeilC51项目
普通文章第二课 HEX文件的生成和MCU最小系统
普通文章第三课 C51语言的数据类型
普通文章第四课 C51常量
普通文章第五课 C51变量
普通文章第六课 C51运算符和表达式
普通文章第七课 运算符和表达式(关系运算符)
普通文章第八课 运算符和表达式(位运算符)
普通文章第九课 C51运算符和表达式(指针和地址
普通文章第十课 C51表达式语句及仿真器
普通文章第十一课 C51复合语句和条件语句
普通文章第十二课 C51开关分支语句
普通文章第十三课 C51循环语句
普通文章第十四课 C51函数
普通文章第十五课 C51数组的使用
普通文章第十六课 C51指针的使用
普通文章第十七课 C51结构、联合和枚举的使用

  • 上一篇文章:
  • 下一篇文章:
  • 更多精彩内容>>>

    普通文章电流单位
    普通文章功率单位
    普通文章什么是达林顿管?
    普通文章晶闸管的作用与原理

    学习单片机的必经之路——单片机之路,永久域名:www.mcuway.com