想做滚球控制系统,先写了个MPU6050驱动看看
单片机源程序如下:
#include #include #include #include typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; //**************************************** // 定义51单片机端口 //**************************************** #define DataPort P0 //LCD1602数据端口 sbit SCL=P1^1; //IIC时钟引脚定义 sbit SDA=P1^0; //IIC数据引脚定义 sbit LCM_RS=P3^5; //LCD1602命令端口 sbit LCM_RW=P3^6; //LCD1602命令端口 sbit LCM_EN=P3^4; //LCD1602命令端口 //**************************************** // 定义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为读取 //**************************************** //定义类型及变量 //**************************************** uchar dis[4]; //显示数字(-511至512)的字符数组 int dis_data; //变量 //int Temperature,Temp_h,Temp_l; //温度及高低位数据 //**************************************** //函数声明 //**************************************** void delay(unsigned int k); //延时 //LCD相关函数 void InitLcd(); //初始化lcd1602 void lcd_printf(uchar *s,int temp_data); void WriteDataLCM(uchar dataW); //LCD数据 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(); //初始化MPU6050 void Delay5us(); void I2C_Start(); void I2C_Stop(); void I2C_SendACK(bit ack); bit I2C_RecvACK(); 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 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; } //**************************************** //延时 //**************************************** void delay(unsigned int k) { unsigned int i,j; for(i=0;i for(j=0;j<121;j++); } } //**************************************** //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_();_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_(); 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)
上一篇:STC89C51单片机和ADXL345三轴加速度模块实现简易计步器程序
下一篇:数码管显示时钟可设置断电记忆
推荐阅读最新更新时间:2024-11-17 13:29
设计资源 培训 开发板 精华推荐
- 最小原理图作业1
- PAM2306双路高效PWM降压DC-DC转换器固定电压稳压器典型应用
- 消费类电子产品 Z8 MCU 开发系统
- 使用 MaxLinear, Inc 的 SP829EK 的参考设计
- LT3756EMSE 90% 效率、20W SEPIC LED 驱动器的典型应用电路
- LT1725CGN 演示板,低成本、高效率同步正向转换器,无光隔离器,+Vin = 36V-72V,+Vout = 2.5V/3.3V,10A
- SJA1105Q-EVB: 以太网交换机和 PHY 评估板。
- MSP430单片机控制坦克打靶C语言源程序代码
- AD8532ARZ-REEL 单电源、立体声耳机驱动器的典型应用
- 基于 NCP1011 的反激式转换器提供 6.5W 的典型应用
- 2024年Automechanika Shanghai海量同期活动刷新历届记录,汇聚行业智慧,共谋未来发展
- 企业文化分享 如何培养稀缺的硅IP专业人员?SmartDV开启的个人成长与团队协作之旅
- 恩智浦发布首个超宽带无线电池管理系统解决方案
- 北交大本科生探秘泰克先进半导体开放实验室,亲历前沿高科技魅力
- 新帅上任:杜德森博士(Dr. Torsten Derr)将于2025年1月1日出任肖特集团首席执行官
- 边缘 AI 如何提升日常体验
- 苹果要首发!台积电宣布2nm已准备就绪
- AMD有望用上全新芯片堆叠技术:延迟大幅减少、性能显著提升
- 宁德时代发布10月战报
- 2024年10月电池行业:增长势头不减!