实例介绍
【实例截图】
【核心代码】
#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 ; } } }
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论