欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于ADXL345的c8051f330單片機簡易計步器源程序
[打印本頁]
作者:
T-BOY
時間:
2018-8-16 10:34
標題:
基于ADXL345的c8051f330單片機簡易計步器源程序
可以實現(xiàn)簡單計步并且可以計算卡路里消耗
單片機源程序如下:
#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;
//獲取時鐘函數(shù)
void get_clock(void)
{
DS1302_GetTime(&CurrentTime);
DateToStr(&CurrentTime);
TimeToStr(&CurrentTime);
}
//時鐘顯示函數(shù)
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碼轉(zhuǎn)化成十進制碼
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: 實現(xiàn)Pedometer的基本算法.
*Input: void
*Output: void
*------------------------------------------------------------------------------------------------------------------------*/
void step_counter(void)
{
static uchar sampling_counter=0;
uchar jtemp;
ADXL345_FLAG=0;
Multiple_read_ADXL345(); //連續(xù)讀出數(shù)據(jù),存儲在BUF中
//------------------------------------------采樣濾波----------------------//
for(jtemp=0;jtemp<=2;jtemp++) //jtemp 0,1,2分別代表x,y,z
{
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;
//----------------------------------計算動態(tài)門限和動態(tài)精度-----------------------//
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); //dc為閾值
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];}
}
}
//------------------------- 動態(tài)門限判決 ----------------------------------
if((vpp[0]>=vpp[1])&&(vpp[0]>=vpp[2])) //x軸最活躍
{
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])) //y軸最活躍
{
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])) //z軸最活躍
{
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) //確定、調(diào)節(jié)按鍵
{
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); //讀取秒數(shù)
temp=zh(temp);
temp=temp+1; //秒數(shù)加1
if(temp>59) //超過59秒,清零
temp=0;
DS1302_SetTime(DS1302_SECOND,temp);
break;
case 3:
temp=Read1302(DS1302_MINUTE); //讀取分數(shù)
temp=zh(temp);
temp=temp+1; //分數(shù)加1
if(temp>59) //超過59分,清零
temp=0;
DS1302_SetTime(DS1302_MINUTE,temp);
break;
case 4:
temp=Read1302(DS1302_HOUR); //讀取小時數(shù)
temp=zh(temp);
temp=temp+1; //小時數(shù)加1
if(temp>23) //超過23小時,清零
temp=0;
DS1302_SetTime(DS1302_HOUR,temp);
break;
case 5:
temp=Read1302(DS1302_WEEK); //讀取星期數(shù)
temp=zh(temp);
temp=temp+1; //星期數(shù)加1
if(temp>7)
temp=1;
DS1302_SetTime(DS1302_WEEK,temp);
break;
case 6:
temp=Read1302(DS1302_DAY); //讀取日數(shù)
temp=zh(temp);
temp=temp+1; //日數(shù)加1
if(temp>31)
temp=1;
DS1302_SetTime(DS1302_DAY,temp);
break;
case 7:
temp=Read1302(DS1302_MONTH); //讀取月數(shù)
temp=zh(temp);
temp=temp+1; //月數(shù)加1
if(temp>12)
temp=1;
DS1302_SetTime(DS1302_MONTH,temp);
break;
case 8:
temp=Read1302(DS1302_YEAR); //讀取年數(shù)
temp=zh(temp);
temp=temp+1; //年數(shù)加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();
//日期顯示結(jié)束
//鍵盤掃描
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++;
}
}
}
復(fù)制代碼
所有資料51hei提供下載:
簡單計步器.zip
(106.26 KB, 下載次數(shù): 43)
2018-8-16 10:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
oohu
時間:
2021-4-22 12:00
如何解釋實現(xiàn)Pedometer的基本算法的程序
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1