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

📄 uart1.c

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

#define UART1_c
#include "main.h"

/*
*************************************************************************************************************
*
*                                         ATmega32  UART1 driver
*
* File : UART1.c
* By   : hjjft
*************************************************************************************************************
*/

/////////////////////////////////////////////////
//                UART1驱动                    //
/////////////////////////////////////////////////

//静态全局变量
static unsigned char UART1_RxBuf[UART1_RX_BUFFER_SIZE];
static volatile unsigned char UART1_RxHead;
static volatile unsigned char UART1_RxTail;
static unsigned char UART1_TxBuf[UART1_TX_BUFFER_SIZE];
static volatile unsigned char UART1_TxHead;
static volatile unsigned char UART1_TxTail;

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

    UBRR1H = (unsigned char)(F_CPU/(16*baudrate) - 1) >>8;         //设置波特率
    UBRR1L = (unsigned char)(F_CPU/(16*baudrate) - 1) & 0xFF;

    UCSR1B = ( (1<<RXCIE1) | (1<<RXEN1) | (1<<TXEN1) );  //允许串口接收、发送和允许接收中断
    UCSR1C = ( (1<<UCSZ11) | (1<<UCSZ10) );  //1位停止位,8位数据位
    x = 0;              //初始化数据缓存
    UART1_RxTail = x;
    UART1_RxHead = x;
    UART1_TxTail = x;
    UART1_TxHead = x;
}

//串行接收中断处理函数
SIGNAL(SIG_UART1_RECV) //串口接收中断服务程序 64没有S SIG_USART1_RECV  128
{
    unsigned char data;
    unsigned char tmphead;
    data = UDR1;     //读接收数据
    tmphead = ( UART1_RxHead + 1 ) & UART1_RX_BUFFER_MASK;    //计算缓存索引
    UART1_RxHead = tmphead;         //保存新的缓存索引
    if ( tmphead == UART1_RxTail )
    {
        //这里加入缓存溢出处理
    }
    UART1_RxBuf[tmphead] = data;   //把接收数据保存到接收缓存
}

//串行发送中断处理函数
SIGNAL(SIG_UART1_DATA)//注意: 这里是数据空中断 64没有S SIG_USART1_DATA  128
{
    unsigned char tmptail;

    if ( UART1_TxHead != UART1_TxTail )  //检查是否发送缓存里的所以数据都已经发送完毕
    {
        tmptail = ( UART1_TxTail + 1 ) & UART1_TX_BUFFER_MASK;       //计算缓存索引
        UART1_TxTail = tmptail;     //保存新的缓存索引
        UDR1 = UART1_TxBuf[tmptail];     //开始发送
    }
    else
    {
        UCSR1B &= ~(1<<UDRIE1);      //关UDRE中断 
    }
}

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

    while ( UART1_RxHead == UART1_RxTail ); //等待接收数据
        
    tmptail = ( UART1_RxTail + 1 ) & UART1_RX_BUFFER_MASK;    //计算缓存索引
    UART1_RxTail = tmptail;       //保存新的缓存索引
    return UART1_RxBuf[tmptail]; 
}

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

    while ( tmphead == UART1_TxTail );       //等待有空地缓存空间
        
    UART1_TxBuf[tmphead] = data;     //保存数据到缓存
    UART1_TxHead = tmphead;     //保存新的缓存索引
    UCSR1B |= (1<<UDRIE1); //开 UDRE 中断
}

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

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

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


⌨️ 快捷键说明

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