news 2026/5/11 6:25:26

串口通信实战:主机按键控制从机LED

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
串口通信实战:主机按键控制从机LED

1. 项目概述

本项目基于单片机学习板,实现两个单片机之间的串口通信。主机通过按键K1控制从机LED灯的亮灭,是一个典型的串口通信应用实例。

1.1 硬件平台

  • 主控芯片:STC89C52
  • 通信接口:串口(CH340 USB转串口芯片)
  • 按键:K1连接在P3.4
  • LED:连接在P1端口

1.2 实现功能

  • 主机检测K1按键状态
  • 主机通过串口发送控制命令
  • 从机接收并解析串口命令
  • 从机控制LED1的亮灭状态

2. 硬件连接

2.1 串口连接配置

主机(Master) 从机(Slave) P3.1 (TXD) ----------- P3.0 (RXD) P3.0 (RXD) ----------- P3.1 (TXD) GND ------------------- GND

2.2 按键和LED连接

  • 主机:K1按键 → P3.4
  • 从机:LED1 → P1.0(低电平点亮)

2.3 通信协议

采用简单的字符协议:

  • 主机发送'L''1':从机LED1亮
  • 主机发送'O''0':从机LED1灭
  • 主机发送'A''a':从机所有LED亮

3. 程序设计

3.1 主机程序(Master)

#include <reg52.h> #define FOSC 11059200L #define BAUD 9600 sbit KEY_K1 = P3^4; bit last_key_state = 1; /** * 串口初始化 * 波特率:9600 @ 11.0592MHz * 工作方式:方式1 */ void UART_Init(void) { SCON = 0x50; // 方式1,8位数据,允许接收 TMOD = 0x20; // 定时器1方式2 TH1 = 0xFD; // 9600波特率 TL1 = 0xFD; TR1 = 1; // 启动定时器1 ES = 0; // 不启用串口中断 } /** * 发送单个字节 * @param dat 要发送的数据 */ void UART_SendByte(unsigned char dat) { SBUF = dat; while(!TI); // 等待发送完成 TI = 0; // 清除发送标志 } /** * 发送字符串 * @param str 要发送的字符串 */ void UART_SendString(char *str) { while(*str != '\0') { UART_SendByte(*str++); } } /** * 毫秒级延时函数 * @param ms 延时毫秒数 */ void DelayMs(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 114; j++); } /** * 发送启动信息 */ void SendWelcomeMessage(void) { UART_SendString("\r\n"); UART_SendString("=== HL-1 MASTER CONTROLLER ===\r\n"); UART_SendString("Function: K1 -> Slave LED Control\r\n"); UART_SendString("Press K1 to toggle slave LED1\r\n"); UART_SendString("================================\r\n"); UART_SendString("\r\n"); } /** * 主函数 */ void main(void) { // 初始化串口 UART_Init(); // 发送启动信息 SendWelcomeMessage(); while(1) { // 检测按键状态变化 if(KEY_K1 != last_key_state) { DelayMs(10); // 按键消抖 if(KEY_K1 != last_key_state) { last_key_state = KEY_K1; if(KEY_K1 == 0) // 按键按下 { UART_SendByte('L'); // 发送LED亮命令 UART_SendString(" - LED ON command sent\r\n"); } else // 按键释放 { UART_SendByte('O'); // 发送LED灭命令 UART_SendString(" - LED OFF command sent\r\n"); } } } DelayMs(1); // 降低CPU占用率 } }

3.2 从机程序(Slave)

#include <reg52.h> /** * 串口初始化 */ void UART_Init(void) { SCON = 0x50; // 串口方式1 TMOD = 0x20; // 定时器1方式2 TH1 = 0xFD; // 9600波特率 TL1 = 0xFD; TR1 = 1; // 启动定时器1 ES = 1; // 允许串口中断 EA = 1; // 允许总中断 } /** * 毫秒级延时函数 * @param ms 延时毫秒数 */ void DelayMs(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 114; j++); } /** * 主函数 */ void main(void) { // 初始化串口 UART_Init(); P1 = 0xFF; // 初始化所有LED灭 // 启动指示灯 P1 = 0xFE; // LED1亮一下 DelayMs(300); P1 = 0xFD; // LED2亮一下 DelayMs(300); P1 = 0xFF; // 所有LED灭 while(1) { // 主循环为空,等待串口中断 // 可在此处添加其他任务 } } /** * 串口中断服务函数 * interrupt 4 表示串口中断 */ void UART_ISR(void) interrupt 4 { unsigned char received_char; if(RI) // 接收中断 { RI = 0; // 清除接收标志 received_char = SBUF; // 读取接收到的字符 // 根据命令控制LED switch(received_char) { case 'L': // LED亮命令 case '1': P1 &= 0xFE; // LED1亮 (P1.0 = 0) break; case 'O': // LED灭命令 case '0': P1 |= 0x01; // LED1灭 (P1.0 = 1) break; case 'A': // 所有LED亮 case 'a': P1 = 0x00; // 所有LED亮 break; default: // 无效命令,不做处理 break; } } if(TI) // 发送中断(本程序不使用) { TI = 0; } }

4. 编译与烧录

4.1 开发环境配置

  1. 编译器:Keil uVision 5
  2. 编译器设置:选择C51编译器
  3. 目标芯片:STC89C52

4.2 编译步骤

  1. 创建新工程,选择STC89C52芯片
  2. 添加源文件,编写代码
  3. 设置编译选项
  4. 编译生成HEX文件

4.3 烧录步骤

  1. 使用烧写器
  2. 选择正确的COM端口
  3. 载入生成的HEX文件
  4. 点击下载,然后给开发板上电

5. 测试与调试

5.1 硬件测试

  1. 确保USB线连接正常
  2. 确认CH340驱动已安装
  3. 检查杜邦线连接是否正确
  4. 验证电源指示灯正常

5.2 软件测试

  1. 使用串口调试助手监控通信
  2. 测试按键响应
  3. 观察LED状态变化
  4. 测试通信稳定性

5.3 串口调试助手设置

端口:COMx(根据实际选择) 波特率:9600 数据位:8 停止位:1 校验位:None 流控制:None

6. 常见问题与解决方案

6.1 通信失败

现象:按键按下后从机LED无反应
解决方法

  1. 检查TXD和RXD是否交叉连接
  2. 确认波特率设置一致(9600)
  3. 检查地线是否连接
  4. 验证串口线是否完好

6.2 按键响应不稳定

现象:需要多次按键才能触发
解决方法

  1. 增加消抖延时时间
  2. 优化按键扫描算法
  3. 检查按键硬件连接

6.3 LED不亮

现象:发送命令后LED不亮
解决方法

  1. 确认LED连接在P1.0
  2. 检查LED方向是否正确
  3. 验证LED限流电阻是否正常

7. 功能扩展

7.1 多按键控制

可以扩展为多个按键控制多个LED:

// 扩展为4个按键控制4个LED sbit KEY_K2 = P3^5; sbit KEY_K3 = P3^6; sbit KEY_K4 = P3^7;

7.2 协议升级

实现更复杂的通信协议:

// 帧格式:帧头 + 命令 + 数据 + 校验 // 0xAA 0x55 CMD LED_NUM CHECKSUM

7.3 状态反馈

从机向主机发送状态反馈:

// 从机收到命令后回复 void SendResponse(unsigned char status) { SBUF = status; while(!TI); TI = 0; }

8. 项目总结

本项目通过学习板实现了基本的串口通信功能,具有以下特点:

8.1 技术要点

  1. 串口通信:掌握了51单片机串口通信的基本原理
  2. 中断应用:学习了串口中断的使用方法
  3. 按键处理:掌握了按键消抖和状态检测技术
  4. 协议设计:了解了简单的通信协议设计

8.2 学习收获

  1. 理解主从机通信的基本概念
  2. 掌握串口通信的硬件连接方法
  3. 学会使用串口调试工具
  4. 能够独立完成简单的通信项目

8.3 应用前景

本项目为基础,可扩展为:

  • 智能家居控制系统
  • 工业监控系统
  • 机器人控制系统
  • 物联网终端设备


版权声明:本文为原创内容,转载请注明出处

关键词:HL-1学习板、STC89C52、串口通信、单片机、按键控制、LED控制、51单片机

技术标签#单片机#串口通信#STC89C52#HL-1#嵌入式开发

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 16:38:44

40、桌面监控项目:天气数据监测与分析系统详解

桌面监控项目:天气数据监测与分析系统详解 1. 项目概述 桌面监控项目主要用于实时获取天气数据、展示数据图表以及进行未来天气预测。该项目包含两个主要类: DataRetriever.java 和 Mainframe.java 。 DataRetriever.java 负责从 Cloudant 数据库中获取数据,而 Mai…

作者头像 李华
网站建设 2026/5/9 15:27:05

16、系统管理:系统维护实用脚本解析

系统管理:系统维护实用脚本解析 在系统管理和维护工作中,脚本起着至关重要的作用。本文将详细介绍几个实用的系统维护脚本,包括 killall 、 verifycron 和 docron 脚本,深入探讨它们的工作原理、运行方式、使用结果以及可能的改进方向。 killall 脚本 工作原理 …

作者头像 李华
网站建设 2026/5/10 5:53:41

OneMore插件终极指南:如何用160+功能彻底改变你的OneNote体验

OneMore插件终极指南&#xff1a;如何用160功能彻底改变你的OneNote体验 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore OneMore是一款专为Microsoft OneNote设计的开…

作者头像 李华
网站建设 2026/5/10 16:31:41

百万Token新纪元:Qwen2.5-1M开源模型引领长文本智能处理革命

百万Token新纪元&#xff1a;Qwen2.5-1M开源模型引领长文本智能处理革命 【免费下载链接】Qwen2.5-14B-Instruct-1M 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen2.5-14B-Instruct-1M 在人工智能技术迅猛发展的今天&#xff0c;长文本处理一直是制约行业突破…

作者头像 李华
网站建设 2026/5/10 18:12:07

全球首个百亿级开源首尾帧生视频模型问世!通义万相Wan2.1-FLF2V-14B解锁视频创作新范式

4月17日&#xff0c;人工智能领域再添重要突破——通义万相正式对外发布并开源其首尾帧生视频模型Wan2.1-FLF2V-14B。这款具备里程碑意义的AI模型&#xff0c;凭借140亿参数规模一举成为全球首个开源的百亿级首尾帧驱动视频生成模型。用户只需上传两张静态图像作为视频序列的起…

作者头像 李华
网站建设 2026/5/10 14:08:06

ComfyUI Manager节点加载失败快速排查与修复指南

ComfyUI Manager节点加载失败快速排查与修复指南 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager 当你满怀期待地打开ComfyUI Manager&#xff0c;却发现自定义节点列表一片空白&#xff0c;这种体验确实令人沮丧。本文…

作者头像 李华