用手机App玩转单片机LED:一个HC-06蓝牙模块的完整物联网小项目(附STC89C52代码)
在智能家居和物联网设备遍地开花的今天,你是否想过自己动手打造一个可以通过手机控制的智能硬件?本文将带你从零开始,用最常见的STC89C52单片机和HC-06蓝牙模块,构建一个完整的手机遥控LED系统。这个项目不仅适合嵌入式开发新手入门,也能让创客爱好者快速体验物联网的乐趣。
1. 项目准备与硬件连接
1.1 所需材料清单
在开始项目前,我们需要准备以下硬件设备:
- STC89C52单片机开发板(或兼容的51系列开发板)
- HC-06蓝牙模块(建议选择带4针接口的版本)
- USB转TTL模块(用于程序烧录和调试)
- LED灯组(8个LED灯,或使用开发板上的P2口LED)
- 杜邦线若干(公对公、公对母各准备一些)
- 5V电源适配器(或使用开发板的USB供电)
提示:购买HC-06模块时,注意区分主从模式版本。本项目使用从机模式即可,价格通常在15-25元之间。
1.2 硬件连接示意图
正确的硬件连接是项目成功的第一步。下面是各模块间的接线方式:
| 模块 | 引脚 | 连接目标 | 引脚 |
|---|---|---|---|
| HC-06蓝牙模块 | VCC | 开发板 | 5V |
| GND | 开发板 | GND | |
| TXD | 开发板 | RXD(P3.0) | |
| RXD | 开发板 | TXD(P3.1) | |
| STC89C52 | P2.0-P2.7 | LED灯组 | 正极 |
| GND | LED灯组 | 负极 |
重要注意事项:
- 蓝牙模块的TXD应连接单片机的RXD,RXD连接单片机的TXD
- 烧录程序时,需要断开蓝牙模块与单片机的连接,否则可能导致烧录失败
- LED灯组需要串联限流电阻(通常220Ω-1kΩ)
2. 单片机程序设计
2.1 串口通信基础配置
STC89C52单片机通过串口与HC-06蓝牙模块通信。我们需要正确配置串口参数,确保数据传输的稳定性。以下是基于11.0592MHz晶振的配置代码:
#include <REGX52.H> // 串口初始化函数,波特率9600 void UartInit(void) { PCON &= 0x7F; // 波特率不倍速 SCON = 0x50; // 8位数据,可变波特率 TMOD &= 0x0F; // 清除定时器1模式位 TMOD |= 0x20; // 设置定时器1为8位自动重装模式 TL1 = 0xFD; // 设置定时初始值 TH1 = 0xFD; // 设置定时重载值 ET1 = 0; // 禁止定时器1中断 TR1 = 1; // 启动定时器1 ES = 1; // 开启串口中断 EA = 1; // 开启总中断 }2.2 主程序与中断处理
主程序主要负责初始化工作,而实际的数据处理在串口中断服务程序中完成:
void main() { UartInit(); // 初始化串口 while(1) { // 主循环可以添加其他功能 } } // 串口中断服务程序 void Uart_Interrupt() interrupt 4 { if(RI == 1) { // 检查接收中断标志 P2 = SBUF; // 将接收到的数据直接输出到P2口 RI = 0; // 清除接收中断标志 } }这段代码的工作原理是:
- 手机发送的数据通过蓝牙传输到HC-06模块
- HC-06通过串口将数据发送给单片机
- 单片机在串口中断中接收数据,并直接输出到P2口
- P2口连接的LED会根据接收到的数据亮灭
2.3 程序烧录与测试
使用STC-ISP等烧录工具将程序写入单片机:
- 选择正确的单片机型号(STC89C52RC)
- 设置正确的COM端口(通过设备管理器查看)
- 打开编译生成的.hex文件
- 点击"下载/编程"按钮
- 给单片机上电开始烧录
注意:烧录时需要断开蓝牙模块与单片机的连接,否则可能导致通信冲突。
3. 手机端配置与调试
3.1 蓝牙调试APP选择
市面上有多种蓝牙串口调试APP可供选择,以下是几款常见应用的对比:
| 应用名称 | 平台 | 特点 | 推荐指数 |
|---|---|---|---|
| 蓝牙串口助手 | Android | 界面简洁,功能齐全 | ★★★★★ |
| Serial Bluetooth | Android | 支持多种数据格式 | ★★★★☆ |
| LightBlue | iOS | 专业级蓝牙调试工具 | ★★★★☆ |
| BTool | Android | 支持AT指令调试 | ★★★☆☆ |
3.2 连接与通信测试
完成硬件连接和程序烧录后,按照以下步骤测试系统:
- 给开发板和蓝牙模块上电
- 打开手机蓝牙设置,搜索并配对HC-06(默认密码通常是1234或0000)
- 打开蓝牙串口调试APP,选择已配对的HC-06设备
- 在发送框中输入十六进制数据(如FF、55、AA等)
- 观察开发板上LED的变化
常用测试指令:
FF:所有LED亮00:所有LED灭55:间隔点亮LED(01010101)AA:间隔点亮LED(10101010)
4. 项目扩展与进阶应用
4.1 增加控制指令集
基础的直接输出控制虽然简单,但缺乏灵活性。我们可以设计一套简单的指令协议:
void Uart_Interrupt() interrupt 4 { if(RI == 1) { unsigned char cmd = SBUF; RI = 0; switch(cmd) { case 'A': P2 = 0xFF; break; // 全亮 case 'B': P2 = 0x00; break; // 全灭 case 'C': P2 ^= 0xFF; break; // 反转状态 case 'D': P2 <<= 1; break; // 左移 case 'E': P2 >>= 1; break; // 右移 default: P2 = cmd; // 直接输出 } } }这样,手机端可以发送字母指令来实现更丰富的控制效果。
4.2 添加状态反馈功能
当前系统是单向通信,我们可以增加从单片机向手机发送状态信息的功能:
void SendToPhone(unsigned char dat) { SBUF = dat; while(!TI); // 等待发送完成 TI = 0; // 清除发送中断标志 } // 在主循环中添加状态检测 void main() { UartInit(); unsigned char lastP2 = P2; while(1) { if(P2 != lastP2) { SendToPhone(P2); // 状态变化时发送当前值 lastP2 = P2; } } }4.3 进阶应用场景
这个基础项目可以扩展为多种实用设备:
- 智能家居控制器:通过继电器模块控制家电
- 蓝牙遥控小车:控制电机驱动模块
- 环境监测终端:连接温湿度传感器,将数据发送到手机
- 电子门锁系统:结合电磁锁实现手机开锁
5. 常见问题排查
5.1 蓝牙无法连接
可能原因及解决方法:
供电不足:
- 确保蓝牙模块获得稳定的5V电源
- 检查电源线连接是否牢固
配对密码错误:
- 尝试常见密码:1234、0000、8888
- 如需修改密码,需要通过AT指令设置
波特率不匹配:
- 确认蓝牙模块与单片机使用相同波特率
- 默认通常是9600,但也可能是115200
5.2 数据接收不稳定
数据传输异常的可能解决方案:
检查接线:
- 确认TXD-RXD交叉连接
- 检查杜邦线是否接触良好
降低波特率:
- 如果使用12MHz晶振,建议改用4800波特率
- 修改蓝牙模块波特率与之匹配
添加软件校验:
- 在协议中加入校验和
- 实现简单的重传机制
5.3 LED响应不正确
当LED表现与预期不符时:
检查LED极性:
- 确认所有LED方向一致
- 长脚为正极,短脚为负极
验证P2口输出:
- 用万用表测量P2各引脚电压
- 发送FF时应全部为高电平
排查程序问题:
- 确认中断服务程序被正确调用
- 检查SBUF是否被正确读取