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 ------------------- GND2.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 开发环境配置
- 编译器:Keil uVision 5
- 编译器设置:选择C51编译器
- 目标芯片:STC89C52
4.2 编译步骤
- 创建新工程,选择STC89C52芯片
- 添加源文件,编写代码
- 设置编译选项
- 编译生成HEX文件
4.3 烧录步骤
- 使用烧写器
- 选择正确的COM端口
- 载入生成的HEX文件
- 点击下载,然后给开发板上电
5. 测试与调试
5.1 硬件测试
- 确保USB线连接正常
- 确认CH340驱动已安装
- 检查杜邦线连接是否正确
- 验证电源指示灯正常
5.2 软件测试
- 使用串口调试助手监控通信
- 测试按键响应
- 观察LED状态变化
- 测试通信稳定性
5.3 串口调试助手设置
端口:COMx(根据实际选择) 波特率:9600 数据位:8 停止位:1 校验位:None 流控制:None6. 常见问题与解决方案
6.1 通信失败
现象:按键按下后从机LED无反应
解决方法:
- 检查TXD和RXD是否交叉连接
- 确认波特率设置一致(9600)
- 检查地线是否连接
- 验证串口线是否完好
6.2 按键响应不稳定
现象:需要多次按键才能触发
解决方法:
- 增加消抖延时时间
- 优化按键扫描算法
- 检查按键硬件连接
6.3 LED不亮
现象:发送命令后LED不亮
解决方法:
- 确认LED连接在P1.0
- 检查LED方向是否正确
- 验证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 CHECKSUM7.3 状态反馈
从机向主机发送状态反馈:
// 从机收到命令后回复 void SendResponse(unsigned char status) { SBUF = status; while(!TI); TI = 0; }8. 项目总结
本项目通过学习板实现了基本的串口通信功能,具有以下特点:
8.1 技术要点
- 串口通信:掌握了51单片机串口通信的基本原理
- 中断应用:学习了串口中断的使用方法
- 按键处理:掌握了按键消抖和状态检测技术
- 协议设计:了解了简单的通信协议设计
8.2 学习收获
- 理解主从机通信的基本概念
- 掌握串口通信的硬件连接方法
- 学会使用串口调试工具
- 能够独立完成简单的通信项目
8.3 应用前景
本项目为基础,可扩展为:
- 智能家居控制系统
- 工业监控系统
- 机器人控制系统
- 物联网终端设备
版权声明:本文为原创内容,转载请注明出处
关键词:HL-1学习板、STC89C52、串口通信、单片机、按键控制、LED控制、51单片机
技术标签:#单片机#串口通信#STC89C52#HL-1#嵌入式开发