智能小车是嵌入式入门的经典项目,本文分享一款基于 STC89C52RC + 深圳大夏龙雀科技 DX-BT37 蓝牙模块 打造的多功能智能小车,集蓝牙遥控、超声波避障、红外避障、RGB炫彩灯效于一体。
在做这个项目之前,我对比了市面上多款蓝牙模块,最终选择大夏龙雀的BT37,核心原因有二:一是它采用 BK3633 芯片,支持 蓝牙 5.2 协议,抗干扰能力强;二是工作电流仅 5mA 左右,对电池供电的小车来说非常友好;实际测试中,能够稳定连接,完全满足智能小车的遥控需求。
一、项目功能概览
1.1 功能清单
|
蓝牙遥控 |
前进、后退、左转、右转、停止、变速、模式切换 |
BT37 BLE 透传 + 手机APP |
|
超声波避障 |
前方测距,自动减速、停车 |
HC-SR04 超声波模块 |
|
红外避障 |
两侧检测障碍物,自动转向 |
红外避障模块 |
|
RGB炫彩灯 |
前大灯/转向灯/呼吸灯/彩虹灯 |
RGB LED + PWM 混色 |
|
速度控制 |
5档速度可调 |
MX1508 PWM 调速 |
|
电源管理 |
锂电池供电 + TP4056 充电 |
两节18650 + TP4056 |
1.2 项目亮点
-
入门友好:以 STC89C52RC 为主控,51单片机是高校嵌入式入门的首选,代码简单易懂
-
蓝牙稳定:采用大夏龙雀 BT37 蓝牙 5.2 模块,遥控体验流畅
-
功能齐全:遥控 + 避障 + 灯效 + 调速
-
成本低廉:全部物料加起来不到50元
二、系统总体架构
整个系统采用 "手机端(APP)— BT37蓝牙模块 — STC89C52主控 — 执行层(电机、传感器、灯光)" 的三层架构:

2.1 工作原理
蓝牙连接:BT37 模块上电后自动广播,手机蓝牙搜索并建立 BLE 连接,WORK-STATUS 引脚输出高电平表示连接成功
指令下发:用户在手机端点击方向键或功能按钮,指令通过 BLE 透传至 BT37 模块
UART通信:BT37 通过 UART(默认波特率9600)将指令发送给 STC89C52RC 主控
指令解析:51单片机解析指令,执行对应的电机驱动、传感器读取或灯效变换
状态回传:传感器数据和运行状态通过蓝牙回传到手机端显示
2.2 硬件选型清单
|
主控 |
STC89C52RC |
– |
×1 |
51单片机,8051内核,LQFP-44 |
|
蓝牙 |
大夏龙雀 DX-BT37 |
UART |
×1 |
BLE5.2,BK3633芯片,AT指令配置 |
|
电机驱动 |
MX1508 |
PWM |
×1 |
双路直流电机驱动,低功耗 |
|
电机 |
直流减速电机(带轮胎) |
– |
×2 |
TT马达,1:48减速比 |
|
超声波 |
HC-SR04 |
触发+回波 |
×1 |
测距范围2cm~400cm |
|
红外避障 |
红外对管模块 |
数字输出 |
×2 |
左右各一,检测障碍物 |
|
灯光 |
RGB LED(共阴) |
PWM |
×1 |
三原色混合,炫彩效果 |
|
电源 |
18650 锂电池 |
– |
×2 |
3.7V串联,7.4V供电 |
|
充电 |
TP4056 充电模块 |
– |
×1 |
锂电池并联充电(改装后) |
|
搭建 |
面包板 + 杜邦线 + 车底盘 |
– |
1套 |
免焊接,快速原型 |
三、硬件设计与连接

3.1 硬件连接总览
全部电路通过面包板 + 杜邦线搭建,无需PCB,零基础也能快速上手。连接示意图如下:

3.2 STC89C52RC 引脚分配
// STC89C52RC 引脚分配
#define MOTOR_L_IN1 P1_0 // 左电机 IN1
#define MOTOR_L_IN2 P1_1 // 左电机 IN2
#define MOTOR_R_IN1 P1_2 // 右电机 IN1
#define MOTOR_R_IN2 P1_3 // 右电机 IN2
// ========== 超声波 HC-SR04 ==========
#define TRIG_PIN P2_0 // 触发信号
#define ECHO_PIN P2_1 // 回波信号
// ========== 红外避障 ==========
#define IR_LEFT P2_2 // 左红外
#define IR_RIGHT P2_3 // 右红外
// ========== RGB LED ==========
#define LED_R P1_4 // 红灯
#define LED_G P1_5 // 绿灯
#define LED_B P1_6 // 蓝灯
3.3 MX1508 电机驱动原理
MX1508 是一款双通道直流电机驱动芯片,体积小、功耗低,非常适合小型智能小车:
|
1 |
0 |
正转 |
|
0 |
1 |
反转 |
|
1 |
1 |
刹车 |
|
0 |
0 |
滑行 |
通过 PWM 信号控制 IN1/IN2 的占空比即可实现调速。STC89C52 没有硬件 PWM,可使用定时器中断模拟 PWM 输出,也可以用 PCA 模块实现(STC89C52RC 带 PCA 功能)。
3.4 HC-SR04 超声波测距原理

超声波模块通过发射40kHz方波,检测回波时间计算距离:
// 超声波测距函数
float HC_SR04_GetDistance(void)
{
unsigned int time;
float distance;
TRIG_PIN = 0;
delay_us(5);
TRIG_PIN = 1; // 发送10us触发脉冲
delay_us(10);
TRIG_PIN = 0;
while(ECHO_PIN == 0); // 等待回波
TR0 = 1; // 启动定时器0计时
while(ECHO_PIN == 1); // 等待回波结束
TR0 = 0; // 停止计时
time = TH0 * 256 + TL0; // 读取计时值
TH0 = 0; TL0 = 0; // 清零
// 距离 = 时间 × 声速 / 2
// 声速340m/s = 34000cm/s = 0.034cm/us
distance = (float)time * 0.017; // 除以2
return distance;
}
3.5 电源方案设计
电源是小车的"心脏",本项目采用双节18650锂电池方案:
-
动力供电:两节18650串联,输出约7.4V,直接给 MX1508 和电机供电,保证动力充足
-
控制供电:通过 AMS1117-3.3V 降压,给 STC89C52、BT37、传感器供电(STC89C52可宽压3.3~5V工作,建议3.3V以匹配BT37电平)
-
充电方案:将两节电池改为并联(3.7V),通过 TP4056 单芯片充电,充满后切换回串联模式使用
-
注意事项:BT37 工作电压 2.0~3.6V,严禁直接接7.4V,必须经过稳压!
注意:BT37 模块的 VBAT 引脚建议就近放置 22uF + 0.1uF 两个滤波电容,减少射频突发传输时的电压跌落,提高通信稳定性。这是手册里特别强调的细节,实测确实有效。
3.6 电平匹配注意事项
STC89C52 是 5V 单片机,而 BT37 是 3.3V 模块,两者串口通信需要注意电平匹配:
-
BT37 TX → STC89C52 RX:3.3V 高电平可以被 5V 单片机识别为高电平,直接连接即可
-
STC89C52 TX → BT37 RX:5V 高电平超过 BT37 的 3.6V 最大耐压,必须使用电平转换模块降压
最简单的方案:串联一个 1KΩ 电阻 + 3.3V 钳位二极管,或者直接用分压电路(2K + 3.3K 电阻分压)。
四、大夏龙雀 DX-BT37 蓝牙模块

BT37 是整个项目的无线通信核心,这里专门展开讲一下这款模块的技术特点和使用心得。
4.1 模块核心参数
|
芯片型号 |
BK3633 |
|
蓝牙协议 |
蓝牙 5.2 |
|
工作电压 |
2.0~3.6V |
|
工作电流 |
约5mA |
|
深度睡眠电流 |
约1μA |
|
空旷通信距离 |
181.6m |
4.2 为什么选 BT37?
我之前也用过其他品牌的蓝牙模块,综合对比下来,大夏龙雀 BT37 的优势体现在:
BT37支持蓝牙5.2,连接速度更快、功耗更低、AT指令丰富,板载天线,无需额外设计天线电路。
4.3 AT指令配置示例
BT37 的 AT 指令与 BT36 兼容,我常用指令如下(注意实测发现部分AT指令需重启后才能生效):
// AT 指令示例(串口发送,返回OK表示成功)
"AT\\r\\n" // 测试AT指令是否正常
"AT+NAME=MyCar\\r\\n" // 设置设备名称为 MyCar
"AT+BAUD=9600\\r\\n" // 设置波特率9600
"AT+PWR=7\\r\\n" // 设置发射功率(0-9级)
"AT+UUID=FFE0\\r\\n" // 设置服务UUID
"AT+PWRM=0\\r\\n" // 设置功耗模式(0正常,1低功耗,2冬眠)
"AT+RESET\\r\\n" // 复位模块
4.4 供电参考电路

五、通信协议设计
5.1 指令格式
采用简洁的文本指令协议,以 \\r\\n 结尾,便于调试:
// ========== 运动控制指令 ==========
"FWD\\r\\n" // 前进
"BACK\\r\\n" // 后退
"LEFT\\r\\n" // 左转
"RIGHT\\r\\n" // 右转
"STOP\\r\\n" // 停止
// ========== 速度控制 ==========
"SPD:1\\r\\n" // 速度1档
"SPD:2\\r\\n" // 速度2档
"SPD:3\\r\\n" // 速度3档
"SPD:4\\r\\n" // 速度4档
"SPD:5\\r\\n" // 速度5档
// ========== 灯效控制 ==========
"LED:0\\r\\n" // 关灯
"LED:1\\r\\n" // 前大灯(白光常亮)
"LED:2\\r\\n" // 左转灯(黄色闪烁)
"LED:3\\r\\n" // 右转灯(黄色闪烁)
"LED:4\\r\\n" // 刹车灯(红色常亮)
"LED:5\\r\\n" // 呼吸灯(RGB渐变)
"LED:6\\r\\n" // 彩虹灯(RGB循环)
// ========== 模式切换 ==========
"MODE:0\\r\\n" // 手动遥控模式
"MODE:1\\r\\n" // 自动避障模式
// ========== 数据查询 ==========
"GET:DIST\\r\\n" // 查询前方距离
// ========== 回复格式 ==========
"OK\\r\\n" // 执行成功
"ERR\\r\\n" // 执行失败
"DIST:25.3\\r\\n" // 距离数据(cm)
5.2 串口解析实现
STC89C52 使用硬件串口中断接收数据,逐字节解析:
#define RX_BUF_SIZE 32
unsigned char rx_buf[RX_BUF_SIZE];
unsigned char rx_index = 0;
bit cmd_ready = 0;
// 串口中断服务函数
void UART_ISR() interrupt 4
{
unsigned char ch;
if(RI) {
RI = 0;
ch = SBUF;
if(ch == '\\n' || rx_index >= RX_BUF_SIZE – 1) {
rx_buf[rx_index] = '\\0';
cmd_ready = 1;
rx_index = 0;
} else if(ch != '\\r') {
rx_buf[rx_index++] = ch;
}
}
}
// 主循环中处理指令
void main(void)
{
UART_Init(); // 串口初始化,9600波特率
Motor_Init(); // 电机初始化
LED_Init(); // LED初始化
HC_SR04_Init(); // 超声波初始化
while(1) {
if(cmd_ready) {
cmd_ready = 0;
Parse_Command(rx_buf);
}
// 自动避障模式
if(auto_mode) {
Obstacle_Avoidance();
}
// LED灯效任务
LED_Task();
}
}
六、软件架构与控制流程

6.1 主循环结构
整个系统采用前后台架构:中断负责数据接收和PWM时序,主循环负责指令解析和业务逻辑。
// 主循环概览
void main(void)
{
System_Init(); // 系统初始化
while(1) {
// 1. 处理蓝牙指令
if(cmd_ready) {
Parse_Command(rx_buf);
cmd_ready = 0;
}
// 2. 自动避障模式
if(auto_mode) {
Obstacle_Avoidance_Task();
}
// 3. LED灯效刷新
LED_PWM_Update();
// 4. 定时采集传感器
if(timer_100ms) {
timer_100ms = 0;
sensor_distance = HC_SR04_GetDistance();
}
}
}
6.2 自动避障算法
void Obstacle_Avoidance_Task(void)
{
float dist = HC_SR04_GetDistance();
if(dist < 10.0) {
// 距离太近,停车后退
Motor_Backward();
delay_ms(500);
Motor_TurnRight();
delay_ms(800);
}
else if(IR_LEFT == 0) {
// 左边有障碍物,右转
Motor_TurnRight();
delay_ms(300);
}
else if(IR_RIGHT == 0) {
// 右边有障碍物,左转
Motor_TurnLeft();
delay_ms(300);
}
else {
// 前方畅通,前进
Motor_Forward();
}
}
七、手机APP控制端
为了让小车的控制更便捷,开发了配套的 蓝牙控制APP(也可用微信小程序实现),通过 BLE 直接连接 BT37 模块:

APP功能
|
方向控制 |
D-pad方向键,前进/后退/左转/右转/停止 |
|
速度调节 |
5档速度滑块,实时调整车速 |
|
模式切换 |
手动遥控 / 自动避障 一键切换 |
|
灯效控制 |
大灯/转向灯/刹车灯/呼吸灯/彩虹灯 |
|
状态显示 |
连接状态、电池电压、前方距离 |
八、机械结构与组装

8.1 车体结构
小车采用双层结构设计:
-
底层:电机驱动板(MX1508)+ 电池 + 电机 + 车轮 + 红外
-
上层:STC89C52 主控板 + BT37 蓝牙模块 + 超声波 + RGB灯
这样的布局好处是重心低、行驶稳定,同时传感器安装在前端,检测更灵敏。
8.2 组装要点
电机固定:使用铜柱将电机支架固定在底盘上,确保左右电机对称
万向轮:前端安装一个万向轮作为支撑,使小车能够灵活转向
电池仓:建议设计专门的电池仓,避免电池晃动影响重心
传感器高度:超声波和红外避障模块安装高度约3~5cm,与地面平行
布线整理:用扎带整理线束,避免线材缠绕车轮
九、实测问题记录
9.1 超声波测距不准
确保 TRIG 触发脉冲宽度 ≥ 10us
可以多次采样取平均值,减小误差
9.2 小车走不直
左右电机转速有差异,软件上做速度补偿,也可以在程序中微调左右PWM占空比
检查轮胎是否安装到位,万向轮是否灵活
十、项目总结
基本物料总结
|
STC89C52RC 最小系统板 |
约3元 |
×1 |
|
大夏龙雀 DX-BT37 蓝牙模块 |
约1元 |
×1 |
|
MX1508 电机驱动 |
约3元 |
×1 |
|
TT减速电机 + 轮胎 |
约8元 |
×2 |
|
HC-SR04 超声波模块 |
约4元 |
×1 |
|
红外避障模块 |
约2元 |
×2 |
|
RGB LED + 电阻 |
约1元 |
×1 |
|
18650 锂电池 + 电池盒 |
约6元 |
×2 |
|
TP4056 充电模块 |
约2元 |
×1 |
|
车底盘 + 万向轮 |
约8元 |
1套 |
|
面包板 + 杜邦线 |
约5元 |
若干 |
|
AMS1117-3.3V + 电容 |
约1元 |
×1 |
不到50元的成本,就能做出一台功能齐全的蓝牙智能小车,性价比非常高。
对于入门嵌入式的朋友来说,做一台自己的蓝牙智能小车,是学习单片机、电机驱动、传感器和蓝牙通信的绝佳练手项目。希望这篇文章能给你带来启发,也欢迎在评论区交流你的创意!
网硕互联帮助中心






评论前必须登录!
注册