基于STC12C5A60S2的ADXL345Z程序(12T单片机未测试)头文件I2C.h#ifndef__I2C_H_#define__I2C_H_#include//---重定义关键词---//#ifndefuchar#defineucharunsignedchar#endif#ifndefuint#defineuintunsignedint#endif//--定义使用的IO口--//sbitI2C_SCL=P0^2;sbitI2C_SDA=P0^1;//--声明全局变量--//voidI2C_Delay10us();voidI2C_Start();voidI2C_Stop();ucharI2C_SendByte(uchardat,ucharack);//ucharI2C_ReadByte();ucharI2C_ReadByte(ucharack);voidI2C_Ack(void);voidI2C_NAck(void);#endif源文件I2C.c#include"i2c.h"voidI2C_Delay10us()//@12.000MHz{unsignedchari;i=12;while(--i);}voidI2C_Start(){I2C_SDA=1;I2C_Delay10us();I2C_SCL=1;I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7usI2C_SDA=0;I2C_Delay10us();//保持时间是>4usI2C_SCL=0;I2C_Delay10us();}voidI2C_Stop(){I2C_SDA=0;I2C_Delay10us();I2C_SCL=1;I2C_Delay10us();//建立时间大于4.7usI2C_SDA=1;I2C_Delay10us();}ucharI2C_SendByte(uchardat,ucharack){uchara=0,b=0;//最大255,一个机器周期为1us,最大延时255us。for(a=0;a<8;a++)//要发送8位,从最高位开始{I2C_SDA=dat>>7;//起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号dat=dat<<1;I2C_Delay10us();I2C_SCL=1;I2C_Delay10us();//建立时间>4.7usI2C_SCL=0;I2C_Delay10us();//时间大于4us}I2C_SDA=1;I2C_Delay10us();I2C_SCL=1;while(I2C_SDA&&(ack==1))//等待应答,也就是等待从设备把I2C_SDA拉低{b++;if(b>200)//如果超过200us没有应答发送失败,或者为非应答,表示接收结束{I2C_SCL=0;I2C_Delay10us();return0;}}I2C_SCL=0;I2C_Delay10us();return1;}ucharI2C_ReadByte(unsignedcharack){uchara=0,dat=0;I2C_SDA=1;//起始和发送一个字节之后I2C_SCL都是0I2C_Delay10us();for(a=0;a<8;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();returndat;}voidI2C_Ack(void){I2C_SCL=0;I2C_SDA=0;I2C_Delay10us();I2C_SCL=1;I2C_Delay10us();I2C_SCL=0;}//不产生ACK应答voidI2C_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"#ifndefu8#defineu8unsignedchar#endif#ifndefu16#defineu16unsignedint#endif#defineDEVICE_ID0X00//器件ID,0XE5#defineTHRESH_TAP0X1D//敲击阀值#defineOFSX0X1E#defineOFSY0X1F#defineOFSZ0X20#defineDUR0X21#defineLatent0X22#defineWindow0X23#defineTHRESH_ACK0X24#defineTHRESH_INACT0X25#defineTIME_INACT0X26#defineACT_INACT_CTL0X27#defineTHRESH_FF0X28#defineTIME_FF0X29#defineTAP_AXES0X2A#defineACT_TAP_STATUS0X2B#defineBW_RATE0X2C#definePOWER_CTL0X2D#defineINT_ENABLE0X2E#defineINT_MAP0X2F#defineINT_SOURCE0X30#defineDATA_FORMAT0X31#defineDATA_X00X32#defineDATA_X10X33#defineDATA_Y00X34#defineDATA_Y10X35#defineDATA_Z00X36#defineDATA_Z10X37#defineFIFO_CTL0X38#defineFIFO_STATUS0X39//用户配置,跟硬件电路有关,VDD-IO接高电平则为此地址,接地请查看数据手册#defineADXL_READ0X3B#defineADXL_WRITE0X3Au8ADXL345_Init(void);//初始化ADXL345voidADXL345_WR_Reg(u8addr,u8val);//写ADXL345寄存器u8ADXL345_RD_Reg(u8addr);//读ADXL345寄存器voidADXL345_RD_XYZ(short*x,short*y,short*z);//读取一次值voidADXL345_RD_Avval(short*x,short*y,short*z);//读取平均值voidADXL345_AUTO_Adjust(char*xval,char*yval,char*zval);//自动校准voidADXL345_Read_Average(short*x,short*y,short*z,u8times);//连续读取times次,取平均shortADXL345_Get_Angle(floatx,floaty,floatz,u8dir);voidAdxl_Show_Num(u16x,u16y,shortnum,u8mode);#endif源文件ADXL345Z.c#include"ADXL345Z.h"#include"OLED.h"#includeu8ADXL345_Init(void...