登录/注册

51单片机如何实现串口通信?它的工作原理是什么?

串口通信是单片机一个重要的部分,单片机和PC,单片机和单片机之间的通信大都用串口。单片机的串口是全双工异步串口通信方式。串口传送数据是一帧一帧发送的,它有四种工作方式,同时也可以做并行I/O的扩展。

更多

51单片机(主要指兼容Intel 8051架构的微控制器)通过其内置的通用异步收发器(UART, Universal Asynchronous Receiver/Transmitter)模块来实现串口通信。这是一种异步串行通信方式,不需要发送时钟信号线,仅需两条数据线(TXD发送,RXD接收)即可实现双向通信。

工作原理核心要点

  1. 异步通信:

    • 发送端和接收端不使用共享的时钟信号进行同步。
    • 依靠预定义的波特率(Baud Rate)来约定通信速度(每位数据的持续时间)。
    • 每帧数据传输以起始位(Start Bit)开始,以停止位(Stop Bit)结束来界定数据帧。
  2. 数据帧格式: 一个完整的数据帧通常包含以下部分(最常见的是8-N-1格式):

    • 起始位 (1位): 逻辑低电平(0),表示一个新字节传输的开始。
    • 数据位 (5-9位): 通常是8位,代表一个字节的有效数据。51单片机通常默认支持5-9位。
    • 校验位 (可选1位): 用于简单的错误检测。可以是奇校验、偶校验或无校验(最常见)。
    • 停止位 (1位、1.5位或2位): 逻辑高电平(1),标志着一个帧的结束,并为下次传输提供稳定时间。通常是1位2位
  3. UART模块内部核心部件(51单片机视角):

    • 发送缓冲器(SBUF): 用于存放待发送的数据字节。当启动发送时,UART硬件会自动将这个字节装入发送移位寄存器。
    • 接收缓冲器(SBUF): 用于存放从接收移位寄存器移入并转换完成的完整接收字节。读SBUF获取数据(发送和接收物理上是两个寄存器,但软件访问地址相同)。
    • 发送移位寄存器: 将并行数据(来自SBUF)按设定的波特率逐位从TXD引脚串行输出(先输出起始位,然后是数据位LSB->MSB,最后是停止位)。
    • 接收移位寄存器: 监视RXD引脚,在检测到起始位后,按约定的波特率采样接收数据位并移入寄存器(采样通常在每位周期的中间时刻进行)。当完整的一帧接收完毕(包括预期停止位),数据会被并行送入接收SBUF,并置位接收完成标志(RI)。
    • 波特率发生器: 通常由一个独立的定时器(通常是T1)驱动,产生与预设波特率匹配的时钟频率。这个频率通常是波特率的16倍(用于接收采样)或直接驱动移位。
    • 控制和状态寄存器: SCON(串行控制寄存器)是最核心的寄存器,负责配置:
      • 工作模式(模式1是最常用的8位UART模式)。
      • 波特率倍增(SMOD位,影响T1溢出率)。
      • 发送完成标志(TI)。
      • 接收完成标志(RI)。
      • 允许接收(REN)。
    • PCON(电源控制寄存器): 其中SMOD位用于波特率倍增控制(0:不倍增;1:倍增)。
    • 中断系统: UART发送完成(TI=1)或接收完成(RI=1)时,可以触发串口中断(如果中断被使能)。

在51单片机中实现串口通信的典型步骤

  1. 选择波特率:

    • 根据通信需求(通信速度、抗干扰要求)和晶振频率确定波特率。
    • 使用定时器1(工作在模式2 - 8位自动重载)作为波特率发生器是最常见的方法。
    • 计算公式:波特率 = (2^SMOD / 32) * (定时器T1溢出率) (模式1下的UART)
    • 溢出率 = Fosc / (12 * (256 - TH1))
    • 推导得到TH1初值:TH1 = 256 - (Fosc * (2^SMOD)) / (384 * BaudRate)。需要计算并配置TH1。
  2. 配置定时器T1:

    • 设置TMOD寄存器,使T1工作在模式2(8位自动重载),例如:TMOD = 0x20;
    • 将计算好的TH1初值装入TH1(TL1会自动加载TH1值)。
    • 启动定时器T1(TR1=1)。
  3. 配置串口控制器SCON:

    • 选择模式1(8位UART,波特率可变,使用T1产生):SM0=0, SM1=1
    • 允许接收(如果要接收数据):REN=1
    • 清除发送完成(TI)和接收完成(RI)标志(软件清零)。
    • 例如:SCON = 0x50; // 0101 0000 即 SM0=0, SM1=1, REN=1
  4. 配置波特率倍增(PCON):

    • 根据计算需要使用SMOD位:PCON |= 0x80; (设置SMOD=1,波特率加倍) 或 PCON &= 0x7F; (清除SMOD=0,波特率不加倍)。默认通常是0。
  5. 发送数据(查询方式):

    • 将需要发送的数据写入SBUF寄存器,例如:SBUF = 'A';
    • UART硬件自动开始发送(置起始位、移位数据位、置停止位)。
    • 软件循环查询TI标志:while (!TI);(等待硬件置位TI表示发送完成)。
    • 软件清除TI标志:TI = 0; (为下次发送做准备)。
  6. 接收数据(查询方式):

    • 确保REN=1 (已设置)。
    • 软件循环查询RI标志:while (!RI);(等待硬件置位RI表示接收到一个完整字节)。
    • 软件清除RI标志:RI = 0;(为下次接收做准备)。
    • 读取SBUF中的数据:received_data = SBUF;
  7. (可选) 使用中断方式处理收发:

    • 更高效,避免CPU空转查询。
    • 使能串口中断: ES = 1;
    • 使能总中断: EA = 1;
    • 在串口中断服务程序(中断号为4)中:
      • 判断是发送中断(TI=1)还是接收中断(RI=1)。
      • 如果是接收中断:
        • 读取SBUF: received_data = SBUF;
        • 务必清除RI标志:RI = 0;
      • 如果是发送中断:
        • 清除TI标志:TI = 0;
        • 通常在这里可以启动下一个字节的发送(将新数据写入SBUF)。

代码示例(查询方式,晶振11.0592MHz,波特率9600)

#include <reg51.h> // 包含51单片机寄存器定义头文件

void UART_Init() {
    // 1. 配置T1为波特率发生器(模式2)
    TMOD = 0x20;        // 设置T1为8位自动重装模式(TMOD.5和TMOD.4为2)
    TH1 = 0xFD;         // TH1和TL1初值(针对11.0592MHz,9600bps)
    TL1 = 0xFD;
    TR1 = 1;            // 启动定时器1

    // 2. 配置SCON(串口模式1,允许接收)
    SCON = 0x50;        // 0101 0000b:模式1(UART,8位), REN=1

    // 3. PCON波特率倍增设置(默认为0,不需要设置)
    // PCON &= 0x7F;    // 可选:确保SMOD=0
}

void UART_SendByte(unsigned char dat) {
    SBUF = dat;         // 数据放入发送缓冲器,硬件自动开始发送
    while (!TI);        // 等待发送完成标志TI置位
    TI = 0;             // 软件清除TI标志
}

unsigned char UART_ReceiveByte() {
    while (!RI);        // 等待接收完成标志RI置位
    RI = 0;             // 软件清除RI标志
    return SBUF;        // 返回接收到的数据
}

void main() {
    unsigned char received_char;
    UART_Init();        // 初始化串口

    while (1) {
        received_char = UART_ReceiveByte();  // 等待并接收一个字节
        UART_SendByte(received_char + 1);    // 将接收到的字符+1后发送回去(简单回显+1测试)
    }
}

重要提示

总结来说,51单片机的串口通信依赖内置的UART硬件模块实现异步串行数据传输。核心是配置定时器1产生正确的波特率时钟,设置SCON寄存器定义数据帧格式和收发使能。通过查询或中断方式检测TI/RI标志来管理数据的发送和接收流程。理解起始位、停止位、波特率以及SBUF、TI、RI寄存器的操作是关键。

如何实现51单片机与PC的串行通信

51单片机与PC机的串行通信是一种常见的

2024-10-21 11:35:35

51单片机串口通信详细介绍-小白必看

51单片机串口通信是

2024-04-17 09:33:12

单片机串口通信的接收与发送

单片机串口通信是一种常见的通信方式,它可以

2023-12-20 14:03:46

51单片机——串口通信

51单片机——串口通信

资料下载 张杰 2021-11-23 17:36:04

Java实现51单片机串口通信 Serie Library

Java实现与51单片机串口

资料下载 佚名 2021-11-23 16:51:36

51单片机串口通信

,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信;

资料下载 万物死 2021-11-21 20:36:04

51单片机串口通信

,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信;

资料下载 从未拥有 2021-11-18 14:06:01

串口通信详解(51单片机

串口传输,实现单片机与PC机的双机

资料下载 尚文清 2021-11-12 10:06:02

51单片机如何实现双机串口通信

51单片机如何实现双机串口

2023-11-03 07:42:19

STM32与51单片机原理图及串口通信实例

分别编写STM32与51单片机程序,通过串口通信,

2022-12-28 14:27:14

单片机串口通信乱码怎么解决

单片机串口通信乱码问题问题:测试51

2022-02-18 06:34:51

51单片机CPU的内部结构及工作原理是什么

51单片机CPU的内部结构及工作原理1.51单片机CPU的内部结构2.

2021-11-18 08:22:07

51单片机串口通信 精选资料分享

这节我们主要讲单片机上串口的工作原理和如何通过程序来对串口进行设置,以及

2021-07-16 06:36:34

51单片机uart串口通信

51单片机uart串口通信,按照传统的理解就是信息的传输与交换。对于

2021-07-14 07:19:17

使用单片机实现串口通信的资料详细说明

串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到电脑端,而

2020-08-09 14:13:00

7天热门专题 换一换
相关标签