草庐IT

51单片机智能蓝牙小车

菜菜不服输 2023-08-25 原文

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


这篇文章分为两部分

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

                  

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

  1. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  2. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  3. 智能客服 | 浅谈人工智能聊天机器人ChatGPT - 2

    2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动

  4. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  5. 基于python的短视频智能推荐/django的影视网站/视频推荐系统 - 2

    摘要本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述短视频智能推荐的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 短视频智能推荐的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、热门视频管理、用户上传管理、系统管理,用户:首页、个人中心、用户上传管理、我的收藏管理,前台首页;首页、热门视频、用户上传、公告信息、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个短视频智能推荐信

  6. 51单片机——74HC595的应用(SPI实践) - 2

    目录SPI总线SPI总线概述 SPI总线分类SPI优点及缺点SPI接口硬件原理SPI四种工作模式 74HC595应用74HC595芯片概述74HC595封装及管脚功能74HC595工作原理 ​编辑 74HC595串行转并行点亮LED灯 程序实现  Proteus运行结构示意图SPI总线SPI总线概述 SPI(SerialPeripheralinterface):串行外围设备接口 用途:用来在微控制器与外围设备芯片之间实现数据交换 特点:高速、全双工、同步 SPI总线分类四线制全双工SPI(同时收发)MISO    主机输入/从机输出MOSI    主机输出/从机输入SCLK   串行时钟CS或

  7. 【毕业设计】基于单片机的智能温控农业大棚系统 - 物联网 stm32 - 2

    文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室

  8. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序 - 2

    一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024

  9. 基于51单片机、DS1302时钟模块的电子闹钟设计 - 2

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、设计原理1.DS1302介绍2.闹钟音乐播放原理二、程序设计1.DS1302.h2.ds1302.c3.music.h4.main.c三、电路图四、运行结果1.proteus仿真2.开发板实验五、总结六、附件提示:以下是本篇文章正文内容,下面案例可供参考一、设计原理1.DS1302介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。该芯片采用普通32.768kHz晶振,DS1302工作时功耗很

  10. [蓝桥杯单片机]学习笔记——串口通信的基本原理与应用 - 2

    目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式  2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器​编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置  3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一

随机推荐