51单片机+MPU6050驱动程序,1602显示

发布者:DataExplorer最新更新时间:2019-12-10 来源: 51hei关键字:51单片机  MPU6050  驱动程序  1602显示 手机看文章 扫描二维码
随时随地手机看文章

想做滚球控制系统,先写了个MPU6050驱动看看

单片机源程序如下:

#include

#include     //Keil library

#include    //Keil library

#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)

[1] [2] [3]
关键字:51单片机  MPU6050  驱动程序  1602显示 引用地址:51单片机+MPU6050驱动程序,1602显示

上一篇:STC89C51单片机和ADXL345三轴加速度模块实现简易计步器程序
下一篇:数码管显示时钟可设置断电记忆

推荐阅读最新更新时间:2024-11-17 13:29

51单片机 温湿度传感器DHT11
//硬件连接: P2.0口为通讯口连接DHT1 #include reg51.h #include intrins.h typedef unsigned char U8; typedef signed char S8; typedef unsigned int U16; #define uchar unsigned char #define uint unsigned int sbit P2_0 = P2^0 ; sbit P2_1 = P2^1 ; //----------------------------------------------// //-------
[单片机]
51单片机各种型号的区别与特点介绍
8031/8051/8751是Intel公司早期的产品。 8031的特点 8031片内不带程序存储器ROM,使用时用户需外接程序存储器和一片逻辑电路373,外接的程序存储器多为EPROM的2764系列。用户若想对写入到EPROM中的程序进行修改,必须先用一种特殊的紫外线灯将其照射擦除,之后再可写入。写入到外接程序存储器的程序代码没有什么保密性可言。 8051的特点 8051片内有4k ROM,无须外接外存储器和373,更能体现“单片”的简练。但是你编的程序你无法烧写到其ROM中,只有将程序交芯片厂代你烧写,并是一次性的,今后你和芯片厂都不能改写其内容。 8751的特点 8751与8051基本一样,但8751片内有4k的EPROM
[单片机]
单片机控制LCD1602显示字符(测试通过)
本次测试的是常用 LCD1602 显示屏,操作流程很简单,但有些小问题要注意,如该LCD处理速度有些慢,单片机在发送控制指令时需要适当延时,否则可能操作失败。 一、硬件简介 1 引脚介绍 具体引脚如下: 单片机需要操作的引脚有:RS、RW、E及DB0~7 2 指令介绍 在这里,仅仅介绍下什么是CGRAM、什么是DDRAM? CGRAM:是用户自定义字符存放存储器,可以自己在指定地址定义字符 DDRAM:是对应屏幕位置的存储器,设定了该地址,就确定了从屏幕什么位置开始显示字符 二、软件部分 #include #include #define DATA P0
[单片机]
基于AT89C51单片机的RS232-GPIB控制器设计
越来越多的测量仪器提供GPIB(General Purpose Intefface Bus)总线接口,通过该总线可以方便快捷地连接带有GPIB接口的仪器及计算机,组成一个GPlB网络。GPIB设备与计算机连接时,需要借助GPIB接口板卡,但这些GPIB接口板卡价格昂贵,给仪器与计算机连接带来不便。在大多数情况下计算机只连接一台GPIB接口仪器,并不需要这些功能复杂价格昂贵的GPIB板卡。面对单台仪器与计算机连接的功能需求,本文设计了一种性价比突出的RS232一GPIB控制器,该控制器利用计算机最常用的RS232接口,控制带有GPIB接口的仪器,在计算机与仪器之间建立数据传输的通道。同时,支持SCPI(Standard Comman
[单片机]
基于AT89C<font color='red'>51单片机</font>的RS232-GPIB控制器设计
基于51单片机的智能路灯控制器设计
一.系统概述 系统使用的模块有AT89C51单片机+LCD1602显示屏+ADC0832+按键+小灯。 本次设计的智能路灯控制系统以AT89C51单片机为控制核心,使用LCD1602显示屏显示ADC采集回来的光照强度的数字电压信号,系统程序内设置光照强度阈值,在默认状态下为自动模式,此时调节电位器就能实现光照强度的调节,按下自动按键就会切换到手动模式,此时按下手动开和手动关按键就能控制小灯的亮灭 二.仿真概述 1.使用LCD1602显示光照强度电压信号值。 2.按键切换手动和自动模式,按下手动开和手动关按键就能直接控制小灯的亮灭。 3.调节电位器来模拟光照强度的变化。 三.程序设计 使用Keil 51进行程序设
[单片机]
基于<font color='red'>51单片机</font>的智能路灯控制器设计
什么是51单片机51单片机主要产品有哪些?
51单片机是对目前所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是52系列的单片机一般不具备自编程能力。 当前常用的51系列单片机主要产品有: *Intel的:80C31、80C51、87C51,80C32、80C52、87C52等; *ATM
[单片机]
什么是<font color='red'>51单片机</font>?<font color='red'>51单片机</font>主要产品有哪些?
51单片机一个输出口显示多位输出
电路图 #include reg51.h sbit LE0=P3^0; sbit LE1=P3^1; sbit LE2=P3^2; sbit LE3=P3^3; int i,j,k; int xx ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void yanchi(int ms) { while(ms--) { for(i=0;i 100;i++); } } void main() { while(1) { for(j=0;j 10000;j++) { P2=xx ;//千 LE
[单片机]
<font color='red'>51单片机</font>一个输出口<font color='red'>显示</font>多位输出
单片机控制无刷电机初步调试成果和学习经历
调了一天多的无刷电机,用的无刷电调,其实本来应该是用32做的,但是不知道原理, 于是用了比较熟悉的51单片剂一下来进行调试 一下,查询的资料,还是蛮简单的,但是实际操作并没有那么容易, 在网上查也没有能用的程序,尤其是51,因为基本用无刷的都是无人机 四六轴。所以今天贴上我的程序,分享给大家,希望能对各位减少时间学习,快速上手,本程序实现的功能是在第一次给无刷电机上电后,首先拉高油门,然后降低油门,最后满开油门,注意,,,,注意,,,,注意,一定不要用带螺旋桨的无刷电机来实验,危险,开机后会全速运行,我开全速是为了用涵道,所以全速,, 废话不多说,贴程序 51单片机源程序如下: /**********************
[单片机]
单片机控制无刷电机初步调试成果和学习经历
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved