shouchengcheng
just do it

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 }

 



 

posted on 2013-12-25 23:43  shouchengcheng  阅读(1003)  评论(0编辑  收藏  举报