自己做的激光测距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)
* 函数功能 : 将读出数据
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』