基于51单片机的蓝牙控制小车程序(HC-05+L298N)
一、系统概述
基于STC89C52RC单片机(11.0592MHz晶振),通过HC-05蓝牙模块实现手机APP与单片机的无线通信,结合L298N电机驱动模块控制2路直流减速电机,实现小车的前进、后退、左转、右转、停止及调速功能。系统支持实时指令响应和低功耗设计,适用于教育机器人、玩具小车等场景。
二、硬件设计
2.1 核心组件选型
| 模块 | 型号/参数 | 功能说明 |
|---|---|---|
| 主控 | STC89C52RC(8KB Flash,512B RAM) | 蓝牙指令解析、电机控制逻辑、状态管理 |
| 蓝牙模块 | HC-05(主从一体,蓝牙2.0) | 与手机APP通信(串口透传,波特率9600bps) |
| 电机驱动 | L298N(双H桥,2A/路) | 驱动2路直流电机(正转/反转/调速) |
| 电机 | 2×直流减速电机(6V,带轮) | 小车动力(左/右轮,差速转向) |
| 电源 | 7.4V锂电池(或5V/2A DC) | 为L298N和电机供电(单片机用5V稳压) |
| 手机APP | 蓝牙串口调试器(如“蓝牙调试器”) | 发送控制指令(字符型,如'F'=前进) |
2.2 硬件连接图
+-------------------+ +-------------------+ +-------------------+
| STC89C52RC | | HC-05 | | L298N驱动模块 |
| P3.0(RXD) ← HC-05|TXD | VCC→5V, GND→GND | | VCC→7.4V, GND→GND |
| P3.1(TXD) → HC-05|RXD | STATE→P3.7(状态指示)| | IN1→P2.0, IN2→P2.1 |
| P2.0~P2.3 → L298N|IN1~IN4 | | | IN3→P2.2, IN4→P2.3 |
| P1.0 → L298N|ENA(左电机PWM) | | | ENA→P1.0, ENB→P1.1 |
| P1.1 → L298N|ENB(右电机PWM) | | | OUT1/2→左电机 |
| +5V稳压 → 单片机VCC | | | OUT3/4→右电机 |
+-------------------+ +-------------------+ +-------------------+
关键说明:
- HC-05:默认波特率9600bps,8N1,通过AT指令可配置为主/从模式(本设计设为主模式,手机连接从机)。
- L298N:IN1/IN2控制左电机(正转/反转),IN3/IN4控制右电机,ENA/ENB为使能端(高电平有效,接PWM可调速)。
三、软件设计(Keil C51)
3.1 开发环境
- IDE:Keil μVision5(C51编译器)
- 晶振:11.0592MHz(确保串口波特率误差<1%)
- 通信协议:蓝牙串口透传(手机APP发送单字符指令,如'F'/'B'/'L'/'R'/'S')
3.2 核心原理
- 蓝牙通信:HC-05与手机APP配对后,通过串口(P3.0/RXD、P3.1/TXD)接收指令,波特率9600bps。
- 指令解析:单片机接收单字符指令,映射为电机控制动作(如'F'=前进,'L'=左转)。
- 电机控制:通过L298N的IN1~IN4控制电机转向,ENA/ENB接PWM信号(本设计用IO口模拟PWM,占空比可调)。
3.3 核心代码实现
3.3.1 头文件与引脚定义
#include <reg52.h>
#include <intrins.h>
// ==================== 引脚定义 ====================
// 蓝牙模块(HC-05):P3.0=RXD(接收),P3.1=TXD(发送)
#define BLUETOOTH_RXD P3_0
#define BLUETOOTH_TXD P3_1
// L298N电机驱动
#define MOTOR_IN1 P2_0 // 左电机正转
#define MOTOR_IN2 P2_1 // 左电机反转
#define MOTOR_IN3 P2_2 // 右电机正转
#define MOTOR_IN4 P2_3 // 右电机反转
#define MOTOR_ENA P1_0 // 左电机使能(PWM)
#define MOTOR_ENB P1_1 // 右电机使能(PWM)
// 状态指示(LED)
#define LED_RUN P3_7 // 运行状态灯(闪烁表示正常)
// ==================== 全局变量 ====================
unsigned char bluetooth_cmd = 0; // 蓝牙接收指令('F'/'B'/'L'/'R'/'S')
bit cmd_received = 0; // 指令接收完成标志
3.3.2 延时函数(微秒/毫秒级,11.0592MHz)
// 微秒延时(误差±1us)
void DelayUs(unsigned int us) {
while (us--) {
_nop_(); _nop_(); _nop_(); _nop_(); // 4个_nop_≈3.6us(需根据晶振调整)
}
}
// 毫秒延时
void DelayMs(unsigned int ms) {
unsigned int i, j;
for (i=0; i<ms; i++)
for (j=0; j<110; j++); // 110次循环≈1ms
}
3.3.3 串口初始化(蓝牙通信,9600bps)
// 串口初始化(模式1,8N1,波特率9600bps@11.0592MHz)
void UART_Init() {
SCON = 0x50; // 模式1(8位UART),允许接收(REN=1)
TMOD |= 0x20; // 定时器1模式2(8位自动重装)
TH1 = 0xFD; // 波特率9600bps:TH1=256-11059200/(12×32×9600)=253=0xFD
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
ES = 1; // 允许串口中断
EA = 1; // 开总中断
}
3.3.4 电机控制函数(L298N驱动)
// 左电机控制(dir:0=停,1=正转,2=反转,speed=0~100%占空比)
void Motor_Left(unsigned char dir, unsigned char speed) {
if (dir == 0) { // 停止
MOTOR_IN1 = 0; MOTOR_IN2 = 0;
} else if (dir == 1) { // 正转
MOTOR_IN1 = 1; MOTOR_IN2 = 0;
} else if (dir == 2) { // 反转
MOTOR_IN1 = 0; MOTOR_IN2 = 1;
}
MOTOR_ENA = (speed > 0) ? 1 : 0; // 使能(PWM简化:高电平=全速,低=停止)
}
// 右电机控制(同上)
void Motor_Right(unsigned char dir, unsigned char speed) {
if (dir == 0) { // 停止
MOTOR_IN3 = 0; MOTOR_IN4 = 0;
} else if (dir == 1) { // 正转
MOTOR_IN3 = 1; MOTOR_IN4 = 0;
} else if (dir == 2) { // 反转
MOTOR_IN3 = 0; MOTOR_IN4 = 1;
}
MOTOR_ENB = (speed > 0) ? 1 : 0;
}
// 小车动作函数(简化版,全速)
void Car_Forward() { // 前进
Motor_Left(1, 100); // 左电机正转,全速
Motor_Right(1, 100); // 右电机正转,全速
}
void Car_Backward() { // 后退
Motor_Left(2, 100);
Motor_Right(2, 100);
}
void Car_TurnLeft() { // 左转(左轮停,右轮转)
Motor_Left(0, 0);
Motor_Right(1, 100);
}
void Car_TurnRight() { // 右转(右轮停,左轮转)
Motor_Left(1, 100);
Motor_Right(0, 0);
}
void Car_Stop() { // 停止
Motor_Left(0, 0);
Motor_Right(0, 0);
}
3.3.5 串口中断(蓝牙指令接收)
// 串口中断服务函数(接收蓝牙指令)
void UART_ISR() interrupt 4 {
if (RI) { // 接收中断标志
RI = 0; // 清除标志
bluetooth_cmd = SBUF; // 读取接收字符
cmd_received = 1; // 标记指令接收完成
}
}
3.3.6 主函数(指令解析与执行)
void main() {
UART_Init(); // 初始化串口(蓝牙通信)
LED_RUN = 0; // 初始灯灭
while (1) {
// 1. 状态指示(LED闪烁,1Hz)
LED_RUN = ~LED_RUN;
DelayMs(500);
// 2. 解析蓝牙指令并执行
if (cmd_received) {
cmd_received = 0; // 清除标志
switch (bluetooth_cmd) {
case 'F': Car_Forward(); break; // 前进
case 'B': Car_Backward(); break; // 后退
case 'L': Car_TurnLeft(); break; // 左转
case 'R': Car_TurnRight(); break; // 右转
case 'S': Car_Stop(); break; // 停止
default: break; // 无效指令
}
}
}
}
四、测试与验证
4.1 硬件连接
- 按2.2节连接HC-05(P3.0/P3.1)、L298N(P2.0~P2.3,P1.0/P1.1),电机接L298N输出端,电源用7.4V锂电池(L298N的12V接7.4V,5V输出给单片机)。
4.2 功能测试
- 手机APP配置:安装“蓝牙调试器”,连接HC-05,设置发送单字符('F'/'B'/'L'/'R'/'S')。
- 动作测试:发送'F',小车前进;发送'L',左转;发送'S',停止,观察是否与指令一致。
参考代码 51单片机蓝牙控制小车程序 www.youwenfan.com/contentcss/182664.html
五、总结
基于51单片机和HC-05蓝牙模块实现了小车无线控制,核心是串口通信和电机驱动逻辑。通过模块化设计,可扩展PWM调速(用定时器生成PWM波)、避障功能(添加超声波传感器)或循迹功能(添加红外对管),满足更复杂的控制需求。