欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
求VL5310X單片機驅動
[打印本頁]
作者:
best_2009
時間:
2025-6-7 22:14
標題:
求VL5310X單片機驅動
謝謝大家
作者:
wpppmlah
時間:
2025-6-9 08:51
//只供參考
#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();
}
}
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1