logo资料库

MPU6050 1602液晶显示 51单片机.docx

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
//低通滤波频率,典型值:0x06(5Hz) 0x19//陀螺仪采样率,典型值:0x07(125Hz) 0x1A 0x1B//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) 0x1C//加速计自检、测量范围及高通滤波频率,典型值:0x01(不 MPU6050 1602 显示 //**************************************** // //**************************************** #include #include #include #include #define uchar unsigned char #define uint unsigned int #define ushort unsigned short #define SMPLRT_DIV #define CONFIG #define GYRO_CONFIG #define ACCEL_CONFIG 自检,2G,5Hz) #define ACCEL_XOUT_H #define ACCEL_XOUT_L #define ACCEL_YOUT_H #define ACCEL_YOUT_L #define ACCEL_ZOUT_H #define ACCEL_ZOUT_L #define TEMP_OUT_H #define TEMP_OUT_L #define GYRO_XOUT_H #define GYRO_XOUT_L #define GYRO_YOUT_H #define GYRO_YOUT_L #define GYRO_ZOUT_H #define GYRO_ZOUT_L #define PWR_MGMT_1 #define WHO_AM_I #define SlaveAddress 0xD0 sbit rs=P3^5; sbit rw=P1^1; sbit en=P3^4; sbit SCL=P1^6; sbit SDA=P1^7; uchar dis[4]; void delay(unsigned int k) { 0x3B 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 //IIC 时钟引脚定义 //IIC 数据引脚定义 0x43 0x45 0x47 unsigned int i,j; for(i=0;i
} } void write_com(uchar com) { //等 0 输入命令 //液晶写命令程序 //液晶使能信号初始化 //把 com 参数,液晶的命令值送到 P0 口 //延时,按照液晶的时序图的要求 //使能信号,0 到 1 表示上升沿打开可以写命令数据到液晶里 rs=0; en=0; P0=com; delay(50); en=1; delay(50); en=0; rs=1; en=0; P0=date; delay(50); en=1; delay(50); en=0; //使能信号回复 } void write_data(uchar date) { //液晶写数据程序 //等 1 表示输入数据 //把 date 参数,液晶的数据送到 P0 口 } void init() //液晶初始化程序 { en=0; write_com(0x38); //设置 16X2 显示,5X7 点阵,8 位数据口 write_com(0x0c); //设置开显示,不显示光标 write_com(0x06); //写一个字符后地址指针加 1 write_com(0x01); //显示清 0,数据指针清 0 } void lcd_printf(uchar *s,int temp_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; //取余运算 //取余运算 } //****************************************
//LCD1602 写入一个字符 //**************************************** void DisplayOneChar(uchar X,uchar Y,uchar DData) { Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; write_com(X); write_data(DData); } //**************************************** //LCD1602 显示字符串 //**************************************** void DisplayListChar(uchar X,uchar Y,uchar *DData,L) { uchar ListLength=0; Y&=0x1; X&=0xF; while(L--) { DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; } } 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_(); } //************************************** //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 发送应答信号 //入口参数: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) { uchar i;
for(i=0;i<8;i++) { dat<<=1; SDA=CY; SCL=1; Delay5us(); SCL=0; Delay5us(); } I2C_RecvACK(); //8 位计数器 //移出数据的最高位 //送数据口 //拉高时钟线 //延时 //拉低时钟线 //延时 } //************************************** //从 I2C 总线接收一个字节数据 //************************************** uchar I2C_RecvByte() { uchar i; uchar dat=0; SDA=1; for(i=0;i<8;i++) { dat<<=1; SCL=1; Delay5us(); dat|=SDA; SCL=0; Delay5us(); } return dat; //使能内部上拉,准备读取数据, //8 位计数器 //拉高时钟线 //延时 //读数据 //拉低时钟线 //延时 } //************************************** //向 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 设备读取一个字节数据 //**************************************
uchar Single_ReadI2C(uchar REG_Address) { uchar REG_data; I2C_Start(); I2C_SendByte(SlaveAddress); I2C_SendByte(REG_Address); I2C_Start(); I2C_SendByte(SlaveAddress+1); REG_data=I2C_RecvByte(); I2C_SendACK(1); I2C_Stop(); return REG_data; //起始信号 //发送设备地址+写信号 //发送存储单元地址,从 0 开始 //起始信号 //发送设备地址+读信号 //读出寄存器数据 //接收应答信号 //停止信号 //解除休眠状态 } 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_Address); L=Single_ReadI2C(REG_Address+1); return (H<<8)+L; //合成数据 } //************************************** //在 1602 上显示 10 位数据 //************************************** void Display10BitData(int value,uchar x,uchar y) { value/=64; lcd_printf(dis, value); DisplayListChar(x,y,dis,4); //转换为 10 位数据 //转换数据显示 //启始列,行,显示数组,显示长度 } void main() { rw=0; init(); //rw 直接置 0,应该在液晶初始化前,否则断电后再通电就不能显示,切记!!! //液晶初始化函数
write_com(0x80); InitMPU6050(); //初始化 MPU6050 delay(50); 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); Display10BitData(GetData(GYRO_XOUT_H),2,1); //显示 X 轴角速度 Display10BitData(GetData(GYRO_YOUT_H),7,1); //显示 Y 轴角速度 Display10BitData(GetData(GYRO_ZOUT_H),12,1);//显示 Z 轴角速度 //显示 Z 轴加速度 } }
分享到:
收藏