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

发布者:Yuexiang888最新更新时间:2019-12-23 来源: 51hei关键字:VL53L0X  激光测距模块  单片机  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

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

[1] [2]
关键字:VL53L0X  激光测距模块  单片机  驱动程序 引用地址:VL53L0X激光测距模块的单片机驱动程序

上一篇:全自动洗衣机控制器设计的单片机代码
下一篇:单片机直流电机调速并显示的仿真与程序源码

推荐阅读最新更新时间:2024-11-21 04:47

低成本单片机系统的液晶显示器显示技术研究
  1.前言   随着电子技术的迅速发展,使得电子电路的设计日趋复杂,单片机因为具有高集成度、高稳定性和成本低廉等特点,因而在电子设计中得到越来越广泛的应用。   第一,使用数码显示管虽然成本低廉,但是显示内容非常有限且单一,不能满足越来越多的显示需求;第二,使用CRT或者彩色液晶显示器可以显示更多的内容,但是存在着设计复杂化、提高设计成本和浪费资源等弊端。因此,实际工作中迫切需要一种简单实用,成本低廉,设计简单的显示其产品。    2.基本原理   LC0811-SL由液晶显示器控制器和液晶显示器面板以及发光二极管背光三部分组成。其中液晶显示器显示控制器是整个显示器的核心部分。其内部结构图如图1所示。       2.1 电
[电源管理]
低成本<font color='red'>单片机</font>系统的液晶显示器显示技术研究
一种红外感应泵液器的单片机应用设计
摘要:红外微电脑自动泵液晶是21世纪一个实用的全新的小家电产品。它采用红外技术感应人手,由单片机控制出液量,具有抗干扰能力强、无误操作、省电节能等特点。 关键词:红外 泵液晶 单片机 随着许多日用新产品的出现,人们的生活水平和生活质量不断提高,同时,也逐渐改变了人们传统的生活方式。如液体香皂改变了人们用传统香皂洗手、洗澡、洗脸、洗碗的习惯。液体香皂可高效、安全去除和抑制95%以上有害细菌,特别适合医院和其他经常接触细菌源的行业人员,如银行及证券公司等有台工作人员。强力去污型可有效去除皮肤表层之重油污,并有除菌抗菌之效用,对皮肤无伤害,最适用于经常接触重油污的油田、煤矿、机修等工作人员手部肌肤的清洁养护。现在,各种清洁爽肤、营养
[单片机]
PIC单片机的类型以及特征介绍
对于pic单片机,大家或多或少均有所耳闻。但是,大家对pic单片机有多少了解呢?是否熟知不同类型的pic单片机呢? 由美国Microchip公司推出的PIC单片机系列产品,首先采用了RISC结构的嵌入式微控制器,其高速度、低电压、低功耗、大电流LCD驱动能力和低价位OTP技术等都体现出单片机产业的新趋势。现在PIC系列单片机在世界单片机市场的份额排名中已逐年升位,尤其在8位单片机市场,据称已从1990年的第20位上升到目前的第二位。PIC单片机从覆盖市场出发,已有三种(又称三层次)系列多种型号的产品问世,所以在全球都可以看到PIC单片机从电脑的外设、家电控制、电讯通信、智能仪器、汽车电子到金融电子各个领域的广泛应用。现今的PI
[单片机]
PIC<font color='red'>单片机</font>的类型以及特征介绍
STM8单片机按键检测电路设计
硬件环境采用STM8SF103,电压为3.3V。 电路需要注意的是STM8SF103这系列的IO作为输入口时只能是上拉输入和悬浮输入,虽然是弱上拉,在VCC为3.3V电压时,仍然能够被拉升至3.0V左右。 所以按键检测电路IO口一端需要接地,而不是外接上拉。悬浮方式下IO仍然会有0.89V左右电压,读取对应的IO寄存器IDR,仍然处于逻辑高电平状态。 软件代码相对很简单,只需要将IO口设置成上拉输入即可。采用轮询代码如下: //初始化只需要设置IO口模式即可。 GPIO_Init(KEY2_PORT,KEY2_PIN,GPIO_MODE_IN_PU_NO_IT);//上拉输入,不产生中断 //按键检测部分 /* #
[单片机]
STM8<font color='red'>单片机</font>按键检测电路设计
51单片机-流水灯
[单片机]
51<font color='red'>单片机</font>-流水灯
PIC单片机入门总结
1. 安装软件流程 1)安装mplab8.85 2)安装CCS_PCWHD_4.120 a) 双击Compiler目录下的pcwhdupd.exe安装编译器,按照提示安装了编译器之后在桌面上会有PIC C Compiler,这个图标,这就是C编译器。 b)把PIC C profiler挂到mplab上。方法:双击plugins目录下的setup_mplab_plugin.exe按照提示完全安装即可。 2. 建立工程方法(pic wizard) 3. 简单的一个io口控制源码 注意调试模式和下载程序模式 1) 对配置位要进行正确配置 例如: #device HIGH_
[单片机]
PIC<font color='red'>单片机</font>入门总结
电动自行车速度与里程表的设计
  从保护环境和经济条件许可等因素综合来看,电动自行车目前乃至今后都有着广阔的发展空间。目前市面上电动自行车的速度表和里程表都是机械的,看起来不够直观与方便。如果能用LED直接显示出来里程数或速度值,就可节省用户的时间及精力处理自行车行进过程中的突发事件。   本文介绍的速度与里程表设计以单片机和光电传感器为核心。传感器将不同车速转变成的不同频率的脉冲信号输入到单片机进行控制与计算,再采用LED模块进行显示,使得电动自行车的速度与里程数据能直观的显示给使用者。 系统概述   本系统由信号预处理电路、单片机AT89C2051、系统化LED显示模块、串口数据存储电路和系统软件组成。其中信号预处理电路包含信号放大、波形变换和波形整
[应用]
爱特梅尔推出面向高容量USB应用的8051微控制器
爱特梅尔公司 (Atmel Corporation) 宣布为其标准 8051 USB 微控制器系列新增三款ROM 器件,新器件与现有的闪存型款产品相辅相成,特别适合着重成本、灵活性要求不高、而代码不变的高容量应用。 全新的AT83C5134、AT83C5135 和AT83C5136器件以8051 X2 处理器核为基础,在6个时钟周期内执行一条指令,分别备有8Kb、16Kb和32Kb ROM代码存储器。此外,爱特梅尔还提供两种 32Kb 型款的产品AT83EC5136和AT83EI5136,分别具有512K 和32 Kb的EEPROM,适用于数据存储。这些产品都具有USB全速控制器、UART、SPI 和双线接口,可以轻易连接至共享
[新品]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved