历史上的今天
返回首页

历史上的今天

今天是:2024年09月11日(星期三)

正在发生

2020年09月11日 | 51单片机MPU6050数字陀螺仪与LCD12864显示

2020-09-11 来源:51hei

#include

#include      

#include    

#include


typedef unsigned char  uchar;

typedef unsigned short ushort;

typedef unsigned int   uint;


#define DataPort P0     

sbit    SCL=P2^6;           

sbit    SDA=P2^5;         


sbit LCM_RS   = P3^7;   

sbit LCM_RW   = P3^6;              

sbit LCM_EN   = P3^5;            

sbit LCD12864_PSB  = P1^5;

sbit LCD12864_RSET = P1^3;

//****************************************

// 定义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];                          

int dis_data;                     


//****************************************

//整数转字符串

//****************************************

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++);

    }                       

}


void WaitForEnable(void)   

{                  

    DataPort=0xff;      

    LCM_RS=0;LCM_RW=1;_nop_();

    LCM_EN=1;_nop_();_nop_();

    while(DataPort&0x80);   

    LCM_EN=0;               

}                  


void WriteCommandLCM(uchar CMD)

{                  

    WaitForEnable();

    LCM_RS=0;LCM_RW=0;_nop_();

    DataPort=CMD;_nop_();   

    LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}                  


void WriteDataLCM(uchar dataW)

{                  

    WaitForEnable();        

    LCM_EN=0;LCM_RS=1;LCM_RW=0;_nop_();

    DataPort=dataW;_nop_();

    LCM_EN=1;_nop_();LCM_EN=0;_nop_();

}      


void LcdPos_xy(unsigned char x,unsigned char y)

{

    unsigned char pos;

    switch(x)

    {

        case 1:pos=0x80+y-1;break;

        case 2:pos=0x90+y-1;break;

        case 3:pos=0x88+y-1;break;

        case 4:pos=0x98+y-1;break;

        default:pos=0x80+y-1;break;

    }

    WriteCommandLCM(pos|0x80);

}


void DisplayListChar(uchar X,uchar Y,uchar *DData)

{

    LcdPos_xy(X,Y);

    while(*DData)

    {

        WriteDataLCM(*DData++);

    }

}


void InitLcd()              

{           

        LCD12864_PSB = 1;//并行通信

        LCD12864_RSET = 0;

        delay(10);

        LCD12864_RSET = 1;


        WriteCommandLCM(0x30);

        delay(5);

        WriteCommandLCM(0x30);

        delay(5);

        WriteCommandLCM(0x18);

        delay(5);

        WriteCommandLCM(0x10);

        delay(5);

        WriteCommandLCM(0x01);

        delay(5);

        WriteCommandLCM(0x06);

        delay(5);

        WriteCommandLCM(0x0c);

        delay(5);


        DisplayListChar(1,2,"加速度");

        DisplayListChar(1,6,"角速度");

        DisplayListChar(2,1,"X:");

        DisplayListChar(3,1,"Y:");

        DisplayListChar(4,1,"Z:");

}           


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++)         //8位计数器

    {

        dat <<= 1;              //移出数据的最高位

        SDA = CY;               //送数据口

        SCL = 1;                //拉高时钟线

        Delay5us();             //延时

        SCL = 0;                //拉低时钟线

        Delay5us();             //延时

    }

    I2C_RecvACK();

}

//**************************************

//从I2C总线接收一个字节数据

//**************************************

uchar I2C_RecvByte()

{

    uchar i;

    uchar dat = 0;

推荐阅读

史海拾趣

Hifn Inc公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,它们不仅限于接收和转换电视信号,还具备丰富的网络交互功能。

机顶盒的核心功能在于接收并解码来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,将其转换成适合在电视机上播放的格式。这一过程包括接收、解码和显示三个主要步骤,确保了用户能够享受到高清乃至4K的超高清画质和震撼音效。此外,机顶盒还提供了诸如电子节目指南、因特网网页浏览等增值服务,极大地丰富了用户的观看体验。

随着技术的不断进步,机顶盒正朝着智能化、多功能化方向发展。例如,智能推荐算法能够根据用户的观看历史和偏好,提供个性化的节目推荐;语音识别技术则让用户能够通过语音指令控制机顶盒,实现更加便捷的操作体验。同时,机顶盒还支持家庭影院功能,让用户在家中就能享受到电影院般的视听效果。

总的来说,机顶盒作为连接电视与外部信号源的桥梁,不仅提升了电视节目的观看体验,还通过丰富的网络交互功能为用户提供了更加广泛的内容和娱乐选择。随着技术的不断发展和用户需求的日益多样化,机顶盒将继续在家庭娱乐领域发挥重要作用。

ABI Electronics公司的发展小趣事

ABI Electronics公司深知研发实力是企业发展的核心竞争力。因此,公司不断加大对研发的投入,引进了一批高素质的研发人才,建立了完善的研发体系。通过与高校、科研机构等合作,ABI不断吸收新的技术和知识,推动产品的升级换代,保持了在行业内的技术领先地位。

Baneasa SA公司的发展小趣事

Baneasa SA公司成立之初,便专注于电子元器件的研发与生产。公司凭借创始团队的技术积累和市场洞察力,成功开发出一款高性能的半导体芯片,迅速在行业内崭露头角。这款芯片以其出色的稳定性和可靠性赢得了市场的广泛认可,为Baneasa SA的发展奠定了坚实的基础。

ADDtek公司的发展小趣事

随着国内市场的逐渐饱和,Baneasa SA开始将目光投向海外市场。公司制定了国际化的发展战略,通过在欧美等发达国家设立分支机构、参加国际展会等方式积极开拓国际市场。这些努力使得Baneasa SA的产品逐渐在国际市场上占据了一席之地,公司的业务范围也得到了进一步扩大。

Custom Connector Corporation公司的发展小趣事

Custom Connector Corporation成立于1969年,当时电子连接器行业正处于快速发展阶段。创始人看到这一市场潜力,决定投身于这一领域。在创业初期,CCC面临着资金紧张、技术瓶颈和市场认可度低等问题。然而,创始人凭借对技术的执着追求和对市场的敏锐洞察,带领团队不断研发新产品,改进生产工艺,逐渐在市场中树立了自己的品牌形象。

Heatron公司的发展小趣事

进入21世纪后,Heatron公司开始积极寻求国际合作机会,以进一步拓展其全球业务。公司先后与多个国家的知名企业建立了战略伙伴关系,共同开发新产品、新技术。通过资源共享和市场互补,Heatron不仅成功进入了多个新兴市场,还显著提升了其品牌在国际市场上的知名度和影响力。

问答坊 | AI 解惑

稳压电源的制作

(一) 电容降压式稳压电源       电容降压式稳压电源输出电流较小,但他不用变压器所以体积小,成本低,适用于耗电小的电子设备,原理图见(1-1) 如果桥式整流电路的输入交流电压为Vi输出直流电压为Vo,输出电流为Iz 则降压电容 ...…

查看全部问答>

选D的请进

本帖最后由 paulhyde 于 2014-9-15 09:06 编辑 今年的D题你们有思路吗?  …

查看全部问答>

[藏书阁]碳势传感器

内容: 1.氧探头的定碳标定 2.热处理氧探头的结构 3.氧传感器的安装方式 4.氧探头的烧碳黑操作 5.氧探头内阻值测定公式 6.氧化锆氧传感器测氧原理 7.氧探头常见故障及处理方法 HM系列热处理氧探头 碳势检测方法.pdf…

查看全部问答>

在PWM直流电机调速中增量式PID控制算法的输出是怎么与PWM建立关系的

各位大侠:我是菜鸟,最近我用单片机做一个PWM直流电机调速的实验,我用的是增量式PID控制算法,我有个问题不是很明白:那就是在这个系统中是怎样通过增量式PID控制算法的输出来控制PWM的,增量式PID控制算法的输出是怎么与PWM建立关系的,假设增量 ...…

查看全部问答>

帮忙分析下这个电路,将将其原理

[ 本帖最后由 tonytong 于 2010-5-20 12:46 编辑 ]…

查看全部问答>

有谁用过BGB100?

自己用蓝牙无线收发器做了一个板子,想用FPGA控制它通信,但是没通,大家谁用过这个芯片,希望指点一下。…

查看全部问答>

谁能帮忙从 pudn 上下载几个程序发到我的邮箱里,谢谢

一个内存驱动器的源代码 http://www.pudn.com/downloads/sourcecode/windows/vxd/detail1558.html 虚拟串口用VC编译 http://www.pudn.com/downloads170/sourcecode/windows/vxd/detail788464.html 8139网卡驱动源码 http://www.pudn.co ...…

查看全部问答>

大家好,请问一个关于串口的问题

我现在写好了串口驱动,测试的时候发现问题,但是不知道是什么原因,串口只能写不能读 代码如下.... 输出是 test uart com1 open ok in ComWrite() com write ABCD.... ok in ComRead() com write ABCD.... ok com write ABCD.... ok com ...…

查看全部问答>

DS18B20的温度检测

我用得是C8051F410,系统很简单,就是检测温度值不对,均为FF、FF,初始化有问题 希望各位朋友指点,软件用的keil 4 #include     //SFRdeclarations #include #include     // CH452常量定义 sbit LOAD=P1^4;  &nbs ...…

查看全部问答>

用Studio 5.0 Platform Builder编译出来的SDK怎么用?

编译出来的SDK只有5M不到,直接将msi文件运行安装之后,在建立一个简单的工程都编译不过。 一般一个标准SDK都有100M多的样子,为什么我自己编译出来的只有SDK只有几兆呢,哪位知道这个SDK到底是怎么用的,还要什么别的设置么,找MSDN,也没找到。 ...…

查看全部问答>