欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7565|回復: 8
收起左側

adxl345的51單片機的測試程序

[復制鏈接]
ID:122732 發表于 2016-5-23 10:31 | 顯示全部樓層 |閱讀模式
可用。。adxl345傳感器通過串口發給pc,開串口助手,選端口號即可


0.png
  1. /*
  2. * ADXL345模塊
  3. *
  4. * 用途:ADXL345模塊IIC測試程序
  5. *
  6. * 作者                                        日期                                備注
  7. *                         2010/12/10                        新增
  8. *                         2010/12/11                        修改
  9. *
  10. */       

  11. #include  <REG51.H>       
  12. #include  <math.h>    //Keil library  
  13. #include  <stdio.h>   //Keil library       
  14. #include  <INTRINS.H>

  15. #define   uchar unsigned char
  16. #define   uint unsigned int       
  17. #define length  33
  18. uchar  buffer[length];

  19. sbit          SCL=P2^5;      //IIC時鐘引腳定義
  20. sbit           SDA=P2^4;      //IIC數據引腳定義


  21. #define        SlaveAddress   0xA6          //定義器件在IIC總線中的從地址,根據ALT  ADDRESS地址引腳不同修改
  22.                               //ALT  ADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A
  23. typedef unsigned char  BYTE;
  24. typedef unsigned short WORD;

  25. BYTE BUF[16];                         //接收數據緩存區             
  26. uchar ge,shi,bai,qian,wan;           //顯示變量
  27. int  dis_data;                       //變量

  28. void delay(unsigned int k);
  29. //void InitLcd();                      //初始化lcd1602
  30. void Init_ADXL345(void);             //初始化

  31. //void WriteDataLCM(uchar dataW);
  32. //void WriteCommandLCM(uchar CMD,uchar Attribc);
  33. //void DisplayOneChar(uchar X,uchar Y,uchar DData);
  34. //void write_com(uchar com);
  35. //void write_date(uchar date);

  36. void conversion(uint temp_data);

  37. void  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //單個寫入數據
  38. uchar Single_Read_ADXL345(uchar REG_Address);                   //單個讀取內部寄存器數據
  39. void  Multiple_Read_ADXL345();                                  //連續的讀取內部寄存器數據
  40. //------------------------------------
  41. void Delay5us();
  42. void Delay5ms();
  43. void ADXL345_Start();
  44. void ADXL345_Stop();
  45. void ADXL345_SendACK(bit ack);
  46. bit  ADXL345_RecvACK();
  47. void ADXL345_SendByte(BYTE dat);
  48. BYTE ADXL345_RecvByte();
  49. void ADXL345_ReadPage();
  50. void ADXL345_WritePage();
  51. //-----------------------------------

  52. //*********************************************************
  53. void conversion(uint temp_data)  
  54. {  
  55.     wan=temp_data/10000+0x30 ;
  56.     temp_data=temp_data%10000;   //取余運算
  57.         qian=temp_data/1000+0x30 ;
  58.     temp_data=temp_data%1000;    //取余運算
  59.     bai=temp_data/100+0x30   ;
  60.     temp_data=temp_data%100;     //取余運算
  61.     shi=temp_data/10+0x30    ;
  62.     temp_data=temp_data%10;      //取余運算
  63.     ge=temp_data+0x30;        
  64. }

  65. /*******************************/
  66. void delay(uint k)       
  67. {                                               
  68.         uint i,j;                               
  69.         for(i=k;i>0;i--)
  70.                 for(j=110;j>0;j--);                       
  71.                                                        
  72. }
  73. /*******************************/

  74.                                        

  75. /**************************************
  76. 延時5微秒(STC90C52RC---12MHz---12T)
  77. 不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
  78. 當改用1T的MCU時,請調整此延時函數
  79. **************************************/
  80. void Delay5us()
  81. {
  82.     _nop_();_nop_();_nop_();_nop_();
  83.     _nop_();_nop_();_nop_();_nop_();
  84.         _nop_();_nop_();_nop_();_nop_();
  85. }

  86. /**************************************
  87. 延時5毫秒(STC90C52RC@12M)
  88. 不同的工作環境,需要調整此函數
  89. 當改用1T的MCU時,請調整此延時函數
  90. **************************************/
  91. void Delay5ms()
  92. {
  93.     WORD n = 560;

  94.     while (n--);
  95. }

  96. /**************************************
  97. 起始信號
  98. **************************************/
  99. void ADXL345_Start()
  100. {
  101.     SDA = 1;                    //拉高數據線
  102.     SCL = 1;                    //拉高時鐘線
  103.     Delay5us();                 //延時
  104.     SDA = 0;                    //產生下降沿
  105.     Delay5us();                 //延時
  106.     SCL = 0;                    //拉低時鐘線
  107. }

  108. /**************************************
  109. 停止信號
  110. **************************************/
  111. void ADXL345_Stop()
  112. {
  113.     SDA = 0;                    //拉低數據線
  114.     SCL = 1;                    //拉高時鐘線
  115.     Delay5us();                 //延時
  116.     SDA = 1;                    //產生上升沿
  117.     Delay5us();                 //延時
  118. }

  119. /**************************************
  120. 發送應答信號
  121. 入口參數:ack (0:ACK 1:NAK)
  122. **************************************/
  123. void ADXL345_SendACK(bit ack)
  124. {
  125.     SDA = ack;                  //寫應答信號
  126.     SCL = 1;                    //拉高時鐘線
  127.     Delay5us();                 //延時
  128.     SCL = 0;                    //拉低時鐘線
  129.     Delay5us();                 //延時
  130. }

  131. /**************************************
  132. 接收應答信號
  133. **************************************/
  134. bit ADXL345_RecvACK()
  135. {
  136.     SCL = 1;                    //拉高時鐘線
  137.     Delay5us();                 //延時
  138.     CY = SDA;                   //讀應答信號
  139.     SCL = 0;                    //拉低時鐘線
  140.     Delay5us();                 //延時

  141.     return CY;
  142. }

  143. /**************************************
  144. 向IIC總線發送一個字節數據
  145. **************************************/
  146. void ADXL345_SendByte(BYTE dat)
  147. {
  148.     BYTE i;

  149.     for (i=0; i<8; i++)         //8位計數器
  150.     {
  151.         dat <<= 1;              //移出數據的最高位
  152.         SDA = CY;               //送數據口
  153.         SCL = 1;                //拉高時鐘線
  154.         Delay5us();             //延時
  155.         SCL = 0;                //拉低時鐘線
  156.         Delay5us();             //延時
  157.     }
  158.     ADXL345_RecvACK();
  159. }

  160. /**************************************
  161. 從IIC總線接收一個字節數據
  162. **************************************/
  163. BYTE ADXL345_RecvByte()
  164. {
  165.     BYTE i;
  166.     BYTE dat = 0;

  167.     SDA = 1;                    //使能內部上拉,準備讀取數據,
  168.     for (i=0; i<8; i++)         //8位計數器
  169.     {
  170.         dat <<= 1;
  171.         SCL = 1;                //拉高時鐘線
  172.         Delay5us();             //延時
  173.         dat |= SDA;             //讀數據               
  174.         SCL = 0;                //拉低時鐘線
  175.         Delay5us();             //延時
  176.     }
  177.     return dat;
  178. }

  179. //******單字節寫入*******************************************

  180. void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
  181. {
  182.     ADXL345_Start();                  //起始信號
  183.     ADXL345_SendByte(SlaveAddress);   //發送設備地址+寫信號
  184.     ADXL345_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf22頁
  185.     ADXL345_SendByte(REG_data);       //內部寄存器數據,請參考中文pdf22頁
  186.     ADXL345_Stop();                   //發送停止信號
  187. }

  188. //********單字節讀取*****************************************
  189. uchar Single_Read_ADXL345(uchar REG_Address)
  190. {   uchar REG_data;
  191.     ADXL345_Start();                          //起始信號
  192.     ADXL345_SendByte(SlaveAddress);           //發送設備地址+寫信號
  193.     ADXL345_SendByte(REG_Address);            //發送存儲單元地址,從0開始       
  194.     ADXL345_Start();                          //起始信號
  195.     ADXL345_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  196.     REG_data=ADXL345_RecvByte();              //讀出寄存器數據
  197.         ADXL345_SendACK(1);   
  198.         ADXL345_Stop();                           //停止信號
  199.     return REG_data;
  200. }
  201. //*********************************************************
  202. //
  203. //連續讀出ADXL345內部加速度數據,地址范圍0x32~0x37
  204. //
  205. //*********************************************************
  206. void Multiple_read_ADXL345(void)
  207. {   uchar i;
  208.     ADXL345_Start();                          //起始信號
  209.     ADXL345_SendByte(SlaveAddress);           //發送設備地址+寫信號
  210.     ADXL345_SendByte(0x32);                   //發送存儲單元地址,從0x32開始       
  211.     ADXL345_Start();                          //起始信號
  212.     ADXL345_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  213.          for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中BUF
  214.     {
  215.         BUF[i] = ADXL345_RecvByte();          //BUF[0]存儲0x32地址中的數據
  216.         if (i == 5)
  217.         {
  218.            ADXL345_SendACK(1);                //最后一個數據需要回NOACK
  219.         }
  220.         else
  221.         {
  222.           ADXL345_SendACK(0);                //回應ACK
  223.        }
  224.    }
  225.     ADXL345_Stop();                          //停止信號
  226.     Delay5ms();
  227. }


  228. //*****************************************************************

  229. //初始化ADXL345,根據需要請參考pdf進行修改************************
  230. void Init_ADXL345()
  231. {
  232.    Single_Write_ADXL345(0x31,0x0B);   //測量范圍,正負16g,13位模式
  233.    Single_Write_ADXL345(0x2C,0x09);   //速率設定為12.5 參考pdf13頁
  234.    Single_Write_ADXL345(0x2D,0x08);   //選擇電源模式   參考pdf24頁
  235.    Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中斷
  236.    Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根據測試傳感器的狀態寫入pdf29頁
  237.    Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根據測試傳感器的狀態寫入pdf29頁
  238.    Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根據測試傳感器的狀態寫入pdf29頁
  239. }
  240. //***********************************************************************
  241. //顯示x軸
  242. void display_x()
  243. {   float temp;
  244.     dis_data=(BUF[1]<<8)+BUF[0];  //合成數據   
  245.         if(dis_data<0)
  246.         {
  247.                 dis_data=-dis_data;
  248.             buffer[0]='-';
  249.         }
  250.         else buffer[0]=' '; //顯示空格

  251.     temp=(float)dis_data*3.9;  //計算數據和顯示,查考ADXL345快速入門第4頁
  252.     conversion(temp);          //轉換出顯示需要的數據

  253. //        buffer[8] ='X';
  254. //        buffer[9] =':';
  255.     buffer[1] =qian;
  256.     buffer[2] ='.';
  257.         buffer[3] =bai;
  258.     buffer[4] =shi;
  259.     buffer[5] =' ';
  260.          
  261. }

  262. //***********************************************************************
  263. //顯示y軸
  264. void display_y()
  265. {     float temp;
  266.     dis_data=(BUF[3]<<8)+BUF[2];  //合成數據   
  267.         if(dis_data<0)
  268.         {
  269.                 dis_data=-dis_data;
  270.             buffer[6]='-';
  271.         }
  272.         else buffer[6]=' '; //顯示空格

  273.     temp=(float)dis_data*3.9;  //計算數據和顯示,查考ADXL345快速入門第4頁
  274.     conversion(temp);          //轉換出顯示需要的數據
  275.        
  276. //        buffer[16] ='Y';
  277. //        buffer[17] =':';
  278.     buffer[7] =qian;
  279.     buffer[8] ='.';
  280.         buffer[9] =bai;
  281.     buffer[10] =shi;
  282.     buffer[11] =' ';

  283. }

  284. //***********************************************************************
  285. //顯示z軸
  286. void display_z()
  287. {
  288.     float temp;
  289.     dis_data=(BUF[5]<<8)+BUF[4];    //合成數據   
  290.         if(dis_data<0)
  291.         {
  292.             dis_data=-dis_data;
  293.         buffer[12]='-';       //顯示負符號位
  294.         }
  295.         else buffer[12]=' ';  //顯示空格

  296.     temp=(float)dis_data*3.9;  //計算數據和顯示,查考ADXL345快速入門第4頁
  297.     conversion(temp);          //轉換出顯示需要的數據
  298.        
  299.         //buffer[24] ='Z';
  300.         //buffer[25] =':';
  301.     buffer[13] =qian;
  302.     buffer[14] ='.';
  303.         buffer[15] =bai;
  304.     buffer[16] =shi;
  305.         buffer[17]='\n';
  306.         buffer[18]='\0';
  307.        

  308.    
  309. }
  310. void UART_init()
  311. {
  312.         SCON = 0x50;  
  313.         TMOD|=0x20;
  314.         PCON|= 0x80;
  315.         TH1=0xfa;
  316.         TL1=0xfa;
  317.         TR1=1;
  318.         REN=1;
  319.         SM0=0;
  320.         SM1=1;
  321.         EA=1;
  322.         ES=1;

  323.        
  324. }
  325. /*********************串口發送一串數據***********************/
  326. void Send_Byte(unsigned char *temp)      //發送一串數據
  327. {
  328.         unsigned char i=0;
  329.              ES=0;         //禁止串口中斷   
  330.            while(temp[i] != '\0')
  331.             {
  332.                    SBUF=*(temp+i);
  333.                         i++;               
  334.                         while(TI==0);        //發送數據完畢時,TI會自動置高
  335.                         TI=0;                    //發送數據完畢,將TI清零,準備下一次發送
  336.                 }
  337.            ES=1;              //清零串口發送中斷標志
  338. }
  339. //*********************************************************



  340. //*********************************************************
  341. //******主程序********
  342. //*********************************************************
  343. void main()
  344. {
  345.         uchar devid,a;
  346.         delay(500);                                   //上電延時
  347.         UART_init();               
  348.         while(1)                                 //循環
  349.         {
  350.                  
  351.                    /* buffer[0] ='A';
  352.                     buffer[1] ='D';
  353.                     buffer[2] ='X';
  354.                         buffer[3] ='L';
  355.                     buffer[4] ='3';
  356.                     buffer[5] ='4';
  357.                         buffer[6] ='5';
  358.                         buffer[7] =' ';                                 */
  359.                
  360.                 Init_ADXL345();                         //初始化ADXL345
  361.                 devid=Single_Read_ADXL345(0X00);        //讀出的數據為0XE5,表示正確
  362.         /*        if(devid!=0XE5)
  363.                 {               
  364.                             
  365.                                
  366.                                 buffer[8] ='N';
  367.                             buffer[9] ='o';
  368.                             buffer[10] =' ';
  369.                                 buffer[11] ='F';
  370.                             buffer[12] ='i';
  371.                             buffer[13] ='n';
  372.                             buffer[14] ='d';
  373.                         buffer[15] ='!';
  374.                             buffer[16] =' ';
  375.                                 buffer[17] =' ';
  376.                                 buffer[18] =' ';
  377.                                 buffer[19] =' ';
  378.                                 buffer[20] =' ';
  379.                                 buffer[21] =' ';
  380.                                 buffer[22] =' ';
  381.                                 buffer[23] =' ';
  382.                                 buffer[24] =' ';
  383.                                 buffer[25] =' ';
  384.                                 buffer[26] =' ';
  385.                                 buffer[27] =' ';
  386.                             buffer[28] =' ';
  387.                                 buffer[29] =' ';
  388.                                 buffer[30] =' ';
  389.                             buffer[31] ='\n';
  390.                                 buffer[32]='\0';

  391.                                
  392.                
  393.                 }
  394.                 else
  395.                 {                */       
  396.                         Multiple_read_ADXL345();               //連續讀出數據,存儲在BUF中
  397.                          display_x();
  398.                          display_y();
  399.                          display_z();
  400.         //        }
  401.                 Send_Byte(buffer);
  402.                 delay(1000);
  403.                   
  404. }
  405. }
復制代碼


51串口實現ADXL345數據傳輸.rar

47.65 KB, 下載次數: 107, 下載積分: 黑幣 -5

可用

評分

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

查看全部評分

回復

使用道具 舉報

ID:141382 發表于 2016-10-6 01:47 | 顯示全部樓層
謝謝。
回復

使用道具 舉報

ID:207736 發表于 2017-6-4 17:51 | 顯示全部樓層
謝謝分享!
回復

使用道具 舉報

ID:197175 發表于 2017-8-2 21:43 | 顯示全部樓層
輸出的數不論xyz軸都小于1 是怎么回事
回復

使用道具 舉報

ID:242401 發表于 2018-1-12 16:26 | 顯示全部樓層
如何將轉換的度數精確到0.01,main函數里最后的延時能不能省掉?如果不能,怎么樣才能不影響輸出?
回復

使用道具 舉報

ID:288681 發表于 2018-3-7 14:24 | 顯示全部樓層
h9eg393r 發表于 2018-1-12 16:26
如何將轉換的度數精確到0.01,main函數里最后的延時能不能省掉?如果不能,怎么樣才能不影響輸出?

您好,這個模塊的測試程序就這個帖子的可以用嗎?
回復

使用道具 舉報

ID:244403 發表于 2019-4-14 13:08 | 顯示全部樓層
點贊有用!!
回復

使用道具 舉報

ID:511917 發表于 2019-4-14 15:30 | 顯示全部樓層
點贊有用!!
回復

使用道具 舉報

ID:6269 發表于 2019-6-2 19:25 | 顯示全部樓層
謝謝分享。贊一個。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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