默れ

ADXL345应用——计步器设计(软件实现)

0
阅读(7584)

     经过之前对单双击,摇晃检测等功能的熟悉,在计步器设计中,我们把各种功能糅合在一起,实现计步器初始参数的输入。

     首先输入身高,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;