基于STC12C5A60S2的ADXL345程序.doc
《基于STC12C5A60S2的ADXL345程序.doc》由会员分享,可在线阅读,更多相关《基于STC12C5A60S2的ADXL345程序.doc(17页珍藏版)》请在三一办公上搜索。
1、基于STC12C5A60S2的ADXL345Z程序(12T单片机未测试)头文件I2C.h#ifndef _I2C_H_#define _I2C_H_#include /-重定义关键词-/#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endif/-定义使用的IO口-/sbit I2C_SCL = P02;sbit I2C_SDA = P01;/-声明全局变量-/void I2C_Delay10us();void I2C_Start();void I2C_Stop();uch
2、ar I2C_SendByte(uchar dat, uchar ack);/ uchar I2C_ReadByte();uchar I2C_ReadByte(uchar ack);void I2C_Ack(void);void I2C_NAck(void);#endif源文件I2C.c#include i2c.hvoid I2C_Delay10us()/12.000MHzunsigned char i;i = 12;while (-i);void I2C_Start()I2C_SDA = 1;I2C_Delay10us();I2C_SCL = 1;I2C_Delay10us();/建立时间是
3、I2C_SDA保持时间4.7usI2C_SDA = 0;I2C_Delay10us();/保持时间是4usI2C_SCL = 0;I2C_Delay10us();void I2C_Stop()I2C_SDA = 0;I2C_Delay10us();I2C_SCL = 1;I2C_Delay10us();/建立时间大于4.7usI2C_SDA = 1;I2C_Delay10us();uchar I2C_SendByte(uchar dat, uchar ack)uchar a = 0,b = 0;/最大255,一个机器周期为1us,最大延时255us。for(a=0; a 7; /起始信号之后I
4、2C_SCL=0,所以可以直接改变I2C_SDA信号dat = dat 4.7usI2C_SCL = 0;I2C_Delay10us();/时间大于4usI2C_SDA = 1;I2C_Delay10us();I2C_SCL = 1;while(I2C_SDA & (ack = 1)/等待应答,也就是等待从设备把I2C_SDA拉低b+;if(b 200) /如果超过200us没有应答发送失败,或者为非应答,表示接收结束I2C_SCL = 0;I2C_Delay10us();return 0;I2C_SCL = 0;I2C_Delay10us(); return 1;uchar I2C_Read
5、Byte(unsigned char ack)uchar a = 0,dat = 0;I2C_SDA = 1;/起始和发送一个字节之后I2C_SCL都是0I2C_Delay10us();for(a=0; a8; a+)/接收8个字节I2C_SCL = 1;I2C_Delay10us();dat = 1;dat |= I2C_SDA;I2C_Delay10us();I2C_SCL = 0;I2C_Delay10us();if(!ack)I2C_NAck();elseI2C_Ack();return dat;void I2C_Ack(void)I2C_SCL=0;I2C_SDA=0;I2C_Del
6、ay10us();I2C_SCL=1;I2C_Delay10us();I2C_SCL=0;/不产生ACK应答 void I2C_NAck(void)I2C_SCL=0;I2C_SDA=1;I2C_Delay10us();I2C_SCL=1;I2C_Delay10us();I2C_SCL=0;头文件ADXL345Z.h#ifndef _ADXL345Z_H#define _ADXL345Z_H#include #include i2c.h#ifndef u8#define u8 unsigned char#endif#ifndef u16 #define u16 unsigned int#end
7、if#define DEVICE_ID0X00 /器件ID,0XE5#define THRESH_TAP0X1D /敲击阀值#define OFSX0X1E#define OFSY0X1F#define OFSZ0X20#define DUR0X21#define Latent0X22#define Window 0X23 #define THRESH_ACK0X24#define THRESH_INACT0X25 #define TIME_INACT0X26#define ACT_INACT_CTL0X27 #define THRESH_FF0X28#define TIME_FF0X29 #
8、define TAP_AXES0X2A #define ACT_TAP_STATUS 0X2B #define BW_RATE0X2C #define POWER_CTL0X2D #define INT_ENABLE0X2E#define INT_MAP0X2F#define INT_SOURCE 0X30#define DATA_FORMAT 0X31#define DATA_X00X32#define DATA_X10X33#define DATA_Y00X34#define DATA_Y10X35#define DATA_Z00X36#define DATA_Z10X37#define
9、FIFO_CTL0X38#define FIFO_STATUS0X39/用户配置,跟硬件电路有关,VDD-IO接高电平则为此地址,接地请查看数据手册#define ADXL_READ 0X3B#define ADXL_WRITE 0X3Au8 ADXL345_Init(void); /初始化ADXL345void ADXL345_WR_Reg(u8 addr,u8 val);/写ADXL345寄存器u8 ADXL345_RD_Reg(u8 addr);/读ADXL345寄存器void ADXL345_RD_XYZ(short *x,short *y,short *z);/读取一次值void A
10、DXL345_RD_Avval(short *x,short *y,short *z);/读取平均值void ADXL345_AUTO_Adjust(char *xval,char *yval,char *zval);/自动校准void ADXL345_Read_Average(short *x,short *y,short *z,u8 times);/连续读取times次,取平均short ADXL345_Get_Angle(float x,float y,float z,u8 dir);void Adxl_Show_Num(u16 x,u16 y,short num,u8 mode);#e
11、ndif源文件ADXL345Z.c#include ADXL345Z.h#include OLED.h#include u8 ADXL345_Init(void) u8 temp=ADXL345_RD_Reg(DEVICE_ID);if(temp=0xe5)/读取器件ID ADXL345_WR_Reg(DATA_FORMAT,0X2B);/低电平中断输出,13位全分辨率,输出数据右对齐,16g量程 ADXL345_WR_Reg(BW_RATE,0x0A);/数据输出速度为100HzADXL345_WR_Reg(POWER_CTL,0x28); /链接使能,测量模式ADXL345_WR_Reg(
12、INT_ENABLE,0x00);/不使用中断 ADXL345_WR_Reg(OFSX,0x00);ADXL345_WR_Reg(OFSY,0x00);ADXL345_WR_Reg(OFSZ,0x00);return 0;else return 1;void ADXL345_WR_Reg(u8 addr,u8 val)I2C_Start();I2C_SendByte(ADXL_WRITE,1);/发送写器件指令,等待应答I2C_SendByte(addr,1);/发送寄存器地址I2C_SendByte(val,1);/发送要写入的值I2C_Stop();u8 ADXL345_RD_Reg(u8
13、 addr)u8 temp;I2C_Start(); I2C_SendByte(ADXL_WRITE,1);/发送写器件指令,等待应答I2C_SendByte(addr,1);/发送寄存器地址I2C_Start();/重新开始起始信号,无需发送结束信号I2C_SendByte(ADXL_READ,1);/发送写器件指令,等待应答temp=I2C_ReadByte(0);/读取寄存器内容I2C_Stop();return temp;/读取3个轴的数据/x,y,z:读取到的数据void ADXL345_RD_XYZ(short *x,short *y,short *z)u8 buf6;u8 i;I
14、2C_Start(); I2C_SendByte(ADXL_WRITE,1);/发送写器件指令I2C_SendByte(DATA_X0,1); I2C_Start(); /重新启动I2C_SendByte(ADXL_READ,1);/发送读器件指令for(i=0;i6;i+) if(i=5) bufi=I2C_ReadByte(0);/读取一个字节,不继续再读,发送NACK else bufi=I2C_ReadByte(1); I2C_Stop();/产生一个停止条件*x=(short)(u16)buf18)+buf0); *y=(short)(u16)buf38)+buf2); *z=(sh
15、ort)(u16)buf58)+buf4); void ADXL345_Read_Average(short *x,short *y,short *z,u8 times)u8 i;short tx,ty,tz;*x=0;*y=0;*z=0;if(times)/读取次数不为0for(i=0;itimes;i+)/连续读取times次ADXL345_RD_XYZ(&tx,&ty,&tz);*x+=tx;*y+=ty;*z+=tz;delay_ms(1);*x/=times;*y/=times;*z/=times;/得到角度/x,y,z:x,y,z方向的重力加速度分量(不需要单位,直接数值即可)/d
16、ir:要获得的角度.0,与Z轴的角度;1,与X轴的角度;2,与Y轴的角度./返回值:角度值.单位0.1.short ADXL345_Get_Angle(float x,float y,float z,u8 dir)float temp; float res=0;switch(dir)case 0:/与自然Z轴的角度 temp=sqrt(x*x+y*y)/z; res=atan(temp); break;case 1:/与自然X轴的角度 temp=x/sqrt(y*y+z*z); res=atan(temp); break; case 2:/与自然Y轴的角度 temp=y/sqrt(x*x+z*
17、z); res=atan(temp); break; return res*1800/3.14;/读取ADXL的平均值/x,y,z:读取10次后取平均值void ADXL345_RD_Avval(short *x,short *y,short *z)short tx=0,ty=0,tz=0; u8 i; for(i=0;i10;i+)ADXL345_RD_XYZ(x,y,z);delay_ms(10);tx+=(short)*x;ty+=(short)*y;tz+=(short)*z; *x=tx/10;*y=ty/10;*z=tz/10; /自动校准/xval,yval,zval:x,y,z
18、轴的校准值void ADXL345_AUTO_Adjust(char *xval,char *yval,char *zval)short tx,ty,tz;u8 i;short offx=0,offy=0,offz=0;ADXL345_WR_Reg(POWER_CTL,0x00); /先进入休眠模式.delay_ms(100);ADXL345_WR_Reg(DATA_FORMAT,0X2B);/低电平中断输出,13位全分辨率,输出数据右对齐,16g量程 ADXL345_WR_Reg(BW_RATE,0x0A);/数据输出速度为100HzADXL345_WR_Reg(POWER_CTL,0x28
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC12C5A60S2 ADXL345 程序
链接地址:https://www.31ppt.com/p-2385876.html