这个单片机程序详细什么意思?

这个程序讲的是一个振动检测仪,振动一定幅度后蜂鸣器会报警。

#include<reg52.h>

 #include<intrins.h>

 #define uchar unsigned char

 #define uint unsigned int

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

 sbit lcden=P2^6;//????

 sbit lcdrs=P2^4; //???????

 sbit w=P2^5;//?????

 sbit    SCL=P1^0; //IIC??????

sbit    SDA=P1^1; //IIC??????

sbit beep=P3^6;

sbit n=P2^3;

 uchar num,temp;

 void delay(uint z)

 {

  uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

 }

 void beep1()

 {

beep=!beep;

 _nop_();

 

 }

  void beep2()

 {

beep=!beep;

 delay(500);

 }

   void beep3()

 {

beep=!beep;

 delay(50);

 }

 

void write_com(uchar com)//?????

{

w=0;

lcdrs=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_data(uchar date)//?????

{

w=0;

lcdrs=1;

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void init()

{

write_com(0x38);//??16*2?? ,5*7??,8?????

write_com(0x0c);//???,????

write_com(0x06);//??????????????,?????,???????? ,???????

write_com(0x01);//??????,????

write_com(0x80+0x10);//?????

}

 

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;

    SDA = 1;                    //??????,??????,

    for (i=0; i<8; i++)         //8????

    {

        dat <<= 1;

        SCL = 1;                //?????

        Delay5us();             //??

        dat |= SDA;             //???               

        SCL = 0;                //?????

        Delay5us();             //??

    }

    return dat;

}

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

//?I2C??????????

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

void Single_WriteI2C(uchar REG_Address,uchar REG_data)

{

    I2C_Start();                  //????

    I2C_SendByte(SlaveAddress);   //??????+???

    I2C_SendByte(REG_Address);    //???????,

    I2C_SendByte(REG_data);       //???????,

    I2C_Stop();                   //??????

}

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

//?I2C??????????

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

uchar Single_ReadI2C(uchar REG_Address)

{

uchar REG_data;

I2C_Start();                   //????

I2C_SendByte(SlaveAddress);    //??????+???

I2C_SendByte(REG_Address);     //????????,?0??

I2C_Start();                   //????

I2C_SendByte(SlaveAddress+1);  //??????+???

REG_data=I2C_RecvByte();       //???????

I2C_SendACK(1);                //??????

I2C_Stop();                    //????

return REG_data;

}

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

//???MPU6050

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

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 show_x()

{

  int i;

float t;

i=GetData(ACCEL_XOUT_H); //X 16

i/=64;           //转换为10位数据

if(i<0)

   {

     i=-i;

//     DisplayOneChar(2,1,'-');      //???????

     write_com(0x83);

     write_data(0x2D);

   }

   else 

 {

   write_com(0x83);

   write_data(0x2B);

 }

   t=(float)i*3.9;

    if(t>800)

{

beep1();

}

else

beep=1;

    write_data((uint)t/1000+0x30);

    write_data(0x2e);

  write_data((uint)t%1000/100+0x30);

}

void show_y()

{

  int i;

float t;

i=GetData(ACCEL_YOUT_H); //X 16

i/=64;           //转换为10位数据

if(i<0)

   {

     i=-i;

//     DisplayOneChar(2,1,'-');      //???????

     write_com(0x85);

     write_data(0x2D);

   }

   else 

 {

   write_com(0x85);

   write_data(0x2B);

 }

    t=(float)i*3.9;

    write_data((uint)t/1000+0x30);

    write_data(0x2e);

  write_data((uint)t%1000/100+0x30);

}

void show_z()

{

  int i;

float t;

i=GetData(ACCEL_ZOUT_H); //X 16

i/=64;           //转换为10位数据

if(i<0)

   {

     i=-i;

//     DisplayOneChar(2,1,'-');      //???????

     write_com(0x8a);

     write_data(0x2D);

   }

   else 

 {

   write_com(0x8a);

   write_data(0x2B);

 }

    t=(float)i*3.9;

    write_data((uint)t/1000+0x30);

    write_data(0x2e);

  write_data((uint)t%1000/100+0x30);

}

void show_sx()

{

  int i;

float t;

i=GetData(GYRO_XOUT_H); //X 16

i/=64;           //转换为10位数据

if(i<0)

   {

     i=-i;

//     DisplayOneChar(2,1,'-');      //???????

     write_com(0x80+0x43);

     write_data(0x2D);  //-

   }

   else 

 {

   write_com(0x80+0x43);

   write_data(0x2B); //+

 }

  if(i>10)

 beep2();

 else

 beep=1;

 write_data(i/1000+0x30);

 write_data(i%100/10+0x30);

 write_data(i%10+0x30);

}

 

void show_sy()

{

  int i;

float t;

i=GetData(GYRO_YOUT_H); //X 16

i/=64;           //转换为10位数据

if(i<0)

   {

//     DisplayOneChar(2,1,'-');      //???????

  i=-i;

     write_com(0x80+0x45);

     write_data(0x2D);  //-

   }

   else 

 {

   write_com(0x80+0x45);

   write_data(0x2B); //+

 }

 write_data(i/1000+0x30);

 write_data(i%100/10+0x30);

 write_data(i%10+0x30);

}

void show_sz()

{

  int i;

float t;

i=GetData(GYRO_ZOUT_H); //X 16

i/=64;           //转换为10位数据

if(i<0)

   {

       i=-i;

//     DisplayOneChar(2,1,'-');      //???????

     write_com(0x80+0x4a);

     write_data(0x2D);  //-

   }

   else 

 {

   write_com(0x80+0x4a);

   write_data(0x2B); //+

 }

 

 write_data(i/100+0x30);

 write_data(i%100/10+0x30);

 write_data(i%10+0x30);

}

 

void main()

{

beep=1;

init();

InitMPU6050(); //???MPU6050

write_com(0x80);

write_data(0x67);

write_com(0x80+0x40);

write_data(0x77);

write_com(0x80+0x0A);

write_data('E');

while(1)

{

 

show_x();  //显示x加速度

// show_y();  //显示y加速度

// show_z();  //显示z加速度

show_sx();

//    show_sy();

// show_sz();

if(n==1)

{

beep=1;

  write_com(0x80+0x0c);

  write_data('0');

 

}

else

{

beep3();

 write_com(0x80+0x0c);

   write_data('1');

delay(100);

 

}

 

}

}

转载于:https://www.cnblogs.com/xiongboshiguoranduo/p/5274112.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值