找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6768|回复: 3
打印 上一主题 下一主题
收起左侧

蓝牙遥控51单片机智能小车源码(APP,通信协议等资料分享)

  [复制链接]
跳转到指定楼层
楼主
附件中有蓝牙遥控51单片机智能小车的程序,蓝牙APK,通信协议等


51智能小车蓝牙遥控通讯协议
协议格式如下:
$0,0,0,0,0,0,0,0,0,0,0,100,4200#

1、上下左右停止(对应协议中的第1
举例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
变量:direction
{up(1)down(2)left(3)right(4)stop(0)}

2、左旋转、右旋转(对应协议中的第3(自定义1)
举例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
变量:revolve
{turn_left(1)turn_right(2)}

3、鸣笛(对应协议中的第5(自定义3)
举例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
变量:whistle
{truefalse}

4、加速(对应协议中的第7(自定义5)
举例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
变量:expedite
{truefalse}

5、减速(对应协议中的第9(自定义6)
举例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
变量:reduce
{truefalse}

6、点灯(自锁)(对应协议中的第17(自定义2)
举例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
变量:light
{truefalse}1,0

7、灭火(自锁)(对应协议中的第19(自定义8)
举例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
变量:outfire
{truefalse}1,0

8、超声波(对应协议中的第23
举例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
变量:ultrasonic
{100.8}   cm

9、电池电压(对应协议中的第25
举例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
变量:voltage
{4.2}   v




单片机源程序如下:
  1. /**********************亚博智能小车黑线循迹例程************************
  2. *  平台:BST-V51  + Keil uVision3 + STC89C52RC
  3. *  名称:智能小车例程
  4. *  公司:深圳亚博智
  5. *  编写:罗工
  6. *  晶振:11.0592MHZ
  7. *  说明:免费开源,不提供源代码分析,有问题直接到交流群交流
  8. *  硬件设置:要有自己动手能力,进行组装接线和传感器灵敏度的调试,才能完成实验
  9. *  使用说明:根据下面IO口自己用杜邦线连接各种模块,可以自己修改各种模块IO口
  10. ******************************************************************/
  11. //按下K4按键,1秒左右启电小车
  12. //按下复位健可以停止小车        

  13. #include "reg52.h"             //包含52系统头文件
  14. #include <string.h>
  15. #include "bst_car.h"         //包含bst_car.h智能小车头文件

  16. unsigned char pwm_val_left  =0;//变量定义
  17. unsigned char pwm_val_right =0;
  18. unsigned char push_val_left ;// 左电机占空比N/20 //速度调节变量 0-20。。。0最小,20最大
  19. unsigned char push_val_right ;// 右电机占空比N/20
  20.                                                            // 大家可以根据循迹效果修改以上两个数值
  21. bit Right_PWM_ON=1;                   //右电机PWM开关
  22. bit Left_PWM_ON =1;                           //左电机PWM开关

  23. bit startBit = 0;                                  //串口接收开始标志位
  24. bit newLineReceived = 0;                 //串口一帧协议包接收完成

  25. unsigned char control=0X03;                //车运动控制全局变量
  26. unsigned char inputString[50];  //接收数据协议

  27. long int distance = 0;               //距离变量
  28. unsigned int timeH, timeL;
  29. unsigned char succeed_flag;

  30. /*小车运行状态枚举*/
  31. enum{
  32.   enSTOP = 0,
  33.   enRUN,
  34.   enBACK,
  35.   enLEFT,
  36.   enRIGHT
  37. }enCarState;

  38. #define         enMinMin()         {push_val_left =20;push_val_right =20;}
  39. #define         enMin()                 {push_val_left =24;push_val_right =24;}
  40. #define         enMidle()        {push_val_left =28;push_val_right =28;}
  41. #define                enMax()                 {push_val_left =32;push_val_right =32;}
  42. #define         run_car     '1'//按键前
  43. #define         back_car    '2'//按键后
  44. #define         left_car    '3'//按键左
  45. #define         right_car   '4'//按键右
  46. #define         stop_car    '0'//按键停

  47. int g_volume = 0;
  48. int g_carstate = 0;
  49. char returntemp[] = "$0,0,0,0,0,0,0,0,0,0,0,0000cm,8.2V#";





  50. //延时函数        
  51. void delay(unsigned int xms)                                
  52. {
  53.     unsigned int i,j;
  54.         for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
  55.     for(j=112;j>0;j--);
  56. }
  57. /******************************************************************************/
  58. /* 函数名称  : delayt                                                         */
  59. /* 函数描述  : 延时函数                                                       */
  60. /* 输入参数  : x                                                              */
  61. /* 参数描述  : 延时时间数据                                                   */
  62. /* 返回值    : 无                                                             */
  63. /******************************************************************************/        
  64. void delayt(unsigned int x)
  65. {
  66.     unsigned char j;
  67.     while(x-- > 0)
  68.     {
  69.               for(j = 0;j < 125;j++)
  70.         {
  71.             ;
  72.         }
  73.     }
  74. }

  75. /******************************************************************************/
  76. /* 函数名称  : Trig_SuperSonic                                                */
  77. /* 函数描述  : 发出声波函数                                                   */
  78. /* 输入参数  : 无                                                             */
  79. /* 参数描述  : 无                                                             */
  80. /* 返回值    : 无                                                             */
  81. /******************************************************************************/
  82. void Trig_SuperSonic(void)//发出声波
  83. {
  84.          OUTPUT = 1;
  85.          delayt(1);
  86.          OUTPUT = 0;
  87. }
  88. /******************************************************************************/
  89. /* 函数名称  : Measure_Distance                                               */
  90. /* 函数描述  : 计算距离函数                                                   */
  91. /* 输入参数  : 无                                                             */
  92. /* 参数描述  : 无                                                             */
  93. /* 返回值    : 无                                                             */
  94. /******************************************************************************/
  95. long Measure_Distance(void)
  96. {
  97.         unsigned int  time;
  98.         OUTPUT = 0;
  99.     EA = 1;
  100.         T2MOD = 0X00;
  101.         T2CON = 0x00; //定时器12位工作模式         自动重装
  102.         while(1)
  103.         {
  104.                 EA = 0;
  105.                 Trig_SuperSonic();
  106.                 while(INPUT == 0);
  107.                 succeed_flag = 0;
  108.                 EA = 1;
  109.                 EX0 = 1;
  110.                 TH2 = 0;
  111.                 TL2 = 0;
  112.                 TR2 = 1;  //开启定时器
  113.                 delayt(10);
  114.                 TR2 = 0;
  115.                 EX0 = 0;
  116.                 if(succeed_flag == 1)
  117.                 {
  118.                         time = timeH*256 + timeL;
  119.                         distance = time*0.0172;
  120.                         return distance;
  121.                 }
  122.                 else
  123.                 {
  124.                         distance = 0;

  125.                 }

  126.         }
  127. }

  128. //前进
  129. void run(void)
  130. {
  131.     //push_val_left=5;         //速度调节变量 0-20。。。0最小,20最大
  132.         //push_val_right=5;
  133.         Left_moto_go ;   //左电机往前走
  134.         Right_moto_go ;  //右电机往前走
  135. }

  136. //左转
  137. void leftrun(void)
  138. {         
  139.      //push_val_left=5;
  140.          //push_val_right=5;
  141.          Right_moto_go ;  //右电机往前走
  142.      Left_moto_Stop ;  //左电机停止
  143. //         delay(100);
  144. //         Right_moto_Stop;                //微信打开注释
  145. //         delay(100);

  146. }

  147. //右转
  148. void  rightrun(void)
  149. {
  150.          //push_val_left=5;
  151.          //push_val_right=5;
  152.      Left_moto_go  ;   //左电机往前走
  153.          Right_moto_Stop   ;  //右电机往前走
  154. //         delay(100);
  155. //         Left_moto_Stop;         //微信打开注释
  156. //         delay(100);
  157.         
  158. }

  159. //后退
  160. void back(void)
  161. {

  162.    Left_moto_back  ;  // 左轮后退
  163.    Right_moto_back  ;  // 左轮后退
  164. }

  165. //停转
  166. void stop(void)
  167. {
  168.   Right_moto_Stop  ;   //停转
  169.   Left_moto_Stop   ;   //
  170. }


  171. //左旋转
  172. void tleft(void)
  173. {
  174.   Left_moto_go  ;   //左电机往前走
  175.   Right_moto_back  ;  // 左轮后退
  176. }

  177. //右旋转
  178. void tright(void)
  179. {
  180.   Left_moto_back  ;   //左电机往前走
  181.   Right_moto_go ;  // 左轮后退
  182. }




  183. /************************************************************************/
  184. //                   PWM调制电机转速                                   

  185. //                   左电机调速                                       
  186. /*调节push_val_left的值改变电机转速,占空比*/
  187. void pwm_out_left_moto(void)
  188. {  
  189.      if(Left_PWM_ON)
  190.      {
  191.           if(pwm_val_left<=push_val_left)
  192.               {
  193.                    EN1=1;
  194.               }
  195.               else
  196.               {
  197.                    EN1=0;
  198.           }
  199.           if(pwm_val_left>=32)
  200.               pwm_val_left=0;
  201.      }
  202.      else   
  203.      {
  204.           EN1=0;   //若未开启PWM则EN1=0 左电机 停止
  205.      }
  206. }
  207. /******************************************************************/
  208. /*                    右电机调速                                  */  
  209. void pwm_out_right_moto(void)
  210. {
  211.     if(Right_PWM_ON)
  212.     {
  213.         if(pwm_val_right<=push_val_right)        //20ms内电平信号 111 111 0000 0000 0000 00
  214.             {
  215.                 EN2=1;                                                         //占空比6:20
  216.         }
  217.             else
  218.             {
  219.                 EN2=0;
  220.         }
  221.             if(pwm_val_right>=32)
  222.             pwm_val_right=0;
  223.     }
  224.     else   
  225.     {
  226.         EN2=0;          //若未开启PWM则EN2=0 右电机 停止
  227.     }
  228. }
  229.       
  230.       
  231. //TIMER0中断服务子函数产生PWM信号
  232. void timer0()interrupt 1 using 2
  233. {
  234.      TH0=0XFC;          //1Ms定时
  235.          TL0=0X66;
  236.          pwm_val_left++;
  237.          pwm_val_right++;
  238.          pwm_out_left_moto();
  239.          pwm_out_right_moto();
  240. }        
  241. void exit0() interrupt 0  // 外部中断0  超声波接收
  242. {
  243.         timeH = TH2;
  244.         timeL = TL2;
  245.         succeed_flag = 1;
  246.         EX0 = 0;
  247. }

  248. void timer2()  interrupt 5         //定时器2
  249. {
  250.          TF2 = 0;
  251.      TH2 = 0;          //1Ms定时
  252.          TL2 = 0;
  253. }
  254. /******************************************************************/
  255. /* 串口中断程序*/
  256. /******************************************************************/

  257. void UART_SER () interrupt 4
  258. {
  259.         unsigned char n;         //定义临时变量
  260.         static int num = 0;

  261.         if(RI)                 //判断是接收中断产生
  262.         {
  263.                 RI = 0;         //标志位清零
  264.                 n = SBUF; //读入缓冲区的值

  265.                 //control=n;


  266. )
  267.             {
  268.               startBit = 1;
  269.                   num = 0;
  270.             }
  271.             if(startBit == 1)
  272.             {
  273.                inputString[num] = n;     
  274.             }  
  275.             if (n == '#')
  276.             {
  277.                newLineReceived = 1;
  278.                startBit = 0;
  279.             }
  280.                 num++;
  281.                 if(num >= 50)
  282.                 {
  283.                         num = 0;
  284.                         startBit = 0;
  285.                         newLineReceived        = 0;
  286.                 }
  287.         }

  288. }


  289. //pwm初始化
  290. void pwmint(void)
  291. {
  292.         TMOD=0X01;
  293.         TH0= 0XFC;  //1ms定时
  294.     TL0= 0X66;
  295.         TR0= 1;
  296.         ET0= 1;
  297.         EA = 1;            //开总中断

  298. }

  299. //WIFI、蓝牙初始化
  300. void WifiInit(void)
  301. {
  302.    
  303.            SCON = 0x50;         // SCON: 模式1, 8-bit UART, 使能接收
  304.         TMOD |= 0x20;
  305.         TH1=0xfd;                 //波特率9600 初值
  306.         TL1=0xfd;
  307.         TR1= 1;
  308.         EA = 1;                    //开总中断
  309.         ES= 1;                         //打开串口中断


  310. }
  311. //串口发送函数
  312. void PutString(unsigned char *TXStr)  
  313. {               
  314.         ES=0;     
  315.         while(*TXStr!=0)
  316.         {                     
  317.           SBUF=*TXStr;
  318.           while(TI==0);
  319.           TI=0;   
  320.           TXStr++;
  321.         }
  322.         ES=1;
  323. }     
  324. //主函数
  325. void main(void)
  326. {        
  327.     P0 = 0X00;    //关电机        
  328.         P1 = 0xff;           //关闭所有LED和风扇
  329.         FIRE = 0;

  330.     pwmint();
  331.         WifiInit();

  332.         while(1)        //无限循环
  333.         {
  334.                  
  335.                  distance = Measure_Distance();        //计算脉宽并转换为距离
  336.                  

  337.                 if (newLineReceived)
  338.                    {
  339.                         switch(inputString[1])
  340.                         {
  341.                                 case run_car:   g_carstate = enRUN; break;
  342.                                 case back_car:  g_carstate = enBACK;break;
  343.                                 case left_car:  g_carstate = enLEFT;break;
  344.                                 case right_car: g_carstate = enRIGHT;break;
  345.                                 case stop_car:  g_carstate = enSTOP;break;
  346.                                 default:g_carstate = enSTOP;break;
  347.                         }
  348.                         if(inputString[3] == '1')  //左旋转
  349.                         {
  350.                                 TR0= 1;
  351.                                 tleft();
  352.                                 delay(2000);//延时2s
  353.                                 stop();
  354.                                 TR0= 0;
  355.                         }
  356.                         else if(inputString[3] == '2')        // 右旋转
  357.                         {
  358.                                    TR0= 1;
  359.                                 tright();
  360.                                 delay(2000);//延时2s
  361.                                 stop();
  362.                                 TR0= 0;
  363.                         }
  364.                         if(inputString[5] == '1')  //鸣笛
  365.                         {
  366.                                 FM = 0;
  367.                                 delay(1000);
  368.                                 FM = 1;
  369.                         }
  370.                         if(inputString[7] == '1')  //加速
  371.                         {
  372.                                 g_volume++;
  373.                                 if(g_volume>=4)
  374.                                 {
  375.                                         g_volume = 4;
  376.                                 }
  377.                         }
  378.                         if(inputString[9] == '1')  //减速
  379.                         {
  380.                                 g_volume--;
  381.                                 if(g_volume<=0)
  382.                                 {
  383.                                         g_volume = 1;
  384.                                 }
  385.                         }   
  386.                         if(inputString[17] == '1')  //点灯
  387.                         {
  388.                                 LED = (LED == 1)?0:1;  //反转电平
  389.                                 delay(200);//延时2s
  390.                                 LED = (LED == 1)?0:1;  //反转电平
  391.                                 delay(200);//延时2s
  392.                                 LED = (LED == 1)?0:1;  //反转电平
  393.                                 delay(200);//延时2s
  394.                                 LED = (LED == 1)?0:1;  //反转电平
  395.                                 delay(200);//延时2s
  396.                                 LED = (LED == 1)?0:1;  //反转电平
  397.                                 delay(200);//延时2s
  398.                                 LED = (LED == 1)?0:1;  //反转电平
  399.                                 delay(200);//延时2s
  400.                                 LED = (LED == 1)?0:1;  //反转电平
  401.                                 delay(200);//延时2s
  402.                                 LED = (LED == 1)?0:1;  //反转电平
  403.                                 delay(200);//延时2s
  404.                         }
  405.                         
  406.                         if(inputString[19] == '1')  //灭火
  407.                         {
  408.                                 FIRE = (FIRE == 1)?0:1;
  409.                         }        
  410.               
  411.                //返回状态
  412.                    //组装超声波数据
  413.                         returntemp[23] = (distance / 1000) + 0x30;
  414.                         returntemp[24] = (distance / 100 % 10) + 0x30;
  415.                         returntemp[25] = (distance / 10 % 10) + 0x30;
  416.                         returntemp[26] = (distance % 10 ) + 0x30;


  417.                PutString(returntemp); //返回协议数据包      
  418.                
  419.                newLineReceived = 0;  
  420.                    memset(inputString, 0x00, sizeof(inputString));  
  421.          
  422.             }
  423.    
  424. ……………………

  425. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



所有资料51hei提供下载:

51智能小车蓝牙遥控.zip (4.39 MB, 下载次数: 142)


评分

参与人数 1黑币 +60 收起 理由
admin + 60

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:330023 发表于 2018-6-12 20:04 | 只看该作者
emmmm  哪位大佬可以把资料发我一份吗??
回复

使用道具 举报

板凳
ID:429154 发表于 2018-12-11 11:28 | 只看该作者
不是apk的源码,下载了好像没有用
回复

使用道具 举报

地板
ID:633514 发表于 2019-10-31 21:09 | 只看该作者
luvivin 发表于 2018-12-11 11:28
不是apk的源码,下载了好像没有用

不太会做,下载来看一看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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