×
单片机 > 单片机程序设计 > 详情

VL53L0X激光测距模块的单片机驱动程序

发布时间:2021-03-18 发布时间:
|

自己做的激光测距VL53L0X程序,拿出来和大家分享。这程序里面没有加显示设备,因为不知道大家要使用什么来显示,所以请根据个人情况来进行修改添加,但是附件里面的程序是我加上OLED后的程序
各位请按需使用。

单片机源程序如下:

#include

#include "intrins.h"

#define uchar unsigned char

#define uint unsigned int


#define VL53L0X_REG_IDENTIFICATION_MODEL_ID         0xc0

#define VL53L0X_REG_IDENTIFICATION_REVISION_ID      0xc2

#define VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD   0x50

#define VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD 0x70

#define VL53L0X_REG_SYSRANGE_START                  0x00

#define VL53L0X_REG_RESULT_INTERRUPT_STATUS         0x13

#define VL53L0X_REG_RESULT_RANGE_STATUS             0x14

#define address 0x52


sbit I2C_SCL = P1^3;

sbit I2C_SDA = P1^2;



void I2C_Delay10us();

void I2C_Start();

void I2C_Stop();

uchar I2C_SendByte(uchar dat);

uchar I2C_ReadByte();

//void I2C_SendACK(bit ack);

void vl53l0x_send(uchar reg,uchar dat);

uchar vl53l0x_read(uchar reg);

short makeuint16(int lsb, int msb);


uchar gbuf[16];

uint acnt ;

uint scnt;

uint dist ;

uchar DeviceRangeStatusInternal;


/*******************************************************************************

* 函 数 名         : Delay1ms()                //@11.0592MHz

* 函数功能                     : 延时

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void Delay1ms()                //@11.0592MHz

{

    unsigned char i, j;


    _nop_();

    i = 11;

    j = 190;

    do

    {

        while (--j);

    } while (--i);

}

/*******************************************************************************

* 函 数 名         : delay_ms(unsigned int time)

* 函数功能                     : 延时

* 输    入         : time

* 输    出         : 无

*******************************************************************************/

void delay_ms(unsigned int time)

{

    unsigned char

    i;

    for(i=1; i<=time; i++)

        Delay1ms();

}

/*******************************************************************************

* 函 数 名         : Delay1us()

* 函数功能                   : 延时

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void I2C_Delay10us()

{

    unsigned char i;


    _nop_();

    _nop_();

    _nop_();

    i = 24;

    while (--i);

}

/*******************************************************************************

* 函 数 名         : I2C_Start()

* 函数功能                   : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿

* 输    入         : 无

* 输    出         : 无

* 备    注         : 起始之后I2C_SDA和I2C_SCL都为0

*******************************************************************************/

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();

}

/*******************************************************************************

* 函 数 名           : I2C_Stop()

* 函数功能                 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿

* 输    入           : 无

* 输    出                  : 无

* 备    注           : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲

*******************************************************************************/

void I2C_Stop()

{

    I2C_SDA = 0;

    I2C_Delay10us();

    I2C_SCL = 1;

    I2C_Delay10us();//建立时间大于4.7us

    I2C_SDA = 1;

    I2C_Delay10us();

}

/*******************************************************************************

* 函 数 名           : I2cSendByte(uchar num)

* 函数功能                  : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,

*                    * 保持发送信号I2C_SDA保持稳定

* 输    入           : num ,ack

* 输    出                  : 0或1。发送成功返回1,发送失败返回0

* 备    注           : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0

*******************************************************************************/

uchar I2C_SendByte(uchar dat)

{

    uchar 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_SDA = 1;

    //I2C_Delay10us();

    I2C_SCL = 1;

    I2C_Delay10us();

    CY=I2C_SDA;

    I2C_SCL = 0;

    I2C_Delay10us();

    return CY;

}

/*******************************************************************************

* 函 数 名           : I2cReadByte()

* 函数功能                     : 使用I2c读取一个字节

* 输    入           : 无

* 输    出                  : dat

* 备    注           : 接收完一个字节I2C_SCL=0

*******************************************************************************/

uchar I2C_ReadByte()

{

    uchar 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;

}

/*******************************************************************************

* 函 数 名           : vl53l0x_send(uchar reg,uchar dat)

* 函数功能                     : 使用I2c向vl530xl发送命令

* 输    入           : reg,dat

* 输    出                  : 无

*******************************************************************************/

void vl53l0x_send(uchar reg,uchar dat)

{

    I2C_Start();

    I2C_SendByte(address);

    I2C_SendByte(reg);

    I2C_SendByte(dat);

    I2C_Stop();

}

/*******************************************************************************

* 函 数 名           : vl53l0x_read(uchar reg)

* 函数功能                     : 使用I2c向vl530x0l读取一个字节

* 输    入           : reg

* 输    出                  : num

*******************************************************************************/

uchar vl53l0x_read(uchar 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;

}

/*******************************************************************************

* 函 数 名           :  makeuint16(int lsb, int msb)

* 函数功能 : 将读出数据


关键字:VL53L0X  激光测距模块  单片机  驱动程序

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析