找回密码
 立即注册

QQ登录

只需一步,快速开始

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

adxl345加速度 计步器 ds1302+5110液晶显示 c8051单片机控制

  [复制链接]
跳转到指定楼层
楼主


计步器程序下载(用c8051f单片机ds1302时间芯片和5110液晶屏显示):
adxl345加速度计ds1302 5110液晶和51单片机实现的简单计步器.zip (90.38 KB, 下载次数: 212)

51单片机的版本:http://www.51hei.com/bbs/dpj-50085-1.html
程序2:ds1302+5110液晶显示的adxl345加速度 计步器版本用的c8051f单片机芯片:
  1. #include <c8051f330.h>
  2. #include <string.h>
  3. #include  <intrins.h>
  4. //===============================================================
  5. #include "sys.h"
  6. #include "5110.h"
  7. #include "adxl345.h"
  8. #include "ds1302.h"
  9. /*==============================================================*/
  10. sbit K1=P1^3;
  11. sbit K2=P1^2;
  12. sbit speak=P0^5;

  13. unsigned char ADXL345_FLAG=0;
  14. unsigned char START_FLAG=0;
  15. unsigned char number=0;

  16. unsigned char idata bad_flag[3];
  17. unsigned int idata array0[3]={1,1,1};
  18. unsigned int idata array1[3]={1,1,1};
  19. unsigned int idata array2[3]={0,0,0};
  20. unsigned int idata adresult[3];
  21. unsigned int idata max[3]={0,0,0};
  22. unsigned int idata min[3]={1000,1000,1000};
  23. unsigned int idata dc[3]={500,500,500};
  24. unsigned int idata vpp[3]={30,30,30};        
  25. unsigned int idata precision[3]={5,5,5};        
  26. unsigned int idata old_fixed[3];
  27. unsigned int idata new_fixed[3];
  28. unsigned int idata STEPS=0;
  29. unsigned int idata time=0;
  30.                                                                                 
  31. float xdata speed=0;
  32. float xdata dist=0;
  33. float xdata kalul=0;

  34. SYSTEMTIME CurrentTime;
  35. //获取时钟函数
  36. void get_clock(void)
  37. {
  38.         DS1302_GetTime(&CurrentTime);
  39.         DateToStr(&CurrentTime);
  40.         TimeToStr(&CurrentTime);
  41. }
  42. //时钟显示函数
  43. void show_time(void)
  44. {
  45.         Set_R_C_5110(0,12);
  46.         Write_String_5110(CurrentTime.DateString);
  47.         Set_R_C_5110(0,60);
  48.         Write_String_5110("---");
  49.         Write_Char_5110(CurrentTime.DateString[9]);
  50.         
  51.         Set_R_C_5110(1,0);
  52.         Write_String_5110(CurrentTime.TimeString);
  53. }
  54. //BCD码转化成十进制码
  55. uchar zh(uchar temp)
  56. {
  57.     temp=((temp&0x70)>>4)*10 + (temp&0x0F);
  58.         return temp;
  59. }
  60. void first_picture(void)
  61. {
  62.     DS1302_SetTime(DS1302_YEAR,12);
  63.         DS1302_SetTime(DS1302_MONTH,1);
  64.         DS1302_SetTime(DS1302_DAY,11);
  65.         DS1302_SetTime(DS1302_WEEK,5);
  66.         DS1302_SetTime(DS1302_HOUR,12);
  67.         DS1302_SetTime(DS1302_MINUTE,12);
  68.         DS1302_SetTime(DS1302_SECOND,12);
  69.         Set_R_C_5110(0,0);
  70.         Write_String_5110("20");
  71.                
  72.         Set_R_C_5110(1,54);
  73.         Write_String_5110("SET- ");
  74.         
  75.         Set_R_C_5110(2,0);
  76.         Write_String_5110("B=00000 b");
  77.         
  78.     Set_R_C_5110(3,0);
  79.         Write_String_5110("L=00000 m");
  80.         
  81.         Set_R_C_5110(4,0);
  82.         Write_String_5110("S=00.00 m/s");
  83.         
  84.         Set_R_C_5110(5,0);
  85.         Write_String_5110("C=00.00 c/kg/h");         
  86. }

  87. void delay_ms(uint n)
  88. {
  89.     uint i,j;
  90.     for(i=0;i<n;i++)
  91.       for(j=0;j<1000;j++);
  92. }
  93. /*------------------------------------------------------------------------------------------------------------------------
  94. *Name:                 step_counter()
  95. *Function:        实现Pedometer的基本算法.
  96. *Input:                void
  97. *Output:         void
  98. *------------------------------------------------------------------------------------------------------------------------*/
  99. void step_counter(void)
  100. {
  101.         static uchar sampling_counter=0;
  102.         uchar jtemp;

  103.         ADXL345_FLAG=0;
  104.         Multiple_read_ADXL345();    //连续读出数据,存储在BUF中
  105.         //------------------------------------------采样滤波----------------------//
  106.         for(jtemp=0;jtemp<=2;jtemp++)
  107.         {               
  108.                 array2[jtemp]=array1[jtemp];
  109.                 array1[jtemp]=array0[jtemp];                        
  110.                    array0[jtemp]=BUF[2*jtemp]+(BUF[2*jtemp+1]<<8);
  111.                   
  112.                    adresult[jtemp]=array0[jtemp]+array1[jtemp]+array2[jtemp];
  113.                    adresult[jtemp]=adresult[jtemp]/3;
  114.                 if(adresult[jtemp]>max[jtemp])               {max[jtemp]=adresult[jtemp];}
  115.                 if(adresult[jtemp]<min[jtemp])               {min[jtemp]=adresult[jtemp];}
  116.         }
  117.           sampling_counter=sampling_counter+1;
  118.         //----------------------------------计算动态门限和动态精度-----------------------//
  119.     if(sampling_counter>=50)
  120.     {               
  121.               sampling_counter=0;                        
  122.                 for(jtemp=0;jtemp<=2;jtemp++)
  123.                 {
  124.                         vpp[jtemp]=max[jtemp]-min[jtemp];
  125.                 dc[jtemp] =min[jtemp]+(vpp[jtemp]>>1);
  126.                         max[jtemp]=0;
  127.                 min[jtemp]=1023;
  128.                         bad_flag[jtemp]=0;
  129.                         if(vpp[jtemp]>=160)
  130.                         {
  131.                                 precision[jtemp]=vpp[jtemp]/32; //8
  132.                         }
  133.                 else if((vpp[jtemp]>=50)&& (vpp[jtemp]<160))            
  134.                         {
  135.                                 precision[jtemp]=4;
  136.                         }
  137.                        else if((vpp[jtemp]>=15) && (vpp[jtemp]<50))  
  138.             {
  139.                                 precision[jtemp]=3;
  140.                         }                          
  141.                         else
  142.                        {
  143.                           precision[jtemp]=2;
  144.                     bad_flag[jtemp]=1;
  145.                 }
  146.                 }
  147.           }               
  148.         //--------------------------线性移位寄存器--------------------------------------
  149.         for(jtemp=0;jtemp<=2;jtemp++)
  150.         {
  151.                 old_fixed[jtemp]=new_fixed[jtemp];

  152.             if(adresult[jtemp]>=new_fixed[jtemp])                        
  153.             {   
  154.                      if((adresult[jtemp]-new_fixed[jtemp])>=precision[jtemp])   {new_fixed[jtemp]=adresult[jtemp];}
  155.             }
  156.             else if(adresult[jtemp]<new_fixed[jtemp])
  157.                     {   
  158.                        if((new_fixed[jtemp]-adresult[jtemp])>=precision[jtemp])   {new_fixed[jtemp]=adresult[jtemp];}
  159.             }
  160.         }
  161.         //------------------------- 动态门限判决 ----------------------------------
  162.         if((vpp[0]>=vpp[1])&&(vpp[0]>=vpp[2]))
  163.         {
  164.                 if((old_fixed[0]>=dc[0])&&(new_fixed[0]<dc[0])&&(bad_flag[0]==0))        
  165.                 {
  166.                         STEPS=STEPS+1;
  167.                 }
  168.         }
  169.         else if((vpp[1]>=vpp[0])&&(vpp[1]>=vpp[2]))
  170.         {
  171.                 if((old_fixed[1]>=dc[1])&&(new_fixed[1]<dc[1])&&(bad_flag[1]==0))        
  172.                 {
  173.                         STEPS=STEPS+1;
  174.                 }
  175.         }
  176.         else if((vpp[2]>=vpp[1])&&(vpp[2]>=vpp[0]))
  177.         {
  178.                 if((old_fixed[2]>=dc[2])&&(new_fixed[2]<dc[2])&&(bad_flag[2]==0))        
  179.                 {
  180.                         STEPS=STEPS+1;
  181.                 }
  182.         }
  183. }
  184. //键盘扫描
  185. void key_scan(void)
  186. {
  187.         uchar temp=0;
  188.         if(K1==0)      //功能选择功能
  189.         {
  190.             delay_ms(50);
  191.                 speak=0;
  192.                 delay_ms(10);
  193.                 speak=1;
  194.                 number++;
  195.                 if(number>8)  number=0;
  196.                 if(number!=1)
  197.                 {
  198.                     START_FLAG=0;
  199.                     Write_Char_5110_rc(2,78,'N');
  200.                 }                  
  201.                 if(number==0)   Write_Char_5110_rc(1,78,' ');
  202.                 else if(number==1)   Write_Char_5110_rc(1,78,'J');
  203.                 else if(number==2)   Write_Char_5110_rc(1,78,'S');
  204.                 else if(number==3)   Write_Char_5110_rc(1,78,'M');
  205.                 else if(number==4)   Write_Char_5110_rc(1,78,'H');
  206.                 else if(number==5)   Write_Char_5110_rc(1,78,'W');
  207.                 else if(number==6)   Write_Char_5110_rc(1,78,'D');
  208.                 else if(number==7)   Write_Char_5110_rc(1,78,'Y');
  209.                 else if(number==8)   Write_Char_5110_rc(1,78,'N');
  210.                 while(K1==0);
  211.         }
  212.         if(K2==0)           //确定、调节按键
  213.         {
  214.             delay_ms(50);
  215.                 switch(number)
  216.                 {
  217.                     case 1:                              //计步器
  218.                                   if(START_FLAG==1)   
  219.                                   {
  220.                                       START_FLAG=0;
  221.                                           speak=0;
  222.                                           delay_ms(10);
  223.                                           speak=1;
  224.                                           Write_Char_5110_rc(2,78,'N');
  225.                                           dist=STEPS*0.5;            //路程
  226.                                           speed=dist/time;           //速度
  227.                                           kalul=1.25*speed*3.6;      //卡路里   
  228.                                           
  229.                                           Write_variable_5110(3,12,dist);
  230.                               Write_variable_5110_dian(4,12,speed*100);
  231.                               Write_variable_5110_dian(5,12,kalul*100);
  232.                                           
  233.                                           STEPS=0;
  234.                                           time=0;
  235.                                   }
  236.                                   else
  237.                                   {
  238.                                       START_FLAG=1;
  239.                                           speak=0;
  240.                                           delay_ms(10);
  241.                                           speak=1;
  242.                                           Write_Char_5110_rc(2,78,'Y');
  243.                                           Write_variable_5110(3,12,0);
  244.                               Write_variable_5110_dian(4,12,0);
  245.                               Write_variable_5110_dian(5,12,0);
  246.                                   }            
  247.                                   break;
  248.                         case 2:
  249.                               temp=Read1302(DS1302_SECOND);  //读取秒数
  250.                                   temp=zh(temp);
  251.                                   temp=temp+1;  //秒数加1
  252.                                   if(temp>59)   //超过59秒,清零
  253.                               temp=0;
  254.                                   DS1302_SetTime(DS1302_SECOND,temp);                                                                  
  255.                                   break;
  256.                         case 3:
  257.                               temp=Read1302(DS1302_MINUTE);  //读取分数
  258.                                   temp=zh(temp);
  259.                                   temp=temp+1;  //分数加1
  260.                                   if(temp>59)          //超过59分,清零
  261.                                   temp=0;
  262.                                   DS1302_SetTime(DS1302_MINUTE,temp);
  263.                                   break;
  264.                         case 4:
  265.                               temp=Read1302(DS1302_HOUR);    //读取小时数
  266.                                   temp=zh(temp);
  267.                                   temp=temp+1;  //小时数加1
  268.                                   if(temp>23)          //超过23小时,清零
  269.                                   temp=0;
  270.                                   DS1302_SetTime(DS1302_HOUR,temp);
  271.                                   break;
  272.                         case 5:
  273.                               temp=Read1302(DS1302_WEEK);    //读取星期数
  274.                                   temp=zh(temp);
  275.                                   temp=temp+1;  //星期数加1
  276.                                   if(temp>7)  
  277.                                   temp=1;
  278.                                   DS1302_SetTime(DS1302_WEEK,temp);
  279.                                   break;
  280.                         case 6:
  281.                               temp=Read1302(DS1302_DAY);     //读取日数
  282.                                   temp=zh(temp);
  283.                                   temp=temp+1;  //日数加1
  284.                                   if(temp>31)
  285.                                   temp=1;
  286.                                   DS1302_SetTime(DS1302_DAY,temp);
  287.                                   break;
  288.                         case 7:
  289.                               temp=Read1302(DS1302_MONTH);   //读取月数
  290.                                   temp=zh(temp);
  291.                                   temp=temp+1;  //月数加1
  292.                                   if(temp>12)
  293.                                   temp=1;
  294.                                   DS1302_SetTime(DS1302_MONTH,temp);
  295.                                   break;
  296.                         case 8:
  297.                               temp=Read1302(DS1302_YEAR);    //读取年数
  298.                                   temp=zh(temp);
  299.                                   temp=temp+1;                   //年数加1
  300.                                   if(temp>15)
  301.                                   temp=0;
  302.                                   DS1302_SetTime(DS1302_YEAR,temp);
  303.                                   break;
  304.                         default:break;
  305.                 }
  306.                 while(K2==0);
  307.         }
  308. }
  309. void main(void)
  310. {
  311.         Init_Device();     //单片机初始化
  312.     Init_5110();       //液晶初始化
  313.     Clear_5110();      //液晶清屏

  314.         Init_ADXL345();    //加速度模块初始化
  315.         Initial_DS1302();  //时钟芯片初始化
  316.         first_picture();   //液晶界面初显示
  317.       
  318.     while(1)
  319.     {
  320.         //日期显示开始
  321.         get_clock();
  322.             show_time();
  323.             //日期显示结束
  324.                 //键盘扫描
  325.                 key_scan();
  326.                 //计步器工作
  327.                 if(ADXL345_FLAG==1 && START_FLAG==1)
  328.             {
  329.                     ADXL345_FLAG=0;
  330.                         step_counter();
  331.                         Write_variable_5110(2,12,STEPS);
  332.                 }
  333.     }
  334. }
  335. void timer0(void) interrupt 1    //约0.02s 进一次中断
  336. {
  337.     static uchar cnt=0,cnt1=0;
  338.     TL0=0X96;
  339.         TH0=0Xc3;
  340.         cnt++;
  341.         cnt1++;
  342.         if(cnt>=10)
  343.         {
  344.             ADXL345_FLAG=1;
  345.                 cnt=0;
  346.         }
  347.         if(START_FLAG==1)
  348.         {
  349.             if(cnt1>=50)
  350.                 {
  351.                     cnt1=0;
  352.                         time++;
  353.                 }
  354.         }
  355. }
复制代码




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

使用道具 举报

沙发
ID:73345 发表于 2016-5-11 01:46 | 只看该作者
感谢分享!!!
回复

使用道具 举报

板凳
ID:86621 发表于 2016-5-12 00:03 | 只看该作者
楼主你忙
回复

使用道具 举报

地板
ID:120268 发表于 2016-5-12 12:52 | 只看该作者
我也想做可惜不会写程序
回复

使用道具 举报

5#
ID:120620 发表于 2016-5-14 09:24 来自手机 | 只看该作者
楼主能发份原理图跟PCB给我嘛?急求!麻烦楼主了 1281503280@qq.com
回复

使用道具 举报

6#
ID:120772 发表于 2016-5-14 18:09 | 只看该作者
请问sys.h中的函数是什么作用啊,是声明中断吗?
回复

使用道具 举报

7#
ID:128779 发表于 2016-7-1 09:28 | 只看该作者
你好.楼主,可以详细介绍一下吗
回复

使用道具 举报

8#
ID:128779 发表于 2016-7-1 09:31 | 只看该作者
A小白 发表于 2016-5-14 09:24
楼主能发份原理图跟PCB给我嘛?急求!麻烦楼主了 1281503280@qq.com

你好,有原理图跟PCB了吗,可否发给我一份
回复

使用道具 举报

9#
ID:130363 发表于 2016-7-14 16:09 | 只看该作者
谢谢楼主
回复

使用道具 举报

10#
ID:133756 发表于 2016-7-21 16:18 | 只看该作者
楼主能发份原理图给我嘛?急求!麻烦楼主了 2923133214@qq.com
回复

使用道具 举报

11#
ID:135954 发表于 2016-8-4 11:48 | 只看该作者
感謝樓主的代碼!
回复

使用道具 举报

12#
ID:137625 发表于 2016-8-27 00:30 | 只看该作者
我手上只有AT89C51的单片机,可以用上面链接中c8051f单片机的程序么?
回复

使用道具 举报

13#
ID:139377 发表于 2016-9-14 10:11 | 只看该作者
学习一下      
回复

使用道具 举报

14#
ID:140039 发表于 2016-9-21 16:02 | 只看该作者
跟楼主学习学习
回复

使用道具 举报

15#
ID:143128 发表于 2016-11-1 14:17 | 只看该作者
能发个仿真图来看看嘛? 谢谢
回复

使用道具 举报

16#
ID:150971 发表于 2016-11-29 13:17 | 只看该作者
顶一个!
回复

使用道具 举报

17#
ID:153672 发表于 2016-12-10 13:24 | 只看该作者
谢谢,参考一下。
回复

使用道具 举报

18#
ID:150971 发表于 2017-1-4 17:34 | 只看该作者
顶一个
回复

使用道具 举报

19#
ID:166173 发表于 2017-2-23 14:16 | 只看该作者
谢谢分享
回复

使用道具 举报

20#
ID:186896 发表于 2017-4-6 21:44 | 只看该作者
谢谢楼主
回复

使用道具 举报

21#
ID:188124 发表于 2017-4-11 20:52 | 只看该作者
那个ADXL345的是空的
回复

使用道具 举报

22#
ID:188124 发表于 2017-5-8 20:22 | 只看该作者
我试了一下您的代码,只是最基本的记步,感觉不太准,不灵敏,都记不了10步,不知道是哪里出的问题,希望能与您交流一下。
回复

使用道具 举报

23#
ID:201575 发表于 2017-5-16 21:56 | 只看该作者
A小白 发表于 2016-5-14 09:24
楼主能发份原理图跟PCB给我嘛?急求!麻烦楼主了 1281503280@qq.com

你好 有原理图和程序吗可以给我发一份吗?
回复

使用道具 举报

24#
ID:201575 发表于 2017-5-16 21:57 | 只看该作者
wutong 发表于 2016-8-27 00:30
**** 作者被禁止或删除 内容自动屏蔽 ****

你好  可以给我发一分吗
回复

使用道具 举报

25#
ID:204636 发表于 2017-5-25 17:39 | 只看该作者
楼主发一份仿真图给我吧,谢谢楼主了2749974377@qq.com
回复

使用道具 举报

26#
ID:33848 发表于 2017-6-30 10:26 | 只看该作者
好东西,谢谢了
回复

使用道具 举报

27#
ID:33848 发表于 2017-6-30 10:26 | 只看该作者
我怎么不能发言?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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