- 打卡等级:常住居民III
- 打卡总天数:161
- 最近打卡:2025-05-01 18:53:09
已绑定手机
中级会员
- 积分
- 497
|
VL53L0X 激光测距
芯片 STC32G12K128
模拟IIC接口 可以移植到其它STC芯片 程序已经验证过来
#include <stdio.H>
#include <STC32G.H>
//--定义使用的IO口--//
#define I2C_SCL P15
#define I2C_SDA P14
unsigned char gbuf[11]; //存储缓存数据
unsigned int acnt ; //环境亮度
unsigned int scnt ; //信号强度
unsigned int dist ; //距离 MM
unsigned char DeviceRangeStatusInternal; //完成状态
void I2C_Delay10us()
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 81UL;
while (i) i--;
}
void I2C_Start()
{
I2C_SDA = 1;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us
I2C_SDA = 0;
I2C_Delay10us();//保持时间是>4us
I2C_SCL = 0;
I2C_Delay10us();
}
void I2C_Stop()
{
I2C_SDA = 0;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立时间大于4.7us
I2C_SDA = 1;
I2C_Delay10us();
}
unsigned char I2C_SendByte(unsigned char dat)
{
unsigned char a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。
for(a=0; a<8; a++)//要发送8位,从最高位开始
{
dat <<= 1;
I2C_SDA=CY;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立时间>4.7us
I2C_SCL = 0;
I2C_Delay10us();//时间大于4us
}
I2C_SCL = 1;
I2C_Delay10us();
CY=I2C_SDA;
I2C_SCL = 0;
I2C_Delay10us();
return CY;
}
unsigned char I2C_ReadByte()
{
unsigned char a = 0,dat = 0;
I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0
I2C_Delay10us();
for(a=0; a<8; a++)//接收8个字节
{
I2C_SCL = 1;
I2C_Delay10us();
dat <<= 1;
dat |= I2C_SDA;
I2C_Delay10us();
I2C_SCL = 0;
I2C_Delay10us();
}
return dat;
}
void vl53l0x_send(unsigned char reg,unsigned char dat)
{
I2C_Start();
I2C_SendByte(address);
I2C_SendByte(reg);
I2C_SendByte(dat);
I2C_Stop();
}
unsigned char vl53l0x_read(unsigned char reg)
{
unsigned char num;
I2C_Start();
I2C_SendByte(address); //发送写器件地址
I2C_SendByte(reg); //发送要读取的地址
I2C_Stop();
I2C_Start();
I2C_SendByte(address+1); //发送读器件地址
num=I2C_ReadByte(); //读取数据
I2C_Stop();
return num;
}
int makeuint16 (int lsb, int msb) //将两个8位整数lsb和msb合并成一个16位的无符号整数
{
return ((msb & 0xFF) << 8) | (lsb & 0xFF);
}
void date()
{
unsigned char val = 0;
int cnt = 0;
vl53l0x_send(VL53L0X_REG_SYSRANGE_START, 0x01);
while (cnt < 100)
{
I2C_Delay10us(); //延时
val = vl53l0x_read(VL53L0X_REG_RESULT_RANGE_STATUS);
if (val & 0x01) break;
cnt++;
}
gbuf[0]=vl53l0x_read(0x14);
gbuf[1]=vl53l0x_read(0x14+1);
gbuf[2]=vl53l0x_read(0x14+2);
gbuf[3]=vl53l0x_read(0x14+3);
gbuf[4]=vl53l0x_read(0x14+4);
gbuf[5]=vl53l0x_read(0x14+5);
gbuf[7]=vl53l0x_read(0x14+7);
gbuf[6]=vl53l0x_read(0x14+6);
gbuf[9]=vl53l0x_read(0x14+9);
gbuf[8]=vl53l0x_read(0x14+8);
gbuf[11]=vl53l0x_read(0x14+11);
gbuf[10]=vl53l0x_read(0x14+10);
acnt = makeuint16(gbuf[7], gbuf[6]); //环境亮度
scnt = makeuint16(gbuf[9], gbuf[8]); //信号强度
dist = makeuint16(gbuf[11], gbuf[10]); //距离 单位MM
DeviceRangeStatusInternal = ((gbuf[0] & 0x78) >> 3); //状态
}
|
1
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+1
楼主威武~
|