1、USART功能简介
ATmega328P单片机中的USART(Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/异步收发器)是一个用于串行通信的接口。
2、配置USART的寄存器
UDR(USART数据寄存器):用于存储待发送或已接收的数据。当发送数据时,将数据写入UDR寄存器即启动发送;当接收数据时,数据会被存储在UDR寄存器中。
UCSRxA(USART接收状态寄存器):用于指示接收状态,如接收完成、溢出等。
UCSRxB(USART控制寄存器B):用于配置USART的接收使能、发送使能等控制位。
UCSRxC(USART控制寄存器C):用于配置USART的波特率、数据格式等参数。
3、USART的配置和参数
波特率生成:USART的波特率是通过配置内部定时器/计数器来生成的。ATmega328P提供了多种定时器/计数器配置选项,以满足不同波特率的需求。
数据格式:USART的数据格式可以通过相关寄存器进行配置,包括数据位长度(通常为5到9位)、停止位数量(通常为1或2位)以及是否使用奇偶校验等。
控制位:USART的控制位包括发送使能位、接收使能位等,用于控制USART模块的发送和接收功能。
4、示例代码
/*
* 程序功能:使用串口输出字符串"ATmega328p"
* 硬件平台:ATmega328p
* 作者:微技侠
*
*/
#include <avr/io.h>
#define F_CPU 16000000UL
#include <avr/interrupt.h>
#include <util/delay.h>
#define BAUD 9600 //定义串口通信的波特率
#define MYUBRR F_CPU/16/BAUD-1
void USART_Init(unsigned int ubrr)//配置USART模块的工作参数
{
/*Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
//Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (0<<USBS0)|(3<<UCSZ00);
}
void USART_Transmit(unsigned char data)
{
/* Wait for empty transmit buffer */
while (!(UCSR0A & (1<<UDRE0)))
;
/* Put data into buffer, sends the data */
UDR0 = data;
}
unsigned char USART_Receive(void)
{
/* Wait for data to be received */
while (!(UCSR0A & (1<<RXC0)))
;
/* Get and return received data from buffer */
return UDR0;
}
void PutChar(char c)
{
//if (c=='\n') PutChar('\n');
UDR0=c;
/* Wait for empty transmit buffer */
while (!(UCSR0A & (1<<UDRE0)));
}
void PutStr(char *s)
{
while(*s) PutChar(*s++);
}
int main(void)
{
//unsigned char ReceiveData;
USART_Init(MYUBRR);
while (1)
{
PutStr("ATmega328p\n");
_delay_ms(250);
}
}