基本信息
源码名称:pedometer 计步器 源码下载
源码大小:0.09M
文件格式:.rar
开发语言:C/C++
更新时间:2015-07-03
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 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  ;
		}
	}
}