0.png (67.06 KB, 下載次數: 128)
下載附件
2016-5-10 23:57 上傳
計步器程序下載(用c8051f單片機ds1302時間芯片和5110液晶屏顯示):
adxl345加速度計ds1302 5110液晶和51單片機實現的簡單計步器.zip
(90.38 KB, 下載次數: 214)
2016-5-10 23:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
51單片機的版本:http://www.zg4o1577.cn/bbs/dpj-50085-1.html
程序2:ds1302+5110液晶顯示的adxl345加速度 計步器版本用的c8051f單片機芯片:
- #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++;
- }
- }
- }
復制代碼
|