基于加速度传感器ADXL345的计步器设计_第1页
基于加速度传感器ADXL345的计步器设计_第2页
基于加速度传感器ADXL345的计步器设计_第3页
基于加速度传感器ADXL345的计步器设计_第4页
基于加速度传感器ADXL345的计步器设计_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第#页附录2程序清单#include<REG51.H>#include<INTRINS.H>#defineucharunsignedchar#defineuintunsignedint#defineDataPortP0//LCD1602数据端口sbitSCL=P"5;〃IIC时钟引脚定义;sbitSDA=P"4;//IIC数据引脚定义ucharcodetable_num[]="0123456789abcdefg";/************LCD1602设置sbitrs=P1A0;〃寄存器选择信号H:数据寄存器L:指令寄存器sbitrw=P1T;〃寄存器选择信号H:数据寄存器L:指令寄存器sbite=P"2;〃片选信号下降沿触发/*清零按键设置/*清零按键设置sbitkeyl=P1A6;sbitkey2=P1A7;sbitkey3=P1A3;#defineSlaveAddress0xA6/*定义器件在IIC总线中的从地址根据ALTADDRESS地址引脚不同修改ALTADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A*/longbushu,zong;//步数longbushu,zong;//步数ucharBUF[8];ucharge,shi,bai,qian,wan;intdis_data;intc;ints;inth=30.5;voidMultiple_Read_ADXL345();#defineRdCommand0x01#definePrgCommand0x02//接收数据缓存区//显示变量//变量//连续的读取内部寄存器数据//定义ISP的操作命令#defineEraseCommand0x03#defineError1#defineOk0#defineWaitTime0x01sfrISP_DATA=0xe2;sfrISP_ADDRH=0xe3;sfrISP_ADDRL=0xe4;sfrISP_CMD=0xe5;sfrISP_TRIG=0xe6;sfrISP_CONTR=0xe7;#defineWaitTime0x01sfrISP_DATA=0xe2;sfrISP_ADDRH=0xe3;sfrISP_ADDRL=0xe4;sfrISP_CMD=0xe5;sfrISP_TRIG=0xe6;sfrISP_CONTR=0xe7;//定义CPU的等待时间//寄存器申明uchara_a;打开ISP,IAP打开ISP,IAP功能voidISP_IAP_enable(void)EA=0;//关中断ISP_CONTR=ISP_CONTR&0x18;ISP_CONTR=ISP_CONTR|WaitTime;ISP_CONTR=ISP_CONTR|0x80;}//0001,1000//写入硬件延时//ISPEN=1/**************关闭ISP,IAP功能****************/voidISP_IAP_disable(void){ISP_CONTR=ISP_CONTR&0x7f;ISP_TRIG=0x00;EA=1;//ISPEN=0//开中断}/voidISPgoon(void){*****************公用的触发代码**********/ISP_IAP_enable();ISP_TRIG=0x46;ISP_TRIG=0xb9;_nop_();//打开ISP,IAP功能//触发ISP_IAP命令字节1//触发ISP_IAP命令字节2}/**********字节读************/unsignedcharbyte_read(unsignedintbyte_addr){EA=0;ISP_ADDRH=(unsignedchar)(byte_addr>>8);ISP_ADDRLISP_CMDISP_CMDISPgoon();ISP_IAP_disableEA=1;return(ISP_DATA);//地址赋值=(unsignedchar)(byte_addr&0x00ff);=ISP_CMD&0xf8;//清除低3位=ISP_CMD|RdCommand;//写入读命令//触发执行//关闭ISRIAP功能//返回读到的数据}/************扇区擦除************/voidSectorErase(unsignedintsector_addr){unsignedintiSectorAddr;iSectorAddr=(sector_addr&0xfe00);//取扇区地址ISP_ADDRH=(unsignedchar)(iSectorAddr>>8);ISP_ADDRL=0x00;ISP_CMD=ISP_CMD&0xf8;//清空低3位ISP_CMD=ISP_CMD|EraseCommand;//擦除命令3ISPgoon();//触发执行ISP_IAP_disable();//关闭ISP,IAP功能/**********字节写********/voidbyte_write(unsignedintbyte_addr,unsignedcharoriginal_data){EA=0;//SectorErase(byte_addr);ISP_ADDRH=(unsignedchar)(byte_addr>>8);//取地址ISP_ADDRL=(unsignedchar)(byte_addr&0x00ff);ISP_CMD=ISP_CMD&0xf8;//清低3位ISP_CMD=ISP_CMD|PrgCommand;//写命令2ISP_DATA=original_data;//写入数据准备ISPgoon();//触发执行ISP_IAP_disable();//关闭IAP功能EA=1;}/**********把数据保存到单片机内部eeprom中voidwrite_eeprom()//保存数据SectorErase(0x2000);byte_write(0x2000,bushu);byte_write(0x2001,bushu>>8);byte_write(0x2002,bushu>>16);byte_write(0x2003,zong);byte_write(0x2004,zong>>8);byte_write(0x2005,zong>>16);byte_write(0x2055,a_a);/******************把数据从单片机内部eeprom中读出来voidread_eeprom()//读出保存数据bushu=byte_read(0x2002);bushu<<=8;bushu|=byte_read(0x2001);bushu<<=8;bushu|=byte_read(0x2000);zong=byte_read(0x2005);zong<<=8;zong|=byte_read(0x2004);zong<<=8;zong|=byte_read(0x2003);a_a=byte_read(0x2055);开机自检eeprom初始化voidinit_eeprom()//开始初始化保存的数据read_eeprom();//读出保存数据if(a_a!=14)//新的单片机初始单片机内问eeprom{zong=0;bushu=0;a_a=14;write_eeprom();//保存数据}}voidconversion(uinttemp_data){wan=temp_data/10000+0x30;temp_data=temp_data%10000;//取余运算qian=temp_data/1000+0x30;temp_data=temp_data%1000;//取余运算bai=temp_data/100+0x30;temp_data=temp_data%100;//取余运算shi=temp_data/10+0x30;temp_data=temp_data%10;//取余运算ge=temp_data+0x30;}voiddelay_1ms(uintq){uinti,j;for(i=0;i<q;i++)for(j=0;j<120;j++);}voiddelay_uint(uintq){while(q--);}voidwrite_com(ucharcom){e=0;rs=0;rw=0;P0=com;delay_uint(25);e=1;delay_uint(100);e=0;}voidwrite_data(uchardat){

e=0;rs=1;rw=0;P0=dat;delay_uint(25);e=1;delay_uint(100);e=0;}/***********lcd1602显示}/***********lcd1602显示进制数voidwrite_bushu(ucharhang,ucharadd,longdate){if(hang==1)voidwrite_bushu(ucharhang,ucharadd,longdate){if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);if(date>=1000000)write_data(0x30+date/1000000%10);if(date>=100000)write_data(0x30+date/100000%10);if(date>=10000)write_data(0x30+date/10000%10);if(date>=1000)write_data(0x30+date/1000%10);if(date>=100)write_data(0x30+date/100%10);if(date>=10)write_data(0x30+date/10%10);write_data(0x30+date%10);/*************lcd1602显示这字符函数/*************lcd1602显示这字符函数voidwrite_string(ucharhang,ucharadd,uchar*p){voidwrite_string(ucharhang,ucharadd,uchar*p){if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);while(1){if(*p=='\0')break;write_data(*p);p++;}}*lcd1602初始化设置voidinit_1602()//lcd1602初始化*lcd1602初始化设置voidinit_1602()//lcd1602初始化{write_com(0x38);write_com(0x0c);write_com(0x06);delay_uint(1000);write_string(1,0,"B:0Z:0");write_string(2,0,"S:0C:0");/**********lcd1602显示特定的字符voidwrite_zifu(ucharhang,ucharadd,uchardate){if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);write_data(date);}voidDelay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}voidDelay5ms(){uintn=560;while(n--);}/*********起始信号************/voidADXL345_Start(){SDA=1;//拉高数据线SCL=1;//拉高时钟线Delay5us();//延时SDA=0;//产生下降沿Delay5us();//延时SCL=0;}/******停止信号********/voidADXL345_Stop(){SDA=0;//拉低时钟线//拉低数据线

SCL=1;Delay5us();SDA=1;Delay5us();}/********发送应答信号//拉高时钟线//延时//产生上升沿//延时入口参数:ack(O:ACKi:NAK)**********/{SDA={SDA=ack;SCL=1;Delay5us();SCL=0;Delay5us();}//写应答信号//拉高时钟线//延时//拉低时钟线//延时接收应答信号*/bitADXL345_RecvACK(){SCL=1;//拉高时钟线Delay5us();//延时CY=SDA;//读应答信号SCL=O;//拉低时钟线Delay5us();//延时returnCY;}向IIC总线发送一个字节数据voidADXL345_SendByte(uchardat){//8位计数器//8位计数器//移出数据的最高位//送数据口//拉高时钟线//延时//拉低时钟线//延时for(i=0;i<8;i++){dat<<=1;SDA=CY;SCL=1;Delay5us();SCL=0;Delay5us();}ADXL345_RecvACK();从IIC总线接收一个字节数据*******/ucharADXL345_RecvByte()////使能内部上拉,准备读取数据,//8位计数器uchari;uchardat=0;SDA=1;for(i=0;i<8;i++){dat<<=1;SCL=1;Delay5us();dat|=SDA;SCL=0;Delay5us();}returndat;//拉高时钟线//延时//读数据//拉低时钟线//延时//单字节写入//voidSingle_Write_ADXL345(ucharREG_Address,ucharREG_data){ADXL345_Start();//起始信号ADXL345_SendByte(SlaveAddress);//发送设备地址+写信号ADXL345_SendByte(REG_Address);//内部寄存器地址,参考中文pdf22页ADXL345_SendByte(REG_data);〃内部寄存器数据,参考中文pdf22页ADXL345_Stop();//发送停止信号//单字节读取////单字节读取//ucharSingle_Read_ADXL345(ucharREG_Address){ucharREG_data;ADXL345_Start();ucharSingle_Read_ADXL345(ucharREG_Address){ucharREG_data;ADXL345_Start();ADXL345_SendByte(SlaveAddress);ADXL345_SendByte(REG_Address);ADXL345_Start();ADXL345_SendByte(SlaveAddress+1);REG_data=ADXL345_RecvByte();ADXL345_SendACK(1);ADXL345_Stop();//起始信号//发送设备地址+写信号//发送存储单元地址,从0开始//起始信号//发送设备地址+读信号//读出寄存器数据//停止信号returnREG_data;}//*****连续读出ADXL345内部加速度数据,地址范围0x32~0x37*****//voidMultiple_read_ADXL345(void){uchari;voidMultiple_read_ADXL345(void){uchari;ADXL345_Start();ADXL345_SendByte(SlaveAddress);ADXL345_SendByte(0x32);ADXL345_Start();ADXL345_SendByte(SlaveAddress+1);//起始信号//发送设备地址+写信号//发送存储单元地址,从0x32开始//起始信号//发送设备地址+读信号for(i=0;i<6;i++){BUF[i]for(i=0;i<6;i++){BUF[i]=ADXL345_RecvByte();if(i==5){ADXL345_SendACK(1);}else{ADXL345_SendACK(0);}}ADXL345_Stop();Delay5ms();}//******初始化ADXL345voidInit_ADXL345()//连续读取6个地址数据,存储中BUF//BUF[0]存储0x32地址中的数据//最后一个数据需要回NOACK//回应ACK//停止信号根据需要请参考pdf进行修改***//{Single_Write_ADXL345(0x31,0x0B);〃测量范围,正负16g,13位模式Single_Write_ADXL345(0x2C,0x08);〃速率设定为12.5参考pdf13页Single_Write_ADXL345(0x2D,0x08);〃选择电源模式参考pdf24页Single_Write_ADXL345(0x2E,0x80);//使能DATA_READY中断Single_Write_ADXL345(0x1E,0x00);//X偏移量根据测试传感器的状态写入pdf29页Single_Write_ADXL345(0x1F,0x00);//Y偏移量根据测试传感器的状态写入pdf29页Single_Write_ADXL345(0x20,0x05);//Z偏移量根据测试传感器的状态写入pdf29页voiddisplay_y()//*******显示//*******显示x轴//{staticucharflag_en,flag_fu;floattemp;dis_data=(BUF[3]<<8)+BUF[2];//合成数据if(dis_data<0){dis_data=-dis_data;flag_fu=1;}else{flag_en=1;flag_fu=0;}temp=(float)dis_data*3.9;〃计算数据和显示,查考ADXL345快速入门第4页if(temp>100)//步数加1{

if((flag_en==1)&&(flag_fu==1)){flag_en=0;bushu++;zong++;s=bushu*h;c=bushu*1.5;write_eeprom();//保存数据//显示步数//显示步数//显示总步数write_bushu(1,11,zong);write_bushu(2,2,s);write_bushu(2,11,c);}}if(temp<70){flag_en=1;//******按键控制程序//voidkey(){if(key1==0){delay_1ms(1);if(key1==0){zong=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论