|
ADXL345模塊做計(jì)步器,找到了一段程序但是看不太懂,有大佬教教我,ADXL345是怎么來(lái)計(jì)算步數(shù)和判斷運(yùn)動(dòng)狀態(tài)的啊......
#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; //定時(shí)讀取adxl345
char dis0[16]; //串口數(shù)據(jù)顯示
xdata char dis1[16]; //串口數(shù)據(jù)顯示
xdata char dis2[16]; //串口數(shù)據(jù)顯示
unsigned long time_20ms=0; //定時(shí)器計(jì)數(shù)
unsigned char ReportFlag=0; //數(shù)據(jù)上報(bào)標(biāo)志
unsigned int BuShu=0; //累計(jì)步數(shù)
float JuLi=0; //累計(jì)距離
float KaLuLi=0; //累計(jì)卡路里
unsigned char statFlag = 0;//狀態(tài)
void Init_Timer0(void); //函數(shù)聲明
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(); //定時(shí)器0初始化
UART_Init();
LCD_Init(); //初始化液晶
DelayMs(20); //延時(shí)有助于穩(wěn)定
LCD_Clear();
Init_ADXL345(); //清屏
if(Single_Read_ADXL345(0X00)==0xe5) //讀出的數(shù)據(jù)為0XE5,表示正確
{
DelayMs(5);
}
else
{
DelayMs(3);
}
led=1;
while (1) //主循環(huán)
{
if(ReadAdxl345==1) //定時(shí)讀取adxl345數(shù)據(jù)
{
BuShuCheck(); //檢測(cè)步數(shù)
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)//站著狀態(tài)
{LCD_Write_String(11,1,"Stand");}
else if(statFlag == 1)////躺著狀態(tài)
{LCD_Write_String(11,1,"Lie ");}
else if(statFlag == 2)//跑著狀態(tài)
{LCD_Write_String(11,1,"Run ");}
else if(statFlag == 3)//走著狀態(tài)
{LCD_Write_String(11,1,"Walk ");}
}
if(ReportFlag==1) //2s
{
ReportFlag=0;
sprintf(dis0,"*B:%04d",BuShu/2); //上報(bào)步數(shù)
SendStr(dis0,7);
sprintf(dis0,"J:%04.1fm",JuLi); //上報(bào)距離
SendStr(dis0,7);
sprintf(dis0,"K:%07.2fcal",KaLuLi); //上報(bào)卡路里
SendStr(dis0,12);
if(statFlag == 0)//站著狀態(tài)
{SendStr("Stand#",6);}
else if(statFlag == 1)////躺著狀態(tài)
{SendStr("Lie #",6);}
else if(statFlag == 2)//跑著狀態(tài)
{SendStr("Run #",6);}
else if(statFlag == 3)//走著狀態(tài)
{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++;//檢測(cè)次數(shù)
if((temp_X<650)||(abs(temp_Y)>400)) //查看正常次數(shù)
{
led=0; //呼吸燈
ErrorNum++; //記錄次數(shù)
shuNum++;//豎直狀態(tài)++
}
else
{NormalNum++; ceNum++;led=1;} //呼吸燈//側(cè)著狀態(tài)++
if((NormalNum!=0)&&(ErrorNum!=0)) // 從角度判斷走了一步
{
ErrorNum=0;
NormalNum=0;
BuShu++;
JuLi=(float)(BuShu/2)*0.45; //計(jì)算距離
KaLuLi=JuLi*70*0.832; //卡路里計(jì)算 走路 距離*體重*系數(shù)
}
if(CheckNum>=20)
{
if((ceNum!=0)&&(shuNum==0))
{
statFlag = 0;//站著狀態(tài)
}
else if((ceNum==0)&&(shuNum!=0))
{
statFlag = 1;//躺著狀態(tài)
}
else if((ceNum!=0)&&(shuNum!=0))
{
if((BuShu - remBuShu)>=6)//跑著 一個(gè)周期大于3步
{statFlag = 2;}//跑著狀態(tài)
else
{statFlag = 3;}//走著狀態(tài)
remBuShu = BuShu;//記錄上次步數(shù)
}
CheckNum=0;
ceNum=0; //清空計(jì)數(shù)
shuNum=0;
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
TH0=(65536-20000)/256; //重新賦值 20ms
TL0=(65536-20000)%256;
EA=1; //總中斷打開(kāi)
ET0=1; //定時(shí)器中斷打開(kāi)
TR0=1; //定時(shí)器開(kāi)關(guān)打開(kāi)
}
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;
}
}
|
|