找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 39718|回复: 67
收起左侧

基于51单片机的手机蓝牙遥控小车设计(程序 元件清单 实物图)

  [复制链接]
ID:335907 发表于 2019-1-17 23:46 | 显示全部楼层 |阅读模式
本人一直想做一个遥控车,终于今天实现了,跟大家分享一下。

一、元件清单
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指令集就好)和源程序。

94931983471821824.jpg 105776735203218362.jpg

app:
837108316045614533.jpg 201007723374054530.jpg

单片机源程序如下:
  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. }
复制代码
0.png
所有资料51hei提供下载:
资料.zip (1.01 MB, 下载次数: 662)

评分

参与人数 2黑币 +58 收起 理由
菜用鸡 + 8 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2019-1-18 02:14 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:65956 发表于 2019-1-18 08:35 | 显示全部楼层
很不错,我也曾作过,程序上面可作兴趣的参考
回复

使用道具 举报

ID:471573 发表于 2019-1-22 16:56 | 显示全部楼层
很酷的哦!!!
回复

使用道具 举报

ID:335907 发表于 2019-2-22 09:54 | 显示全部楼层
515121621106635400.jpg
我也是个小白,这是我的连接线路图,我把前轮的L298N的ENA用跳线帽短接了。然后,后轮的L298N的ENB,拔掉跳线帽后有两个插口,一个接P14,一个接P04。我也不知道正确的到底怎么接,反正这样接它就能跑,还请大佬指点。
回复

使用道具 举报

ID:441855 发表于 2019-2-22 14:39 | 显示全部楼层
从下就对遥控小车很感兴趣,正打算做一个呢,刚好又有楼主的资料作为参考,真是开心
回复

使用道具 举报

ID:462283 发表于 2019-3-2 13:08 | 显示全部楼层
哎,本初学者对你的程序有个问题,你的串口中断函数那里,没有 ES=0,然后ES=1;  会不会让程序一直一直循环,我看了郭天祥的书上是这么说的
回复

使用道具 举报

ID:472506 发表于 2019-3-2 17:21 | 显示全部楼层
感兴趣,准备做个玩下。
回复

使用道具 举报

ID:271725 发表于 2019-3-26 20:46 | 显示全部楼层
程序113行处有错误,而且后面也是相同的错误
回复

使用道具 举报

ID:335907 发表于 2019-4-21 21:46 | 显示全部楼层
不伤手的立白 发表于 2019-3-26 20:46
程序113行处有错误,而且后面也是相同的错误

请问具体是哪段程序?有什么样的错误?能截个图看看吗?多谢
回复

使用道具 举报

ID:518387 发表于 2019-4-22 10:43 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:518387 发表于 2019-4-22 10:45 | 显示全部楼层
厉害了 大兄弟
回复

使用道具 举报

ID:428211 发表于 2019-5-9 01:54 来自手机 | 显示全部楼层
怎么没有app软件呢??
回复

使用道具 举报

ID:522384 发表于 2019-5-11 15:45 | 显示全部楼层
请问怎么焊接呢?
回复

使用道具 举报

ID:546398 发表于 2019-5-24 17:02 | 显示全部楼层
感谢楼主分享 今年设计做的就是这个
回复

使用道具 举报

ID:483666 发表于 2019-5-31 22:01 | 显示全部楼层
51单片机和蓝牙工作电压都是5v,楼主你用12v,难道不会烧掉吗
回复

使用道具 举报

ID:385250 发表于 2019-6-1 14:39 | 显示全部楼层
有没有Proteus仿真图
回复

使用道具 举报

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

使用道具 举报

ID:483666 发表于 2019-6-11 23:32 | 显示全部楼层
cd2333 发表于 2019-6-9 17:40
楼主您好~我们是要做一个实训项目,内容是手机蓝牙控制小车前进,不过不需要左转、后退等功能,只要求前进 ...

线接对没有,指令设置正确没有。都没错,你就细心检查,你会发现你犯的是低级错误。。。
回复

使用道具 举报

ID:399732 发表于 2019-6-12 00:38 | 显示全部楼层
好东西,值得分享
回复

使用道具 举报

ID:575219 发表于 2019-6-30 20:53 | 显示全部楼层
厉害牛皮
回复

使用道具 举报

ID:584421 发表于 2019-7-19 19:30 | 显示全部楼层
cd2333 发表于 2019-6-9 17:40
楼主您好~我们是要做一个实训项目,内容是手机蓝牙控制小车前进,不过不需要左转、后退等功能,只要求前进 ...

试着把字符型改为十六进制
回复

使用道具 举报

ID:606151 发表于 2019-9-3 16:04 来自手机 | 显示全部楼层
lll66666 发表于 2019-2-22 09:54
我也是个小白,这是我的连接线路图,我把前轮的L298N的ENA用跳线帽短接了。然后,后轮的L298N的ENB,拔掉 ...

能留个联系方式吗?
回复

使用道具 举报

ID:316114 发表于 2019-9-4 10:35 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:74784 发表于 2019-9-15 12:41 | 显示全部楼层
没有app~~~~~~~~~~~~
回复

使用道具 举报

ID:422924 发表于 2019-9-25 14:41 | 显示全部楼层
好帖感觉真新很棒
回复

使用道具 举报

ID:563554 发表于 2019-11-3 21:48 | 显示全部楼层
很棒,赞一个
回复

使用道具 举报

ID:635714 发表于 2019-11-5 13:13 | 显示全部楼层
您好,请问您的手机蓝牙串口助手发送什么指令去控制小车?
回复

使用道具 举报

ID:441316 发表于 2019-11-8 16:52 | 显示全部楼层
atom52 发表于 2019-5-31 22:01
51单片机和蓝牙工作电压都是5v,楼主你用12v,难道不会烧掉吗

l298N驱动电机 有个5v 输出 应该是用这个给单片机供电 ,12v 接在 l298n上
回复

使用道具 举报

ID:617327 发表于 2019-11-8 21:09 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:639598 发表于 2019-11-11 11:52 | 显示全部楼层
好资料,51黑有你更精彩!!
回复

使用道具 举报

ID:594848 发表于 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的底线连在一起。
回复

使用道具 举报

ID:641276 发表于 2019-11-14 11:00 | 显示全部楼层
APP在压缩包里吗
回复

使用道具 举报

ID:639598 发表于 2019-11-14 16:03 | 显示全部楼层
资料已下载 谢谢
回复

使用道具 举报

ID:642652 发表于 2019-11-15 15:36 | 显示全部楼层
楼主,那个app就叫蓝牙串口助手吗?在哪里下载的
回复

使用道具 举报

ID:434366 发表于 2019-11-26 17:14 | 显示全部楼层
不错 ,谢谢大佬,学习了!
回复

使用道具 举报

ID:651155 发表于 2019-11-27 21:18 | 显示全部楼层
有蓝牙串口app的具体使用步骤就好了
回复

使用道具 举报

ID:637295 发表于 2020-1-9 16:33 | 显示全部楼层
谢谢大佬,学习了
回复

使用道具 举报

ID:691253 发表于 2020-2-9 00:33 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:722967 发表于 2020-4-5 20:23 | 显示全部楼层
cd2333 发表于 2019-6-9 17:40
楼主您好~我们是要做一个实训项目,内容是手机蓝牙控制小车前进,不过不需要左转、后退等功能,只要求前进 ...

请问你解决了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表