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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機的ADXL345手勢控制車制作資料

[復制鏈接]
跳轉到指定樓層
樓主
希望對大家有幫助
功能說明:
加速度模塊不同傾角時,向計算機發送不同數據
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提供下載:
手勢遙控車資料加代碼.zip (1.43 MB, 下載次數: 46)



評分

參與人數 1黑幣 +4 收起 理由
吳先生 + 4 很給力!

查看全部評分

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

使用道具 舉報

沙發
ID:293797 發表于 2018-5-16 17:07 | 只看該作者
能實現功能嗎
回復

使用道具 舉報

板凳
ID:483023 發表于 2019-4-3 08:10 | 只看該作者
原理圖都沒有,騙我黒幣
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久 | 麻豆一区二区三区精品视频 | 亚洲视频区 | 91在线最新 | 少妇久久久 | 精品国产三级 | 国产麻豆乱码精品一区二区三区 | www.一级毛片| 黑人精品欧美一区二区蜜桃 | 91在线精品一区二区 | 综合久久久 | 国产超碰人人爽人人做人人爱 | 日韩视频在线一区二区 | 91精品国产一区二区在线观看 | 欧美一级片免费看 | 成人免费视屏 | av在线一区二区三区 | 一区二区三区国产精品 | 日本三级电影在线免费观看 | 国产精品久久av | 在线视频一区二区三区 | 精品视频久久久久久 | 啪啪网页 | 成人午夜精品 | 亚洲欧美中文字幕 | 亚洲国产成人精品在线 | 日本亚洲一区 | 亚洲一区二区三区在线视频 | 亚洲一二三区在线观看 | 欧美性生活免费 | 亚洲免费高清 | 视频羞羞| 亚洲综合在线视频 | 日本三级网站在线 | 日日操日日干 | 亚洲一区二区三区四区五区午夜 | 求个av网址| 丝袜 亚洲 另类 欧美 综合 | 国产乱码精品一区二区三区五月婷 | 成人国产精品免费观看 | 国产一区二区免费在线 |