久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3222|回復: 1
收起左側

基于ADXL345的c8051f330單片機簡易計步器源程序

[復制鏈接]
ID:386780 發表于 2018-8-16 10:34 | 顯示全部樓層 |閱讀模式
可以實現簡單計步并且可以計算卡路里消耗

單片機源程序如下:
  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++)      //jtemp 0,1,2分別代表x,y,z
  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);    //dc為閾值
  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]))   //x軸最活躍
  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]))  //y軸最活躍
  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]))    //z軸最活躍
  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. }
復制代碼

所有資料51hei提供下載:
簡單計步器.zip (106.26 KB, 下載次數: 43)
回復

使用道具 舉報

ID:910031 發表于 2021-4-22 12:00 | 顯示全部樓層
如何解釋實現Pedometer的基本算法的程序
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲人成人一区二区在线观看 | 夜夜爽99久久国产综合精品女不卡 | 91人人视频在线观看 | 瑞克和莫蒂第五季在线观看 | 操亚洲 | 国产电影一区二区在线观看 | 久久精品女人天堂av | 国产高清精品一区二区三区 | 国产精品亚洲成在人线 | 日韩毛片免费看 | 国产精品视频一区二区三区 | 成人av电影天堂 | 久久中文字幕一区 | 午夜精品一区二区三区在线视 | 日本在线一区二区三区 | 国产精品a级 | 国产精品久久久久久久久免费软件 | 亚洲精品视频在线看 | 精品亚洲一区二区三区 | 久久鲁视频 | 国产精品亚洲一区二区三区在线 | 精品国产乱码久久久久久图片 | 日韩在线免费视频 | 久久91视频 | 在线亚洲人成电影网站色www | 国产视频综合 | 色呦呦网站 | 福利视频日韩 | 中文字幕欧美在线观看 | 免费久久网 | 日韩视频区 | 精品九九九 | 国产国拍亚洲精品av | 久久精品国产亚洲一区二区三区 | 国精产品一区二区三区 | 国产ts人妖一区二区三区 | 看亚洲a级一级毛片 | 亚洲一区视频在线 | 美女福利视频网站 | 国内av在线 | 黑人巨大精品欧美一区二区免费 |