在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Android手机应用开发 → pedometer 计步器 源码下载

pedometer 计步器 源码下载

Android手机应用开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.09M
  • 下载次数:17
  • 浏览次数:416
  • 发布时间:2015-07-03
  • 实例类别:Android手机应用开发
  • 发 布 人:Byrant
  • 文件格式:.rar
  • 所需积分:2
 相关标签:

实例介绍

【实例简介】
【实例截图】

【核心代码】


#include <c8051f330.h>
#include <string.h> 
#include <intrins.h>
//===============================================================
#include "sys.h"
#include "5110.h"
#include "adxl345.h"
#include "ds1302.h"
/*==============================================================*/
sbit K1=P1^3;
sbit K2=P1^2;
sbit speak=P0^5;

unsigned char ADXL345_FLAG=0;
unsigned char START_FLAG=0;
unsigned char number=0;

unsigned char idata bad_flag[3];
unsigned int idata array0[3]={1,1,1};
unsigned int idata array1[3]={1,1,1};
unsigned int idata array2[3]={0,0,0};
unsigned int idata adresult[3];
unsigned int idata max[3]={0,0,0};
unsigned int idata min[3]={1000,1000,1000};
unsigned int idata dc[3]={500,500,500};
unsigned int idata vpp[3]={30,30,30};	
unsigned int idata precision[3]={5,5,5};	
unsigned int idata old_fixed[3];
unsigned int idata new_fixed[3];
unsigned int idata STEPS=0;
unsigned int idata time=0;
										
float xdata speed=0;
float xdata dist=0;
float xdata kalul=0;

SYSTEMTIME CurrentTime;
//获取时钟函数
void get_clock(void)
{
	DS1302_GetTime(&CurrentTime);
	DateToStr(&CurrentTime);
	TimeToStr(&CurrentTime);
}
//时钟显示函数
void show_time(void)
{
	Set_R_C_5110(0,12);
	Write_String_5110(CurrentTime.DateString);
	Set_R_C_5110(0,60);
	Write_String_5110("---");
	Write_Char_5110(CurrentTime.DateString[9]);
	
	Set_R_C_5110(1,0);
	Write_String_5110(CurrentTime.TimeString);
}
//BCD码转化成十进制码
uchar zh(uchar temp)
{
    temp=((temp&0x70)>>4)*10   (temp&0x0F);
	return temp;
}
void first_picture(void)
{
    DS1302_SetTime(DS1302_YEAR,12);
	DS1302_SetTime(DS1302_MONTH,1);
	DS1302_SetTime(DS1302_DAY,11);
	DS1302_SetTime(DS1302_WEEK,5);
	DS1302_SetTime(DS1302_HOUR,12);
	DS1302_SetTime(DS1302_MINUTE,12);
	DS1302_SetTime(DS1302_SECOND,12);
	Set_R_C_5110(0,0);
	Write_String_5110("20");
		
	Set_R_C_5110(1,54);
	Write_String_5110("SET- "); 
	
	Set_R_C_5110(2,0);
	Write_String_5110("B=00000 b");
	
    Set_R_C_5110(3,0);
	Write_String_5110("L=00000 m");
	
	Set_R_C_5110(4,0);
	Write_String_5110("S=00.00 m/s");
	
	Set_R_C_5110(5,0);
	Write_String_5110("C=00.00 c/kg/h");	 
}
 
void delay_ms(uint n)
{
    uint i,j;
    for(i=0;i<n;i  )
      for(j=0;j<1000;j  );
}

/*------------------------------------------------------------------------------------------------------------------------
*Name: 		step_counter()
*Function:	实现Pedometer的基本算法.
*Input:		void
*Output: 	void
*------------------------------------------------------------------------------------------------------------------------*/
void step_counter(void)
{
	static uchar sampling_counter=0;
	uchar jtemp;

	ADXL345_FLAG=0;
	Multiple_read_ADXL345();    //连续读出数据,存储在BUF中
	//------------------------------------------采样滤波----------------------//
	for(jtemp=0;jtemp<=2;jtemp  )
	{		
		  array2[jtemp]=array1[jtemp];
		  array1[jtemp]=array0[jtemp];			
   		array0[jtemp]=BUF[2*jtemp] (BUF[2*jtemp 1]<<8);
   		
   		adresult[jtemp]=array0[jtemp] array1[jtemp] array2[jtemp];
  	 	adresult[jtemp]=adresult[jtemp]/3;
		if(adresult[jtemp]>max[jtemp])               {max[jtemp]=adresult[jtemp];}
		if(adresult[jtemp]<min[jtemp])               {min[jtemp]=adresult[jtemp];}
	}
  	sampling_counter=sampling_counter 1;
	//----------------------------------计算动态门限和动态精度-----------------------//
    if(sampling_counter>=50)
    {               
      	sampling_counter=0;			
		for(jtemp=0;jtemp<=2;jtemp  )
		{
			vpp[jtemp]=max[jtemp]-min[jtemp];
        	dc[jtemp] =min[jtemp] (vpp[jtemp]>>1);
			max[jtemp]=0;
        	min[jtemp]=1023;
			bad_flag[jtemp]=0;
			if(vpp[jtemp]>=160)
			{
				precision[jtemp]=vpp[jtemp]/32; //8
			}
        	else if((vpp[jtemp]>=50)&& (vpp[jtemp]<160))            
			{
				precision[jtemp]=4;
			}
       		else if((vpp[jtemp]>=15) && (vpp[jtemp]<50))  
            {
				precision[jtemp]=3;
			}  			
			else
       		{ 
          		precision[jtemp]=2;
            	bad_flag[jtemp]=1;
        	}
		}
  	}		
	//--------------------------线性移位寄存器--------------------------------------
	for(jtemp=0;jtemp<=2;jtemp  )
	{
		old_fixed[jtemp]=new_fixed[jtemp];

    	if(adresult[jtemp]>=new_fixed[jtemp])                         
    	{   
     		if((adresult[jtemp]-new_fixed[jtemp])>=precision[jtemp])   {new_fixed[jtemp]=adresult[jtemp];}
    	}
    	else if(adresult[jtemp]<new_fixed[jtemp])
   	 	{   
       		if((new_fixed[jtemp]-adresult[jtemp])>=precision[jtemp])   {new_fixed[jtemp]=adresult[jtemp];}
    	}
	}
	//------------------------- 动态门限判决 ----------------------------------
	if((vpp[0]>=vpp[1])&&(vpp[0]>=vpp[2]))
	{
		if((old_fixed[0]>=dc[0])&&(new_fixed[0]<dc[0])&&(bad_flag[0]==0))        
		{
			STEPS=STEPS 1;
		} 
	}
	else if((vpp[1]>=vpp[0])&&(vpp[1]>=vpp[2]))
	{
		if((old_fixed[1]>=dc[1])&&(new_fixed[1]<dc[1])&&(bad_flag[1]==0))        
		{
			STEPS=STEPS 1;
		}
	}
	else if((vpp[2]>=vpp[1])&&(vpp[2]>=vpp[0]))
	{
		if((old_fixed[2]>=dc[2])&&(new_fixed[2]<dc[2])&&(bad_flag[2]==0))        
		{
			STEPS=STEPS 1;
		}
	}
}


//键盘扫描
void key_scan(void)
{
	uchar temp=0;
	if(K1==0)      //功能选择功能
	{
	    delay_ms(50);
		speak=0;
		delay_ms(10);
		speak=1;
		number  ;
		if(number>8)  number=0;
		if(number!=1) 
		{
		    START_FLAG=0;
		    Write_Char_5110_rc(2,78,'N');
		}		   
		if(number==0)   Write_Char_5110_rc(1,78,' ');
		else if(number==1)   Write_Char_5110_rc(1,78,'J');
		else if(number==2)   Write_Char_5110_rc(1,78,'S');
		else if(number==3)   Write_Char_5110_rc(1,78,'M');
		else if(number==4)   Write_Char_5110_rc(1,78,'H');
		else if(number==5)   Write_Char_5110_rc(1,78,'W');
		else if(number==6)   Write_Char_5110_rc(1,78,'D');
		else if(number==7)   Write_Char_5110_rc(1,78,'Y');
		else if(number==8)   Write_Char_5110_rc(1,78,'N');
		while(K1==0);
	}
	if(K2==0)	   //确定、调节按键
	{
	    delay_ms(50);
		switch(number)
		{
		    case 1:                              //计步器
				  if(START_FLAG==1)   
				  {
				      START_FLAG=0;
					  speak=0;
					  delay_ms(10);
					  speak=1;
					  Write_Char_5110_rc(2,78,'N');
					  dist=STEPS*0.5;            //路程
					  speed=dist/time;           //速度 
					  kalul=1.25*speed*3.6;      //卡路里    
					  
					  Write_variable_5110(3,12,dist);
		              Write_variable_5110_dian(4,12,speed*100);
		              Write_variable_5110_dian(5,12,kalul*100);
					  
					  STEPS=0; 
					  time=0;
				  } 
				  else 
				  {
				      START_FLAG=1;
					  speak=0;
					  delay_ms(10);
					  speak=1;
					  Write_Char_5110_rc(2,78,'Y');
					  Write_variable_5110(3,12,0);
		              Write_variable_5110_dian(4,12,0);
		              Write_variable_5110_dian(5,12,0);
				  }            
				  break;
			case 2:
			      temp=Read1302(DS1302_SECOND);  //读取秒数
				  temp=zh(temp);
				  temp=temp 1;  //秒数加1
				  if(temp>59)   //超过59秒,清零
			      temp=0;
				  DS1302_SetTime(DS1302_SECOND,temp);								  
				  break;
			case 3:
			      temp=Read1302(DS1302_MINUTE);  //读取分数
				  temp=zh(temp);
				  temp=temp 1;  //分数加1
				  if(temp>59)          //超过59分,清零
				  temp=0;
				  DS1302_SetTime(DS1302_MINUTE,temp);
				  break;
			case 4:
			      temp=Read1302(DS1302_HOUR);    //读取小时数
				  temp=zh(temp);
				  temp=temp 1;  //小时数加1
				  if(temp>23)          //超过23小时,清零
				  temp=0;
				  DS1302_SetTime(DS1302_HOUR,temp);
				  break;
			case 5:
			      temp=Read1302(DS1302_WEEK);    //读取星期数
				  temp=zh(temp);
				  temp=temp 1;  //星期数加1
				  if(temp>7)  
				  temp=1;
				  DS1302_SetTime(DS1302_WEEK,temp);
				  break;
			case 6:
			      temp=Read1302(DS1302_DAY);     //读取日数
				  temp=zh(temp);
				  temp=temp 1;  //日数加1
				  if(temp>31)
				  temp=1;
				  DS1302_SetTime(DS1302_DAY,temp);
				  break;
			case 7:
			      temp=Read1302(DS1302_MONTH);   //读取月数
				  temp=zh(temp);
				  temp=temp 1;  //月数加1
				  if(temp>12)
				  temp=1;
				  DS1302_SetTime(DS1302_MONTH,temp);
				  break;
			case 8:
			      temp=Read1302(DS1302_YEAR);    //读取年数
				  temp=zh(temp);
				  temp=temp 1;                   //年数加1
				  if(temp>15)
				  temp=0;
				  DS1302_SetTime(DS1302_YEAR,temp);
				  break;
			default:break;
		}
		while(K2==0);
	}
}
void main(void)
{
	Init_Device();     //单片机初始化
    Init_5110();       //液晶初始化
    Clear_5110();      //液晶清屏
 
	Init_ADXL345();    //加速度模块初始化
	Initial_DS1302();  //时钟芯片初始化
	first_picture();   //液晶界面初显示
       
    while(1)
    {
        //日期显示开始
        get_clock();
	    show_time();
	    //日期显示结束
		//键盘扫描
		key_scan();
		//计步器工作
		if(ADXL345_FLAG==1 && START_FLAG==1)
	    {
		    ADXL345_FLAG=0;
			step_counter();
			Write_variable_5110(2,12,STEPS);
		} 
    }
}
void timer0(void) interrupt 1    //约0.02s 进一次中断
{
    static uchar cnt=0,cnt1=0;
    TL0=0X96;
	TH0=0Xc3;
	cnt  ;
	cnt1  ; 
	if(cnt>=10)
	{ 
	    ADXL345_FLAG=1;
		cnt=0;
	}
	if(START_FLAG==1) 
	{
	    if(cnt1>=50)
		{
		    cnt1=0;
			time  ;
		}
	}
}


标签:

实例下载地址

pedometer 计步器 源码下载

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警