找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 152|回复: 1
打印 上一主题 下一主题
收起左侧

求VL5310X单片机驱动

[复制链接]
跳转到指定楼层
楼主
ID:1152942 发表于 2025-6-7 22:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:68189 发表于 2025-6-9 08:51 | 只看该作者
//只供参考

  1. #include "intrins.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. #define VL53L0X_REG_IDENTIFICATION_MODEL_ID         0xc0
  5. #define VL53L0X_REG_IDENTIFICATION_REVISION_ID      0xc2
  6. #define VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD   0x50
  7. #define VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD 0x70
  8. #define VL53L0X_REG_SYSRANGE_START                  0x00
  9. #define VL53L0X_REG_RESULT_INTERRUPT_STATUS         0x13
  10. #define VL53L0X_REG_RESULT_RANGE_STATUS             0x14
  11. #define address 0x52

  12. sbit I2C_SCL = P1^3;
  13. sbit I2C_SDA = P1^2;


  14. void I2C_Delay10us();
  15. void I2C_Start();
  16. void I2C_Stop();
  17. uchar I2C_SendByte(uchar dat);
  18. uchar I2C_ReadByte();
  19. //void I2C_SendACK(bit ack);
  20. void vl53l0x_send(uchar reg,uchar dat);
  21. uchar vl53l0x_read(uchar reg);
  22. short makeuint16(int lsb, int msb);

  23. uchar gbuf[16];
  24. uint acnt ;
  25. uint scnt;
  26. uint dist ;
  27. uchar DeviceRangeStatusInternal;

  28. /*******************************************************************************
  29. * 函 数 名         : Delay1ms()                //@11.0592MHz
  30. * 函数功能                     : 延时
  31. * 输    入         : 无
  32. * 输    出         : 无
  33. *******************************************************************************/
  34. void Delay1ms()                //@11.0592MHz
  35. {
  36.     unsigned char i, j;

  37.     _nop_();
  38.     i = 11;
  39.     j = 190;
  40.     do
  41.     {
  42.         while (--j);
  43.     } while (--i);
  44. }
  45. /*******************************************************************************
  46. * 函 数 名         : delay_ms(unsigned int time)
  47. * 函数功能                     : 延时
  48. * 输    入         : time
  49. * 输    出         : 无
  50. *******************************************************************************/
  51. void delay_ms(unsigned int time)
  52. {
  53.     unsigned char
  54.     i;
  55.     for(i=1; i<=time; i++)
  56.         Delay1ms();
  57. }
  58. /*******************************************************************************
  59. * 函 数 名         : Delay1us()
  60. * 函数功能                   : 延时
  61. * 输    入         : 无
  62. * 输    出         : 无
  63. *******************************************************************************/
  64. void I2C_Delay10us()
  65. {
  66.     unsigned char i;

  67.     _nop_();
  68.     _nop_();
  69.     _nop_();
  70.     i = 24;
  71.     while (--i);
  72. }
  73. /*******************************************************************************
  74. * 函 数 名         : I2C_Start()
  75. * 函数功能                   : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿
  76. * 输    入         : 无
  77. * 输    出         : 无
  78. * 备    注         : 起始之后I2C_SDA和I2C_SCL都为0
  79. *******************************************************************************/
  80. void I2C_Start()
  81. {
  82.     I2C_SDA = 1;
  83.     I2C_Delay10us();
  84.     I2C_SCL = 1;
  85.     I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us
  86.     I2C_SDA = 0;
  87.     I2C_Delay10us();//保持时间是>4us
  88.     I2C_SCL = 0;
  89.     I2C_Delay10us();
  90. }
  91. /*******************************************************************************
  92. * 函 数 名           : I2C_Stop()
  93. * 函数功能                 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿
  94. * 输    入           : 无
  95. * 输    出                  : 无
  96. * 备    注           : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲
  97. *******************************************************************************/
  98. void I2C_Stop()
  99. {
  100.     I2C_SDA = 0;
  101.     I2C_Delay10us();
  102.     I2C_SCL = 1;
  103.     I2C_Delay10us();//建立时间大于4.7us
  104.     I2C_SDA = 1;
  105.     I2C_Delay10us();
  106. }
  107. /*******************************************************************************
  108. * 函 数 名           : I2cSendByte(uchar num)
  109. * 函数功能                  : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,
  110. *                    * 保持发送信号I2C_SDA保持稳定
  111. * 输    入           : num ,ack
  112. * 输    出                  : 0或1。发送成功返回1,发送失败返回0
  113. * 备    注           : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0
  114. *******************************************************************************/
  115. uchar I2C_SendByte(uchar dat)
  116. {
  117.     uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。

  118.     for(a=0; a<8; a++)//要发送8位,从最高位开始
  119.     {
  120.         dat <<= 1;
  121.         I2C_SDA=CY;
  122.         I2C_Delay10us();
  123.         I2C_SCL = 1;
  124.         I2C_Delay10us();//建立时间>4.7us
  125.         I2C_SCL = 0;
  126.         I2C_Delay10us();//时间大于4us
  127.     }

  128.     //I2C_SDA = 1;
  129.     //I2C_Delay10us();
  130.     I2C_SCL = 1;
  131.     I2C_Delay10us();
  132.     CY=I2C_SDA;
  133.     I2C_SCL = 0;
  134.     I2C_Delay10us();
  135.     return CY;
  136. }
  137. /*******************************************************************************
  138. * 函 数 名           : I2cReadByte()
  139. * 函数功能                     : 使用I2c读取一个字节
  140. * 输    入           : 无
  141. * 输    出                  : dat
  142. * 备    注           : 接收完一个字节I2C_SCL=0
  143. *******************************************************************************/
  144. uchar I2C_ReadByte()
  145. {
  146.     uchar a = 0,dat = 0;
  147.     I2C_SDA = 1;                        //起始和发送一个字节之后I2C_SCL都是0
  148.     I2C_Delay10us();
  149.     for(a=0; a<8; a++)//接收8个字节
  150.     {
  151.         I2C_SCL = 1;
  152.         I2C_Delay10us();
  153.         dat <<= 1;
  154.         dat |= I2C_SDA;
  155.         I2C_Delay10us();
  156.         I2C_SCL = 0;
  157.         I2C_Delay10us();
  158.     }
  159.     return dat;
  160. }
  161. /*******************************************************************************
  162. * 函 数 名           : vl53l0x_send(uchar reg,uchar dat)
  163. * 函数功能                     : 使用I2c向vl530xl发送命令
  164. * 输    入           : reg,dat
  165. * 输    出                  : 无
  166. *******************************************************************************/
  167. void vl53l0x_send(uchar reg,uchar dat)
  168. {
  169.     I2C_Start();
  170.     I2C_SendByte(address);
  171.     I2C_SendByte(reg);
  172.     I2C_SendByte(dat);
  173.     I2C_Stop();
  174. }
  175. /*******************************************************************************
  176. * 函 数 名           : vl53l0x_read(uchar reg)
  177. * 函数功能                     : 使用I2c向vl530x0l读取一个字节
  178. * 输    入           : reg
  179. * 输    出                  : num
  180. *******************************************************************************/
  181. uchar vl53l0x_read(uchar reg)
  182. {
  183.     unsigned char num;
  184.     I2C_Start();
  185.     I2C_SendByte(address); //发送写器件地址
  186.     I2C_SendByte(reg); //发送要读取的地址
  187.                 I2C_Stop();
  188.     I2C_Start();
  189.     I2C_SendByte(address+1); //发送读器件地址
  190.     num=I2C_ReadByte(); //读取数据
  191.     I2C_Stop();
  192.     return num;
  193. }
  194. /*******************************************************************************
  195. * 函 数 名           :  makeuint16(int lsb, int msb)
  196. * 函数功能                       :  将读出数据转换到数组当中
  197. * 输    入           : lsb,msb
  198. * 输    出                  : dat
  199. *******************************************************************************/
  200. short makeuint16(int lsb, int msb)
  201. {
  202.     return ((msb & 0xFF) << 8) | (lsb & 0xFF);
  203. }
  204. /*******************************************************************************
  205. * 函 数 名           :  date()
  206. * 函数功能                       :  进行数据的读取与转换,将数据处理
  207. * 输    入           : 无
  208. * 输    出                  : dist
  209. *******************************************************************************/
  210. unsigned char date()
  211. {
  212.         uchar val = 0;        
  213. //        uchar vall;
  214.         int cnt = 0;
  215.                         vl53l0x_send(VL53L0X_REG_SYSRANGE_START, 0x01);
  216.                 while (cnt < 100)                                      ///检测数据是否传输正常
  217.                 {
  218.       delay_ms(10);
  219.       val = vl53l0x_read(VL53L0X_REG_RESULT_RANGE_STATUS);
  220.       if (val & 0x01) break;
  221.       cnt++;
  222.     }
  223.                  gbuf[0]=vl53l0x_read(0x14);
  224.                  gbuf[7]=vl53l0x_read(0x14+7);
  225.                  gbuf[6]=vl53l0x_read(0x14+6);
  226.                  gbuf[9]=vl53l0x_read(0x14+9);
  227.                  gbuf[8]=vl53l0x_read(0x14+8);
  228.                  gbuf[11]=vl53l0x_read(0x14+11);
  229.                  gbuf[10]=vl53l0x_read(0x14+10);
  230.      acnt = makeuint16(gbuf[7], gbuf[6]);
  231.      scnt = makeuint16(gbuf[9], gbuf[8]);                 
  232.      dist = makeuint16(gbuf[11], gbuf[10]);                 
  233. //                 DeviceRangeStatusInternal = ((gbuf[0] & 0x78) >> 3);
  234. //                         if(DeviceRangeStatusInternal==11&&dist>20&&dist<1200)
  235. //                        {
  236. //                                vall=dist/10000;
  237. //                    OLED_dan(8*0,0,vall+16);
  238. //                    vall=dist%10000/1000;
  239. //                    OLED_dan(8*1,0,vall+16);
  240. //                    vall=dist%1000/100;
  241. //                    OLED_dan(8*2,0,vall+16);
  242. //                    vall=dist%100/10;
  243. //                    OLED_dan(8*3,0,vall+16);
  244. //                    vall=dist%10/1;
  245. //                    OLED_dan(8*4,0,vall+16);
  246. //                        }
  247.                         return  dist;             //该数组为五位
  248. }
  249. void main()
  250. {

  251.         while(1)
  252.         {
  253.     date();
  254.         }
  255. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表