📄 uart1.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 + -