1、系统功能介绍
本设计题目为基于51单片机的手机蓝牙控制8位LED灯亮灭设计。该系统以STC89C52单片机为核心,结合蓝牙模块与LED灯驱动电路,实现了通过手机蓝牙APP对8个LED灯的远程控制。与传统的简单LED点亮电路相比,本系统不仅可以实现对单个LED的开关控制,还能够实现亮度调节和批量控制,具有较强的互动性和应用价值。
系统的主要功能包括:
- 单灯控制:通过手机发送命令,可以选择任意一盏LED灯并设置其亮灭状态及亮度等级。
- 亮度分级控制:每个LED灯支持三档亮度调节,利用PWM技术实现1档(低亮度)、2档(中亮度)、3档(高亮度)的逐级调节。
- 全灯控制:通过手机APP可一键点亮或关闭全部8盏LED灯,方便快捷。
- 无线通信:通过蓝牙串口模块(如HC-05或HC-06),实现手机APP与单片机之间的数据传输。
- 人机交互性:用户仅需在手机APP上点击或发送指令即可控制灯光,无需复杂操作,提升系统的实用性和易用性。
2、电路设计
2.1 主控电路设计(STC89C52单片机)
STC89C52是一款基于8051内核的增强型单片机,具有丰富的I/O口资源和定时器功能,非常适合用于本系统。
在本系统中,单片机的主要作用为:
- 通过串口与蓝牙模块进行通信,接收手机发送的指令;
- 对指令进行解析,判断是控制单个灯、全部灯还是调节亮度;
- 根据指令输出对应的PWM信号,驱动LED灯点亮或熄灭;
- 控制流程逻辑,保证指令与LED灯状态实时对应。
2.2 蓝牙通信模块电路
系统选用HC-05蓝牙串口模块,其支持AT命令配置,可工作在主机或从机模式。在本设计中,HC-05设置为从机模式,手机APP作为主机进行控制。
- 蓝牙模块通过TXD、RXD引脚与单片机串口P3.0(RXD)、P3.1(TXD)连接,实现数据双向传输。
- 波特率一般设置为9600bps,保证通信稳定。
2.3 8位LED灯电路
- 采用8个独立的LED灯,每个LED通过限流电阻与单片机I/O口连接。
- 为了实现亮度的分档控制,单片机通过定时器产生不同占空比的PWM波来驱动LED。
- 系统中8位LED对应单片机的P1口(P1.0~P1.7),可以独立控制每一盏灯的开关与亮度。
2.4 电源电路
- 系统采用+5V直流电源供电,蓝牙模块与单片机均使用5V电压工作。
- 当系统使用移动电源时,可以方便在便携场景下使用。
3、程序设计
3.1 系统总体框架
系统程序分为以下几个主要部分:
- 串口初始化与通信程序:完成与蓝牙模块的数据交互。
- 指令解析程序:解析手机发送的ON、SN、Ax、Bx、Cx等指令。
- PWM控制程序:根据指令控制LED的占空比,从而实现亮度分级控制。
- 状态管理程序:记录当前每盏灯的状态(开关及亮度等级),以便后续指令更新。
主循环流程如下:
- 初始化单片机、串口与定时器;
- 等待接收手机指令;
- 判断指令类别并执行相应的LED控制操作;
- 刷新LED灯显示效果。
3.2 串口通信程序
c
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P1^0;
sbit LED2 = P1^1;
// ... 依次定义到 P1^7
char cmd[3]; // 存储接收到的指令
uint pwm_count = 0; // PWM计数
void Uart_Init(void) {
TMOD = 0x20; // 定时器1工作在方式2
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
TR1 = 1;
SCON = 0x50; // 串口方式1,REN=1
EA = 1;
ES = 1;
}
void Uart_ISR(void) interrupt 4 {
static uchar i = 0;
if(RI) {
RI = 0;
cmd[i] = SBUF;
i++;
if(i >= 2) {
cmd[2] = '\0'; // 形成指令字符串
i = 0;
}
}
}
3.3 指令解析程序
c
void Parse_Command(void) {
if(strcmp(cmd, "ON") == 0) {
P1 = 0xFF; // 所有LED全亮
}
else if(strcmp(cmd, "SN") == 0) {
P1 = 0x00; // 所有LED全灭
}
else if(cmd[0] == 'A') {
int led_num = cmd[1] - '1'; // 计算灯编号
Set_LED(led_num, 1); // 一档
}
else if(cmd[0] == 'B') {
int led_num = cmd[1] - '1';
Set_LED(led_num, 2); // 二档
}
else if(cmd[0] == 'C') {
int led_num = cmd[1] - '1';
Set_LED(led_num, 3); // 三档
}
}
3.4 PWM控制程序
为了实现三档亮度控制,可以通过不同占空比PWM波驱动LED:
- 一档:20% 占空比
- 二档:60% 占空比
- 三档:100% 占空比
c
uchar led_state[8]; // 存储每盏灯的亮度档位
void Timer0_Init(void) {
TMOD |= 0x01;
TH0 = 0xFC; // 定时器初值
TL0 = 0x18;
ET0 = 1;
EA = 1;
TR0 = 1;
}
void Timer0_ISR(void) interrupt 1 {
uint i;
TH0 = 0xFC;
TL0 = 0x18;
pwm_count++;
if(pwm_count >= 100) pwm_count = 0;
for(i=0; i<8; i++) {
if(led_state[i] == 1) { // 一档 20%
if(pwm_count < 20) P1 |= (1<<i);
else P1 &= ~(1<<i);
}
else if(led_state[i] == 2) { // 二档 60%
if(pwm_count < 60) P1 |= (1<<i);
else P1 &= ~(1<<i);
}
else if(led_state[i] == 3) { // 三档 100%
P1 |= (1<<i);
}
else {
P1 &= ~(1<<i); // 关灯
}
}
}
3.5 LED控制函数
c
void Set_LED(int num, int level) {
if(num >= 0 && num < 8) {
led_state[num] = level;
}
}
4、总结
本设计基于STC89C52单片机,结合蓝牙模块和8位LED电路,实现了远程无线灯光控制。用户通过手机APP即可对LED灯进行逐个控制,调节其亮度等级,还能实现全部灯光的统一开关。系统采用PWM技术保证亮度控制的平滑性,同时利用蓝牙串口通信实现人机交互,具有良好的扩展性和应用价值。
该设计不仅展示了单片机在智能控制中的灵活性,也为蓝牙通信与多灯控制的结合提供了参考,可进一步扩展至智能家居照明系统等领域。