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

📄 uart0.c

📁 mega128串口通讯源码API函数
💻 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 )
{
    unsigned char data;
    unsigned char tmphead;
    data = UDR0;     //读接收数据
    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 + -