fanpu 发表于 2024-4-2 14:12:59

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);//状态

}

国学芯用 发表于 2024-4-2 14:39:16

分享是一种快乐{:5_332:}

karlman 发表于 2024-4-4 14:11:59

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:04

测距范围能到多少

晓飛飛 发表于 2024-4-17 22:21:50

咫尺天涯 发表于 2024-4-17 22:14
测距范围能到多少

传感器有两种模式,高精度模式和长距离模式,长距离模式能到1米多点,高精度模式应该是0.8米左右吧

小涵子爸爸 发表于 2024-4-18 08:03:22

赞,感谢分享{:4_250:}

小飞侠 发表于 2024-4-18 08:52:47

大大的赞{:4_250:}

咫尺天涯 发表于 2024-4-18 18:56:29

晓飛飛 发表于 2024-4-17 22:21
传感器有两种模式,高精度模式和长距离模式,长距离模式能到1米多点,高精度模式应该是0.8米左右吧 ...

在一些场合够用了
页: [1]
查看完整版本: VL53L0X 激光测距