標(biāo)題: 基于單片機(jī)的ADXL345手勢(shì)控制車(chē)制作資料 [打印本頁(yè)]

作者: 未設(shè)置    時(shí)間: 2017-5-26 17:27
標(biāo)題: 基于單片機(jī)的ADXL345手勢(shì)控制車(chē)制作資料
希望對(duì)大家有幫助
功能說(shuō)明:
加速度模塊不同傾角時(shí),向計(jì)算機(jī)發(fā)送不同數(shù)據(jù)
1 左偏時(shí),發(fā)送0a
2 右偏時(shí),發(fā)送a0
3 前偏時(shí),發(fā)送aa
3 后偏是,發(fā)送55

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

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


單片機(jī)源程序如下:
  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時(shí)鐘引腳定義
  7. sbit           SDA=P1^1;      //IIC數(shù)據(jù)引腳定義
  8. #define        SlaveAddress   0xA6          //定義器件在IIC總線中的從地址,根據(jù)ALT  ADDRESS地址引腳不同修改
  9.                               //ALT  ADDRESS引腳接地時(shí)地址為0xA6,接電源時(shí)地
  10. #define JudgeP_M  0x8000   //正負(fù)數(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                   //小車(chē)實(shí)際動(dòng)作控制字符,以實(shí)物為準(zhǔn)
  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);   //單個(gè)寫(xiě)入數(shù)據(jù)
  31. Byte Single_Read_ADXL345(Byte REG_Address);                   //單個(gè)讀取內(nèi)部寄存器數(shù)據(jù)
  32. void  Multiple_Read_ADXL345();                                  //連續(xù)的讀取內(nèi)部寄存器數(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();                                   //上電延時(shí)                                   
  54.         uart();       
  55.         Init_ADXL345();                         //初始化ADXL345
  56.         while(1)                                 //循環(huán)
  57.         {
  58.                 Multiple_Read_ADXL345();               //連續(xù)讀出數(shù)據(jù),存儲(chǔ)在BUF中
  59.                 Data_Convert();
  60.         Data_Process();
  61.                 direction_judge();
  62.                 Delay20ms();                           //延時(shí)      
  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. 延時(shí)5微秒(STC90C52RC@12M)
  86. 不同的工作環(huán)境,需要調(diào)整此函數(shù),注意時(shí)鐘過(guò)快時(shí)需要修改
  87. 當(dāng)改用1T的MCU時(shí),請(qǐng)調(diào)整此延時(shí)函數(shù)
  88. **************************************/
  89. void Delay5us()
  90. {
  91.     _nop_();_nop_();_nop_();_nop_();
  92.     _nop_();_nop_();_nop_();_nop_();
  93.         _nop_();_nop_();_nop_();_nop_();
  94. }

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

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

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

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

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

所有資料51hei提供下載:
手勢(shì)遙控車(chē)資料加代碼.zip (1.43 MB, 下載次數(shù): 46)




作者: 250406053    時(shí)間: 2018-5-16 17:07
能實(shí)現(xiàn)功能嗎
作者: 黑魔力    時(shí)間: 2019-4-3 08:10
原理圖都沒(méi)有,騙我黒幣




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1