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

VL53L0X 激光测距

[复制链接]
  • TA的每日心情
    开心
    4 天前
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    32

    回帖

    113

    积分

    注册会员

    积分
    113
    发表于 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 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-24 09:28
  • 签到天数: 90 天

    [LV.6]常住居民II

    68

    主题

    569

    回帖

    1854

    积分

    超级版主

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

    使用道具 举报

  • TA的每日心情
    郁闷
    2024-4-23 23:33
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    1

    主题

    4

    回帖

    67

    积分

    注册会员

    积分
    67
    发表于 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;
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 51 天

    [LV.5]常住居民I

    2

    主题

    148

    回帖

    191

    积分

    注册会员

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:04
  • 签到天数: 85 天

    [LV.6]常住居民II

    13

    主题

    325

    回帖

    740

    积分

    荣誉版主

    热心市民

    积分
    740
    发表于 2024-4-17 22:21:50 | 显示全部楼层

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 06:34
  • 签到天数: 141 天

    [LV.7]常住居民III

    0

    主题

    393

    回帖

    398

    积分

    中级会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 02:02
  • 签到天数: 68 天

    [LV.6]常住居民II

    4

    主题

    414

    回帖

    1122

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 51 天

    [LV.5]常住居民I

    2

    主题

    148

    回帖

    191

    积分

    注册会员

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-3 08:03 , Processed in 0.067745 second(s), 58 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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