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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

ADXL345是怎么來計算步數和判斷運動狀態的?

[復制鏈接]
跳轉到指定樓層
樓主
ID:890746 發表于 2021-6-7 21:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
ADXL345模塊做計步器,找到了一段程序但是看不太懂,有大佬教教我,ADXL345是怎么來計算步數和判斷運動狀態的啊......
#include<reg52.h>
#include<stdio.h>
#include "delay.h"
#include "math.h"
#include "adxl345.h"
#include "1602.h"

sbit led=P1^4;         //引腳定義

unsigned char ReadAdxl345;                 //定時讀取adxl345
char dis0[16];                   //串口數據顯示
xdata char dis1[16];                   //串口數據顯示
xdata char dis2[16];                   //串口數據顯示
unsigned long time_20ms=0;           //定時器計數
unsigned char ReportFlag=0;           //數據上報標志

unsigned int BuShu=0;         //累計步數
float JuLi=0;                        //累計距離
float KaLuLi=0;                        //累計卡路里
unsigned char statFlag = 0;//狀態
void Init_Timer0(void);                   //函數聲明
void SendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void SendByte(unsigned char dat);
void BuShuCheck(void);

void main (void)
{     
        Init_Timer0();        //定時器0初始化
        UART_Init();

        LCD_Init();           //初始化液晶
        DelayMs(20);          //延時有助于穩定
        LCD_Clear();

        Init_ADXL345();          //清屏
        if(Single_Read_ADXL345(0X00)==0xe5)        //讀出的數據為0XE5,表示正確
        {
                DelayMs(5);
        }
        else
        {
                DelayMs(3);
        }
        led=1;
        while (1)         //主循環
        {
            if(ReadAdxl345==1)   //定時讀取adxl345數據
            {
                        BuShuCheck();                        //檢測步數

                        sprintf(dis1,"B:%04d J:%4.1fm ",BuShu/2,JuLi);        //打印
                        LCD_Write_String(0,0,dis1);//顯示
                        sprintf(dis2,"%7.2fcal ",KaLuLi);                   //打印
                        LCD_Write_String(0,1,dis2);//顯示                        

                        if(statFlag == 0)//站著狀態
                        {LCD_Write_String(11,1,"Stand");}
                        else if(statFlag == 1)////躺著狀態
                        {LCD_Write_String(11,1,"Lie  ");}
                        else if(statFlag == 2)//跑著狀態
                        {LCD_Write_String(11,1,"Run  ");}
                        else if(statFlag == 3)//走著狀態
                        {LCD_Write_String(11,1,"Walk ");}
                }

                if(ReportFlag==1)        //2s
                {
                        ReportFlag=0;
                        sprintf(dis0,"*B:%04d",BuShu/2);        //上報步數
                        SendStr(dis0,7);
                        sprintf(dis0,"J:%04.1fm",JuLi);                        //上報距離
                        SendStr(dis0,7);
                        sprintf(dis0,"K:%07.2fcal",KaLuLi);                   //上報卡路里
                        SendStr(dis0,12);

                        if(statFlag == 0)//站著狀態
                        {SendStr("Stand#",6);}
                        else if(statFlag == 1)////躺著狀態
                        {SendStr("Lie  #",6);}
                        else if(statFlag == 2)//跑著狀態
                        {SendStr("Run  #",6);}
                        else if(statFlag == 3)//走著狀態
                        {SendStr("Walk #",6);}
                        SendStr("\r\n",2);
                }
        }
}

void BuShuCheck(void)
{
        static unsigned char ErrorNum=0;           //變量定義
        static unsigned char NormalNum=0;

        static unsigned char CheckNum=0;           //變量定義
        static unsigned char shuNum=0;
        static unsigned char ceNum=0;
        static unsigned int remBuShu=0;
        ReadAdxl345=0;
        ReadData_x();
        CheckNum++;//檢測次數
        if((temp_X<650)||(abs(temp_Y)>400))       //查看正常次數
        {
                led=0;                        //呼吸燈
                ErrorNum++;        //記錄次數
                shuNum++;//豎直狀態++
        }
        else
        {NormalNum++; ceNum++;led=1;} //呼吸燈//側著狀態++        

        if((NormalNum!=0)&&(ErrorNum!=0))        //                        從角度判斷走了一步
        {
                ErrorNum=0;
                NormalNum=0;
                BuShu++;
                JuLi=(float)(BuShu/2)*0.45;          //計算距離
                KaLuLi=JuLi*70*0.832;                 //卡路里計算 走路 距離*體重*系數
        }

        if(CheckNum>=20)
        {

                if((ceNum!=0)&&(shuNum==0))
                {
                        statFlag = 0;//站著狀態
                }
                else if((ceNum==0)&&(shuNum!=0))
                {
                        statFlag = 1;//躺著狀態
                }
                else if((ceNum!=0)&&(shuNum!=0))
                {
                        if((BuShu - remBuShu)>=6)//跑著 一個周期大于3步
                        {statFlag = 2;}//跑著狀態
                        else
                        {statFlag = 3;}//走著狀態
                        remBuShu = BuShu;//記錄上次步數                        
                }
                CheckNum=0;
                ceNum=0;                //清空計數
                shuNum=0;                        
        }
}
void Init_Timer0(void)
{
        TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
        TH0=(65536-20000)/256;                  //重新賦值 20ms
        TL0=(65536-20000)%256;
        EA=1;            //總中斷打開
        ET0=1;           //定時器中斷打開
        TR0=1;           //定時器開關打開
}

void Timer0_isr(void) interrupt 1
{
        TH0=(65536-20000)/256;                  //重新賦值 20ms
        TL0=(65536-20000)%256;

        time_20ms++;
        if(time_20ms%5==0)
        {
                ReadAdxl345=1;
        }
        if(time_20ms%50==0)
        {
                ReportFlag=1;
        }
}

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区二区在线观看 | 欧美天堂| 日韩在线播放一区 | 亚洲女优在线播放 | 欧美精品一区二区三区在线播放 | www成人免费| 综合网伊人 | 美女视频一区 | 在线a视频 | 日韩欧美二区 | 久久这里有精品 | 91欧美精品成人综合在线观看 | 久久69精品久久久久久久电影好 | 精品粉嫩aⅴ一区二区三区四区 | 日韩精品一区二区在线 | 日韩图区 | 日本一二三区电影 | 国产精品无码久久久久 | 华人黄网站大全 | 久久久国产网站 | 高清一区二区 | 中国91av| 久久精品亚洲精品 | 免费激情 | 又黄又爽的网站 | 国产在线观看一区二区三区 | 精品一区久久 | 久久久久国产一区二区三区四区 | 黄色福利 | www日韩欧美 | 亚洲 欧美 综合 | 国产精品国产精品国产专区不蜜 | 欧美伊人影院 | 国产高清自拍视频在线观看 | 国产精品免费一区二区三区四区 | 在线免费91 | 亚洲精品久久嫩草网站秘色 | 国家一级黄色片 | 国产日产欧产精品精品推荐蛮挑 | h视频免费看 | av手机在线看 |