这几天有时间做了一个手机控制的蓝牙遥控小车车,终于今天实现了,把过程和心得跟大家分享一下。
废话不多说,先上实物图



一、项目元件清单
1、某宝购买一个智能小车底盘(本人车是四驱的,因此有四个电机,两块亚克力板和一些配件螺丝)
2、L298n模块 两个(一个298控制两个电机)
3、HC-06蓝牙模块
4、电池盒跟18650电池3个
5、单片机最小系统
6、杜邦线至少12根,当然越多越好
7、若干根导线(连接电机用的,以及电池盒连到L298N跟单片机)

二、制作过程
首先,先去了解一下L298N的接线,我当时也是懵逼了好久,反正摸索着也会了,一般店家都有资料。然后是蓝牙模块的使用,拿到蓝牙模块后,有开发板的话(没有就用单片机的烧录器),先按照TXD接TXD,RXD接RXD,打开电脑的串口助手与蓝牙构建通信,打开AT,发送AT指令集,比如设设波特率,改个名字,改个配对的密码。但通过蓝牙与单片机连接通信的时候,就是TXD接RXD了。最后一个就是,本人在接线的时候经常碰壁。比如,你以为接好的线他其实没接好,根本没通,还是拿万用表B了才知道。
因为本人忘了买电池盒,所以我是用12V的直流电接着的,导致遥控车拖着跟电线。
三、实物图
(拖着跟电线以及充电宝供电的车 不过我没通电)

资料内包括L298N的部分资料,以及蓝牙的说明书(看AT指令集就好)和源程序。

/手机蓝牙遥控小车 APP可以在应用市场搜 蓝牙串口助手
左转右转大概是90度 我的是四驱的,如果是只有一个l298N的话就把带2的删了
pwm有十级变速
/

#include <reg52.h>

#define Left_moto2_pwm P0_4 //接驱动模块ENA 使能端,输入PWM信号调节速度 左后轮
#define Right_moto2_pwm P0_5 //接驱动模块ENB 右后轮
#define Left_moto_pwm P1_4 //接驱动模块ENA 使能端,输入PWM信号调节速度 左前轮
#define Right_moto_pwm P1_5 //接驱动模块ENB 右前轮
#define uchar unsigned char
#define uint unsigned int

sbit P0_4=P0^4; //定义P0_4
sbit P0_5=P0^5; //定义P0_5
sbit P1_4=P1^4; //定义P1_4
sbit P1_5=P1^5; //定义P1_5

/电机驱动IO定义/
sbit IN1 = P1^2; //为1 左电机反转 前轮
sbit IN2 = P1^3; //为1 左电机正转 前轮
sbit IN3 = P1^6; //为1 右电机正转 前轮
sbit IN4 = P1^7; //为1 右电机反转 前轮
/*sbit EN1 = P1^4; //为1 左电机使能
sbit EN2 = P1^5; //为1 右电机使能 */

sbit IN5 = P0^2; //为1 左电机反转 后轮
sbit IN6 = P0^3; //为1 左电机正转 后轮
sbit IN7 = P0^6; //为1 右电机正转 后轮
sbit IN8 = P0^7; //为1 右电机反转 后轮
/*sbit EN3 = P0^4; //为1 左电机使能 后轮
sbit EN4 = P0^5; //为1 右电机使能 后轮 */

bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
int pwm=1;

#define left_motor_en EN1 = 1 //左电机使能
#define left_motor_stops EN1 = 0 //左电机停止
#define right_motor_en EN2 = 1 //右电机使能
#define right_motor_stops EN2 = 0 //右电机停止

#define left_motor2_en EN3 = 1 //左电机使能 后
#define left_motor2_stops EN3 = 0 //左电机停止 后
#define right_motor2_en EN4 = 1 //右电机使能 后
#define right_motor2_stops EN4 = 0 //右电机停止 后

#define left_motor_go IN1 = 0, IN2 = 1//左电机正传
#define left_motor_back IN1 = 1, IN2 = 0//左电机反转
#define right_motor_go IN3 = 1, IN4 = 0//右电机正传
#define right_motor_back IN3 = 0, IN4 = 1//右电机反转

#define left_motor2_go IN5 = 0, IN6 = 1//左电机正传
#define left_motor2_back IN5 = 1, IN6 = 0//左电机反转
#define right_motor2_go IN7 = 1, IN8 = 0//右电机正传
#define right_motor2_back IN7 = 0, IN8 = 1//右电机反转

unsigned char pwm_val_left =0;//变量定义
unsigned char push_val_left =0;// 左电机占空比N/10
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右电机占空比N/10

void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x–)
for(y = 114; y > 0 ; y–);
}

//蓝牙初始化
void UART_INIT()
{
SM0 = 0;
SM1 = 1;//串口工作方式1
REN = 1;//允许串口接收
EA = 1;//开总中断
ES = 1;//开串口中断
TMOD = 0x20;//8位自动重装模式
TH1 = 0xfd;
TL1 = 0xfd;//9600波特率
TR1 = 1;//启动定时器1
}

/************************************************************************/
void run(void) //pwm调速函数
{
push_val_left =pwm; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
push_val_right =pwm; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
if(pwm10) pwm=0;
if(pwm0&&pwm<0) pwm=0;

}

/***********************************************************************/
/
PWM调制电机转速 /
/
***********************************************************************/

/* 左侧电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
void pwm_out_left_moto(void)
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
{ Left_moto_pwm=1;
Left_moto2_pwm=1; }
else
{ Left_moto_pwm=0;Left_moto2_pwm=0; }

if(pwm_val_left>=10)
pwm_val_left=0;
}
else { Left_moto_pwm=0;Left_moto2_pwm=0; }
}
/*****************************************************************/
/
右侧电机调速 /
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{ Right_moto_pwm=1;
Right_moto2_pwm=1; }
else
{Right_moto_pwm=0;
Right_moto2_pwm=0;}
if(pwm_val_right>=10)
pwm_val_right=0;
}
else {Right_moto_pwm=0;Right_moto2_pwm=0; }
}
/
**************************************************/
///TIMER0中断服务子函数产生PWM信号/
void timer0()interrupt 1 using 2
{
TH0=0XF8; //1Ms定时
TL0=0X30;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}

//小车前进
void forward()
{
ET0 = 1;
run(); //pwm 程序
left_motor_go; //左电机前进
right_motor_go; //右电机前进
left_motor2_go; //左电机前进 后轮
right_motor2_go; //右电机前进 后轮
}

void left_go() //左转
{
ET0 = 1;
run();
left_motor_back;
right_motor_go;
left_motor2_back;
right_motor2_go;
delay(700);
forward();
}
//右转
void right_go()
{
ET0 = 1;
run();
delay(50);
right_motor_back;
left_motor_go;
right_motor2_back;
left_motor2_go;
delay(700);
forward();
}
//小车左转圈
void left()
{
ET0 = 1;
run();
delay(50);
right_motor_go; // 右电机前进
left_motor_back; // 左电机后退
right_motor2_go; // 右电机前进
left_motor2_back; // 左电机后退
}

//小车右转圈
void right()
{
ET0 = 1;
run();
left_motor_go;
right_motor_back;
left_motor2_go;
right_motor2_back;
}

//小车后退
void back()
{
ET0 = 1;
run();
left_motor_back;
right_motor_back;
left_motor2_back;
right_motor2_back;
}

//小车停止
void stop()
{
ET0 = 0;
P1=0;
P0=0;
}

//串口中断
void UART_SER() interrupt 4
{
if(RI)
{
RI = 0;//清除接收标志
switch(SBUF)
{
case ‘g’: forward(); break;//前进
case ‘b’: back(); break;//后退
case ‘l’: left(); break;//左转圈
case ‘r’: right(); break;//右转圈
case ‘s’: stop(); break;//停止
case ‘z’: left_go(); break;//左转行驶
case ‘y’: right_go(); break;//右转行驶
case ‘p’: pwm++;break; //加速
case ‘c’: pwm–;break; //减速
}

    }

}

void main()
{
TMOD=0X01;
TH0= 0XF8; //1ms定时
TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
UART_INIT();//串口初始化
while(1);
}

最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
如果需要 完整代码或设计文件,请在下方留言或者私信我,看到后会第一时间回复。

谢谢!

项目小实战:51单片机控制的手机蓝牙遥控小车设计(程序 元件清单 实物图)相关推荐

  1. 基于51单片机的智能超声波四轮遥控小车proteus仿真

    硬件设计 下边讲一下遥控小车,同样是基于51单片机,利用超声波进行测距,利用蓝牙模块实现遥控(仿真里边没有蓝牙,所以采用的是RS485通信模拟) 仿真图: 由LCD1602作为显示器,具有蜂鸣器报警, ...

  2. 51单片机c语言直流电机廷迟启停,51单片机控制直流电机不会加定时器延时程序...

    这是自己改的延时,串口输入1,电机转动,再输入其他没用了 #include void uart_init(); void qudong (unsigned int t); sbit en1=P0^0; ...

  3. 遥控51单片机控制42步进电机(TB6600驱动)控制方向、速度

    遥控51单片机控制步进电机控制方向.速度 控制开发板自带步进电机 遥控控制 控制42步进电机 大二在做srtp时做到了这部分内容,感觉C51控制起来挺简单的,之后有做关于MSP430的魂斗罗游戏和st ...

  4. 详细介绍如何从零开始制作51单片机控制的智能小车(二)———超声波模块、漫反射光电管、4路红外传感器的介绍和使用

       我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,在本系列的上一篇文章中介绍了如何让小车动起来,本文作为本系列的第二篇文章,主要介绍让小车实现自动避障所涉及的一些传感器, ...

  5. 51单片机控制二相四线步进电机

    步进电机按定子上绕组来分,有二相.三相和五相等系列.最受欢迎的是两相混合式步进电机,约占97%以上的市场份额,其原因是性价比高,配上细分驱动器后效果良好.该种电机的基本步距角为1.8°/步,配上半步驱 ...

  6. 51单片机控制TB6600驱动器驱动42步进电机

    51单片机控制TB6600驱动器驱动42步进电机 第一次 功能实现目标 硬件简介 硬件连接 程序代码 第一次 以前总是看别人写的博客,通过别人的博客解决了我很多问题,从中也学到了各种知识,虽然不是很系 ...

  7. 51单片机控制LCD1602模块

    51单片机控制LCD1602模块 视频播放:LCD1602视频 (1)LCD1602概述 先来看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶显示,1602 ...

  8. 51单片机控制步进电机启停,正反转速度——入门

    实验器件 STC89C52RC的学习板子一个 DC 5V 4相5线步进电机 28YBJ-48 减速步进电机一个 元器件连接: 51单片机开发板 电气原理图 实验现象:下载程序后: 当按下KEY1键可调 ...

  9. 51单片机控制的数字温度计 PROTEUS 和51单片机教程

    51单片机控制的数字温度计 总览部分 MCU部分 显示部分 开仿真以后实时显示温度 因为这个程序比较简单,我就直接上代码了,有不明白的请看我以前的文章,谢谢哦! 参考代码如下: #include &q ...

最新文章

  1. python爬虫基础教程115_Python解析网页源代码中的115网盘链接实例
  2. centos7下NFS服务器的搭建与配置
  3. ListCtrl添加右键菜单(ListCtrl类里编辑,给ListCtrl 发送NM_RCLICK消息)
  4. ocelot简单入门
  5. 数据结构链表之双向链表:Python3 实现双向链表——2
  6. django上传文件到服务器,如何用django将文件上传到服务器?
  7. oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)
  8. 知名互联网公司系统架构图[第3期]
  9. spring揭秘 读书笔记 六 bean的一生
  10. qrect在图片上显示矩形框_Mac上用LabelImg手动标记图片
  11. Phobos勒索病毒完整处理过程
  12. Android移动应用开发大作业——日程管理+邮件反馈
  13. win10-用户忘记密码如何登录
  14. codeforces topcoder 指南
  15. 批量删除 Word 文件中的分页符
  16. c++ 智能指针 (std::weak_ptr)(三)
  17. java爬取今日头条_今日头条抓取街拍图片数据集
  18. JAVA:Java Swing 练习题
  19. 计算机桌面所有的图标突然不见了怎么办,桌面上图标都不见了怎么办
  20. 共建通往天堂的巴别塔

热门文章

  1. buttongroup控件的SelectionChangeFcn的用法
  2. 苹果CMSv10自定义添加分类详细教程
  3. 胶原蛋白的主要功效,胶原蛋白怎么补最有效
  4. 操作剪贴板相关的事件
  5. DIY制作示波器的超详细教程:(四)神形合一,让你的示波器动起来! ——制作调试篇
  6. 仿淘宝、头条上下轮播广告
  7. ofbiz 新建模块
  8. ImageView你不知道的一些问题
  9. Android 12 - 跟踪利器 WinScope
  10. 实施领域驱动设计(Implementing Domain Driven Design翻译)