ADXL345模块是数字三轴、加速度传感器,有SPI、I2C两种方式。支持5v、3.3v供电。使用时CS端拉高(即接电源)。这个模块有点小贵要23块。提供的是51的代码(淘宝上买的基本上都是提供51的代码,要想在430上用还要自己从新移植过)。
ADXL345最主要的是初始化,只要初始化好了,后面就只要取取值就行了。
初始化步骤:
1 void Init_ADXL345(void) 2 { 3 Single_Write_ADXL345(0x31,0x0B); //测量范围,正负16g,13位模式 4 Single_Write_ADXL345(0x2C,0x08); //速率设定为12.5 参考pdf13页 5 Single_Write_ADXL345(0x2D,0x08); //选择电源模式 参考pdf24页 6 Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中断 7 Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入pdf29页 8 Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入pdf29页 9 Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入pdf29页 10 }
下面是通用的I2C代码,留着以后用
1 /************************************** 2 起始信号 3 **************************************/ 4 void ADXL345_Start(void) 5 { 6 SDA_1; //拉高数据线 7 SCL_1; //拉高时钟线 8 Delay5us(); //延时 9 SDA_0; //产生下降沿 10 Delay5us(); //延时 11 SCL_0; //拉低时钟线 12 } 13 14 /************************************** 15 停止信号 16 **************************************/ 17 void ADXL345_Stop(void) 18 { 19 SDA_0; //拉低数据线 20 SCL_1; //拉高时钟线 21 Delay5us(); //延时 22 SDA_1; //产生上升沿 23 Delay5us(); //延时 24 } 25 26 /************************************** 27 发送应答信号 28 入口参数:ack (0:ACK 1:NAK) 29 **************************************/ 30 void ADXL345_SendACK(BYTE ack) 31 { 32 //SDA = ack; //写应答信号 33 if(ack) 34 SDA_1; 35 else 36 SDA_0; 37 SCL_1; //拉高时钟线 38 Delay5us(); //延时 39 SCL_0; //拉低时钟线 40 Delay5us(); //延时 41 } 42 43 /************************************** 44 接收应答信号 45 **************************************/ 46 BYTE ADXL345_RecvACK(void) 47 { 48 unsigned char i; 49 SDA_IN; 50 SCL_1; //拉高时钟线 51 Delay5us(); //延时 52 i = SDA; //读应答信号 53 SCL_0; //拉低时钟线 54 Delay5us(); //延时 55 SDA_OUT; 56 return i; 57 } 58 59 /************************************** 60 向IIC总线发送一个字节数据 61 **************************************/ 62 void ADXL345_SendByte(BYTE dat) 63 { 64 BYTE i; 65 for (i=0; i<8; i++) //8位计数器 66 { 67 68 if(dat&0x80) 69 SDA_1; //送数据口 70 else 71 SDA_0; 72 dat <<= 1; //移出数据的最高位 73 SCL_1; //拉高时钟线 74 Delay5us(); //延时 75 SCL_0; //拉低时钟线 76 Delay5us(); //延时 77 } 78 ADXL345_RecvACK(); 79 } 80 81 /************************************** 82 从IIC总线接收一个字节数据 83 **************************************/ 84 BYTE ADXL345_RecvByte(void) 85 { 86 BYTE i; 87 BYTE dat = 0; 88 89 SDA_1; //使能内部上拉,准备读取数据, 90 SDA_IN; 91 for (i=0; i<8; i++) //8位计数器 92 { 93 dat <<= 1; 94 SCL_1; //拉高时钟线 95 Delay5us(); //延时 96 dat |= SDA; //读数据 97 SCL_0; //拉低时钟线 98 Delay5us(); //延时 99 } 100 SDA_OUT; 101 return dat; 102 }