|
自己做的激光測距VL53L0X程序,拿出來和大家分享。這程序里面沒有加顯示設(shè)備,因為不知道大家要使用什么來顯示,所以請根據(jù)個人情況來進行修改添加,但是附件里面的程序是我加上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;
- /*******************************************************************************
- * 函 數(shù) 名 : Delay1ms() //@11.0592MHz
- * 函數(shù)功能 : 延時
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Delay1ms() //@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : delay_ms(unsigned int time)
- * 函數(shù)功能 : 延時
- * 輸 入 : time
- * 輸 出 : 無
- *******************************************************************************/
- void delay_ms(unsigned int time)
- {
- unsigned char
- i;
- for(i=1; i<=time; i++)
- Delay1ms();
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Delay1us()
- * 函數(shù)功能 : 延時
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void I2C_Delay10us()
- {
- unsigned char i;
- _nop_();
- _nop_();
- _nop_();
- i = 24;
- while (--i);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : I2C_Start()
- * 函數(shù)功能 : 起始信號:在I2C_SCL時鐘信號在高電平期間I2C_SDA信號產(chǎn)生一個下降沿
- * 輸 入 : 無
- * 輸 出 : 無
- * 備 注 : 起始之后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();
- }
- /*******************************************************************************
- * 函 數(shù) 名 : I2C_Stop()
- * 函數(shù)功能 : 終止信號:在I2C_SCL時鐘信號高電平期間I2C_SDA信號產(chǎn)生一個上升沿
- * 輸 入 : 無
- * 輸 出 : 無
- * 備 注 : 結(jié)束之后保持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();
- }
- /*******************************************************************************
- * 函 數(shù) 名 : I2cSendByte(uchar num)
- * 函數(shù)功能 : 通過I2C發(fā)送一個字節(jié)。在I2C_SCL時鐘信號高電平期間,
- * * 保持發(fā)送信號I2C_SDA保持穩(wěn)定
- * 輸 入 : num ,ack
- * 輸 出 : 0或1。發(fā)送成功返回1,發(fā)送失敗返回0
- * 備 注 : 發(fā)送完一個字節(jié)I2C_SCL=0, 需要應(yīng)答則應(yīng)答設(shè)置為1,否則為0
- *******************************************************************************/
- uchar I2C_SendByte(uchar dat)
- {
- uchar a = 0,b = 0;//最大255,一個機器周期為1us,最大延時255us。
- for(a=0; a<8; a++)//要發(fā)送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;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : I2cReadByte()
- * 函數(shù)功能 : 使用I2c讀取一個字節(jié)
- * 輸 入 : 無
- * 輸 出 : dat
- * 備 注 : 接收完一個字節(jié)I2C_SCL=0
- *******************************************************************************/
- uchar I2C_ReadByte()
- {
- uchar a = 0,dat = 0;
- I2C_SDA = 1; //起始和發(fā)送一個字節(jié)之后I2C_SCL都是0
- I2C_Delay10us();
- for(a=0; a<8; a++)//接收8個字節(jié)
- {
- I2C_SCL = 1;
- I2C_Delay10us();
- dat <<= 1;
- dat |= I2C_SDA;
- I2C_Delay10us();
- I2C_SCL = 0;
- I2C_Delay10us();
- }
- return dat;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : vl53l0x_send(uchar reg,uchar dat)
- * 函數(shù)功能 : 使用I2c向vl530xl發(fā)送命令
- * 輸 入 : reg,dat
- * 輸 出 : 無
- *******************************************************************************/
- void vl53l0x_send(uchar reg,uchar dat)
- {
- I2C_Start();
- I2C_SendByte(address);
- I2C_SendByte(reg);
- I2C_SendByte(dat);
- I2C_Stop();
- }
- /*******************************************************************************
- * 函 數(shù) 名 : vl53l0x_read(uchar reg)
- * 函數(shù)功能 : 使用I2c向vl530x0l讀取一個字節(jié)
- * 輸 入 : reg
- * 輸 出 : num
- *******************************************************************************/
- uchar vl53l0x_read(uchar reg)
- {
- unsigned char num;
- I2C_Start();
- I2C_SendByte(address); //發(fā)送寫器件地址
- I2C_SendByte(reg); //發(fā)送要讀取的地址
- I2C_Stop();
- I2C_Start();
- I2C_SendByte(address+1); //發(fā)送讀器件地址
- num=I2C_ReadByte(); //讀取數(shù)據(jù)
- I2C_Stop();
- return num;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : makeuint16(int lsb, int msb)
- * 函數(shù)功能 : 將讀出數(shù)據(jù)轉(zhuǎn)換到數(shù)組當(dāng)中
- * 輸 入 : lsb,msb
- * 輸 出 : dat
- *******************************************************************************/
- short makeuint16(int lsb, int msb)
- {
- return ((msb & 0xFF) << 8) | (lsb & 0xFF);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : date()
- * 函數(shù)功能 : 進行數(shù)據(jù)的讀取與轉(zhuǎn)換,將數(shù)據(jù)處理
- * 輸 入 : 無
- * 輸 出 : dist
- *******************************************************************************/
- unsigned char date()
- {
- uchar val = 0;
- // uchar vall;
- int cnt = 0;
- vl53l0x_send(VL53L0X_REG_SYSRANGE_START, 0x01);
- while (cnt < 100) ///檢測數(shù)據(jù)是否傳輸正常
- {
- 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; //該數(shù)組為五位
- }
- void main()
- {
- while(1)
- {
- date();
- }
- }
復(fù)制代碼 全部資料51hei下載地址:
VL530X0L激光測距.zip
(108.48 KB, 下載次數(shù): 621)
2019-8-1 14:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|