自己做的激光測距VL53L0X程序,拿出來和大家分享。這程序里面沒有加顯示設備,因為不知道大家要使用什么來顯示,所以請根據個人情況來進行修改添加,但是附件里面的程序是我加上OLED后的程序
各位請按需使用。
單片機源程序如下:
#include #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;
上一篇:全自動洗衣機控制器設計的單片機代碼
下一篇:單片機直流電機調速并顯示的仿真與程序源碼
推薦閱讀
史海拾趣
在快速發展的過程中,思博科技始終關注企業文化建設和社會責任。公司倡導“創新、協作、誠信、共贏”的價值觀,為員工提供了良好的工作環境和發展機會。同時,思博科技還積極參與社會公益活動,回饋社會。這些舉措不僅提升了公司的品牌形象和聲譽,還增強了員工的歸屬感和凝聚力。
面對日益激烈的市場競爭,APX Technologies積極尋求與其他企業的合作。公司與一家知名的電子設備制造商達成戰略合作協議,共同開發一款具有創新功能的新型智能手機。這款手機的成功上市不僅提升了APX Technologies的品牌知名度,也為其帶來了可觀的利潤。
隨著業務的不斷擴展,FORYARD意識到全球化布局的重要性。1995年,公司決定在中國設立研發中心和生產基地,以利用當地豐富的人才資源和成本優勢。這一戰略決策極大地提升了FORYARD的產能和研發效率,同時也使其能夠更好地服務全球客戶。此后,FORYARD還陸續在歐洲、亞洲等地建立了多個分支機構,形成了覆蓋全球的研發、生產和銷售網絡。通過全球化布局,FORYARD不僅增強了自身的市場競爭力,還促進了全球電子產業的交流與合作。
在半導體測試領域取得成功后,東沅并沒有停止前進的步伐。他們開始關注新興的電子行業趨勢,并決定拓展新的業務領域。例如,他們開始研發和生產與電源管理相關的Power Mosfet產品,這些產品具有高效能、高可靠度和價格優勢等特點,迅速在市場上占據了一席之地。此外,東沅還積極拓展射頻和模擬芯片領域的研發和銷售,為客戶提供更全面的解決方案。
隨著公司規模的擴大,東沅開始投入大量資源進行技術研發。經過數年的努力,他們成功開發出了一系列具有競爭力的半導體測試設備和測試程序開發工具。這些產品不僅覆蓋了模擬器件、數字器件、混合信號器件和射頻器件等多種類型,而且具有高精度、高效率和高可靠性的特點。憑借這些技術優勢,東沅逐漸贏得了市場的認可,客戶數量不斷增加。
在半導體行業,技術創新是企業持續發展的關鍵。AiT公司深知這一點,因此始終將創新作為公司的核心競爭力。他們投入大量資金和資源用于研發,不斷推出具有創新性和領先性的半導體產品。同時,公司還積極與高校、科研機構等合作,共同開展技術研發和人才培養工作。這些創新舉措使得AiT公司在行業中始終保持領先地位。
#include<htc.h> __CONFIG (INTRC & PROTECT & MCLREN & WDTEN); const unsigned char cs @ 0x1FF; void DelayUs( int x) // 32US {while(--x!=0) { CLRWDT(); NOP();   ...… 查看全部問答∨ |
|
各位大俠,我用AVR ATMEGA16的UART來接收上位機串口調試助手發來的數據,假設為0x53,0x26,0x53,0x89,0x47,前面兩個數據總是對的,然后第三位就接到了最后一個數據,中間的數據就丟失了。 接收中斷程序如下: #pragma interrupt_handler uart_rx_ ...… 查看全部問答∨ |
請教9261的串口收發問題 我在核中添加了下面的代碼: at91_register_uart(AT91SAM9261_ID_US1, 1, ATMEL_UART_RTS); at91_register_uart(AT91SAM9261_ID_US2, 2, ATMEL_UART_RTS); at91_register_uart(AT91SAM9261_ID_US3, 3, ATMEL_UART_RTS ...… 查看全部問答∨ |
編輯完對話框類后無法在EDIT里輸入漢字; 還有請幫忙看看一下代碼怎么修改 LOGFONT m_lf; //字體結構 strcpy(m_lf.lfFaceName,ipadress ); 報錯:error C2664: \ ...… 查看全部問答∨ |
比如下面這段代碼:void main(void){WDTCTL = WDTPW + WDTHOLD; //停止看門狗定時器P1DIR |= 0x01; // 設P1.0為輸出//TA1CTL = RT1SSEL_0 + MC_2 + TAIE; // ACLK, 定時器A計數模式,且開中斷功能TA1CTL=TASSEL_2+ID_3+MC_1; //SMCLK(8KHZ). 8分頻 ...… 查看全部問答∨ |
1、關于電量 我們經常會看到少則幾萬毫安,多則十幾萬毫安的移動電源。即便沒有虛標,這么多的電量并不代表都能充到你的手機里。額定容量不等于實際可用容量,在電量存儲的過程中也會遺失一部分電。 舉個例子,如果 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 利用STM32MP1和STM32MP2在嵌入式 Linux 平臺上部署有效的安全保護機制
- 超小但強大:MCU 的小尺寸封裝和集成如何幫助優化空間受限的設計
- 德州儀器推出全球超小型 MCU,助力微型應用創新
- Microchip推出電動兩輪車(E2W)生態系統,加速電動出行創新
- 意法半導體推出STM32U3微控制器,面向遠程、智能和可持續應用,拓展超低功耗系列創新
- (一) ECloudIDE入門STM32-CubeMX工程創建與導入
- (二)ECloudIDE入門STM32-官方寄存器版例程使用
- Simulink STM32F407VGT6實現硬件在環
- openharmony:hilog_lite組件移植