51单片机智能蓝牙小车

2023-10-26

作为大一电子小趴菜,在和队友学习制作蓝牙小车过程中遇到了许多困难。本文既为大家避坑,也作为团队总结。


这篇文章分为两部分

1,组装篇

2,代码篇


思维导图:


                               组装篇


         先准备好一块电源拓展板,用于为电机驱动模块和降压模块连接电源

         小车底盘可淘宝定制亚克力板(我们是直接上铜板)

 

(具体组装情况如图) 

 注意事项:

        接线:1.蓝牙模块RXD对单片机的TXD, TXD 对单片机的RXD 。千万别接反,会烧坏!!心急之人常接错!!

                   2. 降压模块和单片机VCC和GND相连,调节降压模块上的螺丝旋钮,用万用表测量输出端电压调至5V

                   3.一个电机驱动模块与两个电机相连(需学习H桥路原理 ,文章最后资源奉上)

       晶振:单片机上的晶振尽量用11.0592Mhz的,通信误差小

       电源:1.充电时一定要在旁守着,充满就拔,不然会炸!

                  2.不要等完全没电才充,会损坏电源寿命


                                代码篇


        在组装完毕后,先不要着急直接上蓝牙,可先烧录小车“前后左右”行驶程序检查有无硬件问题

源码如下:

#include<AT89X52.H>		  //包含51单片机头文件,内部有各种寄存器定义

//定义小车驱动模块输入IO口 
sbit ENA=P1^0;      //右下使能
sbit IN1=P1^1;      // 右下轮
sbit IN2=P1^2;
sbit IN3=P1^3;      //左下轮
sbit IN4=P1^4;
sbit ENB=P1^5;      //左下使能
sbit ena=P2^2;      //左上使能
sbit in1=P2^3;      //左上轮
sbit in2=P2^4;
sbit in3=P2^5;      //右上轮
sbit in4=P2^6;
sbit enb=P2^7;      //右上使能

//延时函数	
   void delay(unsigned int k)
{    
     unsigned int x,y;
	 for(x=0;x<k;x++) 
	   for(y=0;y<2000;y++);
}
/************************************************************************/
//全速前进函数 
     void  run(void)
{    
   in1=1;	 	 
   in2=0;	 
	   in3=1;	 
	   in4=0; 
   IN3=1;	 	 
   IN4=0;	 
	   IN1=1;	 
	   IN2=0;
	 //P1=0X55;
}
/*********************************************************************/		 
/************************************************************************/
//全速后退函数 
     void  backrun(void)
{
    in1=0;	 	 
   in2=1;	 
	   in3=0;	 
	   in4=1; 
   IN3=0;	 	 
   IN4=1;	 
	   IN1=0;	 
	   IN2=1;
}
/*********************************************************************/	
/************************************************************************/
//全速左转函数 
     void  leftrun(void)
{
   in1=0;	 	 
   in2=1;	 
	   in3=1;	 
	   in4=0; 
   IN3=0;	 	 
   IN4=1;	 
	   IN1=1;	 
	   IN2=0;
}
/*********************************************************************/	
/************************************************************************/
//全速右转函数 
     void  rightrun(void)
{
   in1=1;	 	 
   in2=0;	 
	   in3=0;	 
	   in4=1; 
   IN3=1;	 	 
   IN4=0;	 
	   IN1=0;	 
	   IN2=1;
}
/*********************************************************************/	
/************************************************************************/
//电机停止转动函数 
     void  stop(void)
{
   in1=0;	 	 
   in2=0;	 
	   in3=0;	 
	   in4=0; 
   IN3=0;	 	 
   IN4=0;	 
	   IN1=0;	 
	   IN2=0;
	 //P1=0X00;
}
/*********************************************************************/	
//主函数
	void main(void)
{	 
	delay(400);
    run();		 //调用前进函数	前进后再进入 无限循环 前进再后退运动
	delay(100);
	while(1)	//无限循环
	{ 

	  run();		//调用前进函数
	  delay(200);
	  backrun();	 //调用后退函数
	  delay(200);
      leftrun();	 //调用左转函数
	  delay(200);
	  rightrun();	//调用右转函数
	  delay(200);
	  stop();		 //调用停止转动函数
	  delay(800);
	  delay(800);
	  delay(800);
	  delay(800);
	  delay(800);
	  delay(800);
	  
	  delay(800);
	  delay(800);
	  delay(800);				 
	 }
}

小车可正常抽风,开始蓝牙!!

        我们用的是HC-05蓝牙模块,该模块好在稳定,不易断联,推荐大家食用

        首先让HC-05蓝牙模块通过USB转TTL与电脑连接

 设置波特率为9600,点击打开串口 (下图并未连接蓝牙,仅作演示用)

这里我们稍微科普一下串口通信知识:主机(如手机发送蓝牙信号)与从机(单片机小车接送蓝牙信号)之间的正常通信需要一致的波特率,HC-05蓝牙模块初始波特率为9600,所以串口助手也需设置9600波特率,写代码和烧录程序时也需设置9600波特率。

串口通信知识是蓝牙小车的重中之重,需要大家自行找资源着重理解。(当时学习和配置串口通信弄了两三天555,小趴菜差点崩溃)

 手机上网搜索下载“蓝牙串口SPP”,与蓝牙模块连接(连接密码为1234)

 通过聊天端发送数字,若电脑串口程序接受缓冲区可正常接收数据。恭喜你,已经成功90%了。

        接下来就是“实车测试”了

先奉上源代码:

#include<AT89x51.H>

//小车驱动接线定义
sbit ENA=P1^0;      //右下使能
sbit IN1=P1^1;      // 右下轮
sbit IN2=P1^2;
sbit IN3=P1^3;      //左下轮
sbit IN4=P1^4;
sbit ENB=P1^5;      //左下使能
sbit ena=P2^2;      //左上使能
sbit in1=P2^3;      //左上轮
sbit in2=P2^4;
sbit in3=P2^5;      //右上轮
sbit in4=P2^6;
sbit enb=P2^7;      //右上使能

#define Left_moto_go    {in1=1,in2=0,IN3=1,IN4=0;}    //左边两个电机向前走
#define Left_moto_back    {in1=0,in2=1,IN3=0,IN4=1;}    //左边两个电机向后转
#define Left_moto_Stop    {in1=0,in2=0,IN3=0,IN4=0;}   //左边两个电机停转                     
#define Right_moto_go     {in3=1,in4=0,IN1=1,IN2=0;}	//右边两个电机向前走
#define Right_moto_back   {in3=0,in4=1,IN1=0,IN2=1;}	//右边两个电机向后走
#define Right_moto_Stop   {in3=0,in4=0,IN1=0,IN2=0;}	//右边两个电机停转    

	#define left     'C'
    #define right    'D'
	#define up       'A'
    #define down     'B'
	#define stop     'F'

	bit  flag_REC=0; 
	bit  flag    =0;  
	
	unsigned char  i=0;
	unsigned char  dat=0;
    unsigned char  buff[5]=0; //接收缓冲字节

/************************************************************************/
//前速前进
     void  run(void)
{
    
	 Left_moto_go ;   //左电机往前走
	 Right_moto_go ;  //右电机往前走
}

//前速后退
     void  backrun(void)
{
    
	 Left_moto_back ;   //左电机往前走
	 Right_moto_back ;  //右电机往前走
}

//左转
     void  leftrun(void)
{
    
	 Left_moto_back ;   //左电机往前走
	 Right_moto_go ;  //右电机往前走
}

//右转
     void  rightrun(void)
{
    
	 Left_moto_go ;   //左电机往前走
	 Right_moto_back ;  //右电机往前走
}
//STOP
     void  stoprun(void)
{
    
	 Left_moto_Stop ;   //左电机往前走
	 Right_moto_Stop ;  //右电机往前走
}
/************************************************************************/
void sint() interrupt 4	  //中断接收3个字节  串行口中断
{ 
 
    if(RI)	                 //是否接收中断
    {
       RI=0;
       dat=SBUF;
       if(dat=='O'&&(i==0)) //接收数据第一帧
         {
            buff[i]=dat;
            flag=1;        //开始接收数据
         }
       else
      if(flag==1)
     {
      i++;
      buff[i]=dat;
      if(i>=2)
      {i=0;flag=0;flag_REC=1 ;}  // 停止接收
     }
	 }
}
/*********************************************************************/		 
/*--主函数--*/
	void main(void)
{
    TMOD=0x20;        //计数器工作方式2
    TH1=0xFd;  		   //11.0592晶振,9600波特率
    TL1=0xFd;
    SCON=0x50;      //设置为方式2
    PCON=0x00; 
    TR1=1;
	ES=1;   
    EA=1;   
  	
	while(1)							/*无限循环*/
	{ 
	  if(flag_REC==1)				    //
	   {
		flag_REC=0;
		if(buff[0]=='O'&&buff[1]=='N')	//第一个字节为O,第二个字节为N,第三个字节为控制码
		switch(buff[2])
	     {
		      case up :						    // 前进
			  run();
			  break;
		      case down:						// 后退
			  backrun();
			  break;
		      case left:						// 左转
			  leftrun();
			  break;
		      case right:						// 右转
			  rightrun();
			  break;
		      case stop:						// 停止
			  stoprun();
			  break;

	     }
      
					 
	 }
	}
}	

注意,烧录程序时也需设置波特率为9600欧~ 


到了我们都爱的实机演示阶段了:(在文章末尾资源中下载慧净蓝牙app)

蓝牙小车演示

文章最后,还奉上了相关学习资源和蓝牙软件喔,要个赞不过分吧~ 

链接:https://pan.baidu.com/s/1nSN66OBecVOPCmuwfg-pZQ 
提取码:BCAR

                  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机智能蓝牙小车 的相关文章

  • 武邑中学2021高考成绩查询,武邑中学高考成绩

    问 衡水武邑中学怎么样 答 收费2 3万 大前年中考400多分的进衡水二中的去年高考600多分 而中考400多分去武中的去年高考300分都不到 这可是有名有姓的真人的真实情况 光复习生每年就60多个班 应届考生30多个班 每年六七千人都抬不
  • 箭头函数()=>{}与function的区别

    1 箭头函数与function定义函数的写法 function function fn a b return a b arrow function var foo a b gt return a b 2 this的指向 使用function
  • uni-app开发总结分享

    目录 一 uni app介绍 二 uni app和vue的具体区别 1 组件 标签的变化 2 js 3 uniapp自带路由和请求方式 三 环境搭建 1 安装HbuilderX 2 创建uni app项目 四 项目目录结构 五 运行uni
  • 安装mysql提示3306端口已经被占用解决方案

    今天遇到的问题是这样的 之前已经安装过mysql了 一直用的好好的 但是今天开启服务时报异常 无法启动 为了省事 于是想到卸载重装 在安装的过程中发现3306已经被占用 这也是一开始服务无法启动的原因 看到有人说用fport查看端口号 于是

随机推荐

  • JSP学生网上选课系统设计(源代码+论文+答辩PPT)

    QQ 19966519194 摘要 随着科学技术的不断提高 计算机科学日渐成熟 其强大的功能已为人们深刻认识 它已进入人类社会的各个领域并发挥着越来越重要的作用 学生选课系统作为一种现代化的教学技术 以越来越受到人民的重视 是一个学校不可缺
  • [Unity][ShaderGraph][FlowCanvas] SetFloat 无效:通过脚本控制 shader 的动态参数时需要使用参数的引用名

    我的 shader 很简单 就是一个 tiling and offset 制作滚动效果 然后我想用一个脚本控制 speed 但是实际运行没有起效果 一开始我看的这个 然后用的 sharedmaterial https forum unity
  • Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装

    Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装 目录 Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装 一 简单介绍 二 ControlNet 插
  • Swift - 将String类型的数字转换成数字类型(支持十进制、十六进制)

    https www cnblogs com Free Thinker p 7243683 html 1 十进制的字符串转成数字 Swift中 如果要把字符串转换成数字类型 比如整型 浮点型等 可以先转成NSString类型 让后再转 1 2
  • JAVA:jdbc:sqlserver 连接SQLserver实例名

    weChatjdbc driverClassName com microsoft sqlserver jdbc SQLServerDriver weChatjdbc url jdbc sqlserver 127 0 0 1 instance
  • Ubuntu服务器下安装FastDFS及nginx配置访问等问题记录

    Ubuntu服务器下安装FastDFS及nginx配置访问 下载对应包 编译环境 包解压环境配置 配置nginx模块和安装nginx来进行访问该图片 下载对应包 下载方式一 直接使用 wget 下载 如果太慢 可以去github下载 然后上
  • 基于Matlab开发的动态机器人轨迹仿真

    基于Matlab开发的动态机器人轨迹仿真 近年来 机器人技术的发展已经进入了高速发展时期 控制与仿真技术作为机器人领域中至关重要的一环 也随之发展壮大 而在动态机器人轨迹仿真方面 Matlab作为一款具备强大数学计算能力的软件 在该领域中得
  • QT实现sqlite数据库连接池

    ifndef CONNECTIONPOOL H define CONNECTIONPOOL H FileName 数据库连接池 Function 获取连接时不需要了解连接的名字 支持多线程 保证获取到的连接一定是没有被其他线程正在使用 按需
  • MySQL 远程登录与其常用命令的介绍

    以下的文章主要介绍的是MySQL 远程登录与其常用命令的介绍 MySQL 远程登录与其常用命令之所以能在很短的时间内被人们广泛的应用 原因也是因为它们的独特功能 以下的文章就有对其相关内容的介绍 MySQL 远程登录及常用命令 第一招 My
  • Unbantu22.04使用DevStack一键部署OpenStack(使用nat静态IP)

    d 学习openstack的小白 第一步就遇到了大麻烦 下载并部署Openstack 传统的基于组件 一个个的安装配置更加麻烦 使用DevStack工具 一键部署可能是个不错的选择 But devstack部署期间总是会出现各种各样的错误
  • JavaScript面向对象

    JavaScript面向对象 面向过程 面向过程就是讲需求一步一步自己完全实现 如 一堆衣服 需要自己一件一件洗 面向对象 面向对象是把有共同特征的方法抽取为类 比如 一堆衣服 都需要洗 创建洗衣机类 女朋友类 让她洗 类的定义和使用 定义
  • 机器学习 day09(如何设置学习率α,特征工程,多项式回归)

    1 常见的错误的学习曲线图 上方两个 当关于迭代次数的学习曲线图 出现波浪型或向上递增型 表示梯度下降算法出错 该情况可由 学习率 过大 或代码有bug导致 2 常用的调试方法 选择一个非常非常小的学习率 来查看学习曲线是否还是有误 即在某
  • uni-app网络请求的封装

    uni app网络请求的封装 这几天没事干 就去小程序开发小团队里看看 顺便看了一下代码 在网络请求上发现了一些问题 差点没忍住破口大骂 最终想了想 他们之前没做过 都是第一次就算了 其实是安慰自己而已 网络请求都写在page里 每个请求都
  • 池化方法总结(Pooling)

    在卷积神经网络中 我们经常会碰到池化操作 而池化层往往在卷积层后面 通过池化来降低卷积层输出的特征向量 同时改善结果 不易出现过拟合 为什么可以通过降低维度呢 因为图像具有一种 静态性 的属性 这也就意味着在一个图像区域有用的特征极有可能在
  • JAVA-while循环语句

    while循环语句用法比for语句用起来简单 格式也对的简单 while 判断条件 循环体 public class WhileTest public static void main String args int i 1 while i
  • 将tensorpack的inference改为pytorch

    最近在跑一个OCR模型 模型是用Tensorpack写的 模型做inference的时候 显存 速度都不是很理想 改成pytorch后 显存占用 速度比之前好了很多 记录下改inference的过程遇到的一些坑 将pb文件转为pth文件 i
  • Python 垃圾回收机制

    众所周知 我们当代的计算机都是图灵机架构 图灵机架构的本质 就是一条无限长的纸带 对应着我们今天的存储器 在工程学的演化中 逐渐出现了寄存器 易失性存储器 内存 和永久性存储器 硬盘 等产品 其实 这本身来自一个矛盾 速度越快的存储器 单位
  • 【易售小程序项目】请求包创建+登录功能实现【基于若依管理系统开发】

    文章目录 说明 请求包创建 创建文件夹 请求工具 request js 登录功能实现 请求方法 页面 涉及知识点 错误提示 前端校验 设置 token 到客户端缓存中 路由跳转 如果已经登录过 访问登录页直接跳转到首页 同项目其他文章 说明
  • 服务器配置填坑 wget: unable to resolve host address解决方法,最终成功

    项目上线 手续要配置服务器 甲方机房在单位内 无法使用公司云服务器 于是配置坑来了 配环境下载包 ubutun 16显示如下错误 wget unable to resolve host address wget 无法解析主机地址 这就能看出
  • 51单片机智能蓝牙小车

    作为大一电子小趴菜 在和队友学习制作蓝牙小车过程中遇到了许多困难 本文既为大家避坑 也作为团队总结 这篇文章分为两部分 1 组装篇 2 代码篇 思维导图 组装篇 先准备好一块电源拓展板 用于为电机驱动模块和降压模块连接电源 小车底盘可淘宝定