msp430 控制mpu6050电赛分享.docx
- 文档编号:28098273
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:21
- 大小:17.75KB
msp430 控制mpu6050电赛分享.docx
《msp430 控制mpu6050电赛分享.docx》由会员分享,可在线阅读,更多相关《msp430 控制mpu6050电赛分享.docx(21页珍藏版)》请在冰豆网上搜索。
msp430控制mpu6050电赛分享
#include
#include
#defineucharunsignedchar
#defineushortunsignedshort
#defineuintunsignedint
//*********************************************************
#defineCPU_F((double)8000000)
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
#defineucharunsignedchar
#defineuint unsignedint
#defineulongunsignedlong
#defineP555
#defineP566
#defineP577
#defineRS_CLR P5OUT&=~(1< #defineRS_SET P5OUT|=(1< #defineRW_CLR P5OUT&=~(1< #defineRW_SET P5OUT|=(1< #defineEN_CLR P5OUT&=~(1< #defineEN_SET P5OUT|=(1< #defineDataPort P4OUT //P4口为数据口 //************************************************************************* // 系统时钟初始化 //************************************************************************* voidClock_Init() { uchari; BCSCTL1&=~XT2OFF; //打开XT振荡器 BCSCTL2|=SELM_2+SELS;//MCLK为8MHZ,SMCLK为8MHZ do{ IFG1&=~OFIFG; //清除震荡标志 for(i=0;i<100;i++) _NOP(); //延时等待 } while((IFG1&OFIFG)! =0); //如果标志为1,则继续循环等待 IFG1&=~OFIFG; } //************************************************************************* // MSP430内部看门狗初始化 //************************************************************************* voidWDT_Init() { WDTCTL=WDTPW+WDTHOLD; //关闭看门狗 } //************************************************************************* // 初始化IO口子程序 //************************************************************************* voidPort_init() { P4SEL=0x00; P4DIR=0xFF; P5SEL=0x00; P5DIR|=BIT5+BIT6+BIT7; //控制口设置为输出模式 } //*********************************************************************** // 显示屏命令写入函数 //*********************************************************************** voidLCD_write_com(unsignedcharcom) { RS_CLR; RW_CLR; EN_SET; DataPort=com; //命令写入端口 delay_us(50); EN_CLR; } //*********************************************************************** // 显示屏数据写入函数 //*********************************************************************** voidLCD_write_data(unsignedchardata) { RS_SET; RW_CLR; EN_SET; DataPort=data; //数据写入端口 delay_us(50); EN_CLR; } //*********************************************************************** // 显示屏清空显示 //*********************************************************************** voidLCD_clear(void) { LCD_write_com(0x01); //清屏幕显示 delay_ms(5); } //*********************************************************************** // 显示屏字符串写入函数 //*********************************************************************** voidLCD_write_str(unsignedcharx,unsignedchary,uchar*s) { if(y==0) { LCD_write_com(0x80+x); //第一行显示 } else { LCD_write_com(0xC0+x); //第二行显示 } while(*s) { LCD_write_data(*s); s++; } } //*********************************************************************** // 显示屏单字符写入函数 //*********************************************************************** voidLCD_write_char(unsignedcharx,unsignedchary,unsignedchardata) { if(y==0) { LCD_write_com(0x80+x); //第一行显示 } else { LCD_write_com(0xC0+x); //第二行显示 } LCD_write_data(data); } //*********************************************************************** // 显示屏初始化函数 //*********************************************************************** voidLCD_init(void) { LCD_write_com(0x38); //显示模式设置 delay_ms(5); LCD_write_com(0x08); //显示关闭 delay_ms(5); LCD_write_com(0x01); //显示清屏 delay_ms(5); LCD_write_com(0x06); //显示光标移动设置 delay_ms(5); LCD_write_com(0x0C); //显示开及光标设置 delay_ms(5); } //*************************************** #defineSDABIT1 #defineSCLBIT2 //**************************************** //定义MPU6050内部地址 //**************************************** #define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值: 0x07(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 #define 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,只读) #define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取 uchardis[4]; //显示数字(-511至512)的字符数组 int dis_data; //变量 //MPU6050操作函数 void InitMPU6050(); //初始化MPU6050 void I2C_Start(); void I2C_Stop(); void I2C_SendACK(ucharack); uchar I2C_RecvACK(); void I2C_SendByte(uchardat); ucharI2C_RecvByte(); void I2C_ReadPage(); void I2C_WritePage(); void display_ACCEL_x(); void display_ACCEL_y(); void display_ACCEL_z(); ucharSingle_ReadI2C(ucharREG_Address); //读取I2C数据 void Single_WriteI2C(ucharREG_Address,ucharREG_data); //向I2C写入数据 //**************************************** //整数转字符串 //**************************************** voidlcd_printf(uchar*s,inttemp_data) { if(temp_data<0) { 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; } //************************************** //SDA高电平的产生 //************************************** voidsda_high() //SDA高电平的产生 { P1DIR|=SDA; P1OUT|=SDA; _NOP(); _NOP(); _NOP(); return; } //************************************** //SDA低电平的产生 //************************************** voidsda_low() //SDA低电平的产生 { P1DIR|=SDA; P1OUT&=~SDA; _NOP(); _NOP(); _NOP(); return; } //************************************** //SCL高电平产生 //************************************** voidscl_high() //SCL高电平产生 { P1DIR|=SCL; P1OUT|=SCL; _NOP(); _NOP(); _NOP(); return; } //************************************** //SCL低电平的产生 //************************************** voidscl_low()//SCL低电平的产生 { P1DIR|=SCL; P1OUT&=~SCL; _NOP(); _NOP(); _NOP(); return; } //************************************** //I2C起始信号 //************************************** voidI2C_Start() { sda_high(); //拉高数据线 scl_high(); //拉高时钟线 delay_us(5); //延时 sda_low(); //产生下降沿 delay_us(5); //延时 scl_low(); //拉低时钟线 } //************************************** //I2C停止信号 //************************************** voidI2C_Stop() { sda_low(); //拉低数据线 scl_high(); //拉高时钟线 delay_us(5); //延时 sda_high(); //产生上升沿 delay_us(5); //延时 } //************************************** //I2C发送应答信号 //入口参数: ack(0: ACK1: NAK) //************************************** voidI2C_SendACK(ucharack) { if(ack)sda_high(); else sda_low();//写应答信号 scl_high(); //拉高时钟线 delay_us(5); //延时 scl_low(); //拉低时钟线 delay_us(5); //延时 } //************************************** //I2C接收应答信号 //************************************** ucharI2C_RecvACK() { ucharcy; scl_high(); //拉高时钟线 P1DIR&=~SDA; delay_us(5); //延时 if((P1IN&SDA)==SDA) { cy=1; } else { cy=0; } // cy=SDA; //读应答信号 scl_low(); //拉低时钟线 delay_us(5); //延时 P1DIR|=SDA; returncy; } //************************************** //向I2C总线发送一个字节数据 //************************************** voidI2C_SendByte(uchardat) { uchari; for(i=0;i<8;i++) //8位计数器 { if((dat< { sda_high(); } else { sda_low(); } //SDA=cy; //送数据口 scl_high(); //拉高时钟线 delay_us(5); //延时 scl_low(); //拉低时钟线 delay_us(5); //延时 } I2C_RecvACK(); } //************************************** //从I2C总线接收一个字节数据 //************************************** ucharI2C_RecvByte() { uchari; uchardat=0,cy; sda_high(); //使能内部上拉,准备读取数据, P1DIR&=~SDA; for(i=0;i<8;i++) //8位计数器 { dat<<=1; scl_high(); //拉高时钟线 delay_us(5); //延时 if((P1IN&SDA)==SDA) { cy=1; } else {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- msp430 控制mpu6050电赛分享 控制 mpu6050 分享
