找回密码
 立即注册
查看: 700|回复: 7

VL53L0X 激光测距

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-05-01 18:53:09
已绑定手机

10

主题

42

回帖

497

积分

中级会员

积分
497
发表于 2024-4-2 14:12:59 | 显示全部楼层 |阅读模式
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 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 2024-4-2 14:39:16 | 显示全部楼层
分享是一种快乐{:5_332:}
热线19952583534
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:40
  • 最近打卡:2025-02-15 01:13:47

2

主题

15

回帖

260

积分

中级会员

积分
260
发表于 2024-4-4 14:11:59 | 显示全部楼层
VL53L0X_REG_SYSRANGE_START和VL53L0X_REG_RESULT_RANGE_STATUS这两个变量没有定义,也不知道数据类型和意义。期待楼主答疑一下。

address要定义为0x52
我在STC8G1K17上测试,
#define I2C_SCL  P15
#define I2C_SDA  P14
这两句要改成
sbit I2C_SCL = P3^2;
sbit I2C_SDA =  P3^3;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:246
  • 最近打卡:2025-04-30 10:10:32

3

主题

155

回帖

537

积分

高级会员

积分
537
发表于 2024-4-17 22:14:04 | 显示全部楼层
测距范围能到多少
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-4-17 22:21:50 | 显示全部楼层
咫尺*** 发表于 2024-4-17 22:14
测距范围能到多少

传感器有两种模式,高精度模式和长距离模式,长距离模式能到1米多点,高精度模式应该是0.8米左右吧
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:502
  • 最近打卡:2025-05-01 08:01:38
已绑定手机

1

主题

833

回帖

1441

积分

金牌会员

积分
1441
发表于 2024-4-18 08:03:22 | 显示全部楼层
赞,感谢分享
靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:394
  • 最近打卡:2025-05-01 03:26:07

16

主题

702

回帖

2470

积分

金牌会员

积分
2470
发表于 2024-4-18 08:52:47 | 显示全部楼层
大大的赞
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:246
  • 最近打卡:2025-04-30 10:10:32

3

主题

155

回帖

537

积分

高级会员

积分
537
发表于 2024-4-18 18:56:29 | 显示全部楼层
晓*** 发表于 2024-4-17 22:21
传感器有两种模式,高精度模式和长距离模式,长距离模式能到1米多点,高精度模式应该是0.8米左右吧 ...

在一些场合够用了
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:26 , Processed in 0.143197 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表