这个单片机程序详细什么意思?
这个程序讲的是一个振动检测仪,振动一定幅度后蜂鸣器会报警。
#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);
}
}
}