ADXL345应用——计步器设计(软件实现)
0赞
发表于 4/13/2012 3:57:54 PM
阅读(8979)
经过之前对单双击,摇晃检测等功能的熟悉,在计步器设计中,我们把各种功能糅合在一起,实现计步器初始参数的输入。
首先输入身高,LCD屏幕显示“input high cm”,等待输入,这里应用了ADXL摇晃检测和旋转检测:设置初始身高170(cm),当向左摇晃时,身高加1(cm),向右摇晃时,身高减1(cm)。设定结束后,竖直放置计步器顺时针旋转,则返回,逆时针旋转则进行下一项参数输入。
if(fifo_flag==9)
{
status = 170;
int2str(status,str,8);
disp_str(0,0,"input high: ");
disp_str(0,2," cm ");
disp_str(0,4," ");
disp_str(0,6," ");
disp_str(0,2,str);
ADuC7026_static_rotate_2();
while(1)
{
if(fifo_flag==1)
{
fifo_flag=10;
SPI_ADXL345_READ(XL345_INT_SOURCE);
SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
fifo_flag=10;
mean_x = 0;
mean_y = 0;
mean_z = 0;
for(i=0; i<1; i++)
{
ADuC7026_once();
mean_x+=long_r_data[0];
mean_y+=long_r_data[1];
mean_z+=long_r_data[2];
}
mean_x/=1;
mean_y/=1;
mean_z/=1;
mean_x-=static_x;
mean_y-=static_y;
mean_z-=static_z;
long_delay(1000000);
if(mean_y>0)
{
left_right =0 ;
if(status>0)
status-=1;
}
else
{
left_right =1;
if(status<255)
status+=1;
}
ADuC7026_once_2();
if(static_y>200)
{
fifo_flag=0;
break;
}
else if(static_y<-200)
{
fifo_flag=20;
break;
}
long_delay(50000);
int2str(status,str,8);
disp_str(0,0,"input high: ");
disp_str(0,2," cm ");
disp_str(0,4," ");
disp_str(0,2,str);
ADuC7026_static_rotate_2();
}
}
}
输入体重。身高参数设置完毕后进入体重设置。LCD屏幕显示“input weight kg”,,设置初始体重60(kg),与身高设置类似,想做摇晃时,体重加1(kg),向右摇晃时,体重减1(kg)。设定结束后,竖直放置计步器顺时针旋转,则返回,逆时针旋转则进行下一项参数输入。
if(fifo_flag==20)
{
weight = 60;
int2str(status,str,8);
disp_str(0,0,"input weight: ");
disp_str(0,2," kg ");
disp_str(0,4," ");
disp_str(0,6," ");
long_delay(1000000);
disp_str(0,2,str);
ADuC7026_static_rotate_2();
while(1)
{
if(fifo_flag==1)
{
fifo_flag=10;
SPI_ADXL345_READ(XL345_INT_SOURCE);
SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
fifo_flag=10;
mean_x = 0;
mean_y = 0;
mean_z = 0;
for(i=0; i<1; i++)
{
ADuC7026_once();
mean_x+=long_r_data[0];
mean_y+=long_r_data[1];
mean_z+=long_r_data[2];
}
mean_x/=1;
mean_y/=1;
mean_z/=1;
mean_x-=static_x;
mean_y-=static_y;
mean_z-=static_z;
long_delay(1000000);
if(mean_y>0)
{
left_right =0 ;
if(weight>0)
weight-=1;
}
else
{
left_right =1;
if(weight<255)
weight+=1;
}
ADuC7026_once_2();
if(static_y>200)
{
fifo_flag=0;
break;
}
else if(static_y<-200)
{
fifo_flag=5;
break;
}
long_delay(50000);
int2str(weight,str,8);
disp_str(0,2,str);
ADuC7026_static_rotate_2();
}
}
}
进入计步状态,LCD第一行显示“step s”,第二行显示速度“V s/sed”,单位以“步/秒”计,第三行显示“cal mc”。程序代码如下:
if(fifo_flag==5)
{
T1CON = 0xC4;
IRQEN=GP_TIMER_BIT;
disp_str(0,0,"step: s");
long_delay(6000000);
while(1)
{
for(i=0; i<500; i++)
{
ADuC7026_once_2();
temp+=static_x;
if(static_x>temp_max)
temp_max_1 = static_x;
if(static_xtemp_up&&flag==0)
{
step+=1;
flag = 1;
}
else if(static_x
卡路里计算程序如下:
int2str(step - run_step,str,8);
disp_str(0,2,"V: s/sec ");
disp_str(0,4,"cal: mc");
disp_str(16, 2, str);
if(step - run_step<3)
{
length=status/5.0;
}
else if(step - run_step==3)
length = status/4.0;
else if(step - run_step==4)
length = status/3.0;
else if(step - run_step==5)
length = status/2.0;
else if(step - run_step>5&&step - run_step<8)
length = status;
else length = 1.2*status;
calorie=(unsigned int)(2.5*length*(step - run_step)*weight);
int2str(calorie,str,8);
disp_str(32, 4, str);
if(step - run_step>4)
disp_str(0, 6, "run ");
else if(step - run_step<4&&step - run_step>0)
disp_str(0,6,"walk ");
else
disp_str(0,6,"static ");
run_step = step;
T1CLRI =0X01;
