基于msp430的mpu6050陀螺仪程序.docx

上传人:scccc 文档编号:13353030 上传时间:2021-12-23 格式:DOCX 页数:13 大小:31.57KB
返回 下载 相关 举报
基于msp430的mpu6050陀螺仪程序.docx_第1页
第1页 / 共13页
基于msp430的mpu6050陀螺仪程序.docx_第2页
第2页 / 共13页
基于msp430的mpu6050陀螺仪程序.docx_第3页
第3页 / 共13页
基于msp430的mpu6050陀螺仪程序.docx_第4页
第4页 / 共13页
基于msp430的mpu6050陀螺仪程序.docx_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《基于msp430的mpu6050陀螺仪程序.docx》由会员分享,可在线阅读,更多相关《基于msp430的mpu6050陀螺仪程序.docx(13页珍藏版)》请在三一文库上搜索。

1、/includes.h #include <msp430x14x.h>#include "LCD1602.h"#include "mpu6050.h"/main.c#include "includes.h"void main()WDTCTL = WDTPW + WDTHOLD;BCSCTL1 &=XT2OFF;doIFG1 &=OFIFG;for(uint i=0xff;i>0;i -);while(IFG1&OFIFG);/ 等待时钟稳定BCSCTL2 |=SELM_2+SELS;/主、从系

2、统时钟均为高频DATA_DIR=0XFF;DATA_OUT=0X00;P6DIR=0XFF;P6OUT=0X00;init();InitMPU6050();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);/ 显示

3、 X 轴角速度Display10BitData(GetData(GYRO_YOUT_H),7,1);/ 显示 Y 轴角速度Display10BitData(GetData(GYRO_ZOUT_H),12,1);delayms(300);/ 以下是传感器相关文件/mpu6050.h#define CPU_F (double)8000000)#define delayus(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)/ 宏定义延时函数#define delayms(x) _delay_cycles(long)(CPU_F*(double)x/1

4、000.0)#define SCL1 P5OUT |=BIT0 #define SCL0 P5OUT &=BIT0 #define SCLOUT P5DIR |= BIT0;/IIC 数据引脚#define SDA1 P5OUT |=BIT1 #define SDA0 P5OUT &=BIT1 #define SDAIN P5DIR &=BIT1 #define SDAOUT P5DIR |=BIT1 #define SDADATA (P5IN & BIT1)/* / 定义 MPU6050 内部地址/*#defineSMPLRTDIV0x19 / 陀螺仪采样率,

5、典型值:0x07(125Hz)#defineCONFIG0x1A / 低通滤波频率,典型值:0x06(5Hz)#defineGYROCONFIG0x1B / 陀螺仪自检及测量范围,典型值:典型值:0x18(不自检,2000deg/s)#define#defineACCELXOUTH0x3B#defineACCELXOUTL0x3C#defineACCELYOUTH0x3D#defineACCELYOUTL0x3E#defineACCELZOUTH0x3F#defineACCELZOUTL0x40#defineTEMPOUTH0x41#defineTEMPOUTL0x42#defineGYROX

6、OUTH0x43#defineGYROXOUTL0x44#defineGYROYOUTH0x45#defineGYROYOUTL0x46#defineGYROZOUTH0x47#defineGYROZOUTL0x48#definePWRMGMT10x6B / 电源管理,典型值:0x00(正常启用)#defineWHOAMI0x75 /IIC 地址寄存器(默认数值0x68,只读)#defineSlaveAddress0xD0 /IIC 写入时的地址字节数据,+1 为读取ACCEL_CONFIG0x1C 加速计自检、测量范围及高通滤波频率, 典型彳1: 0x01(不自检,2G, 5Hz)/ 显示数

7、字(-511 至 512)的字符数组void I2C_Start();void I2C_Stop();void I2C_SendACK(uchar ack);uchar I2C_RecvACK();void I2C_SendByte(uchar dat);uchar I2C_RecvByte();void Single_WriteI2C(uchar REG_Address,uchar REG_data);uchar Single_ReadI2C(uchar REG_Address);void InitMPU6050();void lcd_printf(uchar *s,int temp_dat

8、a);void DisplayListChar(uchar X,uchar Y,uchar *DData,uchar L);int GetData(uchar REG_Address);void Display10BitData(int value,uchar x,uchar y);/mpu6050.c#include "includes.h"uchar dis4;int dis_data;/*/I2C 起始信号/*void I2C_Start()SDAOUT;SDA1;/ 拉高数据线SCLOUT;SCL1;/ 拉高时钟线delayus(5);/ 延时SDA0;/ 产生下降

9、沿delayus(5);/延时SCL0;/*/I2C 停止信号/*void I2C_Stop()/ 拉低时钟线SDAOUT;SDA0;/ 拉低数据线SCLOUT;SCL1;/ 拉高时钟线delayus(5);/ 延时SDA1;/ 产生上升沿delayus(5);/ 延时/* /I2C 发送应答信号/入口参数:ack (0:ACK 1:NAK)/* void I2C_SendACK(uchar ack)SDAOUT;SCLOUT;if(ack) SDA1;else SDA0;/ SDA = ack;SCL1;delayus(5);SCL0;delayus(5);/ 写应答信号/ 拉高时钟线/ 延

10、时/ 拉低时钟线/延时/*/I2C 接收应答信号/*uchar I2C_RecvACK() uchar cy;SCLOUT;SCL1;/ 拉高时钟线SDAIN;delayus(5);/ 延时if(SDADATA)cy=1; else cy=0;/ cy = SDA;/ 读应答信号SCL0;/ 拉低时钟线delayus(5);/延时SDAOUT;return cy;/* /向I2C总线发送一个字节数据 /* void I2C_SendByte(uchar dat) uchar i;SDAOUT;for (i=0; i<8; i+)/8 位计数器if(dat<<i)&0x

11、80) SDA1;elseSDA0;/ SDA = cy;/送数据口SCLOUT;SCL1;/ 拉高时钟线delayus(5);/ 延时SCL0;/ 拉低时钟线delayus(5);/ 延时I2C_RecvACK();/* /从I2C总线接收一个字节数据/*uchar I2C_RecvByte() uchar i;uchar dat = 0,cy;SDAOUT;SCLOUT;/ 使能内部上拉,准备读取数据/8 位计数器SDA1;SDAIN;for (i=0; i<8; i+)dat <<= 1;SCL1;/ 拉高时钟线delayus(5);/ 延时if(SDADATA)cy=

12、1;elsecy=0;dat |= cy;/读数据SCL0;delayus(5);SDAOUT;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设备读取一

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

14、EG_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);void lcd_printf(uchar *s,int temp_data) if(temp_data<0)temp_data= -temp_da

15、ta;*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;/*/LCD1602 显示字符串/*void DisplayListChar(uchar X,uchar Y,uchar *DData,uchar L)uchar ListLength=0;Y&=0x1;X&=0xF;while(L-)Disp1Char

16、(X,Y,DDataListLength);ListLength+;X+;/* / 合成数据/* int GetData(uchar REG_Address)char H,L;H=Single_ReadI2C(REG_Address);L=Single_ReadI2C(REG_Address+1);return (H<<8)+L;/合成数据/* / 在 1602 上显示 10 位数据/* void Display10BitData(int value,uchar x,uchar y) value/=64;/ 转换为 10 位数据lcd_printf(dis, value);/ 转换

17、数据显示DisplayListChar(x,y,dis,4); /启始列,行,显示数组,显示长度以下是LCD1602相关文件#define uchar unsigned char#define uint unsigned int#define DATA_DIR P2DIR#define DATA_OUT P2OUT# define CLR_RS P6OUT&=BIT3; /RS=0;# define SET_RS P6OUT|=BIT3; /RS=1;# define CLR_RW P6OUT&=BIT4; /RW=0;# define SET_RW P6OUT|=BIT4;

18、/RW=1;# define CLR_EN P6OUT&=BIT5; /EN=0;# define SET_EN P6OUT|=BIT5; /EN=1;void delay1(uint z);void write_com(uchar com);void write_data(uchar dat);void init();void display(void);void LocateXY(uchar x,uchar y);void Disp1Char(uchar x,uchar y,uchar DataByte);void DispStr(uchar x,uchar y,uchar *pt

19、r);void DispNChar(uchar x,uchar y, uchar n,uchar *ptr);#include "includes.h"void delay1(uint z)uint t,y;for(t=z;t>0;t -)for(y=110;y>0;y -);/ 写命令 /void write_com(uchar com)CLR_RS;CLR_RW;CLR_EN;DATA_OUT=com;delay1(20);SET_EN;delay1(20);CLR_EN;delay1(20);/ 写数据 /void write_data(uchar dat

20、)SET_RS;CLR_RW;CLR_EN;DATA_OUT=dat;delay1(20);SET_EN;delay1(20);CLR_EN;delay1(20);/ 液晶初始化/void init()delay1(30);write_com(0x38);delay1(10);write_com(0x38);delay1(10);write_com(0x38);write_com(0x38);write_com(0x08);write_com(0x01);write_com(0x06);write_com(0x0c);void display(void)write_com(0x80+0x40)

21、;write_data(0x31);/*131 函数名称:LocateXY132 功能:向液晶输入显示字符位置的坐标信息133 参数:x-位置的列坐标0-15134y-位置的行坐标0-1135 返回值:无136 */ void LocateXY(uchar x,uchar y) uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40;/如果在第2 行temp |= 0x80;/ 第一行为0x80, 第二行为0x80+0x40write_com(temp);/*149函数名称:Disp1Char150 功能:在某个位置显示一个字

22、符151 参数:x-位置的列坐标0-15152y-位置的行坐标0-1153data-显示的字符数据154 返回值:无155 */ void Disp1Char(uchar x,uchar y,uchar DataByte) LocateXY( x, y );write_data( DataByte );/*2 函数名称:DispStr63 功能:让液晶从某个位置起连续显示一个字符串64 参数:x-位置的列坐标0-1565y-位置的行坐标0-1166ptr -指向字符串存放位置的指针167 返回值:无168 */ void DispStr(uchar x,uchar y,uchar *ptr)

23、uchar *temp;uchar i,n = 0;temp = ptr;while(*ptr+ != '0')n+;/计算字符串有效字符的个数for (i=0;i<n;i+) Disp1Char(x+,y,tempi);if (x = 0x0f)x = 0;y人=1;/异或操作,换行/*188 函数名称:DispNchar189 功 能:让液晶从某个位置起连续显示N 个字符190 参 数:x-位置的列坐标0-15191y-位置的行坐标0-1192n-字符个数193ptr -指向字符存放位置的指针194 返回值:无195 */ void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) uchar i;for (i=0;i<n;i+)Disp1Char(x+,y,ptri);if (x = 0x0f)x = 0;y 人=1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1