找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6544|回复: 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, 下载次数: 106, 下载积分: 黑币 -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 单片机教程网

快速回复 返回顶部 返回列表