找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 25294|回复: 68
打印 上一主题 下一主题
收起左侧

ADXL345单片机计步器程序

  [复制链接]
跳转到指定楼层
楼主
ID:115111 发表于 2016-5-11 00:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

adxl345芯片实现的计步器,显示用的是1602液晶屏,下面可以下载完整的程序.


完整的源代码下载: adxl345计步器程序设计.rar (39.38 KB, 下载次数: 753)

部分源码预览:
程序1:1602液晶显示的adxl345加速度 计步器版本:
  1. #include<reg52.h>
  2. #include<math.h>
  3. #include"1602.h"
  4. #include  <INTRINS.H>

  5. #define        SlaveAddress   0xA6          //1010 0110    定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
  6.                               //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A 0011 1010
  7. sbit sclk=P0^0;
  8. sbit sda=P0^1;

  9. float  dis_datax,dis_datay,dis_dataz,acc,acc1=1000;
  10. uchar BUF[8];
  11. uchar wan, qian, bai, shi ,ge,flag,miao,miao1,n;
  12. uint count;

  13. void conversion(uint temp_data)  
  14. {  
  15.     wan=temp_data/10000+0x30 ;
  16.     temp_data=temp_data%10000;   //取余运算
  17.         qian=temp_data/1000+0x30 ;
  18.     temp_data=temp_data%1000;    //取余运算
  19.     bai=temp_data/100+0x30   ;
  20.     temp_data=temp_data%100;     //取余运算                                 -e----------------eee-e
  21.     shi=temp_data/10+0x30    ;
  22.     temp_data=temp_data%10;      //取余运算
  23.     ge=temp_data+0x30;        
  24. }
  25. void delay6us()                 //6us延时函数
  26. {

  27.         _nop_();        _nop_();          



  28. }

  29. void delay_ms(uint n)       //N ms延时函数
  30. {
  31.         uint x,y;
  32.         for(x=n;x>0;x--)
  33.                 for(y=110;y>0;y--);       
  34. }

  35.                                                                                                                                                                 /////

  36. void ADXL345_Start()
  37. {
  38.     sda = 1;                    //拉高数据线
  39.     sclk = 1;                    //拉高时钟线
  40.     delay6us();                 //延时
  41.     sda = 0;                    //产生下降沿
  42.     delay6us();                 //延时
  43.     sclk = 0;                    //拉低时钟线
  44. }

  45. void ADXL345_Stop()
  46. {
  47.     sda = 0;                    //拉低数据线
  48.     sclk = 1;                    //拉高时钟线
  49.     delay6us();                 //延时
  50.     sda = 1;                    //产生上升沿
  51.     delay6us();                 //延时
  52. }

  53. void ADXL345_SendACK(bit ack)
  54. {
  55.     sda = ack;                  //写应答信号
  56.     sclk = 1;                    //拉高时钟线
  57.     delay6us();                 //延时
  58.     sclk = 0;                    //拉低时钟线
  59.     delay6us();                 //延时
  60. }


  61. bit ADXL345_RecvACK()
  62. {
  63.     sclk = 1;                    //拉高时钟线
  64.     delay6us();                 //延时
  65.     CY = sda;                   //读应答信号
  66.     sclk = 0;                    //拉低时钟线
  67.     delay6us();                 //延时

  68.     return CY;
  69. }


  70. void ADXL345_SendByte(uchar dat)
  71. {
  72.     uchar i;
  73. //        sclk = 0;                //拉低时钟线

  74.     for (i=0; i<8; i++)         //8位计数器
  75.     {
  76.         dat <<= 1;              //移出数据的最高位
  77.         sda = CY;               //送数据口
  78.         sclk = 1;                //拉高时钟线
  79.         delay6us();             //延时
  80.         sclk = 0;                //拉低时钟线
  81.         delay6us();             //延时
  82.     }
  83.     ADXL345_RecvACK();
  84. }


  85. uchar ADXL345_RecvByte()
  86. {
  87.     uchar i;
  88.     uchar dat = 0;

  89.     sda = 1;
  90.         //        write_com(0x80);
  91.                    //使能内部上拉,准备读取数据,
  92.     for (i=0; i<8; i++)         //8位计数器
  93.     {
  94.         dat <<= 1;
  95.         sclk = 1;                //拉高时钟线
  96.         delay6us();             //延时
  97.         dat |= sda;             //读数据               
  98.         sclk = 0;                //拉低时钟线
  99.         delay6us();             //延时

  100.     }


  101.     return dat;
  102. }

  103. void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
  104. {
  105.     ADXL345_Start();                  //起始信号
  106.     ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号
  107.     ADXL345_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页
  108.     ADXL345_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页
  109.     ADXL345_Stop();                   //发送停止信号
  110. }

  111. uchar Single_Read_ADXL345(uchar REG_Address)
  112. {
  113.         uchar REG_data;
  114.     ADXL345_Start();            
  115.        
  116.        
  117.        
  118.                       //起始信号
  119.     ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号
  120.     ADXL345_SendByte(REG_Address);                   //发送存储单元地址,从0开始       
  121.     ADXL345_Start();                          //起始信号
  122.     ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  123.     REG_data=ADXL345_RecvByte();              //读出寄存器数据
  124.         ADXL345_SendACK(1);   
  125.         ADXL345_Stop();                           //停止信号
  126.     return REG_data;
  127. }

  128. void Multiple_read_ADXL345()
  129. {   
  130.         uchar i;
  131.     ADXL345_Start();                          //起始信号
  132.     ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号           1010 0110
  133.     ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x32开始 0011 0010
  134.     ADXL345_Start();                          //起始信号
  135.     ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号           1010 0111
  136.         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
  137.     {
  138.         BUF[i] = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据
  139.         if(i == 5)        ADXL345_SendACK(1);       //最后一个数据需要回NOACK
  140.         else        ADXL345_SendACK(0);           //回应ACK
  141.     }
  142.     ADXL345_Stop();                          //停止信号
  143.     delay_ms(10);
  144. }

  145. void Init_ADXL345()           //初始化ADXL345,根据需要请参考pdf进行修改***********************
  146. {
  147. //        delay(500);                                          //上电延时
  148.    Single_Write_ADXL345(0x31,0x2B);   //测量范围,正负16g,13位模式
  149.    Single_Write_ADXL345(0x2C,0x06);   //0000 0110速率设定为6.25 参考pdf13页
  150.    Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页
  151.    Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断
  152.    Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
  153.    Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
  154.    Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页
  155. }


  156. float operation(uchar starti)
  157. {
  158.         float  dis_data        ;
  159.         int temp;
  160.         temp=(BUF[starti+1]<<8)+BUF[starti];  //合成数据
  161. //        write_com(0x80);  
  162.         if(temp<0)
  163.         {
  164.                 temp=-temp;
  165.                 flag=1;

  166.         }
  167.         else flag=0; //显示空格

  168.     dis_data=(float)temp*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
  169.   return dis_data;
  170. }
  171. void display_x()         //显示x轴
  172. {   
  173.    conversion(dis_datax);          //转换出显示需要的数据
  174.    
  175.         write_com(0x80);
  176.         if(flag==0)        write_dat(' ');
  177.         else write_dat('-');
  178.         write_dat('X');
  179.         write_dat(':');
  180.         write_dat(qian);

  181.         write_dat('.');
  182.         write_dat(bai);
  183.         write_dat(shi);
  184.         write_dat('g');       
  185. }

  186. void display_y()        //显示y轴
  187. {   
  188.    
  189.   // dis_datay=operation(2);
  190.     conversion(dis_datay);          //转换出显示需要的数据
  191.         write_com(0x80+8);
  192.         if(flag==0)         write_dat(' ');
  193.         else write_dat('-');
  194.         write_dat('Y');
  195.         write_dat(':');
  196.         write_dat(qian);

  197.         write_dat('.');
  198.         write_dat(bai);
  199.         write_dat(shi);
  200.         write_dat('g');

  201. }

  202. void display_z()           //显示z轴
  203. {  

  204. //  dis_dataz=operation(4);
  205.     conversion(dis_dataz);           //转换出显示需要的数据
  206.         write_com(0x80+0x40);
  207.         if(flag==0)                  write_dat(' ');
  208.         else write_dat('-');
  209.         write_dat('Z');
  210.         write_dat(':');
  211.         write_dat(qian);

  212.         write_dat('.');
  213.         write_dat(bai);
  214.         write_dat(shi);
  215.         write_dat('g');
  216. }

  217. void countstep()
  218. {
  219.         dis_datax=operation(0);
  220.         dis_datay=operation(2);
  221.    dis_dataz=operation(4);

  222.         acc1=acc;
  223.         acc=sqrt(dis_dataz*dis_dataz+dis_datax*dis_datax+dis_datay*dis_datay)  ;
  224.         if(acc1<990&&acc>1010)
  225. //        if(fabs(acc-acc1)>140&&miao1!=miao)

  226.         {
  227.         //        miao1=miao;
  228.                 count++;
  229.         }
  230.         write_com(0x80);
  231.         conversion(acc);
  232.         write_dat('A');
  233.         write_dat(':');
  234.         write_dat(qian);

  235.         write_dat('.');
  236.         write_dat(bai);
  237.         write_dat(shi);
  238.         write_dat('g');



  239.         write_com(0x80+0x40);
  240.         write_dat('C');
  241.         write_dat('o');
  242.         write_dat('u');
  243.         write_dat('n');
  244.         write_dat('t');
  245.         write_dat(':');
  246.         write_dat(count/100+0x30);
  247.         write_dat((count%100)/10+0x30);
  248.         write_dat(count%10+0x30);


  249. }
  250. void ADXL345_Measure()                         //测量角度值并显示
  251. {
  252.         Multiple_read_ADXL345();     //连续读出数据,存储在BUF中
  253. //        display_x();                 //---------显示X轴
  254. //        display_y();                 //---------显示Y轴
  255. //        display_z();                 //---------显示Z轴       
  256.         countstep();

  257. }



  258. void main()
  259. {
  260.         init();
  261.         Init_ADXL345();
  262.         while(1)
  263.         {
  264.         ADXL345_Measure();
  265.            }       
  266. }
复制代码

程序2:ds1302+5110液晶显示的adxl345加速度 计步器版本:http://www.51hei.com/bbs/dpj-50084-1.html


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:119999 发表于 2016-5-11 11:08 | 只看该作者
我也想做,希望得到帮助
回复

使用道具 举报

板凳
ID:120268 发表于 2016-5-12 12:51 | 只看该作者
感谢楼主分享!
回复

使用道具 举报

地板
ID:68727 发表于 2016-5-12 21:21 来自手机 | 只看该作者
下来学习adxl345那里可以买到
回复

使用道具 举报

5#
ID:120928 发表于 2016-5-15 13:13 | 只看该作者
感谢分享
回复

使用道具 举报

6#
ID:119279 发表于 2016-5-20 14:31 | 只看该作者
感谢分享
回复

使用道具 举报

7#
ID:119279 发表于 2016-5-20 14:31 | 只看该作者
正是急需的时候 谢谢大神分享
回复

使用道具 举报

8#
ID:134612 发表于 2016-7-22 13:51 | 只看该作者
感谢分享!!
回复

使用道具 举报

9#
ID:137625 发表于 2016-8-26 00:56 | 只看该作者
感谢分享!找了好久,还是论坛有货
回复

使用道具 举报

10#
ID:99036 发表于 2016-8-30 20:23 | 只看该作者
好东西!!!!谢谢
回复

使用道具 举报

11#
ID:141382 发表于 2016-10-5 17:15 | 只看该作者
谢谢楼主
回复

使用道具 举报

12#
ID:143128 发表于 2016-10-17 21:57 | 只看该作者
这个压缩包有仿真图吗
回复

使用道具 举报

13#
ID:143128 发表于 2016-10-19 18:53 | 只看该作者
可以给个仿真图吗
回复

使用道具 举报

14#
ID:143128 发表于 2016-10-19 22:32 | 只看该作者
void conversion(uint temp_data)  
{  
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;   //取余运算
        qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;    //取余运算
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     //取余运算                                 -e----------------eee-e
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;      //取余运算
    ge=temp_data+0x30;         
}
为什么加0x30
回复

使用道具 举报

15#
ID:55331 发表于 2016-11-24 23:49 | 只看该作者
正需要呢  谢谢分享
回复

使用道具 举报

16#
ID:151000 发表于 2016-11-29 22:07 | 只看该作者
大神,能给个原图吗?
回复

使用道具 举报

17#
ID:151000 发表于 2016-11-29 22:09 | 只看该作者
大神能给个元器件清单吗?
回复

使用道具 举报

18#
ID:151852 发表于 2016-12-3 12:13 | 只看该作者
求全部程序
回复

使用道具 举报

19#
ID:153114 发表于 2016-12-12 17:54 | 只看该作者
感谢分享
回复

使用道具 举报

20#
ID:154881 发表于 2016-12-15 00:02 | 只看该作者
不错不错 正想做这个呢
回复

使用道具 举报

21#
ID:154881 发表于 2016-12-15 00:13 | 只看该作者
Tbucuo 不错  可是 我烧录不行学习学习吧
回复

使用道具 举报

22#
ID:167226 发表于 2017-2-28 19:50 | 只看该作者
正需要
回复

使用道具 举报

23#
ID:167265 发表于 2017-2-28 22:09 | 只看该作者
请问记步数原理是什么,要怎么做才能记一步
回复

使用道具 举报

24#
ID:51533 发表于 2017-3-2 09:32 | 只看该作者
感谢分享
回复

使用道具 举报

25#
ID:169448 发表于 2017-3-10 10:35 | 只看该作者

 感谢楼主分享!
回复

使用道具 举报

26#
ID:169448 发表于 2017-3-11 15:23 | 只看该作者
谢谢大神的分享
回复

使用道具 举报

27#
ID:186896 发表于 2017-4-6 21:44 | 只看该作者
谢谢大神
回复

使用道具 举报

28#
ID:156639 发表于 2017-4-9 20:33 | 只看该作者
准备学习学习
回复

使用道具 举报

29#
ID:188124 发表于 2017-4-11 20:19 | 只看该作者
fresh 发表于 2016-10-19 22:32
void conversion(uint temp_data)  
{  
    wan=temp_data/10000+0x30 ;

0x30的ASCII码是0
回复

使用道具 举报

30#
ID:188124 发表于 2017-4-11 20:23 | 只看该作者
非常感谢分享!
回复

使用道具 举报

31#
ID:189075 发表于 2017-4-13 15:44 | 只看该作者

感谢分享
回复

使用道具 举报

32#
ID:189826 发表于 2017-4-15 14:14 | 只看该作者
感谢分享
回复

使用道具 举报

33#
ID:192342 发表于 2017-4-22 15:24 | 只看该作者
非常感谢分享!
回复

使用道具 举报

34#
ID:196655 发表于 2017-5-5 10:11 | 只看该作者
请问楼主ADXL345有没仿真?是用什么代替的?
回复

使用道具 举报

35#
ID:197695 发表于 2017-5-8 21:36 | 只看该作者
zhahl 发表于 2016-11-29 22:07
大神,能给个原图吗?

你用哪种软件进行仿真?
回复

使用道具 举报

36#
ID:199657 发表于 2017-5-12 14:28 | 只看该作者
请问stc板子 怎么修改管脚
回复

使用道具 举报

37#
ID:192323 发表于 2017-5-12 19:08 | 只看该作者
正是急需的时候 谢谢大神分享!!!!
回复

使用道具 举报

38#
ID:206744 发表于 2017-6-1 16:03 来自手机 | 只看该作者
大神  怎么获得黑币
回复

使用道具 举报

39#
ID:206744 发表于 2017-6-1 16:04 来自手机 | 只看该作者
小时候可花 发表于 2016-12-15 00:13
Tbucuo 不错  可是 我烧录不行学习学习吧

加油加油加油加油
回复

使用道具 举报

40#
ID:206744 发表于 2017-6-1 16:05 来自手机 | 只看该作者
lobagoo 发表于 2016-12-3 12:13
**** 作者被禁止或删除 内容自动屏蔽 ****

我也想要知道全部的  你有吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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