找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8079|回復: 8
打印 上一主題 下一主題
收起左側

無線藍牙小車—手勢遙控 全套制作資料

  [復制鏈接]
跳轉到指定樓層
樓主
ID:210249 發(fā)表于 2017-6-11 21:50 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本制作以STC89C52RC單片機和ADXL345加速度模塊。加速度模塊固定在手上時,當手向左傾斜,小車左轉;手向右傾斜,小車右轉;手向前傾斜,小車前進;手向后傾斜,小車倒退;手水平不動,小車停止任何動作。有效控制范圍 10米(開闊地)。



資料在附件中。。。。。

加速度模塊不同傾角時,向計算機發(fā)送不同數(shù)據(jù)
1 左偏時,發(fā)送0a
2 右偏時,發(fā)送a0
3 前偏時,發(fā)送aa
3 后偏是,發(fā)送55

發(fā)送數(shù)據(jù)時,數(shù)據(jù)類型具備優(yōu)先級,當左右方向現(xiàn)有數(shù)據(jù)時,優(yōu)先發(fā)送左右控制字符

優(yōu)化了部分程序,刪除了多余的測試程序
優(yōu)化了數(shù)組,相比于版本3,刪除了多余的數(shù)組

單片機源程序如下:
  1. #include  <REG52.H>        
  2. #include  <basic.h>
  3. #include  <math.h>    //Keil library  
  4. #include  <stdio.h>   //Keil library        
  5. #include  <INTRINS.H>
  6. sbit          SCL=P1^0;      //IIC時鐘引腳定義
  7. sbit           SDA=P1^1;      //IIC數(shù)據(jù)引腳定義
  8. #define        SlaveAddress   0xA6          //定義器件在IIC總線中的從地址,根據(jù)ALT  ADDRESS地址引腳不同修改
  9.                               //ALT  ADDRESS引腳接地時地址為0xA6,接電源時地
  10. #define JudgeP_M  0x8000   //正負數(shù)判斷
  11. #define Left_cmp  0x006e   //方向數(shù)據(jù)比較值,數(shù)值越小,越靈敏
  12. #define Right_cmp 0x006e
  13. #define Go_cmp    0x006e
  14. #define Back_cmp  0x006e
  15. #define Go    0xaa                   //小車實際動作控制字符,以實物為準
  16. #define Back  0x55
  17. #define Left  0xa0
  18. #define Right 0x0a
  19. #define Stop  0x00                   //停止控制字符
  20. Byte BUF[8];                         //接收數(shù)據(jù)緩存區(qū)
  21. Byte Sbuf[8];
  22. Word Wbuf[2];            
  23. int  dis_data;                       //變量
  24. void delay(unsigned int k);
  25. void Init_ADXL345(void);             //初始化ADXL345
  26. void WriteDataLCM(Byte dataW);
  27. void WriteCommandLCM(Byte CMD,Byte Attribc);
  28. void DisplayOneChar(Byte X,Byte Y,Byte DData);
  29. void conversion(Word temp_data);
  30. void  Single_Write_ADXL345(Byte REG_Address,Byte REG_data);   //單個寫入數(shù)據(jù)
  31. Byte Single_Read_ADXL345(Byte REG_Address);                   //單個讀取內部寄存器數(shù)據(jù)
  32. void  Multiple_Read_ADXL345();                                  //連續(xù)的讀取內部寄存器數(shù)據(jù)
  33. //------------------------------------
  34. void Delay5us();
  35. void Delay5ms();
  36. void Delay20ms();
  37. void ADXL345_Start();
  38. void ADXL345_Stop();
  39. void ADXL345_SendACK(bit ack);
  40. bit  ADXL345_RecvACK();
  41. void ADXL345_SendByte(Byte dat);
  42. Byte ADXL345_RecvByte();
  43. void ADXL345_ReadPage();
  44. void ADXL345_WritePage();
  45. void send();
  46. void uart();
  47. void Data_Convert();
  48. void Data_Process();
  49. void direction_judge();


  50. //******主程序********
  51. void main()
  52. {
  53.         void Delay20ms();                                   //上電延時                                   
  54.         uart();        
  55.         Init_ADXL345();                         //初始化ADXL345
  56.         while(1)                                 //循環(huán)
  57.         {
  58.                 Multiple_Read_ADXL345();               //連續(xù)讀出數(shù)據(jù),存儲在BUF中
  59.                 Data_Convert();
  60.         Data_Process();
  61.                 direction_judge();
  62.                 Delay20ms();                           //延時      
  63.         }
  64. }

  65. /*******************************/
  66. void Delay20ms()                //@11.0592MHz
  67. {
  68.         unsigned char i, j, k;

  69.         _nop_();
  70.         _nop_();
  71.         i = 1;
  72.         j = 216;
  73.         k = 35;
  74.         do
  75.         {
  76.                 do
  77.                 {
  78.                         while (--k);
  79.                 } while (--j);
  80.         } while (--i);
  81. }
  82.                                                                                 
  83. /*******************************/                                       
  84. /**************************************
  85. 延時5微秒(STC90C52RC@12M)
  86. 不同的工作環(huán)境,需要調整此函數(shù),注意時鐘過快時需要修改
  87. 當改用1T的MCU時,請調整此延時函數(shù)
  88. **************************************/
  89. void Delay5us()
  90. {
  91.     _nop_();_nop_();_nop_();_nop_();
  92.     _nop_();_nop_();_nop_();_nop_();
  93.         _nop_();_nop_();_nop_();_nop_();
  94. }

  95. /**************************************
  96. 延時5毫秒(STC90C52RC@12M)
  97. 不同的工作環(huán)境,需要調整此函數(shù)
  98. 當改用1T的MCU時,請調整此延時函數(shù)
  99. **************************************/
  100. void Delay5ms()
  101. {
  102.     Word n = 560;

  103.     while (n--);
  104. }
  105. /**************************************
  106. 起始信號
  107. **************************************/
  108. void ADXL345_Start()
  109. {
  110.     SDA = 1;                    //拉高數(shù)據(jù)線
  111.     SCL = 1;                    //拉高時鐘線
  112.     Delay5us();                 //延時
  113.     SDA = 0;                    //產生下降沿
  114.     Delay5us();                 //延時
  115.     SCL = 0;                    //拉低時鐘線
  116. }
  117. /**************************************
  118. 停止信號
  119. **************************************/
  120. void ADXL345_Stop()
  121. {
  122.     SDA = 0;                    //拉低數(shù)據(jù)線
  123.     SCL = 1;                    //拉高時鐘線
  124.     Delay5us();                 //延時
  125.     SDA = 1;                    //產生上升沿
  126.     Delay5us();                 //延時
  127. }
  128. /**************************************
  129. 發(fā)送應答信號
  130. 入口參數(shù):ack (0:ACK 1:NAK)
  131. **************************************/
  132. void ADXL345_SendACK(bit ack)
  133. {
  134.     SDA = ack;                  //寫應答信號
  135.     SCL = 1;                    //拉高時鐘線
  136.     Delay5us();                 //延時
  137.     SCL = 0;                    //拉低時鐘線
  138.     Delay5us();                 //延時
  139. }
  140. /**************************************
  141. 接收應答信號
  142. **************************************/
  143. bit ADXL345_RecvACK()
  144. {
  145.     SCL = 1;                    //拉高時鐘線
  146.     Delay5us();                 //延時
  147.     CY = SDA;                   //讀應答信號
  148.     SCL = 0;                    //拉低時鐘線
  149.     Delay5us();                 //延時

  150.     return CY;
  151. }
  152. /**************************************
  153. 向IIC總線發(fā)送一個字節(jié)數(shù)據(jù)
  154. **************************************/
  155. void ADXL345_SendByte(Byte dat)
  156. {
  157.     Byte i;

  158.     for (i=0; i<8; i++)         //8位計數(shù)器
  159.     {
  160.         dat <<= 1;              //移出數(shù)據(jù)的最高位
  161.         SDA = CY;               //送數(shù)據(jù)口
  162.         SCL = 1;                //拉高時鐘線
  163.         Delay5us();             //延時
  164.         SCL = 0;                //拉低時鐘線
  165.         Delay5us();             //延時
  166.     }
  167.     ADXL345_RecvACK();
  168. }
  169. //從IIC總線接收一個字節(jié)數(shù)據(jù)
  170. Byte ADXL345_RecvByte()
  171. {
  172.     Byte i;
  173.     Byte dat = 0;
  174.     SDA = 1;                    //使能內部上拉,準備讀取數(shù)據(jù),
  175.     for (i=0; i<8; i++)         //8位計數(shù)器
  176.     {
  177.         dat <<= 1;
  178.         SCL = 1;                //拉高時鐘線
  179.         Delay5us();             //延時
  180.         dat |= SDA;             //讀數(shù)據(jù)               
  181.         SCL = 0;                //拉低時鐘線
  182.         Delay5us();             //延時
  183.     }
  184.     return dat;
  185. }
  186. //******單字節(jié)寫入*******************************************
  187. void Single_Write_ADXL345(Byte REG_Address,Byte REG_data)
  188. {
  189.     ADXL345_Start();                  //起始信號
  190.     ADXL345_SendByte(SlaveAddress);   //發(fā)送設備地址+寫信號
  191.     ADXL345_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf22頁
  192.     ADXL345_SendByte(REG_data);       //內部寄存器數(shù)據(jù),請參考中文pdf22頁
  193.     ADXL345_Stop();                   //發(fā)送停止信號
  194. }
  195. //********單字節(jié)讀取*****************************************
  196. Byte Single_Read_ADXL345(Byte REG_Address)
  197. {  Byte REG_data;
  198.     ADXL345_Start();                          //起始信號
  199.     ADXL345_SendByte(SlaveAddress);           //發(fā)送設備地址+寫信號
  200.     ADXL345_SendByte(REG_Address);            //發(fā)送存儲單元地址,從0開始        
  201.     ADXL345_Start();                          //起始信號
  202.     ADXL345_SendByte(SlaveAddress+1);         //發(fā)送設備地址+讀信號
  203.     REG_data=ADXL345_RecvByte();              //讀出寄存器數(shù)據(jù)
  204.         ADXL345_SendACK(1);   
  205.         ADXL345_Stop();                           //停止信號
  206.     return REG_data;
  207. }
  208. //連續(xù)讀出ADXL345內部加速度數(shù)據(jù),地址范圍0x32~0x37
  209. void Multiple_read_ADXL345(void)
  210. {   Byte i;
  211.     ADXL345_Start();                          //起始信號
  212.     ADXL345_SendByte(SlaveAddress);           //發(fā)送設備地址+寫信號
  213.     ADXL345_SendByte(0x32);                   //發(fā)送存儲單元地址,從0x32開始        
  214.     ADXL345_Start();                          //起始信號
  215.     ADXL345_SendByte(SlaveAddress+1);         //發(fā)送設備地址+讀信號
  216.          for (i=0; i<6; i++)                      //連續(xù)讀取6個地址數(shù)據(jù),存儲中BUF
  217.     {
  218.         BUF[i] = ADXL345_RecvByte();          //BUF[0]存儲0x32地址中的數(shù)據(jù)
  219.         if (i == 5)
  220.         {
  221.            ADXL345_SendACK(1);                //最后一個數(shù)據(jù)需要回NOACK
  222.         }
  223.         else
  224.         {
  225.           ADXL345_SendACK(0);                //回應ACK
  226.        }
  227.    }
  228.     ADXL345_Stop();                          //停止信號
  229.     Delay5ms();
  230. }
  231. //初始化ADXL345,根據(jù)需要請參考pdf進行修改************************
  232. void Init_ADXL345()
  233. {
  234.    Single_Write_ADXL345(0x31,0x0B);   //測量范圍,正負16g,13位模式
  235.    Single_Write_ADXL345(0x2C,0x08);   //速率設定為12.5 參考pdf13頁
  236.    Single_Write_ADXL345(0x2D,0x08);   //選擇電源模式   參考pdf24頁
  237.    Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中斷
  238.    Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根據(jù)測試傳感器的狀態(tài)寫入pdf29頁
  239.    Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根據(jù)測試傳感器的狀態(tài)寫入pdf29頁
  240.    Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根據(jù)測試傳感器的狀態(tài)寫入pdf29頁
  241. }
  242. void uart()
  243. {
  244. SCON=0x50;
  245. TMOD=0x20;
  246. PCON=0x00;
  247. TH1=0xfd;
  248. TL1=0xfd;
  249. IE=0x90;
  250. TR1=1;
  251. }

  252. void send(unsigned char ch)
  253. {
  254. ES=0;
  255. SBUF=ch;
  256. while (TI==0);
  257. TI=0 ;
  258. ES=1;
  259. }
  260. void Data_Convert()                                                //將兩個八位數(shù)據(jù)合成為一個16位數(shù)據(jù)
  261. {
  262.   Wbuf[0]=BUF[1]<<8|BUF[0];
  263.   Wbuf[1]=BUF[3]<<8|BUF[2];
  264.   Wbuf[2]=BUF[5]<<8|BUF[4];
  265. }
  266. void Data_Process()
  267. {
  268.    Word i=0;
  269.     i=Wbuf[0]&JudgeP_M;           //X軸數(shù)據(jù)處理
  270.   if(i==0x8000)                   //當結果為負數(shù)時
  271.   {
  272.    Wbuf[0]=~Wbuf[0]+1;
  273.    Wbuf[0]=Wbuf[0]&0x7fff;
  274.    if(Wbuf[0]>Left_cmp)
  275.    {
  276.    Sbuf[0]=Left;
  277.    }
  278.    else
  279.    {
  280.    Sbuf[0]=Stop;
  281.    }
  282.   }
  283.   else                                           //當結果為正數(shù)時
  284.   {
  285.    if(Wbuf[0]>Right_cmp)
  286.    {
  287.       Sbuf[0]=Right;
  288.    }
  289.    else
  290.    {
  291.            Sbuf[0]=Stop;
  292.    }
  293.   }
  294.   i=Wbuf[1]&JudgeP_M;                   //Y軸數(shù)據(jù)處理
  295.   if(i==0x8000)                   //當結果為負數(shù)時
  296.   {
  297. ……………………

  298. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
無線藍牙小車-手勢遙控全套代碼資料.rar (1.14 MB, 下載次數(shù): 109)




評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:209421 發(fā)表于 2017-6-20 06:43 | 只看該作者
雖然看不懂,還是先收藏了
回復

使用道具 舉報

板凳
ID:164602 發(fā)表于 2017-6-22 09:14 | 只看該作者
2016年,我在單片機微信上看到了這個,當時由于不理解藍牙,所以沒能做出來,雖然十分有興趣。現(xiàn)在用手機做出來一個遙控小車,理解了藍牙的使用,但這個加速度儀還是不會用,能讀出加速度儀的數(shù)據(jù),但還不理解它的數(shù)據(jù)含義,所以沒有做出來?上?吹竭@全套的資料,也是無奈。
回復

使用道具 舉報

地板
ID:455377 發(fā)表于 2018-12-26 14:58 來自手機 | 只看該作者
太厲害了
回復

使用道具 舉報

5#
ID:457150 發(fā)表于 2018-12-28 11:38 | 只看該作者
好東西呀,正在學習這方面知識,頂起來!
回復

使用道具 舉報

6#
ID:483023 發(fā)表于 2019-4-3 18:53 | 只看該作者
把發(fā)射程序和接收程序一起燒入單片機嗎?
回復

使用道具 舉報

7#
ID:250717 發(fā)表于 2019-4-4 14:30 | 只看該作者
樓主,能把用到的材料的淘寶鏈接發(fā)一下嗎?我也想做一個。
回復

使用道具 舉報

8#
ID:483023 發(fā)表于 2019-4-12 09:52 來自手機 | 只看該作者
照著步驟做我都沒成功,有成功的嗎?
回復

使用道具 舉報

9#
ID:371529 發(fā)表于 2019-4-19 20:47 | 只看該作者
黑魔力 發(fā)表于 2019-4-12 09:52
照著步驟做我都沒成功,有成功的嗎?

我也沒有,很是無奈,可能是藍牙沒有配對
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表