单片机我用的是stc15f2k60s2,以下是程序:
- 这是主函数:
- #include "stc15f2k60s2.H"
- #include "math.h" //Keil library
- #include "stdio.h" //Keil library
- #include "intrins.h"
- #include "mpu9150.h"
- /*********************************/
- //存放结果字符串
- unsigned char Data[17];
- /*********************************/
- void Delay(unsigned int q);
- int GetData(add);
- void Uart1_SendString(unsigned char *PBuf);
- void Uart1_Init(void);
- void MPU9150_Init(void);
- void OUT_put(int value);
- void INT_CHAR(unsigned char *PBuf,int value);
- //mpu9150***
- unsigned char I2C_ReadReg(unsigned char add);
- void I2C_WriteReg(unsigned char add,unsigned char dat);
- unsigned char I2C_RecvByte(void);
- bit I2C_SendByte(unsigned char dat);
- bit I2C_RecvACK();
- void I2C_SendACK(bit ack);
- void I2C_Stop(void);
- void I2C_Start(void);
- void Delay5us();
- void main(void)
- {
- Delay(500);
- Uart1_Init();
- MPU9150_Init();
- Delay(150);
- while(1)
- {
- OUT_put(GetData(ACCEL_XOUT_H));
- Uart1_SendString("aa");
- OUT_put(GetData(ACCEL_YOUT_H));
- Uart1_SendString("bb");
- OUT_put(GetData(ACCEL_ZOUT_H));
- Uart1_SendString("cc");
- OUT_put(GetData(GYRO_XOUT_H));
- Uart1_SendString("dd");
- OUT_put(GetData(GYRO_YOUT_H));
- Uart1_SendString("ee");
- OUT_put(GetData(GYRO_ZOUT_H));
- Uart1_SendString("ff");
- OUT_put(I2C_ReadReg(WHO_AM_I));
- Delay(500);
- }
- }
- //*************mpu9150初始化************
- void MPU9150_Init(void)
- {
- I2C_WriteReg(PWR_MGMT_1,0x00);
- I2C_WriteReg(SMPLRT_DIV,0x07);
- I2C_WriteReg(CONFIG,0x06);
- I2C_WriteReg(GYRO_CONFIG,0x18);
- I2C_WriteReg(ACCEL_CONFIG,0x01);
- }
- /*******************延时*********************/
- void Delay(unsigned int q) //误差 -0.005353009259us
- {
- for(;q>0;q--);
- _nop_(); //if Keil,require use intrins.h
- }
- /***********************************************
- *函数名称:Uart1_SendChar
- *功 能:串口1发送单个字符函数
- *入口参数:Udat:欲发送的数据
- *返 回 值:无
- *备 注:无
- ************************************************/
- void Uart1_SendChar(unsigned char Udat)
- {
- SBUF=Udat; //将数据放入发送缓冲区
- while(!ti); //等待发送完成
- TI=0; //清零TI
- }
- /***********************************************
- *函数名称:Uart_SendString
- *功 能:串口发送字符串函数
- *入口参数:*PBuf:指向字符串的指针
- *返 回 值:无
- *备 注:无
- ************************************************/
- void Uart1_SendString(unsigned char *PBuf)
- {
- while(*PBuf!=' ') //未到字符串末尾
- {
- Uart1_SendChar(*PBuf);//发送数据
- PBuf++; //移动指针
- }
- }
- /*************读取数据***********************/
- int GetData(add)
- {
- unsigned char H,L,T;
- H=I2C_ReadReg(add);
- L=I2C_ReadReg(add+1);
- T=H+L;
- return T;
- }
- /***********************************************
- 函数名称:Uart1_Init
- 功 能:串口1初始化函数
- 入口参数:无
- 返 回 值:无
- 备 注:STC15F2K60S2单片机串口1
- 可以选择定时器1或者定时器2作为波特率发生器
- ************************************************/
- void Uart1_Init(void)
- {
- SCON=0x50; //0101 0000 模式1: 1 位起始位; 8 位数据; 1 位停止位;允许接收
- T2L=0xe8; //波特率9600 11.0592MHz
- T2H=0xff;
- AUXR |=0x11; //串口选择定时器2作为波特率发生器,并且启动定时器
- }
- /****************输出处理*******************/
- void OUT_put(int value)
- {
- INT_CHAR(Data,value);
- Uart1_SendString(Data);
- }
- /****************int转char***********************/
- void INT_CHAR(unsigned char *Data,value)
- {
- if(value<0)
- {
- value=-value;
- *Data='-';
- }
- else
- {
- *Data=' ';
- }
- *++Data = value/1000000000000000+0x30;
- value = value%1000000000000000;
- *++Data = value/100000000000000+0x30;
- value = value%100000000000000;
- *++Data = value/10000000000000+0x30;
- value = value%10000000000000;
- *++Data = value/1000000000000+0x30;
- value = value%1000000000000;
- *++Data = value/100000000000+0x30;
- value = value%100000000000;
- *++Data = value/10000000000+0x30;
- value = value%10000000000;
- *++Data = value/1000000000+0x30;
- value = value%1000000000;
- *++Data = value/100000000+0x30;
- value = value%100000000;
- *++Data = value/10000000+0x30;
- value = value%10000000;
- *++Data = value/1000000+0x30;
- value = value%1000000;
- *++Data = value/100000+0x30;
- value = value%100000;
- *++Data = value/10000+0x30;
- value = value%10000;
- *++Data = value/1000+0x30;
- value = value%1000;
- *++Data = value/100+0x30;
- value = value%100;
- *++Data = value/10+0x30;
- value = value%10;
- *++Data = value+0x30;
- value = value;
- }
- #ifndef __mpu9150_h__
- #define __mpu9150_h__
- #include "stc15f2k60s2.h"
- //****************************************
- // 定义51单片机端口
- //****************************************
- sbit SCL=P1^0; //IIC时钟引脚定义
- sbit SDA=P1^1; //IIC数据引脚定义
- //****************************************
- // 定义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为读取
- #endif
- #include <mpu9150.h>
- #include <stc15f2k60s2.H>
- #include <INTRINS.H>
- #include <mpu9150.h>
- typedef unsigned char uchar;
- typedef unsigned short ushort;
- typedef unsigned int uint;
- //**************************************
- //延时5微秒(STC90C52RC@12M)
- //不同的工作环境,需要调整此函数
- //当改用1T的MCU时,请调整此延时函数
- //**************************************
- void Delay5us()
- {
- unsigned char a,b;
- for(b=3;b>0;b--)
- for(a=2;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
- //**************************************
- //I2C起始信号
- //**************************************
- void I2C_Start(void)
- {
- SDA = 1; //拉高数据线
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- SDA = 0; //产生下降沿
- Delay5us(); //延时
- SCL = 0; //拉低时钟线
- Delay5us(); //延时
- }
- //**************************************
- //I2C停止信号
- //**************************************
- void I2C_Stop(void)
- {
- SDA = 0; //拉低数据线
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- SDA = 1; //产生上升沿
- Delay5us(); //延时
- }
- //**************************************
- //I2C发送应答信号
- //入口参数:ack (0:ACK 1:NAK)
- //**************************************
- void I2C_SendACK(bit ack)
- {
- SDA = ack; //写应答信号
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- SCL = 0; //拉低时钟线
- Delay5us(); //延时
- }
- //**************************************
- //I2C接收应答信号
- //**************************************
- bit I2C_RecvACK()
- {
- bit ack;
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- ack = SDA; //读应答信号
- SCL = 0; //拉低时钟线
- Delay5us(); //延时
- return ack;
- }
- //**************************************
- //向I2C总线发送一个字节数据
- //**************************************
- bit I2C_SendByte(uchar dat)
- {
- uchar i;
- for (i=0; i<8; i++) //8位计数器
- {
- if( (dat&0x80)==0x80 ) //先发送高字节
- {
- SDA = 1;
- }
- else
- {
- SDA = 0;
- }
- dat <<= 1; //移出数据的最高位
- SCL = 1; //拉高时钟线
- Delay5us(); //延时
- SCL = 0; //拉低时钟线
- Delay5us(); //延时
- }
- return I2C_RecvACK();
- }
- //**************************************
- //向I2C总线接收一个字节数据
- //**************************************
- unsigned char I2C_RecvByte(void)
- {
- unsigned char i;
- unsigned char dat = 0;
- SDA=1;
- for (i=0; i<8; i++) //8位计数器
- {
- dat <<= 1;
- SCL=1; //拉高时钟线
- Delay5us(); //延时
- dat |= SDA; //读数据
- SCL=0; //拉低时钟线
- Delay5us(); //延时
- }
- return dat;
- }
- /************写mpu9150寄存器************************/
- void I2C_WriteReg(unsigned char add,unsigned char dat)
- {
- I2C_Start(); //起始信号
- I2C_SendByte(SlaveAddress); //发送设备地址+写信号
- I2C_SendByte(add); //发送寄存器地址
- I2C_SendByte(dat); //发送寄存器数据
- I2C_Stop(); //停止信号
- }
- /************读mpu9150寄存器********************/
- unsigned char I2C_ReadReg(unsigned char add)
- {
- unsigned char dat;
- I2C_Start(); //起始信号
- I2C_SendByte(SlaveAddress); //发送设备地址+写信号
- I2C_SendByte(add); //发送寄存器地址
- I2C_Start(); //起始信号
- I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号
- dat=I2C_RecvByte(); //接收数据
- I2C_SendACK(1); //最后一个数据需要NAK
- I2C_Stop(); //停止信号
- return dat;
- }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>