单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 500|回复: 2
收起左侧

蓝牙遥控智能车制作 单片机+SG90舵机扫描 附源程序

[复制链接]
毕达哥拉斯1.1 发表于 2020-2-27 16:22 | 显示全部楼层 |阅读模式
     遥控车是基于STC89C52RC单片机开发,车体组成有底盘,直流电机33GB-520-18.7,L298N电机驱动模块,LM2596降压模块,12V DC电源,HC-05蓝牙模块。其中HC-05蓝牙模块与单片机是串口通信所以要注意连线,STC89C52RC中P3^0,P3^1为串口引脚,具体连线如下示意图:

20200227140830.png
本次制作目的是:通过手机蓝牙调试器发送信号控制车辆的前进,后退,原地左转,原地右转,单独左转,单独右转,舵机扫描以及寻迹模式的切换(在这里声明一下,本次代码的寻迹模式切换模式还不太完善,未达到理想效果,电子发烧友们可以多多指点。在下学艺不精,在接下来的解说中如有错误望大佬纠正。)手机采用蓝牙调试器,需要自己进行按键编辑以及字符发送。

程序编译好后即可烧录,对手机上的蓝牙调试器进行相应字符编辑即可进行操作。对于想基于此程序继续开发的朋友们,如果加入更多功能函数时操作未响应,建议你们逐条加入排除问题。
谢谢大家的认真阅读,有更好的逻辑可以留言。

IMG_20200227_142200.jpg Screenshot_2019-12-22-00-04-22-343_xnj.lazydog.bt.png

将硬件设备搭建完成后,我们即将开始软件的编程:
话不多说,单片机代码走起!!!哈哈
  1. #include <reg52.h>   //头文件
  2. #include <intrins.h>
  3. sbit blackorwhite1=P2^5;//黑白传感器定义引脚
  4. sbit blackorwhite2=P2^6;
  5. sbit blackorwhite3=P2^7;
  6. sbit motor1=P1^0;
  7. sbit motor2=P1^1;//电机1定义引脚
  8. sbit motor3=P1^3;
  9. sbit motor4=P1^4;//电机2定义引脚
  10. sbit PWM1=P2^0;//SG90信号定义引脚


  11. typedef unsigned char uc;
  12. typedef unsigned int ui;    //复杂名称函数的替代
  13. uc Com;
  14. int i;

  15. void Init();  //在这里一定要注意在main()函数后的子函数要进行声明,不声明虽然不会报错但有可能会忽略子函数导致一些功能不能实现
  16. void Send(uc a);
  17. void Cont();  
  18. void qianjin();
  19. void houtui();
  20. void youzhuan();
  21. void zuozhuan();
  22. void xunji();
  23. //void L2_0();  
  24. void L2_45();
  25. void L2_90();
  26. void L2_135();
  27. //void L2_180();
  28. void delay(int t);
  29. void delayx1ms(int x);
  30. void delay1ms();
  31. void delay500us();
  32. void ZUO();
  33. void YOU();

  34. void delay(int t)                          //延迟函数
  35. {
  36.         int a,b;
  37.         for(a=0;a<t;a++)
  38.                 for(b=0;b<120;b++);
  39. }
  40. void delayx1ms(int x)
  41. {
  42.         unsigned char a,b;
  43.         for(x;x>0;x--)
  44.                 for(b=102;b>0;b--)
  45.                         for(a=3;a>0;a--);
  46. }
  47. void delay1ms()
  48. {
  49.         unsigned char a,b;
  50.         for(b=102;b>0;b--)
  51.                 for(a=3;a>0;a--);
  52. }
  53. void delay500us()
  54. {
  55.         unsigned char a,b;
  56.         for(b=1;b>0;b--)
  57.                 for(a=227;a>0;a--);
  58. }

  59. void main()   //    主函数
  60. {
  61. Init();         //     串口初始化函数调用
  62. while (1)
  63. {
  64.   if (RI==1)   //    判断是否有数据
  65.   {
  66.    RI = 0;     // 置0
  67.    Com = SBUF;    // 暂时存放接收的数据
  68.    Cont();             // 调用数据处理函数
  69.   }
  70. }
  71. }
  72. void Init()    //串口初始化
  73. {
  74. ES=0;                     //中断关闭
  75. SCON = 0x50;         //   串行控制寄存器   01010000串口工作方式1并允许中断接收数据
  76. TMOD = 0x20;        //    定时器/计[color=rgb(34, 34, 34)][backcolor=rgb(248, 248, 248)][font=PingFang SC,Arial,\5FAE软雅黑,\5B8B体,simsun,sans-serif][size=0.48] [/font][/backcolor][/color]数器1设置为工作方式
  77. TH1=TL1=0xFD;     //   设置波特率9600=110592*1000000/12/(0x100-0xfd)/32   本次实验晶振(11.0592)
  78. PCON &= 0x7f;       //    波特率不倍增
  79. TR1 = 1;         //   开启定时器1
  80. TI=0;             //   发送中断位
  81. RI=0;             //   接收中断位
  82. ES=1;            //   开启串口中断
  83. motor1=0;
  84. motor2=0;     //   电机初始化
  85. motor3=0;
  86. motor4=0;
  87. }
  88.    
  89. void Send(uc a)   //单字节数据发送
  90. {
  91. TI=0;             // TI是串口接收标志位
  92. SBUF=a;         //SBUF---即串口数据缓冲寄存器   将数据存入
  93. while (TI==0) ;//等待发送结束
  94. TI=0;             //清零
  95. }
  96. void qianjin()   //前进功能函数
  97. {
  98.       motor1=1;
  99.       motor2=0;
  100.       motor3=1;
  101.       motor4=0;
  102. }
  103. void zuozhuan()   //原地左转功能函数
  104. {
  105.       motor1=0;
  106.       motor2=1;
  107.       motor3=1;
  108.       motor4=0;
  109. }
  110. void youzhuan()  //原地右转功能函数
  111. {
  112.       motor1=1;
  113.       motor2=0;
  114.       motor3=0;
  115.       motor4=1;
  116. }
  117. void houtui()  //后退功能函数
  118. {
  119.       motor1=0;
  120.       motor2=1;
  121.       motor3=0;
  122.       motor4=1;
  123. }
  124. void ZUO()  // 单独左转功能函数
  125. {
  126.       motor1=0;
  127.       motor2=0;
  128.       motor3=1;
  129.       motor4=0;
  130. }
  131. void YOU()  // 单独右转功能函数
  132. {
  133.       motor1=1;
  134.       motor2=0;
  135.       motor3=0;
  136.       motor4=0;
  137. }
  138. void xunji()  //寻迹模式切换 功能函数
  139. {
  140. // while(1)
  141. {
  142.    if((blackorwhite1==1)&& (blackorwhite2==0)&&(blackorwhite3==1))
  143.   qianjin();
  144.   else if ((blackorwhite1==0&&blackorwhite2==0&&blackorwhite3==1)||(blackorwhite1==0&&blackorwhite2==1&&blackorwhite3==1))
  145.   zuozhuan();
  146.    else if((blackorwhite1==1&&blackorwhite2==1&&blackorwhite3==0)||(blackorwhite1==1&&blackorwhite2==0&&blackorwhite3==0))
  147.   youzhuan();
  148.   else if ((blackorwhite1==0)&&(blackorwhite2==0)&&(blackorwhite3==0))
  149.    qianjin();
  150.   else
  151.   houtui();
  152.                              
  153. }
  154. }
  155. //void L2_0()                                                  SG90舵机0度函数  若需要可以解禁此功能
  156. /{
  157. //        int i,j;
  158. //        for(j=0;j<43;j++)
  159. //        {
  160. //                PWM1=1;
  161. //                delay500us();
  162. //       //      delay1ms();
  163. //                PWM1=0;
  164. //                for(i=0;i<19;i++)
  165. //                delay1ms();
  166. //                delay500us();
  167. //                PWM1=0;
  168. //                for(i=0;i<20;i++)
  169. //                delay1ms();
  170. //        }
  171. //}
  172. void L2_45()                                                    //舵机45度旋转函数
  173. {
  174.         int i,j;
  175.         for(j=0;j<43;j++)
  176.         {
  177.                 PWM1=1;
  178.         //     delay500us();
  179.                 delay1ms();
  180.                 PWM1=0;
  181.                 for(i=0;i<20;i++)
  182.                 delay1ms();
  183.         //     delay500us();
  184.                 PWM1=0;
  185.                 for(i=0;i<21;i++)
  186.                 delay1ms();
  187.         }
  188. }
  189. void L2_90()                                              //舵机90度旋转函数
  190. {
  191.         int i,j;
  192.         for(j=0;j<43;j++)
  193.    {
  194.                 PWM1=1;
  195.                 delay1ms();
  196.                 delay500us();
  197.                 PWM1=0;
  198.                 for(i=0;i<18;i++)
  199.                 delay1ms();
  200.                 delay500us();
  201.                 PWM1=0;
  202.                 for(i=0;i<20;i++)
  203.                 delay1ms();
  204.          }
  205. }
  206. void L2_135()                                              //舵机135度旋转函数
  207. {
  208.         int i,j;
  209.         for(j=0;j<43;j++)
  210.    {
  211.                 PWM1=1;
  212.                 delay1ms();
  213.                 delay1ms();
  214.        //      delay500us();
  215.                 PWM1=0;
  216.                 for(i=0;i<18;i++)
  217.                 delay1ms();
  218.            //  delay500us();
  219.                 PWM1=0;
  220.                 for(i=0;i<20;i++)
  221.                 delay1ms();
  222.          }
  223. }
  224. //void L2_180()                                              //舵机180度旋转函数,有需要可解禁此功能
  225. //{
  226. //        int i,j;
  227. //        for(j=0;j<43;j++)
  228. //   {
  229. //                PWM1=1;
  230. //                delay1ms();
  231. //                delay1ms();
  232. //                delay500us();
  233. //                PWM1=0;
  234. //                for(i=0;i<17;i++)
  235. //                delay1ms();
  236. //                delay500us();
  237. //                PWM1=0;
  238. //                for(i=0;i<20;i++)
  239. //                delay1ms();
  240. //         }
  241. //}



  242. void Cont()            // 数据处理函数
  243. {
  244. switch(Com)
  245. {
  246.   case '5':
  247.             motor1=0;
  248.             motor2=0;
  249.             motor3=0;
  250.             motor4=0;
  251.             Send(Com);
  252.   break;
  253.   case '2':
  254.             qianjin();
  255.             Send(Com);
  256.   break;
  257.   case '4':
  258.             zuozhuan();
  259.             Send(Com);
  260.   break;
  261.   case '6':
  262.             youzhuan();
  263.             Send(Com);
  264.   break;
  265.   case '8':
  266.             houtui();
  267.             Send(Com);
  268.   break;
  269.   case '1':
  270.             xunji();
  271.             Send(Com);
  272.   break;
  273.   case '9':
  274.             L2_45();
  275.             delay(30);
  276.             L2_90();
  277.             delay(30);
  278.             L2_135();
  279.             delay(30);
  280.             L2_45();
  281.             delay(30);
  282.             L2_90();
  283.             delay(30);
  284.             L2_135();
  285.             delay(30);
  286.             L2_90();      
  287.             Send(Com);
  288.   break;
  289.   case 'F':
  290.             YOU();
  291.             Send(Com);
  292.   break;
  293.   case 'E':
  294.             ZUO();
  295.             Send(Com);
  296.   break;
  297.   default:
  298.    
  299.             motor1=0;
  300.             motor2=0;
  301.             motor3=0;
  302.             motor4=0;
  303.             Send(Com);
  304.   }
  305. }
复制代码

51hei.png

以上程序打包下载:
蓝牙.zip (20.86 KB, 下载次数: 20)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

68227855 发表于 2020-2-27 18:25 | 显示全部楼层
好资料,51黑有你更精彩!!! 接线图有吗?
回复

使用道具 举报

hj08102 发表于 2020-2-28 00:12 | 显示全部楼层
非常楼主感谢分享,正在学习如何控制电机相关的知识,参考下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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