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

📄 uart0.c

📁 AVR atmega64串口驱动
💻 C
字号:

#define uart0_c
#include "main.h"

/*
*************************************************************************************************************
*
*                                         ATmega32  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)(F_CPU/(16*baudrate) - 1) >>8;         //设置波特率
    UBRR0L = (unsigned char)(F_CPU/(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;
}

//串行接收中断处理函数
SIGNAL(SIG_UART0_RECV) //串口接收中断服务程序 64没有S SIG_USART0_RECV  128
{
    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;   //把接收数据保存到接收缓存
}

//串行发送中断处理函数
SIGNAL(SIG_UART0_DATA)//注意: 这里是数据空中断 64没有S SIG_USART0_DATA  128
{
    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 int i;
    unsigned int 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 + -