ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:420.29KB ,
资源ID:4180235      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4180235.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(三陀螺仪mpu6050测试程序.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

三陀螺仪mpu6050测试程序.docx

1、三陀螺仪mpu6050测试程序InvenSense公司的三轴陀螺仪MPU6050测试程序。IIC接口,51单片机驱动,LCD1602同步显示。 硬件原理图/*/ MPU6050 IIC测试程序/ 使用单片机STC89C52/ 晶振:11.0592M/ 显示:LCD1602/ 编译环境 Keil uVision2/ 参考宏晶网站24c04通信程序/ 功能: 显示加速度计和陀螺仪的10位原始数据/ 时间:2013年3月1日/*#include #include /Keil library#include /Keil library#include typedef unsigned char uch

2、ar;typedef unsigned short ushort;typedef unsigned int uint;/*/ 定义51单片机端口/*#define DataPort P0 /LCD1602数据端口sbit SCL=P10; /IIC时钟引脚定义sbit SDA=P11; /IIC数据引脚定义sbit LCM_RS=P20; /LCD1602命令端口sbit LCM_RW=P21; /LCD1602命令端口sbit LCM_EN=P22; /LCD1602命令端口/*/ 定义MPU6050内部地址/*#define SMPLRT_DIV 0x19 /陀螺仪采样率,典型值:0x07

3、(125Hz)#define CONFIG 0x1A /低通滤波频率,典型值:0x06(5Hz)#define GYRO_CONFIG 0x1B /陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)#define ACCEL_CONFIG 0x1C /加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)#define ACCEL_XOUT_H 0x3B#define ACCEL_XOUT_L 0x3C#define ACCEL_YOUT_H 0x3D#define ACCEL_YOUT_L 0x3E#define ACCEL_ZOUT_H 0x3F#d

4、efine ACCEL_ZOUT_L 0x40#define TEMP_OUT_H 0x41#define TEMP_OUT_L 0x42#define GYRO_XOUT_H 0x43#define GYRO_XOUT_L 0x44#define GYRO_YOUT_H 0x45#define GYRO_YOUT_L 0x46#define GYRO_ZOUT_H 0x47#define GYRO_ZOUT_L 0x48#define PWR_MGMT_1 0x6B /电源管理,典型值:0x00(正常启用)#define WHO_AM_I 0x75 /IIC地址寄存器(默认数值0x68,只读

5、)#define SlaveAddress 0xD0 /IIC写入时的地址字节数据,+1为读取/*/定义类型及变量/*uchar dis4; /显示数字(-511至512)的字符数组int dis_data; /变量/int Temperature,Temp_h,Temp_l; /温度及高低位数据/*/函数声明/*void delay(unsigned int k); /延时/LCD相关函数void InitLcd(); /初始化lcd1602void lcd_printf(uchar *s,int temp_data);void WriteDataLCM(uchar dataW); /LCD

6、数据void WriteCommandLCM(uchar CMD,uchar Attribc); /LCD指令void DisplayOneChar(uchar X,uchar Y,uchar DData); /显示一个字符void DisplayListChar(uchar X,uchar Y,uchar *DData,L); /显示字符串/MPU6050操作函数void InitMPU6050(); /初始化MPU6050void Delay5us();void I2C_Start();void I2C_Stop();void I2C_SendACK(bit ack);bit I2C_Re

7、cvACK();void I2C_SendByte(uchar dat);uchar I2C_RecvByte();void I2C_ReadPage();void I2C_WritePage();void display_ACCEL_x();void display_ACCEL_y();void display_ACCEL_z();uchar Single_ReadI2C(uchar REG_Address); /读取I2C数据void Single_WriteI2C(uchar REG_Address,uchar REG_data); /向I2C写入数据/*/整数转字符串/*void lc

8、d_printf(uchar *s,int temp_data) if(temp_data0) temp_data=-temp_data; *s=-; else *s= ; *+s =temp_data/100+0x30; temp_data=temp_data%100; /取余运算 *+s =temp_data/10+0x30; temp_data=temp_data%10; /取余运算 *+s =temp_data+0x30;/*/延时/*void delay(unsigned int k) unsigned int i,j; for(i=0;ik;i+) for(j=0;j121;j+)

9、; /*/LCD1602初始化/*void InitLcd() WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); DisplayOneChar(0,0,A); DisplayOneChar(0,1,G);/*/LCD1602写允许/*void WaitForEnable(void) DataPort=0xff; LCM_RS=0;LCM_RW=1;_nop_(); LCM_EN=1;_nop_()

10、;_nop_(); while(DataPort&0x80); LCM_EN=0;/*/LCD1602写入命令/*void WriteCommandLCM(uchar CMD,uchar Attribc) if(Attribc)WaitForEnable(); LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0;/*/LCD1602写入数据/*void WriteDataLCM(uchar dataW) WaitForEnable(); LCM_RS=1;LCM_RW=0;_nop

11、_(); DataPort=dataW;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0;/*/LCD1602写入一个字符/*void DisplayOneChar(uchar X,uchar Y,uchar DData) Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; WriteCommandLCM(X,0); WriteDataLCM(DData);/*/LCD1602显示字符串/*void DisplayListChar(uchar X,uchar Y,uchar *DData,L) uchar ListLength=0; Y&

12、=0x1; X&=0xF; while(L-) DisplayOneChar(X,Y,DDataListLength); ListLength+; X+; /*/延时5微秒(STC90C52RC12M)/不同的工作环境,需要调整此函数/当改用1T的MCU时,请调整此延时函数/*void Delay5us() _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_

13、();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();/*/I2C起始信号/*void I2C_Start() SDA = 1; /拉高数据线 SCL = 1; /拉高时钟线 Delay5us(); /延时 SDA = 0; /产生下降沿 Delay5us(); /延时 SCL = 0; /拉低时钟线/*/I2C停止信号/*void I2C_Stop() SDA = 0; /拉低数据线 SCL = 1; /拉高时钟线 Delay5us(); /延时 SDA = 1; /产生上升沿 Delay5us(); /延时/*/I2C发送应答信号/入口参数

14、:ack (0:ACK 1:NAK)/*void I2C_SendACK(bit ack) SDA = ack; /写应答信号 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时/*/I2C接收应答信号/*bit I2C_RecvACK() SCL = 1; /拉高时钟线 Delay5us(); /延时 CY = SDA; /读应答信号 SCL = 0; /拉低时钟线 Delay5us(); /延时 return CY;/*/向I2C总线发送一个字节数据/*void I2C_SendByte(uchar dat) uc

15、har i; for (i=0; i8; i+) /8位计数器 dat = 1; /移出数据的最高位 SDA = CY; /送数据口 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时 I2C_RecvACK();/*/从I2C总线接收一个字节数据/*uchar I2C_RecvByte() uchar i; uchar dat = 0; SDA = 1; /使能内部上拉,准备读取数据, for (i=0; i8; i+) /8位计数器 dat = 1; SCL = 1; /拉高时钟线 Delay5us(); /延时

16、dat |= SDA; /读数据 SCL = 0; /拉低时钟线 Delay5us(); /延时 return dat;/*/向I2C设备写入一个字节数据/*void Single_WriteI2C(uchar REG_Address,uchar REG_data) I2C_Start(); /起始信号 I2C_SendByte(SlaveAddress); /发送设备地址+写信号 I2C_SendByte(REG_Address); /内部寄存器地址, I2C_SendByte(REG_data); /内部寄存器数据, I2C_Stop(); /发送停止信号/*/从I2C设备读取一个字节数据

17、/*uchar Single_ReadI2C(uchar REG_Address) uchar REG_data; I2C_Start(); /起始信号 I2C_SendByte(SlaveAddress); /发送设备地址+写信号 I2C_SendByte(REG_Address); /发送存储单元地址,从0开始 I2C_Start(); /起始信号 I2C_SendByte(SlaveAddress+1); /发送设备地址+读信号 REG_data=I2C_RecvByte(); /读出寄存器数据 I2C_SendACK(1); /接收应答信号 I2C_Stop(); /停止信号 retu

18、rn REG_data;/*/初始化MPU6050/*void InitMPU6050() Single_WriteI2C(PWR_MGMT_1, 0x00); /解除休眠状态 Single_WriteI2C(SMPLRT_DIV, 0x07); Single_WriteI2C(CONFIG, 0x06); Single_WriteI2C(GYRO_CONFIG, 0x18); Single_WriteI2C(ACCEL_CONFIG, 0x01);/*/合成数据/*int GetData(uchar REG_Address) char H,L; H=Single_ReadI2C(REG_Ad

19、dress); L=Single_ReadI2C(REG_Address+1); return (H8)+L; /合成数据/*/在1602上显示10位数据/*void Display10BitData(int value,uchar x,uchar y) value/=64; /转换为10位数据 lcd_printf(dis, value); /转换数据显示 DisplayListChar(x,y,dis,4); /启始列,行,显示数组,显示长度/*/显示温度/*/void display_temp()/ Temp_h=Single_ReadI2C(TEMP_OUT_H); /读取温度/ Te

20、mp_l=Single_ReadI2C(TEMP_OUT_L); /读取温度/ Temperature=Temp_h8|Temp_l; /合成温度/ Temperature = 35+ (double) (Temperature + 13200) / 280; / 计算出温度/ lcd_printf(dis,Temperature); /转换数据显示/ DisplayListChar(11,1,dis,4); /启始列,行,显示数组,显示位数/*/主程序/*void main() delay(500); /上电延时 InitLcd(); /液晶初始化 InitMPU6050(); /初始化MP

21、U6050 delay(150); while(1) Display10BitData(GetData(ACCEL_XOUT_H),2,0); /显示X轴加速度 Display10BitData(GetData(ACCEL_YOUT_H),7,0); /显示Y轴加速度 Display10BitData(GetData(ACCEL_ZOUT_H),12,0); /显示Z轴加速度 Display10BitData(GetData(GYRO_XOUT_H),2,1); /显示X轴角速度 Display10BitData(GetData(GYRO_YOUT_H),7,1); /显示Y轴角速度 Display10BitData(GetData(GYRO_ZOUT_H),12,1); /显示Z轴角速度 delay(500);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1