基于51单片机的蓝牙控制小车程序(HC-05+L298N)

基于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→右电机     |  
+-------------------+          +-------------------+          +-------------------+

关键说明

三、软件设计(Keil C51)

3.1 开发环境

3.2 核心原理

  1. 蓝牙通信:HC-05与手机APP配对后,通过串口(P3.0/RXD、P3.1/TXD)接收指令,波特率9600bps。
  2. 指令解析:单片机接收单字符指令,映射为电机控制动作(如'F'=前进,'L'=左转)。
  3. 电机控制:通过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 硬件连接

4.2 功能测试

  1. 手机APP配置:安装“蓝牙调试器”,连接HC-05,设置发送单字符('F'/'B'/'L'/'R'/'S')。
  2. 动作测试:发送'F',小车前进;发送'L',左转;发送'S',停止,观察是否与指令一致。

参考代码 51单片机蓝牙控制小车程序 www.youwenfan.com/contentcss/182664.html

五、总结

基于51单片机和HC-05蓝牙模块实现了小车无线控制,核心是串口通信和电机驱动逻辑。通过模块化设计,可扩展PWM调速(用定时器生成PWM波)、避障功能(添加超声波传感器)或循迹功能(添加红外对管),满足更复杂的控制需求。

 

专注于matlab/simulink,电子电路,编程