当前位置: 首页 > news >正文

串口通信实战:主机按键控制从机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#嵌入式开发

http://www.cnnetsun.cn/news/56643.html

相关文章:

  • 28、网络数据分类与回归分析技术详解
  • Unity反向遮罩技术深度解析与应用实践
  • 多模态大模型新突破:Janus-Pro-7B重构跨模态理解与生成范式
  • 13、系统管理:用户管理脚本实用指南
  • PyQt-Fluent-Widgets 现代桌面应用开发终极指南
  • Duplicity:高效《缺氧》存档编辑器助力玩家打造个性化殖民地
  • AutoGPT文化展览策展助手
  • RSSHub-Radar终极指南:智能信息管理的完整解决方案
  • 蚂蚁开源Ring-1T引爆AI推理革命:万亿参数模型重构开源技术边界
  • 一、基于freertos系统上关于ATGM336H定位模块的定位测试验证
  • Flutter包体积优化终极指南:让你的直播App轻装上阵
  • Qwen3-0.6B震撼发布:轻量级大模型迎来推理与多语言能力的双重突破
  • Pig企业级权限管理系统:从零搭建微服务架构的实战指南
  • Obsidian Git高效配置:构建智能笔记备份系统
  • 心电图AI分类终极指南:3个简单步骤让新手快速上手
  • Unity反向遮罩技术深度解析:从原理到实战应用
  • 多模态生成革命:Lumina-DiMOO全能模型重塑跨模态交互新范式
  • MarkText主题定制完全攻略:打造专属写作空间的5个关键步骤
  • 21、网络命名服务:NIS、NIS+、DNS 与 LDAP 详解
  • 22、OpenLDAP与负载均衡技术解析
  • TaskFlow:重新定义Java任务流程管理的轻量级编排框架
  • AppleRa1n终极教程:iOS设备激活锁完全绕过方案
  • 零基础入门Whisper.cpp:5分钟搭建离线语音识别系统
  • YoloMouse游戏光标自定义工具:终极使用配置指南
  • 34、Unix系统下SMB/CIFS共享访问工具全解析
  • 40、Samba使用的额外资源与命令详解
  • 27、Google 演示文稿使用指南:文本操作与格式设置全攻略
  • 微信小程序大文件上传终极解决方案:miniprogram-file-uploader深度解析
  • 快速掌握Luckysheet:终极免费在线Excel替代方案
  • BlenderGIS 3D地形建模终极指南:从地理数据到逼真场景