生活中計步手環原理介紹:
運動手環的原理的原理是手的晃動加上位移。通過内置相對高精度的加速度傳感器,可以通過積分加速度檢測手環在空間中的位移,以此來判斷是否是步數。現代的手環還具備環境感覺的算法,會試圖判斷空間位移是否是走路或跑步産生的。是以如果你能看到步數的增加,有時候你會發現剛開始走的時候幾步并沒有加上,但是走一會兒就全部算上了。
根據空間位移的幅度。走路與跑步之間,峰值加速度的差别很大,空間位移的範圍差距往往也很大,是不難判斷的。
功能介紹:采用stm32單片機作為控制CPU,4位數位管來顯示目前的步數,通過按鍵進行相關設定,比如開始、計步、清零等相關操作,完美的仿真出stm32單片機計步器的相關功能,程式采用keil編寫并且有中文注釋,新手容易看懂,仿真采用Proteus,全套仿真資料齊全:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iZzUWYzIGO3EjZmdjN3cDZhNTO2MGO0IWY4UDNkZ2Nx8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
程式部分展示:(有中文注釋,新手容易看懂)
//把數值輸出到具體的單片機引腳
void Drv_SEG(u8 num)
{
SEG_A=GETVALBIT(num,0);
SEG_B=GETVALBIT(num,1);
SEG_C=GETVALBIT(num,2);
SEG_D=GETVALBIT(num,3);
SEG_E=GETVALBIT(num,4);
SEG_F=GETVALBIT(num,5);
SEG_G=GETVALBIT(num,6);
SEG_DP=GETVALBIT(num,7);
}
//驅動數位管的函數
//mode =0表示共陽,mode=1表示共陰,可以通過這個修改
//m是要顯示的數字,比如1.0就是m=10,放大10倍
void Show_num(u16 m)
{
u8 num=0,n=0;
static u8 temp_flag=0;
//數位管消隐
SEG1=0;SEG2=0;SEG3=0;SEG4=0;
switch(temp_flag)
{
case 0://左側第1位數位管
n=m/1000;//取資料
num=CAseg_table[n];//查詢數位管的斷碼表
Drv_SEG(num);
SEG1=1;//打開數位管顯示
temp_flag++;
break;
case 1://左側第2位數位管
n=m%1000/100;//取資料
num=CAseg_table[n];//查詢數位管的斷碼表
Drv_SEG(num);
SEG2=1;//打開數位管顯示
temp_flag++;
break;
case 2://左側第3位數位管
n=m%100/10;//取資料
num=CAseg_table[n];//查詢數位管的斷碼表
Drv_SEG(num);
SEG3=1;//打開數位管顯示
temp_flag++;
break;
case 3://左側第4位數位管
n=m%10;//取資料
num=CAseg_table[n];//查詢數位管的斷碼表
Drv_SEG(num);
SEG4=1;//打開數位管顯示
temp_flag=0;
break;
}
Delay_ms(10);//延時
}
//擷取獨立按鍵資料
u8 Get_key_num()
{
u8 temp_key=0;
static u8 flag=0;
if((flag==0)&&((K1==0)||(K2==0)||(K3==0)))
{
flag=1;//按鍵隻擷取一次按鍵數值
SysTick_Delay_Ms(10);//消除抖動
//如果有對應的按鍵按下就傳回對應按鍵數值
if(K1==0)
{temp_key=1;}
else if(K2==0)
{temp_key=2;}
else if(K3==0)
{temp_key=3;}
}
else if((K1==1)&&(K2==1)&&(K3==1))
{
flag=0;//所有按鍵都彈起就清除标志
}
return temp_key;
}
資料分享下載下傳連結:https://docs.qq.com/doc/DTXVldHVWenRPaldC