单片机中的USART通信应用实例详解

数据科学实验室 2022-07-31 ⋅ 20 阅读

概述

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是单片机中一种常用的通信接口,可用于实现与外设设备或其他单片机之间的数据传输。本文将针对USART通信在单片机中的应用进行详细解析,并给出一个实例。

USART通信基础

USART通信是一种串行通信方式,通过发送和接收数据成对的形式来实现通信。通信中需要使用到的三个重要参数为波特率(Baud rate)、数据位(Data bits)和停止位(Stop bits)。波特率定义了数据传输的速度,数据位指定了每个数据块传输的位数,而停止位用于表明一个数据块的结束。

常见的USART通信配置有两种模式:异步模式和同步模式。异步模式的通信通过起始位(Start bit)和停止位来标识每个数据块的开始和结束。同步模式的通信则通过一个由外部时钟源提供的时钟信号来同步发送和接收数据。

USART通信应用实例

1. 串口通信

串口通信是最常见的USART应用之一。可以将单片机串口连接到计算机的串口、USB转串口或蓝牙等外部设备上,以进行数据传输。

#include <avr/io.h>

#define F_CPU 1000000UL
#define BAUDRATE 4800
#define BAUD_PRESCALE (((F_CPU / (BAUDRATE * 16UL))) - 1)

void USART_Init(unsigned int ubrr)
{
    // 设置波特率
    UBRRH = (unsigned char)(ubrr >> 8);
    UBRRL = (unsigned char)ubrr;
    
    // 启用接收和发送
    UCSRB = (1 << RXEN) | (1 << TXEN);
    
    // 设置帧格式:异步,无校验位,1个停止位,8个数据位
    UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
}

void USART_Transmit(unsigned char data)
{
    // 等待发送缓冲区为空
    while (!(UCSRA & (1 << UDRE)));
    
    // 将数据放入发送缓冲区
    UDR = data;
}

int main()
{
    USART_Init(BAUD_PRESCALE);
    
    // 发送字符 'A'
    USART_Transmit('A');
    
    return 0;
}

2. 与传感器通信

单片机可以通过USART与各种传感器进行通信,以接收传感器发送的数据,并进行相应的处理和控制。

#include <avr/io.h>

#define F_CPU 1000000UL
#define BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (BAUDRATE * 16UL))) - 1)

void USART_Init(unsigned int ubrr)
{
    // 设置波特率
    UBRRH = (unsigned char)(ubrr >> 8);
    UBRRL = (unsigned char)ubrr;
    
    // 启用接收和发送
    UCSRB = (1 << RXEN) | (1 << TXEN);
    
    // 设置帧格式:异步,无校验位,1个停止位,8个数据位
    UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
}

unsigned char USART_Receive()
{
    // 等待接收完成
    while (!(UCSRA & (1 << RXC)));
    
    // 返回接收到的数据位
    return UDR;
}

int main()
{
    unsigned char received_data;
    
    USART_Init(BAUD_PRESCALE);
    
    // 接收数据
    received_data = USART_Receive();
    
    // 处理接收到的数据
    // ...
    
    return 0;
}

3. USART中断处理

通过使用USART中断,单片机可以在不断去查询的情况下,实现接收和发送数据的异步处理。

#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 1000000UL
#define BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (BAUDRATE * 16UL))) - 1)

void USART_Init(unsigned int ubrr)
{
    // 设置波特率
    UBRRH = (unsigned char)(ubrr >> 8);
    UBRRL = (unsigned char)ubrr;
    
    // 启用接收和发送
    UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
    
    // 设置帧格式:异步,无校验位,1个停止位,8个数据位
    UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
}

ISR(USART_RXC_vect)
{
    unsigned char received_data = UDR;
    
    // 处理接收到的数据
    // ...
}

int main()
{
    USART_Init(BAUD_PRESCALE);
    
    // 启用全局中断
    sei();
    
    // 发送字符 'A'
    USART_Transmit('A');
    
    while (1)
    {
        // 进行其他任务
        // ...
    }
    
    return 0;
}

结论

USART是单片机中常用的通信接口,可以广泛应用于串口通信、传感器通信等场景中。在编写USART通信应用时,需要根据具体需求选择合适的配置和模式,并进行相应的初始化和处理。通过本文的解析和示例,希望能对USART通信的应用有所了解和指导。


全部评论: 0

    我有话说: