标题: 基于51单片机的手机蓝牙遥控小车设计(程序 元件清单 实物图) [打印本页]

作者: lll66666    时间: 2019-1-17 23:46
标题: 基于51单片机的手机蓝牙遥控小车设计(程序 元件清单 实物图)
本人一直想做一个遥控车,终于今天实现了,跟大家分享一下。

一、元件清单
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:


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


  4. #include <reg52.h>

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

  11. sbit P0_4=P0^4;                 //定义P0_4
  12. sbit P0_5=P0^5;                 //定义P0_5
  13. sbit P1_4=P1^4;                 //定义P1_4
  14. sbit P1_5=P1^5;                 //定义P1_5

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

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

  28. bit Right_moto_stop=1;          
  29. bit Left_moto_stop =1;               
  30. unsigned  int  time=0;               
  31. int pwm=1;

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

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


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

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

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


  52. void delay(uint z)
  53. {
  54.         uint x,y;
  55.         for(x = z; x > 0; x--)
  56.         for(y = 114; y > 0 ; y--);
  57. }



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

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

  78. }


  79. /************************************************************************/
  80. /*                    PWM调制电机转速                                   */
  81. /************************************************************************/


  82. /*                    左侧电机调速                                        */
  83. /*调节push_val_left的值改变电机转速,占空比            */
  84.                 void pwm_out_left_moto(void)
  85. {  
  86.    if(Left_moto_stop)
  87.    {
  88.     if(pwm_val_left<=push_val_left)
  89.              {  Left_moto_pwm=1;
  90.                     Left_moto2_pwm=1;  }
  91.         else
  92.               { Left_moto_pwm=0;Left_moto2_pwm=0;                 }

  93.         if(pwm_val_left>=10)
  94.         pwm_val_left=0;
  95.    }
  96.    else { Left_moto_pwm=0;Left_moto2_pwm=0;          }
  97. }
  98. /******************************************************************/
  99. /*                    右侧电机调速                                  */  
  100.    void pwm_out_right_moto(void)
  101. {
  102.   if(Right_moto_stop)
  103.    {
  104.     if(pwm_val_right<=push_val_right)
  105.              {  Right_moto_pwm=1;
  106.                    Right_moto2_pwm=1;           }
  107.         else
  108.                {Right_moto_pwm=0;
  109.                     Right_moto2_pwm=0;}
  110.         if(pwm_val_right>=10)
  111.             pwm_val_right=0;
  112.    }
  113.    else    {Right_moto_pwm=0;Right_moto2_pwm=0;        }
  114. }
  115. /***************************************************/
  116. ///*TIMER0中断服务子函数产生PWM信号*/
  117.         void timer0()interrupt 1   using 2
  118. {
  119.      TH0=0XF8;          //1Ms定时
  120.          TL0=0X30;
  121.          time++;
  122.          pwm_val_left++;
  123.          pwm_val_right++;
  124.          pwm_out_left_moto();
  125.          pwm_out_right_moto();
  126. }

  127. //小车前进
  128. void forward()
  129. {
  130.         ET0 = 1;
  131.         run();                          //pwm        程序
  132.         left_motor_go; //左电机前进
  133.         right_motor_go; //右电机前进
  134.         left_motor2_go; //左电机前进   后轮
  135.         right_motor2_go; //右电机前进         后轮
  136. }

  137. void left_go()           //左转
  138. {
  139.         ET0 = 1;
  140.         run();
  141.         left_motor_back;
  142.         right_motor_go;
  143.         left_motor2_back;
  144.         right_motor2_go;
  145.         delay(700);
  146.         forward();
  147. }
  148. //右转
  149. void right_go()
  150. {
  151.         ET0 = 1;
  152.         run();
  153.         delay(50);
  154.         right_motor_back;
  155.         left_motor_go;
  156.         right_motor2_back;
  157.         left_motor2_go;
  158.         delay(700);
  159.         forward();
  160. }
  161. //小车左转圈
  162. void left()
  163. {
  164.         ET0 = 1;
  165.         run();
  166.         delay(50);
  167.         right_motor_go;                  //  右电机前进
  168.         left_motor_back;        // 左电机后退
  169.         right_motor2_go;                  //  右电机前进
  170.         left_motor2_back;        // 左电机后退
  171. }

  172. //小车右转圈
  173. void right()
  174. {
  175.         ET0 = 1;
  176.         run();
  177.         left_motor_go;
  178.         right_motor_back;  
  179.         left_motor2_go;
  180.         right_motor2_back;
  181. }

  182. //小车后退
  183. void back()
  184. {
  185.         ET0 = 1;
  186.         run();
  187.         left_motor_back;
  188.         right_motor_back;       
  189.         left_motor2_back;
  190.         right_motor2_back;
  191. }

  192. //小车停止
  193. void stop()
  194. {
  195.         ET0 = 0;
  196.         P1=0;
  197.         P0=0;
  198. }

  199.   
  200. //串口中断
  201. void UART_SER() interrupt 4
  202. {
  203.         if(RI)
  204.         {
  205.                 RI = 0;//清除接收标志
  206.                 switch(SBUF)
  207.                 {
  208.                         case 'g': forward(); break;//前进
  209.                         case 'b': back(); break;//后退
  210.                         case 'l': left(); break;//左转圈
  211.                         case 'r': right(); break;//右转圈
  212.                         case 's': stop(); break;//停止
  213.                         case 'z': left_go(); break;//左转行驶
  214.                          case 'y': right_go(); break;//右转行驶
  215.                         case 'p': pwm++;break;                //加速
  216.                         case 'c': pwm--;break;                //减速
  217.                 }

  218.         }
  219. }

  220. void main()
  221. {
  222.         TMOD=0X01;
  223.         TH0= 0XF8;                  //1ms定时
  224.         TL0= 0X30;
  225.         TR0= 1;
  226.         ET0= 1;
  227.         EA = 1;
  228.         UART_INIT();//串口初始化
  229.         while(1);
  230. }
复制代码

所有资料51hei提供下载:
资料.zip (1.01 MB, 下载次数: 665)



作者: admin    时间: 2019-1-18 02:14
好资料,51黑有你更精彩!!!
作者: aking991    时间: 2019-1-18 08:35
很不错,我也曾作过,程序上面可作兴趣的参考
作者: ifree8    时间: 2019-1-22 16:56
很酷的哦!!!
作者: lll66666    时间: 2019-2-22 09:54

我也是个小白,这是我的连接线路图,我把前轮的L298N的ENA用跳线帽短接了。然后,后轮的L298N的ENB,拔掉跳线帽后有两个插口,一个接P14,一个接P04。我也不知道正确的到底怎么接,反正这样接它就能跑,还请大佬指点。

作者: xiaozhiTZM    时间: 2019-2-22 14:39
从下就对遥控小车很感兴趣,正打算做一个呢,刚好又有楼主的资料作为参考,真是开心
作者: stc89czz    时间: 2019-3-2 13:08
哎,本初学者对你的程序有个问题,你的串口中断函数那里,没有 ES=0,然后ES=1;  会不会让程序一直一直循环,我看了郭天祥的书上是这么说的
作者: zpz181818    时间: 2019-3-2 17:21
感兴趣,准备做个玩下。
作者: 不伤手的立白    时间: 2019-3-26 20:46
程序113行处有错误,而且后面也是相同的错误
作者: lll66666    时间: 2019-4-21 21:46
不伤手的立白 发表于 2019-3-26 20:46
程序113行处有错误,而且后面也是相同的错误

请问具体是哪段程序?有什么样的错误?能截个图看看吗?多谢
作者: z858445995    时间: 2019-4-22 10:43
谢谢分享
作者: z858445995    时间: 2019-4-22 10:45
厉害了 大兄弟
作者: 565576915    时间: 2019-5-9 01:54
怎么没有app软件呢??
作者: 1633941991    时间: 2019-5-11 15:45
请问怎么焊接呢?

作者: 北戈如歌    时间: 2019-5-24 17:02
感谢楼主分享 今年设计做的就是这个
作者: atom52    时间: 2019-5-31 22:01
51单片机和蓝牙工作电压都是5v,楼主你用12v,难道不会烧掉吗
作者: CEO89    时间: 2019-6-1 14:39
有没有Proteus仿真图

作者: cd2333    时间: 2019-6-9 17:40
楼主您好~我们是要做一个实训项目,内容是手机蓝牙控制小车前进,不过不需要左转、后退等功能,只要求前进和加速减速,我就把您的程序复制下来,把不需要的例如左转、后退等功能程序删掉了,留下了我需要的,然后编译没有错误,有一个警告L16,我就把程序烧进去了,我的单片机是89C52,蓝牙模块是HC-05,下载成功后,连接蓝牙成功,用手机发送了前进的指令小车没反应,没有动,是什么原因呢?请大神指点~谢谢您!
作者: atom52    时间: 2019-6-11 23:32
cd2333 发表于 2019-6-9 17:40
楼主您好~我们是要做一个实训项目,内容是手机蓝牙控制小车前进,不过不需要左转、后退等功能,只要求前进 ...

线接对没有,指令设置正确没有。都没错,你就细心检查,你会发现你犯的是低级错误。。。
作者: zhuyu800    时间: 2019-6-12 00:38
好东西,值得分享
作者: yuzele    时间: 2019-6-30 20:53
厉害牛皮
作者: 卑微小鸽    时间: 2019-7-19 19:30
cd2333 发表于 2019-6-9 17:40
楼主您好~我们是要做一个实训项目,内容是手机蓝牙控制小车前进,不过不需要左转、后退等功能,只要求前进 ...

试着把字符型改为十六进制
作者: czs小菜鸡    时间: 2019-9-3 16:04
lll66666 发表于 2019-2-22 09:54
我也是个小白,这是我的连接线路图,我把前轮的L298N的ENA用跳线帽短接了。然后,后轮的L298N的ENB,拔掉 ...

能留个联系方式吗?
作者: eastl    时间: 2019-9-4 10:35
好资料,51黑有你更精彩!!!
作者: lxa0    时间: 2019-9-15 12:41
没有app~~~~~~~~~~~~
作者: 曾现路    时间: 2019-9-25 14:41
好帖感觉真新很棒
作者: QSM980405    时间: 2019-11-3 21:48
很棒,赞一个
作者: QHXRPG    时间: 2019-11-5 13:13
您好,请问您的手机蓝牙串口助手发送什么指令去控制小车?
作者: DeBoDe    时间: 2019-11-8 16:52
atom52 发表于 2019-5-31 22:01
51单片机和蓝牙工作电压都是5v,楼主你用12v,难道不会烧掉吗

l298N驱动电机 有个5v 输出 应该是用这个给单片机供电 ,12v 接在 l298n上
作者: 欢迎新会员    时间: 2019-11-8 21:09
好资料,51黑有你更精彩!!!
作者: 我来下载软件    时间: 2019-11-11 11:52
好资料,51黑有你更精彩!!
作者: Li5151    时间: 2019-11-13 18:51
lll66666 发表于 2019-2-22 09:54
我也是个小白,这是我的连接线路图,我把前轮的L298N的ENA用跳线帽短接了。然后,后轮的L298N的ENB,拔掉 ...

楼主我知道你的问题了,你的L298n模块没有和单片机共地。系统的GND是参考电平,平常所说的IN1=1,IN2=0,这里的1和0是相对GND的,所以一定要连在一起(说明书上这么说的)。你如果用充电宝供电,要从单片机引一条地线出来和L298n的底线连在一起。
作者: 小九九就是我    时间: 2019-11-14 11:00
APP在压缩包里吗
作者: 我来下载软件    时间: 2019-11-14 16:03
资料已下载 谢谢
作者: lc3070    时间: 2019-11-15 15:36
楼主,那个app就叫蓝牙串口助手吗?在哪里下载的
作者: 宇宙浪子521    时间: 2019-11-26 17:14
不错 ,谢谢大佬,学习了!
作者: 炼狱小刀    时间: 2019-11-27 21:18
有蓝牙串口app的具体使用步骤就好了
作者: 372614983    时间: 2020-1-9 16:33
谢谢大佬,学习了
作者: 3285875635    时间: 2020-2-9 00:33
好资料,51黑有你更精彩!!!
作者: 老小怪    时间: 2020-4-5 20:23
cd2333 发表于 2019-6-9 17:40
楼主您好~我们是要做一个实训项目,内容是手机蓝牙控制小车前进,不过不需要左转、后退等功能,只要求前进 ...

请问你解决了吗
作者: 老小怪    时间: 2020-4-7 15:21
楼主,请问我的小车没有反应是为什么
作者: koi666    时间: 2020-4-26 21:42
很好,值得学习
作者: koi666    时间: 2020-4-26 21:45
准备参考这个
作者: ycs89554171    时间: 2020-4-29 09:42
好资料,51黑有你更精彩!!!
作者: anjeny    时间: 2020-5-17 11:44
很棒哦
作者: amd1217    时间: 2020-5-26 22:20
支持一下
作者: 沪闵    时间: 2020-6-9 09:15
请问楼主,我是小白,不知道四轮驱动可以用一个L298N吗
作者: newforce    时间: 2020-6-14 20:27
51黑有你更精彩!!!
作者: 黄尼玛a    时间: 2020-6-15 11:07
谢谢研发
作者: swustlx86    时间: 2020-6-17 09:01
好资料,51黑有你更精彩!!!
作者: billyR    时间: 2020-6-19 19:01
我觉得很不错,最近我在弄

作者: zhangxiaobu    时间: 2020-6-21 14:08
lll66666 发表于 2019-4-21 21:46
请问具体是哪段程序?有什么样的错误?能截个图看看吗?多谢

你让他等于1了,这样子没任何意义,因该是等于你《=的那个值
作者: 轩某人    时间: 2020-6-23 07:40
挺好的
作者: 不来也不去    时间: 2020-8-17 21:35
谢谢楼主分享,我自己也准备弄一个玩玩

作者: 1024030997    时间: 2020-9-15 10:50
好强,感觉应该很好用我觉得
作者: lll66666    时间: 2020-10-18 15:55
565576915 发表于 2019-5-9 01:54
怎么没有app软件呢??

APP软件就是在华为应用商城下载的,名字就叫“蓝牙串口助手”,很小的,就几M。
作者: lll66666    时间: 2020-10-18 15:59
QHXRPG 发表于 2019-11-5 13:13
您好,请问您的手机蓝牙串口助手发送什么指令去控制小车?

就是239-247行的英文字母,g、b、l、s这些,就是按下前进键,就会发送英文字母g过去。
作者: lll66666    时间: 2020-10-18 16:02
Li5151 发表于 2019-11-13 18:51
楼主我知道你的问题了,你的L298n模块没有和单片机共地。系统的GND是参考电平,平常所说的IN1=1,IN2=0,这 ...

感谢指点!
作者: lll66666    时间: 2020-10-18 16:03
lc3070 发表于 2019-11-15 15:36
楼主,那个app就叫蓝牙串口助手吗?在哪里下载的

对对对,就在华为应用商城,一个几M的小软件。不好意思 很久没上了
作者: lll66666    时间: 2020-10-18 16:04
小九九就是我 发表于 2019-11-14 11:00
APP在压缩包里吗

APP在华为应用商城下载 就叫“蓝牙串口助手”
作者: lll66666    时间: 2020-10-18 16:10
感谢各位的关注和讨论,不过由于我很久没上了,错了了大家很多的提问。很多朋友问APP,APP是在华为应用商城下载的,名字就叫“蓝牙串口助手”。这里的程序可能会有一些问题,比如当时L298N的接法其实有点奇怪,然后有个优化改进的地方是,当时这个程序是按了前进后就会一直前进,不过速度快的话这样容易撞车;另一个问题是如果蓝牙断开连接,这辆车是不会停下来的。
作者: YinJie1    时间: 2020-11-23 16:24
挺好的,可能是我太小白,有的地方看着有点难懂

作者: tst200706    时间: 2020-11-24 10:36
很有趣
作者: louis9432    时间: 2020-12-1 19:07
太好了,终于找到解决方案了
作者: lqh_fairy    时间: 2021-5-13 08:19
大佬,有原理图和仿真图吗,本人学生,想尝试一下
作者: Letitia    时间: 2021-7-31 13:30
cd2333 发表于 2019-6-9 17:40
楼主您好~我们是要做一个实训项目,内容是手机蓝牙控制小车前进,不过不需要左转、后退等功能,只要求前进 ...

你先用串口助手测速有没有问题,能不能收发
作者: lhpsnd    时间: 2021-7-31 14:38
我今年也买了一个跟你的一样,我现在是想要用我之前焊好的LCD1602液晶屏与蓝牙模块之间进行交流,用手机链接上蓝牙在手机上个小车发送一个指令,同时在小车的屏幕上显示我发送的指令,还有外接按键是来调节我发送的指令。这个问题我想了好久,还是没有想到办法。希望大佬们能给我点提示或者思路。本人在此谢过了!!!
作者: Martinku    时间: 2021-12-14 10:49
这资料对学习51的遥控小车很有帮助性作用,给楼主赞一下!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1