从流水灯到双机通信:手把手教你玩转51单片机串口(附代码与电路图)
2026/4/21 19:26:23 网站建设 项目流程

从流水灯到双机通信:51单片机串口实战指南

1. 串口通信基础与硬件准备

在嵌入式系统开发中,串口通信是最基础也最实用的功能之一。51单片机的P3.0(RXD)和P3.1(TXD)引脚构成了其串行通信接口,这两个引脚不仅能实现单片机与PC的通信,还能完成单片机之间的数据交换。

硬件准备清单

  • AT89C51/52单片机 ×2
  • 74HC164串入并出芯片
  • LED灯 ×8
  • 11.0592MHz晶振
  • 330Ω电阻 ×8
  • 面包板及杜邦线若干

提示:选择11.0592MHz晶振是为了方便波特率计算,能产生精确的标准通信速率。

串口通信的核心在于理解几个关键概念:

  1. 波特率:决定通信速度,常见值有9600、19200等
  2. 数据帧格式:起始位、数据位、校验位、停止位的组合
  3. 工作模式:51单片机提供4种工作模式,模式1最常用
// 基础串口初始化代码框架 void UART_Init() { SCON = 0x50; // 模式1,允许接收 TMOD |= 0x20; // 定时器1模式2 TH1 = 0xFD; // 9600波特率@11.0592MHz TR1 = 1; // 启动定时器1 }

2. 项目一:串口控制流水灯

2.1 硬件电路搭建

利用串口模式0和74HC164芯片,我们可以实现串行数据到并行输出的转换。将单片机的RXD(P3.0)连接74HC164的数据输入,TXD(P3.1)连接时钟输入,74HC164的8个输出引脚分别通过电阻连接LED。

电路连接要点

  • 74HC164的A/B引脚短接后接RXD
  • CLK引脚接TXD
  • 每个输出引脚串联330Ω电阻接LED正极
  • LED负极接地

2.2 程序设计解析

流水灯程序的核心是通过串口连续发送不同的数据模式,形成视觉上的流动效果。

ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV SCON, #00H ; 设置串口模式0 MOV A, #0FFH ; 初始灯全灭 LOOP: RR A ; 循环右移 MOV SBUF, A ; 发送数据 WAIT: JNB TI, WAIT ; 等待发送完成 CLR TI ; 清除发送标志 ACALL DELAY ; 延时 SJMP LOOP ; 循环 DELAY: ; 约200ms延时 MOV R7, #200 DL1: MOV R6, #250 DJNZ R6, $ DJNZ R7, DL1 RET END

代码关键点分析

  1. RR A指令实现数据右移,产生流水效果
  2. 模式0下,TXD输出移位时钟,自动完成同步
  3. 每次发送后必须检测并清除TI标志

注意:实际调试时若LED显示异常,应检查74HC164的MR引脚是否接高电平,以及时钟信号是否正常。

3. 项目二:双机通信系统

3.1 通信协议设计

实现两个51单片机之间的全双工通信,需要统一以下参数:

参数设置值说明
波特率9600bps常用标准速率
数据位8位无校验位
停止位1位标准配置
工作模式模式110位异步通信
晶振频率11.0592MHz确保波特率精确

3.2 发送端程序设计

发送端需要完成RAM中指定数据的读取和发送:

ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV TMOD, #20H ; 定时器1模式2 MOV TH1, #0FDH ; 9600波特率 MOV TL1, #0FDH SETB TR1 ; 启动定时器 MOV SCON, #50H ; 串口模式1,允许接收 MOV R0, #2 ; 发送2字节 MOV DPTR, #50H ; 数据起始地址 SEND_LOOP: MOVX A, @DPTR ; 读取数据 MOV SBUF, A ; 发送数据 WAIT_TX: JNB TI, WAIT_TX ; 等待发送完成 CLR TI ; 清除标志 INC DPTR ; 指向下一字节 DJNZ R0, SEND_LOOP SJMP $ END

3.3 接收端程序设计

接收端需要实时监测RI标志,及时读取接收到的数据:

ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV TMOD, #20H ; 与发送端相同配置 MOV TH1, #0FDH MOV TL1, #0FDH SETB TR1 MOV SCON, #50H MOV R0, #2 ; 接收2字节 MOV DPTR, #60H ; 存储地址 RECV_LOOP: JNB RI, $ ; 等待接收完成 CLR RI ; 清除标志 MOV A, SBUF ; 读取数据 MOVX @DPTR, A ; 存储数据 INC DPTR ; 指向下一地址 DJNZ R0, RECV_LOOP SJMP $ END

调试技巧

  1. 先用示波器检查TXD引脚是否有信号输出
  2. 确保两台单片机共地
  3. 波特率误差应控制在2%以内
  4. 可先用短距离连接测试,排除线路干扰

4. 进阶应用与问题排查

4.1 自定义协议设计

在实际项目中,简单的数据传输往往需要添加协议层:

// 示例:添加简单帧头帧尾 #define FRAME_HEAD 0xAA #define FRAME_TAIL 0x55 void SendPacket(unsigned char *data, unsigned char len) { SBUF = FRAME_HEAD; // 发送帧头 while(!TI); TI = 0; for(unsigned char i=0; i<len; i++) { SBUF = data[i]; while(!TI); TI = 0; } SBUF = FRAME_TAIL; // 发送帧尾 while(!TI); TI = 0; }

4.2 常见问题解决方案

问题1:通信数据错乱

  • 检查波特率设置是否一致
  • 确认晶振频率准确
  • 检查线路连接是否可靠

问题2:接收不完整

  • 增加接收超时判断
  • 优化缓冲区管理
  • 检查中断优先级设置

问题3:远距离通信不稳定

  • 添加MAX232电平转换芯片
  • 改用RS485通信标准
  • 降低波特率提高抗干扰能力

4.3 性能优化技巧

  1. 中断驱动方式:替代轮询,提高系统效率
void UART_ISR() interrupt 4 { if(RI) { RI = 0; // 处理接收数据 } if(TI) { TI = 0; // 处理发送完成 } }
  1. 双缓冲技术:分离数据处理和通信过程

  2. 数据压缩:减少传输量,提高有效速率

实际项目中,我曾遇到过一个有趣的现象:当单片机同时处理串口通信和LED显示时,偶尔会出现数据丢失。最终发现是因为延时函数影响了串口时序,改为定时器中断控制后问题解决。这提醒我们,在资源有限的嵌入式系统中,各个功能模块的协调至关重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询