PAGE1
PAGE1
10.USART通信
10.1USART概述
USART(UniversalSynchronousandAsynchronousReceiverandTransmitter)是通用同步和异步收发器,是AVR单片机中一个重要的通信模块。USART可以实现单片机与外部设备之间的串行通信,支持多种通信格式,包括异步通信(如常见的RS-232和RS-485)和同步通信(如SPI和I2C)。在本节中,我们将详细探讨基于ATmega328P的USART通信原理和应用。
10.1.1USART的基本功能
USART的主要功能包括:
异步通信:通过UART协议实现数据的发送和接收。
同步通信:通过SPI协议实现数据的同步传输。
多处理器通信:支持多个处理器之间的通信。
波特率设置:可以设置通信的波特率以适应不同的通信速率。
数据帧格式:可以设置数据帧的格式,包括数据位、停止位和奇偶校验位。
10.1.2USART的工作模式
USART支持以下几种工作模式:
异步模式:数据以非同步的方式传输,通常用于与PC或其他设备的通信。
同步模式:数据以同步的方式传输,通常用于与SPI设备的通信。
多处理器模式:允许多个处理器共享同一总线进行通信。
异步模式下的双倍速模式:提高通信速率,适用于高波特率通信。
10.2异步通信
10.2.1异步通信的基本原理
异步通信使用UART协议,通过TXD和RXD两个引脚进行数据的发送和接收。在异步通信中,数据帧通常包括起始位、数据位、奇偶校验位和停止位。起始位为低电平,表示数据帧的开始;数据位为实际传输的数据;奇偶校验位用于校验数据的正确性;停止位为高电平,表示数据帧的结束。
10.2.2异步通信的配置
在ATmega328P中,USART的配置主要通过以下几个寄存器完成:
UCSRB:USART控制和状态寄存器B,用于启用发送和接收功能。
UCSRC:USART控制和状态寄存器C,用于设置通信模式和数据帧格式。
UBRRH和UBRRL:波特率寄存器,用于设置通信速率。
UDR:USART数据寄存器,用于发送和接收数据。
10.2.2.1配置波特率
波特率的设置是通过公式计算的:
UBRR
其中,FCPU
10.2.2.2配置数据帧格式
数据帧格式可以通过UCSRC寄存器设置,常见的格式包括:
8位数据位
1位停止位
无奇偶校验
10.2.3代码示例
以下是一个配置USART并实现简单串口通信的例子:
#includeavr/io.h
#includeutil/setbaud.h
//初始化USART
voidUSART_Init(unsignedintbaud){
//设置波特率
UBRRH=(unsignedchar)(baud8);
UBRRL=(unsignedchar)baud;
//启用接收和发送
UCSR0B=(1RXEN0)|(1TXEN0);
//设置数据帧格式:8位数据位,1位停止位,无奇偶校验
UCSR0C=(1UCSZ01)|(1UCSZ00);
}
//发送一个字符
voidUSART_Transmit(chardata){
//等待数据寄存器为空
while(!(UCSR0A(1UDRE0))){}
//发送数据
UDR0=data;
}
//接收一个字符
charUSART_Receive(void){
//等待数据到达
while(!(UCSR0A(1RXC0))){}
//读取数据
returnUDR0;
}
intmain(void){
//设置波特率为9600
USART_Init(103);//103=/(16*9600))-1
//无限循环
while(1){
//接收字符
charreceived_data=USART_Receive();
//发送接收到的字符
USART_Transmit(received_data);
}
}
10.2.4代码解释
USART_Init函数:
UBRRH和UBRRL用于设置波特率寄存器。
UCSR0B寄存器启用接收(RXEN0)和发送(TXEN0)功能。