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

📄 uart0.c

📁 Atmel公司Atmega128单片机串口测试代码
💻 C
字号:
#include "uart0.h"
#include "mcu.h"

/*
*************************************************************************************************************
*
*                                         ATmega128  UART0 driver
*
* File : UART0.c
* By   : hjjft
*************************************************************************************************************
*/

/////////////////////////////////////////////////
//                uart0驱动                   //
/////////////////////////////////////////////////

//静态全局变量
static unsigned char UART0_RxBuf[UART0_RX_BUFFER_SIZE];
static volatile unsigned char UART0_RxHead;
static volatile unsigned char UART0_RxTail;
static unsigned char UART0_TxBuf[UART0_TX_BUFFER_SIZE];
static volatile unsigned char UART0_TxHead;
static volatile unsigned char UART0_TxTail;

//串口初始化函数
void UART0_InitUART( unsigned long baudrate )
{
    unsigned char x;

	UBRR0H = (unsigned char)(CPU_CLK_FREQ/(16*baudrate) - 1) >>8;         //设置波特率
	UBRR0L = (unsigned char)(CPU_CLK_FREQ/(16*baudrate) - 1) & 0xFF;

	UCSR0B = ( (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0) );  //允许串口接收、发送和允许接收中断
	UCSR0C = ( (1<<UCSZ01) | (1<<UCSZ00) );  //1位停止位,8位数据位
	x = 0;              //初始化数据缓存
	UART0_RxTail = x;
	UART0_RxHead = x;
    UART0_TxTail = x;
	UART0_TxHead = x;
}

//串行接收中断处理函数
void UART0_RX_interrupt( void )
//biml注意中断函数的表示方法

{
	unsigned char data;
	unsigned char tmphead;
	data = UDR0;     //读接收数据
	//biml  以字节的方式读取串口缓冲区的数据

	tmphead = ( UART0_RxHead + 1 ) & UART0_RX_BUFFER_MASK;    //计算缓存索引
	//应用程序的缓冲区可以理解成一个循环链表结构

	UART0_RxHead = tmphead;         //保存新的缓存索引
	if ( tmphead == UART0_RxTail )
	{
		//这里加入缓存溢出处理
	}
	UART0_RxBuf[tmphead] = data;   //把接收数据保存到接收缓存
}

//串行发送中断处理函数
void UART0_TX_interrupt( void )
{
    unsigned char tmptail;

	if ( UART0_TxHead != UART0_TxTail )  //检查是否发送缓存里的所以数据都已经发送完毕
    {
		tmptail = ( UART0_TxTail + 1 ) & UART0_TX_BUFFER_MASK;       //计算缓存索引
		UART0_TxTail = tmptail;     //保存新的缓存索引
		UDR0 = UART0_TxBuf[tmptail];     //开始发送
    }
    else
	{
		UCSR0B &= ~(1<<UDRIE0);      //关UDRE中断
    }
}

//从接收缓存里接收一个字节
unsigned char UART0_ReceiveByte( void )
{
	unsigned char tmptail;

	while ( UART0_RxHead == UART0_RxTail ); //等待接收数据

	tmptail = ( UART0_RxTail + 1 ) & UART0_RX_BUFFER_MASK;    //计算缓存索引
	UART0_RxTail = tmptail;       //保存新的缓存索引
	return UART0_RxBuf[tmptail];
}

//将一个字节放入发送缓存
void UART0_TransmitByte( unsigned char data )
{
    unsigned char tmphead;
    tmphead = ( UART0_TxHead + 1 ) & UART0_TX_BUFFER_MASK;   //计算缓存索引

    while ( tmphead == UART0_TxTail );       //等待有空地缓存空间
        
    UART0_TxBuf[tmphead] = data;     //保存数据到缓存
    UART0_TxHead = tmphead;     //保存新的缓存索引
    UCSR0B |= (1<<UDRIE0); //开 UDRE 中断
}

void UART0_Transmitconstr(const unsigned char *str)    //发送一个const字符串(发送非const字符串会出错)
{
	unsigned char i;
	unsigned char max = str_length(str);
	for(i = 0; i < max; i++)
	{
		UART0_TransmitByte(str[i]);
    }   
}

void UART0_Transmitstr(unsigned char *str)    //发送一个字符串
{
	unsigned char i;
	unsigned char max = strlen(str);
	for(i = 0; i < max; i++)
	{
		UART0_TransmitByte(str[i]);
	}
}

//判断接收缓存是否为空
unsigned char UART0_DataInReceiveBuffer( void )
{
	return ( UART0_RxHead != UART0_RxTail ); //返回0表示接收缓存已空
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -