完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
***it SCL=P1^0; //IIC时钟引脚定义 ***it SDA=P1^1; //IIC数据引脚定义 //******************宏定义***************** #define uchar unsigned char #define uint unsigned int //**********L3G4200D内部寄存器地址********* #define WHO_AM_I 0x0F #define CTRL_REG1 0x20 #define CTRL_REG2 0x21 #define CTRL_REG3 0x22 #define CTRL_REG4 0x23 #define CTRL_REG5 0x24 #define REFERENCE 0x25 #define OUT_TEMP 0x26 #define STATUS_REG 0x27 #define OUT_X_L 0x28 #define OUT_X_H 0x29 #define OUT_Y_L 0x2A #define OUT_Y_H 0x2B #define OUT_Z_L 0x2C #define OUT_Z_H 0x2D #define FIFO_CTRL_REG 0x2E #define FIFO_SRC_REG 0x2F #define INT1_CFG 0x30 #define INT1_SRC 0x31 #define INT1_TSH_XH 0x32 #define INT1_TSH_XL 0x33 #define INT1_TSH_YH 0x34 #define INT1_TSH_YL 0x35 #define INT1_TSH_ZH 0x36 #define INT1_TSH_ZL 0x37 #define INT1_DURAtiON 0x38 //**************************************** #define SlaveAddress 0xD2 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 //****************变量定义**************** typedef unsigned char BYTE; typedef unsigned short WORD; BYTE BUF[8]; //接收数据缓存区 int dis_data,d_x,d_y,d_z; //变量 float temp; /************************************** 延时函数 **************************************/ void delay(unsigned int k) { unsigned int i,j; for(i=0;i for(j=0;j<121;j++); } } //延时5微秒(STC90C52RC@12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数。 void Delay5us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } /************************************** 起始信号 **************************************/ void L3G4200D_Start() { SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 0; //产生下降沿 Delay5us(); //延时 SCL = 0; //拉低时钟线 } /************************************** 停止信号 **************************************/ void L3G4200D_Stop() { SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 1; //产生上升沿 Delay5us(); //延时 } /************************************** 发送应答信号 入口参数:ack (0:ACK 1:NAK) **************************************/ void L3G4200D_SendACK(bit ack) { SDA = ack; //写应答信号 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } /************************************** 接收应答信号 **************************************/ bit L3G4200D_RecvACK() { SCL = 1; //拉高时钟线 Delay5us(); //延时 CY = SDA; //读应答信号 SCL = 0; //拉低时钟线 Delay5us(); //延时 return CY; } /************************************** 向IIC总线发送一个字节数据 **************************************/ void L3G4200D_SendByte(BYTE dat) { BYTE i; for (i=0; i<8; i++) //8位计数器 { dat <<= 1; //移出数据的最高位 SDA = CY; //送数据口 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } L3G4200D_RecvACK(); } /************************************** 从IIC总线接收一个字节数据 **************************************/ BYTE L3G4200D_RecvByte() { BYTE i; BYTE dat = 0; SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器 { dat <<= 1; SCL = 1; //拉高时钟线 Delay5us(); //延时 dat |= SDA; //读数据 SCL = 0; //拉低时钟线 Delay5us(); //延时 } return dat; } //单字节写入******************************************* void Single_WriteL3G4200D(uchar REG_Address,uchar REG_data) { L3G4200D_Start(); //起始信号 L3G4200D_SendByte(SlaveAddress); //发送设备地址+写信号 L3G4200D_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页 L3G4200D_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页 L3G4200D_Stop(); //发送停止信号 } //单字节读取***************************************** uchar Single_ReadL3G4200D(uchar REG_Address) { uchar REG_data; L3G4200D_Start(); //起始信号 L3G4200D_SendByte(SlaveAddress); //发送设备地址+写信号 L3G4200D_SendByte(REG_Address); //发送存储单元地址,从0开始 L3G4200D_Start(); //起始信号 L3G4200D_SendByte(SlaveAddress+1); //发送设备地址+读信号 REG_data=L3G4200D_RecvByte(); //读出寄存器数据 L3G4200D_SendACK(1); L3G4200D_Stop(); //停止信号 return REG_data; } //初始化L3G4200D,根据需要请参考pdf进行修改************************ void InitL3G4200D() { Single_WriteL3G4200D(CTRL_REG1, 0x0f); // Single_WriteL3G4200D(CTRL_REG2, 0x00); // Single_WriteL3G4200D(CTRL_REG3, 0x08); // Single_WriteL3G4200D(CTRL_REG4, 0x30); //+-2000dps Single_WriteL3G4200D(CTRL_REG5, 0x00); } //x轴数据 void data_x() { BUF[0]= Single_ReadL3G4200D(OUT_X_L); BUF[1]= Single_ReadL3G4200D(OUT_X_H); //读取X轴数据 dis_data=(BUF[1]<<8)+BUF[0]; //合成数据 temp=(float)dis_data*0.07; // 数据手册 第9页,2000度/秒量程 d_x=(int)temp; } //y轴数据 void data_y() { BUF[2]= Single_ReadL3G4200D(OUT_Y_L); BUF[3]= Single_ReadL3G4200D(OUT_Y_H);//读取Y轴数据 dis_data=(BUF[3]<<8)+BUF[2]; //合成数据 temp=(float)dis_data*0.07; // 数据手册 第9页,2000度/秒量程 d_y=(int)temp; //if(d_y>50)led2=1;else led2=0; } //z轴数据 void data_z() { BUF[4]= Single_ReadL3G4200D(OUT_Z_L); BUF[5]= Single_ReadL3G4200D(OUT_Z_H);//读取Z轴数据 dis_data=(BUF[5]<<8)+BUF[4]; //合成数据 temp=(float)dis_data*0.07; // 数据手册 第9页,2000度/秒量程 d_z=(int)temp; //if(d_z>50)led3=1;else led3=0; } 求大神:这样获得的d_x,d_y,d_z是不是角速度呢?怎么才能转换成角度呢? |
|
相关推荐
2个回答
|
|
参考下我们战舰V2的ADXL345的历程
|
|
|
|
哈哈哈哈哈炒冷饭,好像确实是有点问题哎
|
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3457 浏览 1 评论
8995 浏览 16 评论
4050 浏览 18 评论
1103浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 19:46 , Processed in 1.299249 second(s), Total 82, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号