登录/注册

51单片机串口通信的原理及应用

  不同型号的单片机使用的串口不同,根据需求选择相应的单片机,在有些场合如果单片机如果没有需要的串行通信接口,则可以通过单片机的I/O口进行模拟。   全双工UART(异步串行通信接口)   UART有两种工作状态:   同步串行通信状态:速率高,硬件电路复杂,需要同时使用两条信号线,所以只能使用单工方式或半双工方式工作。   异步串行通信状态:方式简单,传输速率不高,应用广泛,方便与其他通信标准进行衔接。

更多

好的,我们来详细讲解一下51单片机串口通信的原理及应用。

一、 串口通信的本质

串口通信 (Serial Communication) 是一种最基本、最常用的单片机与外部设备之间串行传输数据的方式。其核心在于:

  1. 串行: 数据位(比特流)按顺序,一位接一位地通过一根(或一对)信号线进行传输。
  2. 异步: 通信双方不依赖共同的时钟信号来严格同步每个比特的开始和结束时刻,而是依靠事先约定的波特率(比特率)来协调发送和接收的速度,并通过起始位停止位来界定每个数据单元的边界。

二、 51单片机串口通信的核心 - UART

51单片机内部集成了一个硬件模块,称为UART (Universal Asynchronous Receiver/Transmitter - 通用异步收发器)。它的作用是:

  1. 发送时: 将CPU送来的并行数据(一个字节)转换成串行比特流,并按帧格式(加上起始位、可选的校验位、停止位)通过TXD(P3.1)引脚发送出去。
  2. 接收时: 通过RXD(P3.0)引脚持续检测串行数据线上的信号。当检测到有效的起始位时,它开始按约定的波特率采样后续的数据位(以及校验位,如果有)。在收到停止位后,将整个收到的字节转换成并行数据,并告诉CPU有新数据到达(通过设置接收中断标志RI)。

UART工作的关键要素(帧格式)

每个传输的单位(通常是一个字节)称为一个"帧",其基本格式如下:

  1. 起始位: 固定1位低电平 (0),用于标志一帧数据的开始。
  2. 数据位: 有效数据部分,通常是5、6、7、8位(最常用的是8位)。数据的最高位(MSB)或最低位(LSB)在先传输由具体设置决定(51通常是LSB,即最低位先发送)。
  3. 校验位(可选): 1位,用于检错。常见方式:
    • 奇校验: 使数据位+校验位中1的总数为奇数。
    • 偶校验: 使数据位+校验位中1的总数为偶数。
    • 无校验: 不包含校验位(最常用)。
  4. 停止位: 1位或2位的高电平(1),标志一帧数据的结束,并为下一帧提供一定的间隔。常用1位停止位。
  5. 波特率: 单位时间内传输的码元(symbol)数量(位/秒,bps)。通信双方必须设定相同的波特率!常见有4800, 9600, 19200, 38400, 57600, 115200等。

三、 51单片机实现串口通信(寄存器原理)

51单片机通过几个特殊功能寄存器(SFR)来控制和使用UART:

  1. SCON (Serial Control Register - 串行控制寄存器, 地址 0x98):

    • SM0, SM1: 工作方式选择位。组合决定了通信模式(同步/异步)和帧格式。通常设置为SM0=0, SM1=1选择工作方式1 (8位UART, 波特率可变),这是最常用的异步模式。
    • REN: 接收允许位。置1允许UART接收数据。
    • TI: 发送中断标志位。当发送一帧数据完成(发送完停止位)时,由硬件自动置1需要在中断服务程序(ISR)中或查询后用软件清0
    • RI: 接收中断标志位。当成功接收到一帧有效数据时(接收完停止位,且帧格式正确),由硬件自动置1需要在中断服务程序(ISR)中或查询后用软件清0
  2. SBUF (Serial Buffer - 串行数据缓冲器, 地址 0x99):

    • 这是一个物理上分开的发送寄存器和接收寄存器,但映射到同一个地址。
    • 写SBUF: CPU向SBUF写数据,数据被送入发送寄存器,随即触发UART启动串行发送过程。
    • 读SBUF: CPU从SBUF读数据,数据是从接收寄存器中读出。
  3. PCON (Power Control Register - 电源控制寄存器, 地址 0x87):

    • SMOD: 波特率加倍位。当使用定时器1作为波特率发生器时:
      • SMOD=0: 波特率 = (定时器1溢出率) / 32
      • SMOD=1: 波特率 = (定时器1溢出率) / 16
      • 1可以将波特率提高一倍。
  4. 定时器1:

    • 在常用的工作方式1下,波特率由定时器1的溢出率决定。
    • 通常将定时器1配置为工作方式2 (8位自动重载): TMOD |= 0x20
    • 波特率计算公式:
      波特率 = (2^SMOD / 32) * (定时器1的溢出率)
      定时器1溢出率 = Fosc / 12 / (256 - TH1)
    • Fosc:系统时钟频率(Hz)。
    • TH1:定时器1重装初值寄存器。

四、 51单片机串口通信的基本步骤

  1. 初始化设置:

    • 配置UART工作方式:设置SCON(常用0x50SM0=0, SM1=1, REN=1允许接收)。
    • 配置波特率:
      • 选择SMOD值(置0或1)。
      • 配置定时器1为方式2:TMOD = (TMOD & 0x0F) | 0x20;
      • 根据所需波特率计算并设置TH1(和TL1)的初值。
      • 启动定时器1:TR1 = 1;
    • (可选) 开启串口中断:EA=1; (总中断) ES=1; (串口中断)。
    • (可选) 清除发送/接收中断标志TI/RI(启动前清除)。
  2. 发送数据:

    • 查询方式:
      void UART_SendByte(unsigned char dat) {
          SBUF = dat;      // 将数据写入发送缓冲器,启动发送
          while (!TI);     // 等待发送完成标志TI置位
          TI = 0;          // 必须软件清零TI
      }
    • 中断方式:
      • 设置ES=1, EA=1
      • 在发送中断服务函数(void UART_ISR() interrupt 4)中:
        if (TI) {
            TI = 0;          // 清除发送中断标志
            // (可选) 设置状态或启动发送下一字节
        }
      • 主程序中直接写SBUF = dat;启动发送。中断处理完TI表示该字节发送完成。
  3. 接收数据:

    • 查询方式:
      unsigned char UART_RecvByte(void) {
          while (!RI);    // 等待接收完成标志RI置位
          RI = 0;         // 必须软件清零RI
          return SBUF;    // 读取接收到的数据
      }
    • 中断方式 (强烈推荐):
      • 设置ES=1, EA=1
      • 在接收中断服务函数(void UART_ISR() interrupt 4)中:
        if (RI) {
            RI = 0;             // 清除接收中断标志
            dat = SBUF;         // 读取接收到的数据
            // 处理接收到的数据dat (存入缓冲区、解析命令等)
        }
      • UART硬件会在检测到完整的有效数据帧后自动触发中断,在ISR中读取SBUF即可。

五、 51单片机串口通信的典型应用

  1. 单片机与PC通信 (最常用):

    • 场景:调试信息输出、程序下载(如STC单片机的ISP)、接收PC指令控制单片机、将传感器数据发送给PC显示或存储。
    • 实现:单片机UART通过TXD/RXD连接到USB转TTL串口模块(如CH340, CP2102等),模块的USB端插入PC。
    • 工具:PC端使用串口调试助手软件(如串口猎人、SSCOM、XCOM、Putty、Tera Term等)进行收发数据。
  2. 单片机与传感器/模块通信:

    • 许多传感器(如温湿度传感器DHT11/DHT22需要模拟时序,但有些如BMP280气压模块可用串口)、GPS模块(GPS NEO-6M/7M等)、蓝牙模块(HC-05/06)、Wi-Fi模块(ESP8266/ESP32本身是主控,但常通过串口与51通信)、GSM模块、OLED显示屏模块等都支持UART接口的指令通信协议。
    • 51单片机作为主机,通过串口发送指令查询数据或控制这些模块。
    • 通常连接方式:51-TXD -> 模块-RXD; 51-RXD -> 模块-TXD; 共地(GND)。
  3. 单片机与单片机通信 (双机通信):

    • 两台(或更多,可通过多机通信模式实现)51单片机之间直接交换数据。
    • 简单双机通信连接:A-TXD -> B-RXD; A-RXD -> B-TXD; A-GND -> B-GND。
    • 需要约定好帧格式(数据位、停止位、校验方式,通常8N1无校验)和波特率。发送方调用UART_SendByte发送数据,接收方查询或中断接收数据。
  4. 调试输出:

    • 在程序中关键位置通过串口输出变量值、状态信息、错误信息等,是非常强大的调试手段(俗称“printf调试法”)。不需要额外硬件(连接PC),信息直观。

六、 注意事项

七、 常见问题解决方向

总结

51单片机的串口通信(UART)是一种基于串行异步传输协议的高效实用通信方式。理解其工作原理(串行、异步、帧格式)、掌握相关寄存器(SCON, SBUF, PCON, TMOD, TH1)的配置和使用方法(查询或中断)、熟悉波特率计算和硬件连接规则,就能轻松实现51单片机与PC、传感器、其他模块或其他单片机之间的数据交换,为应用开发提供强大的通信基础。它是单片机开发者必须掌握的核心技能之一。

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

51单片机串口通信是

2024-04-17 09:33:12

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

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

2023-12-20 14:03:46

51单片机和stm32单片机如何串口通信呢,需要电平转换器吗?

51单片机和stm32单片机如何串口

2023-11-01 07:47:55

51单片机——串口通信

51单片机——串口通信

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

51单片机串口通信

51单片机串口通信文章目录

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

51单片机串口通信

51单片机串口通信文章目录

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

51单片机串口通信的介绍代码说明

本文档的主要内容详细介绍的是51单片机与串口通信的介绍代码说明。

资料下载 佚名 2021-01-19 16:36:32

使用51单片机进行串口通信的基础教程免费下载

本文档的主要内容详细介绍的是使用51单片机进行串口通信的基础教程免费下载

资料下载 佚名 2019-06-18 17:44:00

51单片机串口配置方法

串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,

2023-04-14 14:58:31

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

分别编写STM32与51单片机程序,通过串口通信,实现STM32按键控制

2022-12-28 14:27:14

如何对51单片机串口通信进行Proteus仿真?

怎样去编写51单片机的串口通信的程序?如何对

2021-07-19 06:26:24

51单片机uart串口通信

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

2021-07-14 07:19:17

51单片机串口通信

我想用两个51单片机实现串口通信,主机给从

2019-07-30 11:10:37

详解51单片机串口通信

51单片机之串口通信

2019-07-08 17:55:11

51单片机串口通信出现硬件故障

51单片机串口通信,PC可以接收

2019-03-20 05:07:20
7天热门专题 换一换
相关标签