久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3017|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī) MPU6050程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:284667 發(fā)表于 2018-11-15 21:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

#include <reg52.h>//頭文件
#include <intrins.h>//頭文件
#include <math.h>    //Keil library
#include <stdio.h>   //Keil library
#define uchar unsigned char//宏定義
#define uint unsigned int//宏定義
#define ushort unsigned short
sbit LCM_EN = P3^4;//使能信號端
sbit LCM_RS = P3^5;//寫數(shù)據(jù)/命令選擇端
sbit LCM_RW = P3^6;//讀寫選擇端
sbit SCL=P1^6;//IIC時鐘引腳定義
sbit SDA=P1^5;//IIC數(shù)據(jù)引腳定義
sbit ECHO = P2^1;//超聲波測距模塊信號接收端
sbit TRIG = P2^0;//超聲波測距模塊信號發(fā)送端
//sbit beep = P2^3;//蜂鳴器
//sbit D1 = P1^0;//LED
sbit key = P3^0;
sbit key1 = P3^1;
uint time = 0;//定義時間
unsigned long  S = 0;//定義距離
bit flag = 0;//設(shè)置標(biāo)志位
disdat[4] = {0,0,0,0}; //初始化顯示內(nèi)容
uchar code table [] = {"Distance display"};//顯示內(nèi)容
#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地址寄存器(默認(rèn)數(shù)值0x68,只讀)
#define        SlaveAddress        0xD0        //IIC寫入時的地址字節(jié)數(shù)據(jù),+1為讀取
#define DataPort P0                //LCD1602數(shù)據(jù)端口
//****************************************
//定義類型及變量
//****************************************
uchar dis[4];                                                        //顯示數(shù)字(-511至512)的字符數(shù)組
int        dis_data;                                                //變量
//int        Temperature,Temp_h,Temp_l;        //溫度及高低位數(shù)據(jù)
//****************************************
//函數(shù)聲明
//****************************************
void  delay(unsigned int k);                                                                                //延時
//LCD相關(guān)函數(shù)
void  InitLcd();                                                                                                                //初始化lcd1602
void  lcd_printf(uchar *s,int temp_data);
void  WriteDataLCM(uchar dataW);                                                                        //LCD數(shù)據(jù)
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操作函數(shù)
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數(shù)據(jù)
void  Single_WriteI2C(uchar REG_Address,uchar REG_data);        //向I2C寫入數(shù)據(jù)

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;     //取余運(yùn)算
        *++s =temp_data/10+0x30;
        temp_data=temp_data%10;      //取余運(yùn)算
        *++s =temp_data+0x30;
}

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寫入數(shù)據(jù)
//****************************************
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)
{
        uchar ListLength=0;
        Y&=0x1;
        X&=0xF;
        while(L--)
        {
                DisplayOneChar(X,Y,DData[ListLength]);
                ListLength++;
                X++;
        }
}
//**************************************
//延時5微秒(STC90C52RC@12M)
//不同的工作環(huán)境,需要調(diào)整此函數(shù)
//當(dāng)改用1T的MCU時,請調(diào)整此延時函數(shù)
//**************************************
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;                    //拉高數(shù)據(jù)線
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SDA = 0;                    //產(chǎn)生下降沿
    Delay5us();                 //延時
    SCL = 0;                    //拉低時鐘線
}
//**************************************
//I2C停止信號
//**************************************
void I2C_Stop()
{
    SDA = 0;                    //拉低數(shù)據(jù)線
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SDA = 1;                    //產(chǎn)生上升沿
    Delay5us();                 //延時
}
//**************************************
//I2C發(fā)送應(yīng)答信號
//入口參數(shù):ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(bit ack)
{
    SDA = ack;                  //寫應(yīng)答信號
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SCL = 0;                    //拉低時鐘線
    Delay5us();                 //延時
}
//**************************************
//I2C接收應(yīng)答信號
//**************************************
bit I2C_RecvACK()
{
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    CY = SDA;                   //讀應(yīng)答信號
    SCL = 0;                    //拉低時鐘線
    Delay5us();                 //延時
    return CY;
}
//**************************************
//向I2C總線發(fā)送一個字節(jié)數(shù)據(jù)
//**************************************
void I2C_SendByte(uchar dat)
{
    uchar i;
    for (i=0; i<8; i++)         //8位計數(shù)器
    {
        dat <<= 1;              //移出數(shù)據(jù)的最高位
        SDA = CY;               //送數(shù)據(jù)口
        SCL = 1;                //拉高時鐘線
        Delay5us();             //延時
        SCL = 0;                //拉低時鐘線
        Delay5us();             //延時
    }
    I2C_RecvACK();
}
//**************************************
//從I2C總線接收一個字節(jié)數(shù)據(jù)
//**************************************
uchar I2C_RecvByte()
{
    uchar i;
    uchar dat = 0;
    SDA = 1;                    //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
    for (i=0; i<8; i++)         //8位計數(shù)器
    {
        dat <<= 1;
        SCL = 1;                //拉高時鐘線
        Delay5us();             //延時
        dat |= SDA;             //讀數(shù)據(jù)
        SCL = 0;                //拉低時鐘線
        Delay5us();             //延時
    }
    return dat;
}
//**************************************
//向I2C設(shè)備寫入一個字節(jié)數(shù)據(jù)
//**************************************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{
    I2C_Start();                  //起始信號
    I2C_SendByte(SlaveAddress);   //發(fā)送設(shè)備地址+寫信號
    I2C_SendByte(REG_Address);    //內(nèi)部寄存器地址,
    I2C_SendByte(REG_data);       //內(nèi)部寄存器數(shù)據(jù),
    I2C_Stop();                   //發(fā)送停止信號
}
//**************************************
//從I2C設(shè)備讀取一個字節(jié)數(shù)據(jù)
//**************************************
uchar Single_ReadI2C(uchar REG_Address)
{
        uchar REG_data;
        I2C_Start();                   //起始信號
        I2C_SendByte(SlaveAddress);    //發(fā)送設(shè)備地址+寫信號
        I2C_SendByte(REG_Address);     //發(fā)送存儲單元地址,從0開始
        I2C_Start();                   //起始信號
        I2C_SendByte(SlaveAddress+1);  //發(fā)送設(shè)備地址+讀信號
        REG_data=I2C_RecvByte();       //讀出寄存器數(shù)據(jù)
        I2C_SendACK(1);                //接收應(yīng)答信號
        I2C_Stop();                    //停止信號
        return REG_data;
}
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050()
{
        Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠狀態(tài)
        Single_WriteI2C(SMPLRT_DIV, 0x07);
        Single_WriteI2C(CONFIG, 0x06);
        Single_WriteI2C(GYRO_CONFIG, 0x18);
        Single_WriteI2C(ACCEL_CONFIG, 0x01);
}
//**************************************
//合成數(shù)據(jù)
//**************************************
int GetData(uchar REG_Address)
{
        char H,L;
        H=Single_ReadI2C(REG_Address);
        L=Single_ReadI2C(REG_Address+1);
        return (H<<8)+L;   //合成數(shù)據(jù)
}
//**************************************
//在1602上顯示10位數(shù)據(jù)
//**************************************
void Display10BitData(int value,uchar x,uchar y)
{
        value/=64;                                                        //轉(zhuǎn)換為10位數(shù)據(jù)
        lcd_printf(dis, value);                        //轉(zhuǎn)換數(shù)據(jù)顯示
        DisplayListChar(x,y,dis,4);        //啟始列,行,顯示數(shù)組,顯示長度
}
//**************************************
//顯示溫度
//**************************************
//void display_temp()
//{
//        Temp_h=Single_ReadI2C(TEMP_OUT_H); //讀取溫度
//        Temp_l=Single_ReadI2C(TEMP_OUT_L); //讀取溫度
//        Temperature=Temp_h<<8|Temp_l;     //合成溫度
//        Temperature = 35+ ((double) (Temperature + 13200)) / 280; // 計算出溫度
//        lcd_printf(dis,Temperature);     //轉(zhuǎn)換數(shù)據(jù)顯示
//        DisplayListChar(11,1,dis,4);     //啟始列,行,顯示數(shù)組,顯示位數(shù)
//}

void delay(uint z) //延時子程序
{
  uint x,y;
  for(x = z;x > 0;x--)
     for(y = 110;y > 0;y--);
}
void write_com(uchar com)//定義一個帶參數(shù)的寫命令子程序
{
LCM_RS = 0; //1602的rs為0時,接收命令,為1時接收數(shù)據(jù)
P0 = com;//把void write_com(uchar com)中的COM中的數(shù)據(jù)給P0口
delay(5);//延時
LCM_EN = 1;//使能端為高脈沖
delay(5);//延時
LCM_EN = 0;//低脈沖
delay(5);//延時
}
void write_shu(uchar shu)//定義一個帶參數(shù)的寫數(shù)據(jù)子程序
{
LCM_RS = 1; //1602的rs為0時,接收命令,為1時接收數(shù)據(jù)
P0 = shu;//把void write_shu(uchar shu)中的COM中的數(shù)據(jù)給P0口
delay(5);//延時
LCM_EN = 1;
delay(5);//延時
LCM_EN = 0;
delay(5);//延時
}
void write_1602(uchar add,uchar dat)//1602顯示程序
{
write_com(0x80 + 0x40 + add);
write_shu(dat);
}

void display ()
{
    uchar a;
    write_com(0x80);
        delay(20);
        for(a=0;a<18;a++)
        {
        write_shu(table[a]);
        delay(20);               
        }
}

void init()//定義一個初始化子程序
{
LCM_EN = 0;
LCM_RW = 0;
write_com(0x38);//調(diào)用 write_com子程序并把0x38賦給P0口,顯示模式打開
delay(2);//延時
write_com(0x0c);//調(diào)用 write_com子程序并把“開顯示,顯示光標(biāo),光標(biāo)不閃爍”指令碼賦給P0口
write_com(0x06);//調(diào)用 write_com子程序并把“地址指針加1,整屏不移動”指令碼賦給P0口
write_com(0x80);//數(shù)據(jù)指針初始化,讓指針指向最左端,顯示從第一行開始
write_com(0x01);//調(diào)用 write_com子程序并把"清零指"令碼賦給P0口
display ();
}
void Conut()//計算函數(shù)  厘米
{
  time = TH0*256+TL0;//時間
  TH0 = 0;//TH0初始化
  TL0 = 0;//TL0初始化

  //S=(time*1.7)/100;
   S = time/58;     //算出來是CM
   disdat[0] = S % 1000 / 100;
   disdat[1] = S % 1000 % 100 / 10;
   disdat[2] = S % 1000 % 10 % 10;
   write_1602(1, disdat[0] + 0x30);
   write_1602(2, disdat[1] + 0x30);
   write_1602(3, disdat[2] + 0x30);
   write_1602(4,'.');
   write_1602(5, disdat[3] + 0x30);
   write_1602(6, 'C');
   write_1602(7, 'm');
   
}

/*void Conut1() //計算函數(shù)  毫米
{
  time = TH0*256+TL0;
  TH0 = 0;
  TL0 = 0;

  //S=(time*1.7)/100;
   S = (time/5.8);//
   disdat[0] = S / 1000;
   disdat[1] = S % 1000 / 100;
   disdat[2] = S % 1000 % 100 / 10;
   disdat[3] = S % 1000 %100 % 10;
   write_1602(1, disdat[0] + 0x30);
   write_1602(2, disdat[1] + 0x30);
   write_1602(3, disdat[2] + 0x30);
   write_1602(4, disdat[3] + 0x30);
   write_1602(5, 'm');
   write_1602(6, 'm');
   
}*/
void zd0() interrupt 1  //T0中斷
{
  flag = 1;//中斷溢出標(biāo)志
}

void  StartModule()   //啟動模塊
  {
   TRIG = 1; //啟動一次模塊
   _nop_();  _nop_();    _nop_();    _nop_();    _nop_();//微秒級延時
   _nop_();   _nop_();    _nop_();    _nop_();   _nop_();
   _nop_();   _nop_();    _nop_();   _nop_();   _nop_();
   _nop_();   _nop_();   _nop_();   _nop_();   _nop_();
   _nop_();
   TRIG = 0; //關(guān)閉模塊
  }

void main ()//主函數(shù)
{
  
    if(key == 0)//判斷S2是否按鍵
                 {
                        delay(5);//軟件延時
                        if(key == 0)
                        {
                               
                                delay(400); //啟動等待,等LCD講入工作狀態(tài)
                init(); //LCD初始化
                TMOD = 0x01;//設(shè)T0為方式1,GATE=1;
                TH0 = 0;//TH0重新賦值
                TL0 = 0;//TL0重新賦值         
                ET0 = 1; //允許T0中斷
                EA = 1;//開啟總中斷   

                while(1)
                 {                               
                   StartModule();
                   while(!ECHO);  //當(dāng)RX為零時等待
                   TR0 = 1;       //開啟計數(shù)
                   while(ECHO);   //當(dāng)RX為1計數(shù)并等待
                   TR0 = 0;    //關(guān)閉計數(shù)
                   Conut();   //計算
                   delay(20);
                       if (S < 10)//警報設(shè)置
                         {
                               //beep = 1; //蜂鳴器工作
                                           delay (1);
                                           //beep = 0;
                               //D1 = 0; //LED亮起
                             }
                        else
                         {
                               //beep = 1;
                               //D1 = 1;
                             }
                      }
                            while(!key);        //松手檢測
                     }
                   }

                if (key1 == 0)//判斷S2是否按鍵
                {
                    
                        delay(5);//軟件延時
                        if(key1 == 0)
                        {
                        delay(500);                //上電延時
                 InitLcd();                //液晶初始化
                 InitMPU6050();        //初始化MPU6050
                delay(150);
                  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);        //顯示Z軸加速度
                       Display10BitData(GetData(GYRO_XOUT_H),2,1);        //顯示X軸角速度
                       Display10BitData(GetData(GYRO_YOUT_H),7,1);        //顯示Y軸角速度
                       Display10BitData(GetData(GYRO_ZOUT_H),12,1);        //顯示Z軸角速度
                       delay(500);
                }
                            
                                /*delay(400); //啟動等待,等LCD講入工作狀態(tài)
                init(); //LCD初始化
                TMOD = 0x01;//設(shè)T0為方式1,GATE=1;
                TH0 = 0;
                TL0 = 0;         
                ET0 = 1; //允許T0中斷
                EA = 1;//開啟總中斷   

                while(1)
                 {
                   StartModule();//啟動模塊
                   while(!ECHO);//當(dāng)RX為零時等待
                   TR0 = 1;//開啟計數(shù)
                   while(ECHO);//當(dāng)RX為1計數(shù)并等待
                   TR0 = 0;//關(guān)閉計數(shù)
                   Conut1();//計算
                   delay(20);
                       if (S < 100)//警報設(shè)置
                        {
                              //beep = 1;
                                          delay (1);
                                          //beep = 0;
                              D1 = 0;
                            }
                       else
                        {
                              //beep = 1;
                                          delay (10);
                                          //beep = 0;
                              D1 = 1;
                            }
          
                }*/
                        }
                        while(!key1);        //松手檢測
                }
}

/*該超聲波程序中,利用了串口通信原理,1602液晶顯示,蜂鳴器,LED;

   在超聲波模塊工作時,當(dāng)RX為0時,*/

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久综合| aaa国产大片| 毛片网在线观看 | 羞羞视频免费在线 | 亚洲欧美日韩激情 | 亚洲一区二区在线免费观看 | 男插女下体视频 | 午夜视频一区 | 成人在线一区二区 | 国产黄色在线观看 | www.中文字幕av | av毛片在线免费观看 | 国产目拍亚洲精品99久久精品 | 久久不卡视频 | 日本黄色不卡视频 | 成人激情视频在线 | 成人欧美一区二区三区1314 | 国产www.| 久久国产日韩欧美 | 国产精品一区二区视频 | 一区二区在线 | 日本一区二区三区四区 | 婷婷在线免费 | h在线免费观看 | 综合久久亚洲 | 国产精品精品久久久 | 亚洲h在线观看 | 中文久久 | 国产中文一区二区三区 | av在线免费观看网站 | 日本在线视频一区二区 | 黄网站色大毛片 | 国产98色在线 | 日韩 | 亚洲欧美精 | 一区二区三区中文字幕 | 艹逼网| 国产精品久久99 | 毛片综合 | 黑人巨大精品 | 欧美视频成人 | 性视频一区 |