自己做的激光测距VL53L0X程序,拿出来和大家分享。这程序里面没有加显示设备,因为不知道大家要使用什么来显示,所以请根据个人情况来进行修改添加,但是附件里面的程序是我加上OLED后的程序
各位请按需使用。
单片机源程序如下:
- #include <REGX51.H>
- #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;
- vl53l0x_send(VL53L0X_REG_SYSRANGE_START, 0x01);
- while (cnt < 100) ///检测数据是否传输正常
- {
- delay_ms(10);
- val = vl53l0x_read(VL53L0X_REG_RESULT_RANGE_STATUS);
- if (val & 0x01) break;
- cnt++;
- }
- gbuf[0]=vl53l0x_read(0x14);
- gbuf[7]=vl53l0x_read(0x14+7);
- gbuf[6]=vl53l0x_read(0x14+6);
- gbuf[9]=vl53l0x_read(0x14+9);
- gbuf[8]=vl53l0x_read(0x14+8);
- gbuf[11]=vl53l0x_read(0x14+11);
- gbuf[10]=vl53l0x_read(0x14+10);
- acnt = makeuint16(gbuf[7], gbuf[6]);
- scnt = makeuint16(gbuf[9], gbuf[8]);
- dist = makeuint16(gbuf[11], gbuf[10]);
- // DeviceRangeStatusInternal = ((gbuf[0] & 0x78) >> 3);
- // if(DeviceRangeStatusInternal==11&&dist>20&&dist<1200)
- // {
- // vall=dist/10000;
- // OLED_dan(8*0,0,vall+16);
- // vall=dist%10000/1000;
- // OLED_dan(8*1,0,vall+16);
- // vall=dist%1000/100;
- // OLED_dan(8*2,0,vall+16);
- // vall=dist%100/10;
- // OLED_dan(8*3,0,vall+16);
- // vall=dist%10/1;
- // OLED_dan(8*4,0,vall+16);
- // }
- return dist; //该数组为五位
- }
- void main()
- {
- while(1)
- {
- date();
- }
- }
复制代码 全部资料51hei下载地址:
VL530X0L激光测距.zip
(108.48 KB, 下载次数: 621)
|