久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉到指定樓層
樓主
本制作以STC89C52RC單片機和ADXL345加速度模塊。加速度模塊固定在手上時,當手向左傾斜,小車左轉;手向右傾斜,小車右轉;手向前傾斜,小車前進;手向后傾斜,小車倒退;手水平不動,小車停止任何動作。有效控制范圍 10米(開闊地)。



資料在附件中。。。。。

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

發送數據時,數據類型具備優先級,當左右方向現有數據時,優先發送左右控制字符

優化了部分程序,刪除了多余的測試程序
優化了數組,相比于版本3,刪除了多余的數組

單片機源程序如下:
  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數據引腳定義
  8. #define        SlaveAddress   0xA6          //定義器件在IIC總線中的從地址,根據ALT  ADDRESS地址引腳不同修改
  9.                               //ALT  ADDRESS引腳接地時地址為0xA6,接電源時地
  10. #define JudgeP_M  0x8000   //正負數判斷
  11. #define Left_cmp  0x006e   //方向數據比較值,數值越小,越靈敏
  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];                         //接收數據緩存區
  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);   //單個寫入數據
  31. Byte Single_Read_ADXL345(Byte REG_Address);                   //單個讀取內部寄存器數據
  32. void  Multiple_Read_ADXL345();                                  //連續的讀取內部寄存器數據
  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)                                 //循環
  57.         {
  58.                 Multiple_Read_ADXL345();               //連續讀出數據,存儲在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. 不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
  87. 當改用1T的MCU時,請調整此延時函數
  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. 不同的工作環境,需要調整此函數
  98. 當改用1T的MCU時,請調整此延時函數
  99. **************************************/
  100. void Delay5ms()
  101. {
  102.     Word n = 560;

  103.     while (n--);
  104. }
  105. /**************************************
  106. 起始信號
  107. **************************************/
  108. void ADXL345_Start()
  109. {
  110.     SDA = 1;                    //拉高數據線
  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;                    //拉低數據線
  123.     SCL = 1;                    //拉高時鐘線
  124.     Delay5us();                 //延時
  125.     SDA = 1;                    //產生上升沿
  126.     Delay5us();                 //延時
  127. }
  128. /**************************************
  129. 發送應答信號
  130. 入口參數: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總線發送一個字節數據
  154. **************************************/
  155. void ADXL345_SendByte(Byte dat)
  156. {
  157.     Byte i;

  158.     for (i=0; i<8; i++)         //8位計數器
  159.     {
  160.         dat <<= 1;              //移出數據的最高位
  161.         SDA = CY;               //送數據口
  162.         SCL = 1;                //拉高時鐘線
  163.         Delay5us();             //延時
  164.         SCL = 0;                //拉低時鐘線
  165.         Delay5us();             //延時
  166.     }
  167.     ADXL345_RecvACK();
  168. }
  169. //從IIC總線接收一個字節數據
  170. Byte ADXL345_RecvByte()
  171. {
  172.     Byte i;
  173.     Byte dat = 0;
  174.     SDA = 1;                    //使能內部上拉,準備讀取數據,
  175.     for (i=0; i<8; i++)         //8位計數器
  176.     {
  177.         dat <<= 1;
  178.         SCL = 1;                //拉高時鐘線
  179.         Delay5us();             //延時
  180.         dat |= SDA;             //讀數據               
  181.         SCL = 0;                //拉低時鐘線
  182.         Delay5us();             //延時
  183.     }
  184.     return dat;
  185. }
  186. //******單字節寫入*******************************************
  187. void Single_Write_ADXL345(Byte REG_Address,Byte REG_data)
  188. {
  189.     ADXL345_Start();                  //起始信號
  190.     ADXL345_SendByte(SlaveAddress);   //發送設備地址+寫信號
  191.     ADXL345_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf22頁
  192.     ADXL345_SendByte(REG_data);       //內部寄存器數據,請參考中文pdf22頁
  193.     ADXL345_Stop();                   //發送停止信號
  194. }
  195. //********單字節讀取*****************************************
  196. Byte Single_Read_ADXL345(Byte REG_Address)
  197. {  Byte REG_data;
  198.     ADXL345_Start();                          //起始信號
  199.     ADXL345_SendByte(SlaveAddress);           //發送設備地址+寫信號
  200.     ADXL345_SendByte(REG_Address);            //發送存儲單元地址,從0開始        
  201.     ADXL345_Start();                          //起始信號
  202.     ADXL345_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  203.     REG_data=ADXL345_RecvByte();              //讀出寄存器數據
  204.         ADXL345_SendACK(1);   
  205.         ADXL345_Stop();                           //停止信號
  206.     return REG_data;
  207. }
  208. //連續讀出ADXL345內部加速度數據,地址范圍0x32~0x37
  209. void Multiple_read_ADXL345(void)
  210. {   Byte i;
  211.     ADXL345_Start();                          //起始信號
  212.     ADXL345_SendByte(SlaveAddress);           //發送設備地址+寫信號
  213.     ADXL345_SendByte(0x32);                   //發送存儲單元地址,從0x32開始        
  214.     ADXL345_Start();                          //起始信號
  215.     ADXL345_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  216.          for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中BUF
  217.     {
  218.         BUF[i] = ADXL345_RecvByte();          //BUF[0]存儲0x32地址中的數據
  219.         if (i == 5)
  220.         {
  221.            ADXL345_SendACK(1);                //最后一個數據需要回NOACK
  222.         }
  223.         else
  224.         {
  225.           ADXL345_SendACK(0);                //回應ACK
  226.        }
  227.    }
  228.     ADXL345_Stop();                          //停止信號
  229.     Delay5ms();
  230. }
  231. //初始化ADXL345,根據需要請參考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 偏移量 根據測試傳感器的狀態寫入pdf29頁
  239.    Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根據測試傳感器的狀態寫入pdf29頁
  240.    Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根據測試傳感器的狀態寫入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()                                                //將兩個八位數據合成為一個16位數據
  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軸數據處理
  270.   if(i==0x8000)                   //當結果為負數時
  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                                           //當結果為正數時
  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軸數據處理
  295.   if(i==0x8000)                   //當結果為負數時
  296.   {
  297. ……………………

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

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




評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一二三视频在线观看 | 日韩视频在线一区 | 一级毛片视频 | 免费视频99 | 在线黄| 日日碰狠狠躁久久躁婷婷 | 精品在线一区 | 影音av| 国产精品美女久久久 | 亚洲人成人一区二区在线观看 | 色综合久| 在线看av的网址 | 国产激情在线观看视频 | 中文字幕 视频一区 | 男人天堂av网站 | 最新中文字幕在线 | 国产一级黄色网 | 欧美精品久久久久 | 久久免费视频1 | 91精品久久久 | 亚洲午夜精品久久久久久app | 色网在线看| 亚洲高清视频一区二区 | 久久一二 | 日日射影院 | 精品乱人伦一区二区三区 | 99精品在线观看 | 五月天综合影院 | 综合久| 九九亚洲 | 国产精品一区久久久 | 久久99网 | 在线国产小视频 | 日韩一区二区三区视频在线观看 | 二区国产 | 久久久国产精品一区 | 久久久久久国产免费视网址 | www.99热这里只有精品 | 国产高清91 | 精品久久久久国产免费第一页 | 亚洲国产日韩一区 |