VL53L0X 激光测距
VL53L0X 激光测距芯片 STC32G12K128
模拟IIC接口可以移植到其它STC芯片程序已经验证过来
#include <stdio.H>
#include <STC32G.H>
//--定义使用的IO口--//
#define I2C_SCLP15
#define I2C_SDAP14
unsigned char gbuf; //存储缓存数据
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=vl53l0x_read(0x14);
gbuf=vl53l0x_read(0x14+1);
gbuf=vl53l0x_read(0x14+2);
gbuf=vl53l0x_read(0x14+3);
gbuf=vl53l0x_read(0x14+4);
gbuf=vl53l0x_read(0x14+5);
gbuf=vl53l0x_read(0x14+7);
gbuf=vl53l0x_read(0x14+6);
gbuf=vl53l0x_read(0x14+9);
gbuf=vl53l0x_read(0x14+8);
gbuf=vl53l0x_read(0x14+11);
gbuf=vl53l0x_read(0x14+10);
acnt = makeuint16(gbuf, gbuf); //环境亮度
scnt = makeuint16(gbuf, gbuf); //信号强度
dist = makeuint16(gbuf, gbuf); //距离 单位MM
DeviceRangeStatusInternal = ((gbuf & 0x78) >> 3);//状态
}
分享是一种快乐{:5_332:} VL53L0X_REG_SYSRANGE_START和VL53L0X_REG_RESULT_RANGE_STATUS这两个变量没有定义,也不知道数据类型和意义。期待楼主答疑一下。
address要定义为0x52
我在STC8G1K17上测试,
#define I2C_SCLP15
#define I2C_SDAP14
这两句要改成
sbit I2C_SCL = P3^2;
sbit I2C_SDA =P3^3;
测距范围能到多少 咫尺天涯 发表于 2024-4-17 22:14
测距范围能到多少
传感器有两种模式,高精度模式和长距离模式,长距离模式能到1米多点,高精度模式应该是0.8米左右吧 赞,感谢分享{:4_250:} 大大的赞{:4_250:} 晓飛飛 发表于 2024-4-17 22:21
传感器有两种模式,高精度模式和长距离模式,长距离模式能到1米多点,高精度模式应该是0.8米左右吧 ...
在一些场合够用了
页:
[1]