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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4332|回復: 0
打印 上一主題 下一主題
收起左側

ADXL重力加速度傳感器實現計步器程序(利用MSP430F135實現)

[復制鏈接]
跳轉到指定樓層
樓主
ADXL重力加速度傳感器實現計步器程序,利用MSP430F135實現,代碼功能完整。
可用按鍵控制。


單片機源程序如下:

  1. //存儲器沒有文件系統,一次采集,一次上載

  2. #include "delay.h"
  3. #include "Key.h"
  4. #include  <msp430x13x.h>
  5. #include <string.h>
  6. #include <math.h>
  7. #include <stdio.h>
  8. #include"ADC12.h"
  9. #include "hzlib.h"
  10. #include "LCD.h"
  11. #include "SD2608.h"

  12. #define MEM_IN 0x02                        //P3.1
  13. #define MEM_OUT 0x04                       //P3.2
  14. #define SCLK 0x08                          //P3.3
  15. #define ATRDY 0x40                         //AT45DB161 RDY/BUSY          P2.6
  16. #define ATCS 0x80                          //AT45DB161 AT/CS             P2.7
  17. #define TIME_MS 10000                        //采樣頻率為100



  18. #define X_CHANNEL 0
  19. #define Y_CHANNEL 1
  20. #define Z_CHANNEL 2
  21. //#define TIMEWINDOW_MIN 8                //時間窗,×0.02s=0.2s
  22. //#define TIMEWINDOW_MAX 30               //時間窗,×0.02s=0.8s
  23. #define REGULATION      8              //認為找到穩定規律所需要的步數


  24. unsigned char       itemp,jtemp,temp;               
  25. unsigned char       TIMEWINDOW_MIN =11;        //時間窗,×0.02s=0.2
  26. unsigned char       TIMEWINDOW_MAX =30        ;       //時間窗,×0.02s=0.8s

  27. unsigned int  Adresult;               
  28. unsigned char _bad_flag[3];                                                                                                                                                       
  29. unsigned char  sampling_counter;                                                               
  30. unsigned int _adresult[3];                                                                       
  31. unsigned int _max[3]={0,0,0};
  32. unsigned int _min[3]={5000,5000,5000};
  33. unsigned int _dc[3]={500,500,500};
  34. unsigned int _vpp[3]={30,30,30};       
  35. unsigned int  _precision[3]={5,5,5};       
  36. unsigned int _old_fixed[3];
  37. unsigned int _new_fixed[3];
  38. unsigned long int STEPS;       
  39. unsigned long int STEPS_Temp;       
  40. unsigned  int _array0[3]={1,1,1};
  41. unsigned  int _array1[3]={1,1,1};
  42. unsigned  int _array2[3]={0,0,0};
  43. unsigned  int _array3[3]={0,0,0};
  44. unsigned  int _array4[3]={0,0,0};
  45. unsigned  int  ADXYZ[3] ;


  46. unsigned long int totalxyz[3];
  47. unsigned int averagexyz[3];
  48. unsigned char avxyz;
  49. unsigned char counter;
  50. unsigned char counterx=0;
  51. unsigned char countery=0;
  52. unsigned char counterz=0;


  53. unsigned char Interval=0;                //記錄時間間隔數
  54. unsigned char TempSteps=0;                //記步緩存
  55. unsigned char InvalidSteps=0;        //無效步緩存
  56. unsigned char ReReg=1;                       
  57.                                                                                
  58.                                                                                 //        1-已經開始,但是還沒有找到規律
  59.                                                                                 //        0-已經找到規律
  60. unsigned char high_or_low=0,k=0;
  61. unsigned char recieve;
  62. unsigned char date[7];
  63. unsigned char wdata[7]={0,0,128,0,1,1,0};








  64. void fnClkInit(void)
  65. {
  66.   unsigned int a;
  67.   WDTCTL = WDTPW +WDTHOLD;                                //關閉看門狗
  68.    BCSCTL1|=XTS;                                           //XT1口為高頻  XTS=1,ACLK = LFXT1
  69.   do
  70.     {
  71.      IFG1&=~OFIFG;                                        //清除振蕩器失效標志
  72.      for (a=0xFF;a>0;a--);                                //延時 等待XT1口起振
  73.      }
  74.    while ((IFG1&OFIFG)!=0);                                //判斷XT1口是否起振
  75.          BCSCTL2 |= SELM_3;                          //選擇LFXT1CLK為MCLK時鐘源
  76.          BCSCTL1 |= XT2OFF+DIVA0+DIVA1;                   //禁止XT2口 ACLK 8分頻
  77. }  
  78.                     
  79. /*******************定時器初始化定時5MS*******************/
  80. void TimerBInit(void)
  81. {
  82.        TBCTL   = TBSSEL_1 + TBCLR ;               //ACLK為定時器時鐘   
  83.        TBCCTL0 = CCIE;                                      //開定時器中斷
  84.        TBCCR0  = TIME_MS;                                      //5MS
  85.        //TBCTL  |= MC0;                                       //增計數模式
  86. }



  87. void main(void)
  88. {
  89.    fnClkInit();
  90.    TimerBInit();
  91.    //usart_Init();
  92.    Init_ADC();
  93.    Init_keyPort();
  94.    vdLCD_Init();
  95.    vdDisp_Main();
  96.    clock();
  97.      _EINT();
  98. while(1)
  99.    {
  100.     Iskey ();
  101.      vdDisp_bushu(STEPS);
  102.    }
  103. }


  104. #pragma vector=TIMERB0_VECTOR
  105. __interrupt void Timer_B (void)
  106. {
  107.    ADC12CTL0 &= ~ENC;

  108.   if(recieve==0x04)
  109.    {
  110.      //----------------------------------------------ADC采樣----------------------//
  111.        ADXYZ[0] =ADC12MEM0;//AX
  112.        ADXYZ[1]=ADC12MEM1;//AY
  113.        ADXYZ[2]=ADC12MEM2;//AZ
  114.        //----------------------------------------------開機求平均值判斷放置位置----------------------//
  115.        if(avxyz==0)
  116.        {  
  117.            counter=counter+1;
  118.            totalxyz[0]=totalxyz[0]+ADXYZ[0];
  119.            totalxyz[1]=totalxyz[1]+ADXYZ[1];
  120.            totalxyz[2]=totalxyz[2]+ADXYZ[2];
  121.            if(counter>=40)
  122.            {
  123.               counter=0;
  124.               counterx=0;
  125.               countery=0;
  126.               counterz=0;
  127.               averagexyz[0]= (int)(totalxyz[0]/40);
  128.               averagexyz[1]= (int)(totalxyz[1]/40);
  129.               averagexyz[2]= (int)(totalxyz[2]/40);
  130.               totalxyz[0]=0;
  131.               totalxyz[1]=0;
  132.               totalxyz[2]=0;
  133.               avxyz=1;
  134.       //----------------------------------------------x方向為垂直位置----------------------//
  135.               if (( averagexyz[0]>= averagexyz[1])&&( averagexyz[0]>= averagexyz[2])&& (averagexyz[0]>3500))
  136.               {
  137.                 counterx=1;
  138.                 countery=0;
  139.                 counterz=0;
  140.               }
  141.               else if (( averagexyz[0]<= averagexyz[1])&&( averagexyz[0]<= averagexyz[2])&& (averagexyz[0]<1800))
  142.               {
  143.                 counterx=1;
  144.                 countery=0;
  145.                 counterz=0;
  146.               }
  147.                //----------------------------------------------y方向為垂直位置----------------------//
  148.              else if (( averagexyz[1]>= averagexyz[0])&&( averagexyz[1]>= averagexyz[2])&& (averagexyz[1]>3500))
  149.               {
  150.                 counterx=0;
  151.                 countery=1;
  152.                 counterz=0;
  153.               }
  154.               else if(( averagexyz[1]<= averagexyz[0])&&( averagexyz[1]<= averagexyz[2])&& (averagexyz[1]<1800))
  155.               {
  156.                 counterx=0;
  157.                 countery=1;
  158.                 counterz=0;
  159.               }
  160.                //----------------------------------------------z方向為垂直位置----------------------//
  161.               else if (( averagexyz[2]>= averagexyz[0])&&( averagexyz[2]>= averagexyz[1])&& (averagexyz[2]>3500))
  162.               {
  163.                 counterx=0;
  164.                 countery=0;
  165.                 counterz=1;
  166.               }
  167.               else if (( averagexyz[2]<= averagexyz[0])&&( averagexyz[2]<= averagexyz[1])&& (averagexyz[2]<1800))
  168.               {
  169.                 counterx=0;
  170.                 countery=0;
  171.                 counterz=1;
  172.               }
  173.               //----------------------------------------------未能確定方向重現找----------------------//
  174.               else
  175.               {
  176.                 avxyz=0;
  177.               }
  178.            }
  179.            
  180.        }
  181.         //----------------------------------------------加速度濾波----------------------//
  182.        if(avxyz==1)
  183.        {
  184.                 for(jtemp=X_CHANNEL;jtemp<=Z_CHANNEL;jtemp++)
  185.                 {
  186.                         _array4[jtemp]=_array3[jtemp];
  187.                         _array3[jtemp]=_array2[jtemp];
  188.                         _array2[jtemp]=_array1[jtemp];
  189.                         _array1[jtemp]=_array0[jtemp];
  190.                        
  191.                        _array0[jtemp]= ADXYZ[jtemp];
  192.                        _adresult[jtemp]=_array0[jtemp]+_array1[jtemp]+_array2[jtemp]+_array3[jtemp]+_array4[jtemp];
  193.                        _adresult[jtemp]=_adresult[jtemp]/5;
  194.                
  195.                         if (_adresult[jtemp]>_max[jtemp])               {_max[jtemp]=_adresult[jtemp];}
  196.                         if (_adresult[jtemp]<_min[jtemp])               {_min[jtemp]=_adresult[jtemp];}
  197.                 }
  198.                
  199.               sampling_counter=sampling_counter+1;
  200.         Interval=Interval+1;
  201.        
  202.                 //----------------------------------計算動態門限和動態精度-----------------------//
  203.         if (sampling_counter==50)
  204.           {               
  205.           sampling_counter=0;
  206.                                
  207.           for(jtemp=X_CHANNEL;jtemp<=Z_CHANNEL;jtemp++)
  208.                 {
  209.                 _vpp[jtemp]=_max[jtemp]-_min[jtemp];
  210.                                    _dc[jtemp]=_min[jtemp]+_vpp[jtemp]/2;
  211.                                _max[jtemp]=0;
  212.                                    _min[jtemp]=5000;
  213.                                 _bad_flag[jtemp]=0;

  214.                                 if (_vpp[jtemp]>=1000)
  215.                                      {
  216.                                         TIMEWINDOW_MIN =20;
  217.                                         TIMEWINDOW_MAX =60;
  218.                                         _precision[jtemp]=40;
  219.                                       }
  220.                                     else if ((_vpp[jtemp]>=400)&& (_vpp[jtemp]<1000))            
  221.                                       {
  222.                                         TIMEWINDOW_MIN =25;
  223.                                         TIMEWINDOW_MAX =70;
  224.                                         _precision[jtemp]=20;
  225.                                        }
  226.                                   else if ((_vpp[jtemp]>=200) && (_vpp[jtemp]<400))  
  227.                                      {
  228.                                        TIMEWINDOW_MIN =35;
  229.                                        TIMEWINDOW_MAX =80;
  230.                                         _precision[jtemp]=10;
  231.                                      }  
  232.                        
  233.                                 else
  234.                                    {
  235.                                        _precision[jtemp]=2;
  236.                                  _bad_flag[jtemp]=1;
  237.                                      }

  238.                         }
  239.               }
  240.                
  241.                 //--------------------------線性移位寄存器--------------------------------------//

  242.                 for(jtemp=X_CHANNEL;jtemp<=Z_CHANNEL;jtemp++)
  243.                 {
  244.                         _old_fixed[jtemp]=_new_fixed[jtemp];

  245.                    if (_adresult[jtemp]>=_new_fixed[jtemp])                        
  246.                       {   
  247.                          if((_adresult[jtemp]-_new_fixed[jtemp])>=_precision[jtemp])                  
  248.                         _new_fixed[jtemp]=_adresult[jtemp];
  249.                       }
  250.                   if (_adresult[jtemp]<_new_fixed[jtemp])
  251.                              {   
  252.                            if((_new_fixed[jtemp]-_adresult[jtemp])>=_precision[jtemp])                  
  253.                         _new_fixed[jtemp]=_adresult[jtemp];
  254.                       }
  255.                 }

  256.                 //------------------------- 動態門限判決 ----------------------------------
  257.       
  258.                 if(counterx==1)
  259.                 {
  260.                   if ((_old_fixed[X_CHANNEL]>=_dc[X_CHANNEL])&&(_new_fixed[X_CHANNEL]<_dc[X_CHANNEL])&&(_bad_flag[X_CHANNEL]==0))        
  261.                    {
  262.                                    if((Interval>=TIMEWINDOW_MIN)&&(Interval<=TIMEWINDOW_MAX))        //如果時間間隔在有效的時間窗內
  263.                                         {
  264.                                           if(ReReg==1)                                        //如果還沒有找到規律
  265.                                            {            
  266.                                                 TempSteps++;                                        //記步緩存加1
  267.                                               if(TempSteps>=REGULATION)                               //如果記步緩存達到所要求的規律數
  268.                                              {
  269.                                                   ReReg=0;                                //已經找到規律
  270.                                                   STEPS=STEPS+TempSteps;        //更新顯示
  271.                                                   TempSteps=0;
  272.                                                }
  273.                                               Interval=0;
  274.                                             }
  275.                                          else if(ReReg==0)                                //如果已經找到規律,直接更新顯示
  276.                                           {
  277.                                               STEPS++;
  278.                                               TempSteps=0;
  279.                                               Interval=0;
  280.                                             }
  281.                                        }  
  282.                
  283.                                    else if(Interval>TIMEWINDOW_MAX)        //如果時間間隔大于時間窗上限,記步已經間斷,重新尋找規律
  284.                                    {
  285.                                          
  286.                                             InvalidSteps=0;       
  287.                                             ReReg=1;
  288.                                             TempSteps=1;
  289.                                             Interval=0;
  290.                                             
  291.                                             
  292.                        
  293.                                           }
  294.                                      
  295.                                
  296.                        }
  297.                 }
  298.         
  299.         if(countery==1)
  300.         {
  301.           if ((_old_fixed[Y_CHANNEL]>=_dc[Y_CHANNEL])&&(_new_fixed[Y_CHANNEL]<_dc[Y_CHANNEL])&&(_bad_flag[Y_CHANNEL]==0))        
  302.               {
  303.                
  304.                        if((Interval>=TIMEWINDOW_MIN)&&(Interval<=TIMEWINDOW_MAX))        //如果時間間隔在有效的時間窗內
  305.                                         {
  306.                                           if(ReReg==1)                                        //如果還沒有找到規律
  307.                                            {            
  308.                                                 TempSteps++;                                        //記步緩存加1
  309.                                               if(TempSteps>=REGULATION)                               //如果記步緩存達到所要求的規律數
  310.                                              {
  311.                                                   ReReg=0;                                //已經找到規律
  312.                                                   STEPS=STEPS+TempSteps;        //更新顯示
  313.                                                   TempSteps=0;
  314.                                                }
  315.                                               Interval=0;
  316.                                             }
  317.                                          else if(ReReg==0)                                //如果已經找到規律,直接更新顯示
  318.                                           {
  319.                                               STEPS++;
  320.                                               TempSteps=0;
  321.                                               Interval=0;
  322.                                             }
  323.                                        }  
  324.                
  325.                                    else if(Interval>TIMEWINDOW_MAX)        //如果時間間隔大于時間窗上限,記步已經間斷,重新尋找規律
  326.                                    {
  327.                                             InvalidSteps=0;       
  328.                                             ReReg=1;
  329.                                             TempSteps=1;
  330.                                             Interval=0;
  331.                                             
  332.                        
  333.                                       }
  334.                                      
  335.                                
  336.                         }
  337.                 }
  338.         if(counterz==1)
  339.         {
  340.           if ((_old_fixed[Z_CHANNEL]>=_dc[Z_CHANNEL])&&(_new_fixed[Z_CHANNEL]<_dc[Z_CHANNEL])&&(_bad_flag[Z_CHANNEL]==0))        
  341.                {
  342.                        
  343.                                    if((Interval>=TIMEWINDOW_MIN)&&(Interval<=TIMEWINDOW_MAX))        //如果時間間隔在有效的時間窗內
  344.                                         {
  345.                                           if(ReReg==1)                                        //如果還沒有找到規律
  346.                                            {            
  347.                                                 TempSteps++;                                        //記步緩存加1
  348. ……………………

  349. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
ADXL重力加速度傳感器實現計步器程序(利用MSP430F135實現).zip (120.55 KB, 下載次數: 35)





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本三级电影在线免费观看 | 日韩av在线一区 | 成人亚洲网站 | 国产精品国产精品国产专区不蜜 | 91精品久久久久久久久中文字幕 | 日本aⅴ中文字幕 | 亚州一区二区三区 | 91精品久久久久久久久中文字幕 | 欧美中文字幕在线 | 亚洲一区二区三区在线视频 | 国产一区 在线视频 | 精品欧美一区二区精品久久久 | 蜜桃视频在线观看www社区 | 亚洲精品福利视频 | 男女黄网站 | 狠狠干av | 免费av一区二区三区 | 伊人色综合久久久天天蜜桃 | 91成人在线 | 中国美女撒尿txxxxx视频 | 日韩久久久一区二区 | 日韩免费一级 | 亚洲免费影院 | 精品久久久久香蕉网 | 人人九九精 | 天天操天天插天天干 | 亚洲精品片 | 2019天天干夜夜操 | 一区二区三区欧美在线观看 | 欧美成人精品一区二区男人看 | 亚洲精品在线免费播放 | 国产综合在线视频 | 中文字幕免费 | 国户精品久久久久久久久久久不卡 | 999久久久久久久久 国产欧美在线观看 | 亚洲精品自拍视频 | 日韩一区二区久久 | 欧美一区二区在线看 | 久久黄色 | 国产精品污www一区二区三区 | av永久免费 |