自己做的激光测距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;
上一篇:全自动洗衣机控制器设计的单片机代码
下一篇:单片机直流电机调速并显示的仿真与程序源码
推荐阅读最新更新时间:2024-11-21 04:47
设计资源 培训 开发板 精华推荐
- NV890101MWTXGEVB:固定频率单片降压开关稳压器评估板
- MC34063SMDBKGEVB:MC34063 无铅评估板
- 使用 LT1054ISW 3.5V 至 5V 稳压器的典型应用
- LT3091ER 线性稳压器的典型应用,使用较低值的 RSET 以实现较高的输出电压
- IP6515简易双路降压手机充电适配器无快充
- 有线鼠标键盘转无线鼠标键盘
- Demo_NAE12S20
- LTC3851IMSE-1、1.5V/15A 同步降压稳压器 (350kHz) 的典型应用电路
- 用于 P4080 QorIQ 电源架构处理器的 P4080DS-PC、P4080DS 开发系统
- 基于EG1163S的降压电源模块