#ifndef UART_H
#define UART_H
#define mclk 8000000
#pragma interrupt_handler Uart_RX:12 //串口接收中断函数声明
uchar return_data;
/*******************************************
函数名称: Uart_init
功 能: 异步串口初始化
参 数: 无
返回值 : 无
/********************************************/
void uart_init(uint baud)
{
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0); //选择UCSRC,异步模式,禁止
baud=mclk/16/baud-1 ; // 校验,1位停止位,8位数据位
UBRRL=baud; //波特率最大为65K
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); //接收、发送使能,接收中断使能
SREG=BIT(7); //全局中断开放
DDRD|=0X02; //配置TX为输出(很重要)
}
/*******************************************
函数名称: Uart_sendB
功 能: 异步串口发送一个字节
参 数: sendB--发送的字节数据
返回值 : 无
/********************************************/
void Uart_sendB(uchar sendB)
{
while(!(UCSRA&(1<<UDRE))); //等待发送缓冲区为空
UDR=sendB; //发送数据
while(!(UCSRA&(1<<TXC))); //等待发送完毕
UCSRA|=1<<TXC; //清除发送完毕状态位
}
/*******************************************
函数名称: Uart_RX
功 能: 异步串口接收
参 数: 无
返回值 : 无
/********************************************/
void Uart_RX(void)
{
uchar a;
UCSRB&=~BIT(RXCIE); //关闭接收中断
return_data=UDR;
Uart_sendB(return_data);
UCSRB|=BIT(RXCIE); //使能接收中断
}
///******发送字符串*******************//////////////////
//**********使用例子 *************///
///Uart_Send_Str("Init SD Sucess!\r\n"); /// \r\n 是换行的意思
void Uart_Send_Str(char *CH)
{
uint i=0;
while(*CH)
{Uart_sendB(*CH++);}
}
#endif