找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7718|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

藍(lán)牙遙控51單片機(jī)智能小車(chē)源碼(APP,通信協(xié)議等資料分享)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
附件中有藍(lán)牙遙控51單片機(jī)智能小車(chē)的程序,藍(lán)牙APK,通信協(xié)議等


51智能小車(chē)藍(lán)牙遙控通訊協(xié)議
協(xié)議格式如下:
$0,0,0,0,0,0,0,0,0,0,0,100,4200#

1、上下左右停止(對(duì)應(yīng)協(xié)議中的第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、左旋轉(zhuǎn)、右旋轉(zhuǎn)(對(duì)應(yīng)協(xié)議中的第3(自定義1)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:revolve
{turn_left(1),turn_right(2)}

3、鳴笛(對(duì)應(yīng)協(xié)議中的第5(自定義3)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:whistle
{true,false}

4、加速(對(duì)應(yīng)協(xié)議中的第7(自定義5)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:expedite
{true,false}

5、減速(對(duì)應(yīng)協(xié)議中的第9(自定義6)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:reduce
{true,false}

6、點(diǎn)燈(自鎖)(對(duì)應(yīng)協(xié)議中的第17(自定義2)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:light
{true,false}1,0

7、滅火(自鎖)(對(duì)應(yīng)協(xié)議中的第19(自定義8)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:outfire
{true,false}1,0

8、超聲波(對(duì)應(yīng)協(xié)議中的第23
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:ultrasonic
{100.8}   cm

9、電池電壓(對(duì)應(yīng)協(xié)議中的第25
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:voltage
{4.2}   v




單片機(jī)源程序如下:
  1. /**********************亞博智能小車(chē)黑線循跡例程************************
  2. *  平臺(tái):BST-V51  + Keil uVision3 + STC89C52RC
  3. *  名稱(chēng):智能小車(chē)?yán)?br />
  4. *  公司:深圳亞博智
  5. *  編寫(xiě):羅工
  6. *  晶振:11.0592MHZ
  7. *  說(shuō)明:免費(fèi)開(kāi)源,不提供源代碼分析,有問(wèn)題直接到交流群交流
  8. *  硬件設(shè)置:要有自己動(dòng)手能力,進(jìn)行組裝接線和傳感器靈敏度的調(diào)試,才能完成實(shí)驗(yàn)
  9. *  使用說(shuō)明:根據(jù)下面IO口自己用杜邦線連接各種模塊,可以自己修改各種模塊IO口
  10. ******************************************************************/
  11. //按下K4按鍵,1秒左右啟電小車(chē)
  12. //按下復(fù)位健可以停止小車(chē)        

  13. #include "reg52.h"             //包含52系統(tǒng)頭文件
  14. #include <string.h>
  15. #include "bst_car.h"         //包含bst_car.h智能小車(chē)頭文件

  16. unsigned char pwm_val_left  =0;//變量定義
  17. unsigned char pwm_val_right =0;
  18. unsigned char push_val_left ;// 左電機(jī)占空比N/20 //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
  19. unsigned char push_val_right ;// 右電機(jī)占空比N/20
  20.                                                            // 大家可以根據(jù)循跡效果修改以上兩個(gè)數(shù)值
  21. bit Right_PWM_ON=1;                   //右電機(jī)PWM開(kāi)關(guān)
  22. bit Left_PWM_ON =1;                           //左電機(jī)PWM開(kāi)關(guān)

  23. bit startBit = 0;                                  //串口接收開(kāi)始標(biāo)志位
  24. bit newLineReceived = 0;                 //串口一幀協(xié)議包接收完成

  25. unsigned char control=0X03;                //車(chē)運(yùn)動(dòng)控制全局變量
  26. unsigned char inputString[50];  //接收數(shù)據(jù)協(xié)議

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

  30. /*小車(chē)運(yùn)行狀態(tài)枚舉*/
  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. //延時(shí)函數(shù)        
  51. void delay(unsigned int xms)                                
  52. {
  53.     unsigned int i,j;
  54.         for(i=xms;i>0;i--)                      //i=xms即延時(shí)約xms毫秒
  55.     for(j=112;j>0;j--);
  56. }
  57. /******************************************************************************/
  58. /* 函數(shù)名稱(chēng)  : delayt                                                         */
  59. /* 函數(shù)描述  : 延時(shí)函數(shù)                                                       */
  60. /* 輸入?yún)?shù)  : x                                                              */
  61. /* 參數(shù)描述  : 延時(shí)時(shí)間數(shù)據(jù)                                                   */
  62. /* 返回值    : 無(wú)                                                             */
  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. /* 函數(shù)名稱(chēng)  : Trig_SuperSonic                                                */
  77. /* 函數(shù)描述  : 發(fā)出聲波函數(shù)                                                   */
  78. /* 輸入?yún)?shù)  : 無(wú)                                                             */
  79. /* 參數(shù)描述  : 無(wú)                                                             */
  80. /* 返回值    : 無(wú)                                                             */
  81. /******************************************************************************/
  82. void Trig_SuperSonic(void)//發(fā)出聲波
  83. {
  84.          OUTPUT = 1;
  85.          delayt(1);
  86.          OUTPUT = 0;
  87. }
  88. /******************************************************************************/
  89. /* 函數(shù)名稱(chēng)  : Measure_Distance                                               */
  90. /* 函數(shù)描述  : 計(jì)算距離函數(shù)                                                   */
  91. /* 輸入?yún)?shù)  : 無(wú)                                                             */
  92. /* 參數(shù)描述  : 無(wú)                                                             */
  93. /* 返回值    : 無(wú)                                                             */
  94. /******************************************************************************/
  95. long Measure_Distance(void)
  96. {
  97.         unsigned int  time;
  98.         OUTPUT = 0;
  99.     EA = 1;
  100.         T2MOD = 0X00;
  101.         T2CON = 0x00; //定時(shí)器12位工作模式         自動(dòng)重裝
  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;  //開(kāi)啟定時(shí)器
  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. //前進(jìn)
  129. void run(void)
  130. {
  131.     //push_val_left=5;         //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
  132.         //push_val_right=5;
  133.         Left_moto_go ;   //左電機(jī)往前走
  134.         Right_moto_go ;  //右電機(jī)往前走
  135. }

  136. //左轉(zhuǎn)
  137. void leftrun(void)
  138. {         
  139.      //push_val_left=5;
  140.          //push_val_right=5;
  141.          Right_moto_go ;  //右電機(jī)往前走
  142.      Left_moto_Stop ;  //左電機(jī)停止
  143. //         delay(100);
  144. //         Right_moto_Stop;                //微信打開(kāi)注釋
  145. //         delay(100);

  146. }

  147. //右轉(zhuǎn)
  148. void  rightrun(void)
  149. {
  150.          //push_val_left=5;
  151.          //push_val_right=5;
  152.      Left_moto_go  ;   //左電機(jī)往前走
  153.          Right_moto_Stop   ;  //右電機(jī)往前走
  154. //         delay(100);
  155. //         Left_moto_Stop;         //微信打開(kāi)注釋
  156. //         delay(100);
  157.         
  158. }

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

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

  165. //停轉(zhuǎn)
  166. void stop(void)
  167. {
  168.   Right_moto_Stop  ;   //停轉(zhuǎn)
  169.   Left_moto_Stop   ;   //
  170. }


  171. //左旋轉(zhuǎn)
  172. void tleft(void)
  173. {
  174.   Left_moto_go  ;   //左電機(jī)往前走
  175.   Right_moto_back  ;  // 左輪后退
  176. }

  177. //右旋轉(zhuǎn)
  178. void tright(void)
  179. {
  180.   Left_moto_back  ;   //左電機(jī)往前走
  181.   Right_moto_go ;  // 左輪后退
  182. }




  183. /************************************************************************/
  184. //                   PWM調(diào)制電機(jī)轉(zhuǎn)速                                   

  185. //                   左電機(jī)調(diào)速                                       
  186. /*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比*/
  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;   //若未開(kāi)啟PWM則EN1=0 左電機(jī) 停止
  205.      }
  206. }
  207. /******************************************************************/
  208. /*                    右電機(jī)調(diào)速                                  */  
  209. void pwm_out_right_moto(void)
  210. {
  211.     if(Right_PWM_ON)
  212.     {
  213.         if(pwm_val_right<=push_val_right)        //20ms內(nèi)電平信號(hào) 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;          //若未開(kāi)啟PWM則EN2=0 右電機(jī) 停止
  227.     }
  228. }
  229.       
  230.       
  231. //TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)
  232. void timer0()interrupt 1 using 2
  233. {
  234.      TH0=0XFC;          //1Ms定時(shí)
  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         //定時(shí)器2
  249. {
  250.          TF2 = 0;
  251.      TH2 = 0;          //1Ms定時(shí)
  252.          TL2 = 0;
  253. }
  254. /******************************************************************/
  255. /* 串口中斷程序*/
  256. /******************************************************************/

  257. void UART_SER () interrupt 4
  258. {
  259.         unsigned char n;         //定義臨時(shí)變量
  260.         static int num = 0;

  261.         if(RI)                 //判斷是接收中斷產(chǎn)生
  262.         {
  263.                 RI = 0;         //標(biāo)志位清零
  264.                 n = SBUF; //讀入緩沖區(qū)的值

  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定時(shí)
  294.     TL0= 0X66;
  295.         TR0= 1;
  296.         ET0= 1;
  297.         EA = 1;            //開(kāi)總中斷

  298. }

  299. //WIFI、藍(lán)牙初始化
  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;                    //開(kāi)總中斷
  309.         ES= 1;                         //打開(kāi)串口中斷


  310. }
  311. //串口發(fā)送函數(shù)
  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. //主函數(shù)
  325. void main(void)
  326. {        
  327.     P0 = 0X00;    //關(guān)電機(jī)        
  328.         P1 = 0xff;           //關(guān)閉所有LED和風(fēng)扇
  329.         FIRE = 0;

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

  332.         while(1)        //無(wú)限循環(huán)
  333.         {
  334.                  
  335.                  distance = Measure_Distance();        //計(jì)算脈寬并轉(zhuǎn)換為距離
  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')  //左旋轉(zhuǎn)
  349.                         {
  350.                                 TR0= 1;
  351.                                 tleft();
  352.                                 delay(2000);//延時(shí)2s
  353.                                 stop();
  354.                                 TR0= 0;
  355.                         }
  356.                         else if(inputString[3] == '2')        // 右旋轉(zhuǎn)
  357.                         {
  358.                                    TR0= 1;
  359.                                 tright();
  360.                                 delay(2000);//延時(shí)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')  //點(diǎn)燈
  387.                         {
  388.                                 LED = (LED == 1)?0:1;  //反轉(zhuǎn)電平
  389.                                 delay(200);//延時(shí)2s
  390.                                 LED = (LED == 1)?0:1;  //反轉(zhuǎn)電平
  391.                                 delay(200);//延時(shí)2s
  392.                                 LED = (LED == 1)?0:1;  //反轉(zhuǎn)電平
  393.                                 delay(200);//延時(shí)2s
  394.                                 LED = (LED == 1)?0:1;  //反轉(zhuǎn)電平
  395.                                 delay(200);//延時(shí)2s
  396.                                 LED = (LED == 1)?0:1;  //反轉(zhuǎn)電平
  397.                                 delay(200);//延時(shí)2s
  398.                                 LED = (LED == 1)?0:1;  //反轉(zhuǎn)電平
  399.                                 delay(200);//延時(shí)2s
  400.                                 LED = (LED == 1)?0:1;  //反轉(zhuǎn)電平
  401.                                 delay(200);//延時(shí)2s
  402.                                 LED = (LED == 1)?0:1;  //反轉(zhuǎn)電平
  403.                                 delay(200);//延時(shí)2s
  404.                         }
  405.                         
  406.                         if(inputString[19] == '1')  //滅火
  407.                         {
  408.                                 FIRE = (FIRE == 1)?0:1;
  409.                         }        
  410.               
  411.                //返回狀態(tài)
  412.                    //組裝超聲波數(shù)據(jù)
  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); //返回協(xié)議數(shù)據(jù)包      
  418.                
  419.                newLineReceived = 0;  
  420.                    memset(inputString, 0x00, sizeof(inputString));  
  421.          
  422.             }
  423.    
  424. ……………………

  425. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼



所有資料51hei提供下載:

51智能小車(chē)藍(lán)牙遙控.zip (4.39 MB, 下載次數(shù): 142)


評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:330023 發(fā)表于 2018-6-12 20:04 | 只看該作者
emmmm  哪位大佬可以把資料發(fā)我一份嗎??
回復(fù)

使用道具 舉報(bào)

板凳
ID:429154 發(fā)表于 2018-12-11 11:28 | 只看該作者
不是apk的源碼,下載了好像沒(méi)有用
回復(fù)

使用道具 舉報(bào)

地板
ID:633514 發(fā)表于 2019-10-31 21:09 | 只看該作者
luvivin 發(fā)表于 2018-12-11 11:28
不是apk的源碼,下載了好像沒(méi)有用

不太會(huì)做,下載來(lái)看一看
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表