找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1959|回复: 0
打印 上一主题 下一主题
收起左侧

这个MPU6050单片机程序如何修改为跌倒报警?

[复制链接]
跳转到指定楼层
楼主
ID:774259 发表于 2020-6-27 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
25黑币
帮忙把以下程序修改为一个用52单片机和MPU6050加蜂鸣器报警的跌倒报警装置


#include <regc.51.h>      
#include <math.h>    //Keil library  
#include <stdio.h>   //Keil library
#include <INTRINS.H>
typedef unsigned char  uchar;
typedef unsigned short ushort;
typedef unsigned int   uint;
sbit SCL=P1^0;  
sbit SDA=P1^1;   
sbit led1=P2^7;
sbit led2=P2^6;
#define SMPLRT_DIV  0x19
#define CONFIG   0x1A
#define GYRO_CONFIG  0x1B
#define ACCEL_CONFIG 0x1C
#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
#define WHO_AM_I  0x75
#define SlaveAddress 0xD0
uchar dis[4];      
int dis_data;     
int Acc_X;     
int Acc_Y;
int Acc_Z;
int Gyr_X;  
int Gyr_Y;
int Gyr_Z;
void  delay(unsigned int k);         
//MPU6050????
void  InitMPU6050();            
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);     
void  Single_WriteI2C(uchar REG_Address,uchar REG_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<k;i++)
{   
  for(j=0;j<121;j++);
}      
}
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_();
}
void I2C_Start()
{
    SDA = 1;                  
    SCL = 1;               
    Delay5us();               
    SDA = 0;   
    Delay5us();                 
    SCL = 0;                  
}
void I2C_Stop()
{
    SDA = 0;                  
    SCL = 1;                  
    Delay5us();                 
    SDA = 1;                  
    Delay5us();               
}
void I2C_SendACK(bit ack)
{
    SDA = ack;                  
    SCL = 1;                  
    Delay5us();               
    SCL = 0;               
    Delay5us();               
}
bit I2C_RecvACK()
{
    SCL = 1;               
    Delay5us();            
    CY = SDA;               
    SCL = 0;            
    Delay5us();            
    return CY;
}
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();
}
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;
}
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{
    I2C_Start();                 
    I2C_SendByte(SlaveAddress);  
    I2C_SendByte(REG_Address);   
    I2C_SendByte(REG_data);      
    I2C_Stop();                  
}
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;
}
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;  
}
void shuju()
{
Acc_X=GetData(ACCEL_XOUT_H);
Acc_Y=GetData(ACCEL_YOUT_H);
Acc_Z=GetData(ACCEL_ZOUT_H);
Gyr_X=GetData(GYRO_XOUT_H);  
Gyr_Y=GetData(GYRO_YOUT_H);  
Gyr_Z=GetData(GYRO_ZOUT_H);  
}
short ADXL345_Get_Angle(float x , float y , float z , uchar dir)
{
    float temp;
    float res=0;
    switch(dir)
    {
        case 0:
            temp=sqrt((x*x+y*y))/z;
            res=atan(temp);
            break;
        case 1:
            temp=x/sqrt((y*y+z*z));
            res=atan(temp);
            break;
        case 2:
            temp=y/sqrt((x*x+z*z));
            res=atan(temp);
            break;
    }
    return res*180/3.14;
}
void main()
{
delay(500);   
InitMPU6050();
while(1)
{
  shuju();
  if(3>ADXL345_Get_Angle(Acc_X,Acc_Y,Acc_Z,1)>-3)
  {
   led1=0;
   led2=0;
  }
  if(ADXL345_Get_Angle(Acc_X,Acc_Y,Acc_Z,1)<=-3)
  {
   led1=1;
   led2=0;
  }
  if(ADXL345_Get_Angle(Acc_X,Acc_Y,Acc_Z,1)>=3)
  {
   led1=0;
   led2=1;
  }

}
  
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表