久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15163|回復(fù): 30
打印 上一主題 下一主題
收起左側(cè)

VL53L0X激光測距模塊的單片機驅(qū)動程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:478845 發(fā)表于 2019-8-1 14:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自己做的激光測距VL53L0X程序,拿出來和大家分享。這程序里面沒有加顯示設(shè)備,因為不知道大家要使用什么來顯示,所以請根據(jù)個人情況來進行修改添加,但是附件里面的程序是我加上OLED后的程序
各位請按需使用。

單片機源程序如下:
  1. #include <REGX51.H>
  2. #include "intrins.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int

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

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


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

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

  29. /*******************************************************************************
  30. * 函 數(shù) 名         : Delay1ms()                //@11.0592MHz
  31. * 函數(shù)功能                     : 延時
  32. * 輸    入         : 無
  33. * 輸    出         : 無
  34. *******************************************************************************/
  35. void Delay1ms()                //@11.0592MHz
  36. {
  37.     unsigned char i, j;

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

  68.     _nop_();
  69.     _nop_();
  70.     _nop_();
  71.     i = 24;
  72.     while (--i);
  73. }
  74. /*******************************************************************************
  75. * 函 數(shù) 名         : I2C_Start()
  76. * 函數(shù)功能                   : 起始信號:在I2C_SCL時鐘信號在高電平期間I2C_SDA信號產(chǎn)生一個下降沿
  77. * 輸    入         : 無
  78. * 輸    出         : 無
  79. * 備    注         : 起始之后I2C_SDA和I2C_SCL都為0
  80. *******************************************************************************/
  81. void I2C_Start()
  82. {
  83.     I2C_SDA = 1;
  84.     I2C_Delay10us();
  85.     I2C_SCL = 1;
  86.     I2C_Delay10us();//建立時間是I2C_SDA保持時間>4.7us
  87.     I2C_SDA = 0;
  88.     I2C_Delay10us();//保持時間是>4us
  89.     I2C_SCL = 0;
  90.     I2C_Delay10us();
  91. }
  92. /*******************************************************************************
  93. * 函 數(shù) 名           : I2C_Stop()
  94. * 函數(shù)功能                 : 終止信號:在I2C_SCL時鐘信號高電平期間I2C_SDA信號產(chǎn)生一個上升沿
  95. * 輸    入           : 無
  96. * 輸    出                  : 無
  97. * 備    注           : 結(jié)束之后保持I2C_SDA和I2C_SCL都為1;表示總線空閑
  98. *******************************************************************************/
  99. void I2C_Stop()
  100. {
  101.     I2C_SDA = 0;
  102.     I2C_Delay10us();
  103.     I2C_SCL = 1;
  104.     I2C_Delay10us();//建立時間大于4.7us
  105.     I2C_SDA = 1;
  106.     I2C_Delay10us();
  107. }
  108. /*******************************************************************************
  109. * 函 數(shù) 名           : I2cSendByte(uchar num)
  110. * 函數(shù)功能                  : 通過I2C發(fā)送一個字節(jié)。在I2C_SCL時鐘信號高電平期間,
  111. *                    * 保持發(fā)送信號I2C_SDA保持穩(wěn)定
  112. * 輸    入           : num ,ack
  113. * 輸    出                  : 0或1。發(fā)送成功返回1,發(fā)送失敗返回0
  114. * 備    注           : 發(fā)送完一個字節(jié)I2C_SCL=0, 需要應(yīng)答則應(yīng)答設(shè)置為1,否則為0
  115. *******************************************************************************/
  116. uchar I2C_SendByte(uchar dat)
  117. {
  118.     uchar a = 0,b = 0;//最大255,一個機器周期為1us,最大延時255us。

  119.     for(a=0; a<8; a++)//要發(fā)送8位,從最高位開始
  120.     {
  121.         dat <<= 1;
  122.         I2C_SDA=CY;
  123.         I2C_Delay10us();
  124.         I2C_SCL = 1;
  125.         I2C_Delay10us();//建立時間>4.7us
  126.         I2C_SCL = 0;
  127.         I2C_Delay10us();//時間大于4us
  128.     }

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

  252.         while(1)
  253.         {
  254.     date();
  255.         }
  256. }
復(fù)制代碼
全部資料51hei下載地址:
VL530X0L激光測距.zip (108.48 KB, 下載次數(shù): 621)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏18 分享淘帖 頂2 踩1
回復(fù)

使用道具 舉報

沙發(fā)
ID:171549 發(fā)表于 2019-8-5 17:51 | 只看該作者
不錯,正好要用到這個測距。
回復(fù)

使用道具 舉報

板凳
ID:79544 發(fā)表于 2019-8-30 13:47 | 只看該作者
好資料,感謝分享!!!!!!!
回復(fù)

使用道具 舉報

地板
ID:656033 發(fā)表于 2019-12-4 16:02 | 只看該作者
很好,正在學(xué)習(xí)中。謝謝分享!
回復(fù)

使用道具 舉報

5#
ID:663536 發(fā)表于 2019-12-17 22:47 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報

6#
ID:670476 發(fā)表于 2019-12-22 15:32 | 只看該作者
里面的   CY   是什么意思呢,也沒見在那個地方定義了
回復(fù)

使用道具 舉報

7#
ID:670476 發(fā)表于 2019-12-23 11:23 | 只看該作者
zhpic 發(fā)表于 2019-8-5 17:51
不錯,正好要用到這個測距。

我直接編譯怎么一直出錯呢
回復(fù)

使用道具 舉報

8#
ID:887238 發(fā)表于 2021-3-2 10:29 | 只看該作者
也想用類似51的程序,但里面的寄存器定義哪份文件看得到?
回復(fù)

使用道具 舉報

9#
ID:69115 發(fā)表于 2021-3-8 02:05 | 只看該作者
這個很好,激光測距很實用
回復(fù)

使用道具 舉報

10#
ID:161115 發(fā)表于 2021-3-24 01:17 | 只看該作者
好好學(xué)習(xí)一下,感謝樓主無私的分享
回復(fù)

使用道具 舉報

11#
ID:956767 發(fā)表于 2021-7-27 11:14 | 只看該作者
你好,里面的YC是什么意思呢
回復(fù)

使用道具 舉報

12#
ID:958100 發(fā)表于 2021-8-2 16:27 | 只看該作者
測出來的數(shù)據(jù)是哪一個
回復(fù)

使用道具 舉報

13#
ID:927341 發(fā)表于 2021-8-15 19:28 | 只看該作者
這個程序里面用的顯示模塊是12864嗎
回復(fù)

使用道具 舉報

14#
ID:927341 發(fā)表于 2021-8-15 19:29 | 只看該作者
11112223354 發(fā)表于 2021-8-2 16:27
測出來的數(shù)據(jù)是哪一個

您好,請問顯示模塊您用的是哪一個
回復(fù)

使用道具 舉報

15#
ID:927341 發(fā)表于 2021-8-15 19:37 | 只看該作者
hc201909 發(fā)表于 2019-12-23 11:23
我直接編譯怎么一直出錯呢

您好,請問,這個顯示模塊用的是哪個?
回復(fù)

使用道具 舉報

16#
ID:465596 發(fā)表于 2021-10-7 14:16 | 只看該作者
謝謝分享。要改一下CY
回復(fù)

使用道具 舉報

17#
ID:815693 發(fā)表于 2022-2-15 16:00 | 只看該作者
666.我也正好需要參考一下
回復(fù)

使用道具 舉報

18#
ID:815693 發(fā)表于 2022-3-24 22:25 | 只看該作者
CY是什么意思呀
回復(fù)

使用道具 舉報

19#
ID:853896 發(fā)表于 2023-8-2 08:01 | 只看該作者
201909zc 發(fā)表于 2021-7-27 11:14
你好,里面的YC是什么意思呢

它是PSW狀態(tài)寄存器里面的高位進位標(biāo)志位。你寫的這個應(yīng)該是IIC總線協(xié)議里面的。SDA是數(shù)據(jù)標(biāo)志位,CY每次溢出的數(shù)據(jù)都付給它,一共寫8次。
回復(fù)

使用道具 舉報

20#
ID:433219 發(fā)表于 2023-8-2 15:36 | 只看該作者
VL53L0X  這激光測距,在范圍內(nèi),重復(fù)精度大概多少?
回復(fù)

使用道具 舉報

21#
ID:614056 發(fā)表于 2023-8-19 11:14 | 只看該作者
某一個寶買了個模組回來,寫了代碼測試了下,大概在3-4MM誤差,反應(yīng)速度還可以,有興趣大家可以一起交流下。
另外代碼里有幾個小問題:
1.CY很多朋友不知道,是單片機狀態(tài)寄存器的進位標(biāo)志位,各位對應(yīng)換成自己單片機對應(yīng)的進位標(biāo)志位即可。
2.有的單片機的I/O輸入輸出需要自己切換,實例代碼里面的讀取函數(shù),沒有該方面的說明,自己用的時候需要自己手動切換SDA為輸入,再讀取數(shù)據(jù)。
回復(fù)

使用道具 舉報

22#
ID:815949 發(fā)表于 2023-10-11 20:30 | 只看該作者
goalpeak 發(fā)表于 2023-8-19 11:14
某一個寶買了個模組回來,寫了代碼測試了下,大概在3-4MM誤差,反應(yīng)速度還可以,有興趣大家可以一起交流下 ...

能不能分享一下資料,最近準(zhǔn)備搞個測試角度案子,打算用到激光模塊測距,苦于沒有相關(guān)資料
回復(fù)

使用道具 舉報

23#
ID:1104397 發(fā)表于 2023-12-20 19:38 | 只看該作者
baishifanzon 發(fā)表于 2021-3-24 01:17
好好學(xué)習(xí)一下,感謝樓主無私的分享

請問你有沒有基于51的這個測距模塊的代碼文件呢??
回復(fù)

使用道具 舉報

24#
ID:1104397 發(fā)表于 2023-12-20 19:39 | 只看該作者
goalpeak 發(fā)表于 2023-8-19 11:14
某一個寶買了個模組回來,寫了代碼測試了下,大概在3-4MM誤差,反應(yīng)速度還可以,有興趣大家可以一起交流下 ...

大佬,可以分享一下資料嗎?
回復(fù)

使用道具 舉報

25#
ID:1112981 發(fā)表于 2024-3-15 09:03 | 只看該作者
goalpeak 發(fā)表于 2023-8-19 11:14
某一個寶買了個模組回來,寫了代碼測試了下,大概在3-4MM誤差,反應(yīng)速度還可以,有興趣大家可以一起交流下 ...

代碼能不能分享下
回復(fù)

使用道具 舉報

26#
ID:433219 發(fā)表于 2024-3-15 14:27 | 只看該作者
goalpeak 發(fā)表于 2023-8-19 11:14
某一個寶買了個模組回來,寫了代碼測試了下,大概在3-4MM誤差,反應(yīng)速度還可以,有興趣大家可以一起交流下 ...

誤差是針對金屬、木板類硬質(zhì)類材料的吧,,,針對液體類,精度會變化多大???
回復(fù)

使用道具 舉報

27#
ID:373684 發(fā)表于 2024-3-16 23:07 來自手機 | 只看該作者
做出的產(chǎn)品如何使用??
回復(fù)

使用道具 舉報

28#
ID:433219 發(fā)表于 2024-10-9 16:22 | 只看該作者
tb上有好多賣的,,,還沒下手測一下
回復(fù)

使用道具 舉報

29#
ID:1133618 發(fā)表于 2024-10-14 19:56 | 只看該作者
請問,這個調(diào)長距離,高精度,高速的這三個模式的寄存器是什么呀?
回復(fù)

使用道具 舉報

30#
ID:815949 發(fā)表于 2025-2-19 14:21 | 只看該作者
william_wangxb 發(fā)表于 2023-10-11 20:30
能不能分享一下資料,最近準(zhǔn)備搞個測試角度案子,打算用到激光模塊測距,苦于沒有相關(guān)資料

我也是準(zhǔn)備做個測試角度的小玩意,兄弟,有資料和例程的話分享下,謝謝
回復(fù)

使用道具 舉報

31#
ID:433219 發(fā)表于 2025-2-24 07:52 | 只看該作者
  重復(fù)精度,和材質(zhì)有關(guān)吧?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 毛片免费视频 | 国产福利精品一区 | 精品一区二区不卡 | 亚洲精品久久久久avwww潮水 | 国产视频一区二区三区四区五区 | 看片一区 | 精品免费视频 | 精品一二三区 | 亚洲精品视频在线观看视频 | 丝袜 亚洲 欧美 日韩 综合 | 欧美日日 | 成人国产精品久久久 | 中文字幕在线视频免费观看 | 亚洲 欧美 另类 综合 偷拍 | 国产精品久久久久久久久久久新郎 | 欧美一级免费观看 | 少妇一区在线观看 | 精品久久久久久亚洲综合网站 | 久久1区 | 久久青青 | 伦理午夜电影免费观看 | 成人在线免费观看 | 久久久国产一区二区三区四区小说 | 中文字幕日韩欧美 | 成人在线观看亚洲 | 精品福利在线 | 成人片免费看 | 亚洲国产成人精品女人 | 91九色在线观看 | 一区二区三区视频在线 | 成人免费观看男女羞羞视频 | 国产一区二区三区在线观看免费 | 欧美精品一区二区三区四区 | 久久久精品视频免费看 | 国产精品久久久久一区二区三区 | 欧美精品中文字幕久久二区 | 久久亚洲天堂 | 成人免费在线播放视频 | 亚洲免费婷婷 | 欧美高清dvd | 美女久久久久久久久 |