历史上的今天
返回首页

历史上的今天

今天是:2024年12月23日(星期一)

正在发生

2019年12月23日 | VL53L0X激光测距模块的单片机驱动程序

2019-12-23 来源:51hei

自己做的激光测距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)

* 函数功能                       :  将读出数据转换到数组当中

* 输    入           : lsb,msb

* 输    出                  : dat

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

short makeuint16(int lsb, int msb) 

{

    return ((msb & 0xFF) << 8) | (lsb & 0xFF);

}

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

* 函 数 名           :  date()

* 函数功能                       :  进行数据的读取与转换,将数据处理

* 输    入           : 无

* 输    出                  : dist

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

unsigned char date()

{

        uchar val = 0;        

//        uchar vall;

        int cnt = 0;

推荐阅读

史海拾趣

Echelon公司的发展小趣事

进入21世纪后,Echelon在智能楼宇领域取得了重大突破。公司凭借其先进的LonWorks技术和能源管理服务方案,成功为多个大型楼宇提供了智能化的能源管理解决方案。这些解决方案不仅提高了楼宇的能源利用效率,还降低了运行成本,赢得了客户的广泛赞誉。Echelon在智能楼宇领域的成功,进一步巩固了其在能源管理市场的领先地位。

Hirose Electric公司的发展小趣事

在激烈的市场竞争中,Echelon始终保持对技术的热情和追求。公司不断投入研发资源,对LonWorks技术进行升级和优化,推出了一系列创新的产品和服务。这些新产品和服务不仅提升了Echelon的市场竞争力,还为客户带来了更加高效、便捷的能源管理体验。同时,Echelon还积极与其他科技公司合作,共同研发新技术、新产品,推动整个行业的发展。

Components Corporation公司的发展小趣事

在激烈的市场竞争中,Echelon始终保持对技术的热情和追求。公司不断投入研发资源,对LonWorks技术进行升级和优化,推出了一系列创新的产品和服务。这些新产品和服务不仅提升了Echelon的市场竞争力,还为客户带来了更加高效、便捷的能源管理体验。同时,Echelon还积极与其他科技公司合作,共同研发新技术、新产品,推动整个行业的发展。

Franel Corp公司的发展小趣事

为了更好地服务中国市场,法勒公司不断优化其供应链和生产布局。近年来,法勒加大了在国内的投资力度,建设了现代化的生产基地和研发中心。通过本土化生产,法勒不仅降低了产品成本,还缩短了交货周期,提高了市场响应速度。同时,法勒还积极与本土供应商建立紧密的合作关系,共同构建了一个高效、稳定的供应链体系。

全鹏(CHAMPION)公司的发展小趣事

随着电子商务的快速发展,全鹏公司也积极拥抱这一趋势。自2010年起,全鹏公司成立了电子商务零售部门,并与国内知名电商平台建立了长期战略合作关系。通过线上销售过季产品和折扣商品,全鹏公司的电商业务迅速增长,成为其新的增长点。同时,全鹏公司还不断优化电商平台的运营和管理,提升客户服务质量,为客户提供更加便捷、高效的购物体验。

以上五个故事基于全鹏公司在电子行业的发展历程和成就进行虚构,旨在展示全鹏公司在市场拓展、品牌建设、质量管理、研发创新和电商业务等方面的努力和成果。

联智(Celfras)公司的发展小趣事

联智的半导体集成电路芯片研发及产业化项目是其发展历程中的又一重要里程碑。该项目总投资高达20亿元,分两期建设。一期项目将建设半导体集成电路模拟芯片封测生产线,预计年产量可达1.5亿颗。二期项目将研发更高功率有线无线融合一体化电源管理芯片和新一代A4WP远距离无线充电芯,同时布局物联网IoT芯片市场。这一项目的实施将进一步提升联智的技术实力和市场竞争力。

问答坊 | AI 解惑

Verilog设计的求复角的源代码(通过仿真验证的)

Verilog设计的求复角的源代码(通过仿真验证的)…

查看全部问答>

关于FPGA的AD转换有人做过么?

我用的是AD0804,按时序图写出的状态机程序,但是在数码管老是无法正常显示,数字不是老跳就是定在一个值不动,我让其每隔0.5秒就转换一次 always@(posedge clk) if(sw) begin cs…

查看全部问答>

关于pci类芯片寄存器读写问题。

各位好! 问题描述如下: 寄存器:base address register0 1 先对其连续几次读; a  Value c8501093 b  Value 10 c  Value c8501093 d  Value 10 e  Value c8501093 f  Value ...…

查看全部问答>

RS232\RS485

使用串口进行通信的时候,要设置哪些参数呢?除了波特率、数据位、校验位、停止位外。 串口的通信中的缓冲区在那里?怎么设置这些缓冲区的大小? 什么时候需要用到流控制呢?流控制有什么作用? 先谢谢各位大侠了~…

查看全部问答>

c8051f单片机使用经验总结

c8051f单片机是在MCS51单片机基础上发展起来的,既有继承,又有很大的创新。按照功能可分为专用 型和通用型。专用型:100MHz高速型的如f120芯片;24位高分辨率AD的如f350芯片;带usb功能的芯片如f320和f340;超低功耗的芯片如f410;还有带CAN总 ...…

查看全部问答>

一个二进制转BCD的问题,请大家分析

把一个二进制转成BCD码,使用逻辑分析仪抓的数据,输入的数据最大为189975,加个60000后最大249975,平时这个数据是不断变化的,最大会有正负1000左右的跳动。现在的问题是:假如输入为100000,那么正确的输出应该是1、6、0,让我想不明白的是,最 ...…

查看全部问答>

单片机资料下载

自己所有单片机的示例代码 方便大家下载…

查看全部问答>

SRAM读写

各位 有没有知道为什么我的sram写完数之后再度数时读出的是FFH 各位 有没有知道为什么我的sram写完数之后再度数时读出的是FFH 各位 有没有知道为什么我的sram写完数之后再度数时读出的是FFH各位 有没有人知道为什么我的sram写 ...…

查看全部问答>

求助图像传感器

现在的摄像机出来的都是模拟信号,有没有一种出来是数字信号的?因为摄像机本来就是由数字信号转变为模拟信号,我要采集的是数字信号,这样就又绕了一个圈,再求数字信号。有没有出来数字信号的摄像机?求助!!谢谢!!…

查看全部问答>

基于BeagleBone的内存性能测试

作者:chenzhufly QQ:36886052 ( 转载请注明出处) 好久没发心得了,最近有些忙,进展还是可以的,一直没有记录而已。曾经有人说你如何保证测试的正确性,这个确实很难以回答。所以我会采用一些开放的工具,得到一些大家在同等条件下得到的一些测 ...…

查看全部问答>