0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何將超聲波傳感器HC-SR04與PIC微控制器連接

科技觀察員 ? 來源:circuitdigest ? 作者:阿斯文斯·拉吉 ? 2023-01-01 10:08 ? 次閱讀

為了讓任何項目活躍起來,我們需要使用傳感器。傳感器充當(dāng)所有嵌入式應(yīng)用的眼睛和耳朵,它幫助數(shù)字微控制器了解這個真實模擬世界中實際發(fā)生的事情。在本教程中,我們將學(xué)習(xí)如何將超聲波傳感器HC-SR04與PIC微控制器連接。

HC-SR04是一種超聲波傳感器,可用于測量2厘米至450厘米(理論上)之間的距離。該傳感器已通過安裝到許多涉及障礙物檢測、距離測量、環(huán)境映射等的項目中證明了自己的價值。在本文的最后,您將了解該傳感器的工作原理,以及如何將其與PIC16F877A微控制器連接以測量距離并將其顯示在LCD屏幕上。聽起來很有趣吧??!所以讓我們開始吧...

所需材料:

編程設(shè)置的 PIC16F877A 單片機(jī)

液晶16*2顯示屏

超聲波傳感器 (HC-SR04)

連接線

超聲波傳感器如何工作?

在我們進(jìn)一步討論之前,我們應(yīng)該知道超聲波傳感器的工作原理,以便我們可以更好地理解本教程。本項目中使用的超聲波傳感器如下所示。

poYBAGOs9o6AEsd0AACOsw2KntI531.jpg

正如你所看到的,它有兩個圓形的眼睛,像投影一樣,四個針從中伸出來。兩個眼睛狀的投影是超聲波(以下簡稱US波)發(fā)射器和接收器。發(fā)射器以 40Hz 的頻率發(fā)射美國波,該波在空氣中傳播并在感應(yīng)到物體時被反射回來。接收機(jī)觀察到返回的波?,F(xiàn)在我們知道這個波被反射并回來所需的時間,美國波的速度也是普遍的(3400cm/s)。使用這些信息和下面的高中公式,我們可以計算所覆蓋的距離。

Distance = Speed × Time

現(xiàn)在我們知道了美國傳感器的工作原理,讓我們?nèi)绾问褂盟膫€引腳將其與任何MCU / CPU接口。這四個引腳分別是Vcc,觸發(fā)器,回聲和接地。該模塊工作在+5V電壓下,因此Vcc和接地引腳用于為模塊供電。另外兩個引腳是我們用來與MCU通信的I / O引腳。觸發(fā)引腳應(yīng)聲明為輸出引腳,并設(shè)置為高電平 10uS,這將以 8 周期聲波的形式將 US 波傳輸?shù)娇諝庵?。一旦觀察到波,回波引腳將在美國的波返回傳感器模塊所花費的確切時間間隔內(nèi)變?yōu)楦唠娖健R虼?,此Echo 引腳將被聲明為輸入,并且將使用計時器來測量引腳的高電平。這可以通過下面的時序圖進(jìn)一步理解。

poYBAGOs9pCAUoqZAAAo0mbu7-8786.gif

電路圖:

超聲波傳感器與PIC16F877A接口的完整電路圖如下所示:

pYYBAGOs9e2ABEauAAFgDWrZ1QE461.png

如圖所示,該電路只涉及LCD顯示屏和超聲波傳感器本身。美國傳感器可由+5V供電,因此直接由7805穩(wěn)壓器供電。傳感器有一個輸出引腳(觸發(fā)引腳)連接到引腳 34 (RB1),輸入引腳(回波引腳)連接到引腳 35 (RB2)。完整的引腳連接如下表所示。

poYBAGOs9gWAQc0VAAB4GXS7RXI414.png

對 PIC 微控制器進(jìn)行編程:

本教程的完整程序在本頁末尾給出,下面我將代碼解釋為小意思的完整塊供您理解。

在內(nèi)部,主要功能我們像往常一樣從初始化IO引腳和其他寄存器開始。我們定義LCD和美國傳感器的IO引腳,并通過將其設(shè)置為在1:4預(yù)標(biāo)量下工作并使用內(nèi)部時鐘(Fosc / 4)來啟動定時器1寄存器

TRISD = 0x00; //PORTD declared as output for interfacing LCD
TRISB0 = 1; //Define the RB0 pin as input to use as interrupt pin
TRISB1 = 0; //Trigger pin of US sensor is sent as output pin
TRISB2 = 1; //Echo pin of US sensor is set as input pin
TRISB3 = 0; //RB3 is output pin for LED
T1CON=0x20; //4 pres-scalar and internal clock
定時器1是PIC16F877A中使用的16位定時器,T1CON寄存器控制定時器模塊的參數(shù),結(jié)果將存儲在TMR1H和TMR1L中,因為它是16位結(jié)果,前8個將存儲在TMR1H中,接下來的8個存儲在TMR1L中。此定時器可以分別使用 TMR1ON=0 和 TMR1ON=1 打開或關(guān)閉。

現(xiàn)在,計時器可以使用了,但是我們必須將美波從傳感器中發(fā)送出去,為此,我們必須將觸發(fā)引腳保持高電平10uS,這是通過以下代碼完成的。

Trigger = 1;
__delay_us(10);
Trigger = 0;
如上面的時序圖所示,Echo引腳將保持低電平,直到波返回,然后在波返回所需的確切時間內(nèi)變?yōu)楦唠娖讲⒈3指唠娖?。這個時間必須由定時器1模塊測量,可以通過以下行完成

while (Echo==0);
TMR1ON = 1;
while (Echo==1);
TMR1ON = 0;
測量時間后,結(jié)果值將保存在寄存器TMR1H和TMR1L中,這些寄存器必須進(jìn)行杵狀收集以獲得16位值。這是通過使用下面的行完成的

time_taken = (TMR1L | (TMR1H<<8));
此time_taken將以字節(jié)形式顯示,要獲得實際時間值,我們必須使用以下公式。

Time = (16-bit register value) * (1/Internal Clock) * (Pre-scale)
Internal Clock = Fosc/4

Where in our case,
Fosc = 20000000Mhz and Pre-scale = 4

Hence the value of Internal Clock will be 5000000Mhz and the value of time will be

Time = (16-bit register value) * (1/5000000) * (4)
= (16-bit register value) * (4/5000000)
= (16-bit register value) * 0.0000008 seconds (OR)
Time = (16-bit register value) * 0.8 micro seconds
在我們的程序中,16位寄存器的值存儲在變量time_taken中,因此下面的行用于以微秒為單位計算time_taken

time_taken = time_taken * 0.8;
接下來,我們必須找到如何計算距離。眾所周知,距離=速度*時間。但是這里的結(jié)果應(yīng)該除以 2,因為波同時覆蓋了發(fā)射距離和接收距離。我們波(聲音)的速度是34000厘米/秒。

Distance = (Speed*Time)/2
= (34000 * (16-bit register value) * 0.0000008) /2
Distance = (0.0272 * 16-bit register value)/2
所以距離可以用厘米計算,如下所示:

distance= (0.0272*time_taken)/2;
計算距離和時間的值后,我們只需在LCD屏幕上顯示它們即可。

使用PIC和超聲波傳感器測量距離:

建立連接并上傳代碼后,實驗設(shè)置應(yīng)如下圖所示。

pYYBAGOs9pKAWwCrAADbU6czMQA118.jpg


現(xiàn)在在傳感器之前放置一個對象,它應(yīng)該顯示對象與傳感器的距離。您還可以注意到波傳輸和返回所花費的時間以微秒為單位。


/*

Interfacing Ultrasonic sensor with PIC16F877A

* Code by: B.Aswinth Raj

* Dated: 19-07-2017

* More details at: www.CircuitDigest.com

*/



#define _XTAL_FREQ 20000000

#define RS RD2

#define EN RD3

#define D4 RD4

#define D5 RD5

#define D6 RD6

#define D7 RD7

#define Trigger RB1 //34 is Trigger

#define Echo RB2//35 is Echo

#include



#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)

#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)

#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)

#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)

#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)

#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)

#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)



//LCD Functions Developed by Circuit Digest.

void Lcd_SetBit(char data_bit) //Based on the Hex value Set the Bits of the Data Lines

{

if(data_bit& 1)

D4 = 1;

else

D4 = 0;



if(data_bit& 2)

D5 = 1;

else

D5 = 0;



if(data_bit& 4)

D6 = 1;

else

D6 = 0;



if(data_bit& 8)

D7 = 1;

else

D7 = 0;

}



void Lcd_Cmd(char a)

{

RS = 0;

Lcd_SetBit(a); //Incoming Hex value

EN = 1;

__delay_ms(4);

EN = 0;

}



void Lcd_Clear()

{

Lcd_Cmd(0); //Clear the LCD

Lcd_Cmd(1); //Move the curser to first position

}



void Lcd_Set_Cursor(char a, char b)

{

char temp,z,y;

if(a== 1)

{

temp = 0x80 + b - 1; //80H is used to move the curser

z = temp>>4; //Lower 8-bits

y = temp & 0x0F; //Upper 8-bits

Lcd_Cmd(z); //Set Row

Lcd_Cmd(y); //Set Column

}

else if(a== 2)

{

temp = 0xC0 + b - 1;

z = temp>>4; //Lower 8-bits

y = temp & 0x0F; //Upper 8-bits

Lcd_Cmd(z); //Set Row

Lcd_Cmd(y); //Set Column

}

}



void Lcd_Start()

{

Lcd_SetBit(0x00);

for(int i=1065244; i<=0; i--) ?NOP(); ??

Lcd_Cmd(0x03);

__delay_ms(5);

Lcd_Cmd(0x03);

__delay_ms(11);

Lcd_Cmd(0x03);

Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD

Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD

Lcd_Cmd(0x08); //Select Row 1

Lcd_Cmd(0x00); //Clear Row 1 Display

Lcd_Cmd(0x0C); //Select Row 2

Lcd_Cmd(0x00); //Clear Row 2 Display

Lcd_Cmd(0x06);

}



void Lcd_Print_Char(char data) //Send 8-bits through 4-bit mode

{

char Lower_Nibble,Upper_Nibble;

Lower_Nibble = data&0x0F;

Upper_Nibble = data&0xF0;

RS = 1; // => RS = 1

Lcd_SetBit(Upper_Nibble>>4); //Send upper half by shifting by 4

EN = 1;

for(int i=2130483; i<=0; i--) ?NOP(); ?

EN = 0;

Lcd_SetBit(Lower_Nibble); //Send Lower half

EN = 1;

for(int i=2130483; i<=0; i--) ?NOP();?

EN = 0;

}



void Lcd_Print_String(char *a)

{

int i;

for(i=0;a[i]!='';i++)

Lcd_Print_Char(a[i]); //Split the string using pointers and call the Char function

}

/*****End of LCD Functions*****/



int time_taken;

int distance;

char t1,t2,t3,t4,t5;

char d1,d2,d3;


int main()

{

TRISD = 0x00; //PORTD declared as output for interfacing LCD

TRISB0 = 1; //DEfine the RB0 pin as input to use as interrupt pin

TRISB1 = 0; //Trigger pin of US sensor is sent as output pin

TRISB2 = 1; //Echo pin of US sensor is set as input pin

TRISB3 = 0; //RB3 is output pin for LED



T1CON=0x20;


Lcd_Start();



Lcd_Set_Cursor(1,1);

Lcd_Print_String("Ultrasonic sensor");

Lcd_Set_Cursor(2,1);

Lcd_Print_String("with PIC16F877A");



__delay_ms(2000);

Lcd_Clear();



while(1)

{

TMR1H =0; TMR1L =0; //clear the timer bits



Trigger = 1;

__delay_us(10);

Trigger = 0;



while (Echo==0);

TMR1ON = 1;

while (Echo==1);

TMR1ON = 0;



time_taken = (TMR1L | (TMR1H<<8)); ?

distance= (0.0272*time_taken)/2;



time_taken = time_taken * 0.8;



t1 = (time_taken/1000)%10;

t2 = (time_taken/1000)%10;

t3 = (time_taken/100)%10;

t4 = (time_taken/10)%10;

t5 = (time_taken/1)%10;

d1 = (distance/100)%10;

d2 = (distance/10)%10;

d3 = (distance/1)%10;



Lcd_Set_Cursor(1,1);

Lcd_Print_String("Time_taken:");

Lcd_Print_Char(t1+'0');

Lcd_Print_Char(t2+'0');

Lcd_Print_Char(t3+'0');

Lcd_Print_Char(t4+'0');

Lcd_Print_Char(t5+'0');



Lcd_Set_Cursor(2,1);

Lcd_Print_String("distance:");

Lcd_Print_Char(d1+'0');

Lcd_Print_Char(d2+'0');

Lcd_Print_Char(d3+'0');

}

return 0;

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • PIC微控制器
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    7385
  • 超聲波傳感器
    +關(guān)注

    關(guān)注

    18

    文章

    574

    瀏覽量

    35845
  • HC-SR04
    +關(guān)注

    關(guān)注

    9

    文章

    82

    瀏覽量

    42539
收藏 人收藏

    評論

    相關(guān)推薦

    超聲波傳感器HC-SR04測距實例軟件

    超聲波傳感器HC-SR04測距實例軟件STM32CubeMX,keil5,野火串口調(diào)試助手硬件stm32f103vet6開發(fā)板,J-Link,超聲波
    發(fā)表于 07-30 07:03

    怎樣去編寫HC-SR04超聲波傳感器的程序呢

    怎樣去編寫HC-SR04超聲波傳感器的程序呢?怎樣去使用HC-SR04超聲波傳感器
    發(fā)表于 10-18 09:19

    如何對基于STM32F103VET6的超聲波傳感器HC-SR04進(jìn)行測距呢

    HC-SR04超聲波模塊的工作原理是什么?如何對基于STM32F103VET6的超聲波傳感器HC-SR04進(jìn)行測距呢?
    發(fā)表于 11-09 07:40

    HC-SR04超聲波傳感器實驗記錄

    什么是HC-SR04超聲波傳感器呢?HC-SR04超聲波傳感器的工作原理是什么?
    發(fā)表于 11-09 06:12

    HC-SR04超聲波測距模塊原理

    、HC-SR04超聲波測距模塊原理1.模塊簡介HC-SR04超聲波模塊常用于機(jī)器人避障、物體測距、液位檢測、公共安防、停車場檢測等場所。HC-SR0
    發(fā)表于 12-06 07:14

    HC-SR04超聲波具有哪些參數(shù)應(yīng)用

    引腳電平函數(shù)三、程序?qū)崿F(xiàn):運行效果:一、HC-SR04超聲波產(chǎn)品應(yīng)用領(lǐng)域:1、機(jī)器人避障  2、物體測距  3、液位檢測  4、公共安防  5、停車場檢測超聲波傳感器模塊上面通常有兩個
    發(fā)表于 01-07 06:08

    HC-SR04超聲波測距模塊及程序

    HC-SR04超聲波測距模塊及程序HC-SR04超聲波測距模塊及程序HC-SR04超聲波測距模塊
    發(fā)表于 12-08 16:50 ?83次下載

    HC-SR04超聲波測距資料

    、HC-SR04超聲波測距資料幫你了解傳感器實驗、使用快速入門,你擁有值得。
    發(fā)表于 05-10 10:36 ?18次下載

    如何將HC-SR04超聲波與樹莓派連接

    HC-SR04超聲波傳感器作為測距模塊銷售,因為它可以精確地用于測量2cm到400cm范圍內(nèi)的距離。精度為3mm。
    的頭像 發(fā)表于 07-29 11:15 ?1.2w次閱讀

    HC-SR04超聲波傳感器模塊的示例代碼資料合集

    本文檔的主要內(nèi)容詳細(xì)介紹的是HC-SR04超聲波傳感器模塊的示例代碼資料合集包括了:超聲波PIC單片機(jī)C程序,
    發(fā)表于 06-17 08:00 ?9次下載

    hc-sr04超聲波傳感器的原理和應(yīng)用

    本文主要闡述了hc-sr04超聲波傳感器的原理和應(yīng)用。
    發(fā)表于 04-23 09:42 ?3.2w次閱讀

    帶有HC-SR04超聲波傳感器陣列

    ?? ?使用便宜的HC-SR04超聲波傳感器和Arduino nano,我們可以為機(jī)器人構(gòu)建低成本的傳感器陣列。Arduino代碼輪詢
    發(fā)表于 12-30 15:06 ?0次下載

    HC-SR04超聲波傳感器開源分享

    電子發(fā)燒友網(wǎng)站提供《HC-SR04超聲波傳感器開源分享.zip》資料免費下載
    發(fā)表于 06-12 10:46 ?14次下載
    <b class='flag-5'>HC-SR04</b><b class='flag-5'>超聲波</b><b class='flag-5'>傳感器</b>開源分享

    Zephyr RTOS和HC-SR04超聲波傳感器開源

    電子發(fā)燒友網(wǎng)站提供《Zephyr RTOS和HC-SR04超聲波傳感器開源.zip》資料免費下載
    發(fā)表于 06-20 09:44 ?0次下載
    Zephyr RTOS和<b class='flag-5'>HC-SR04</b><b class='flag-5'>超聲波</b><b class='flag-5'>傳感器</b>開源

    超聲波傳感器HC-SR04(Arduino項目)

    電子發(fā)燒友網(wǎng)站提供《超聲波傳感器HC-SR04(Arduino項目).zip》資料免費下載
    發(fā)表于 07-04 10:43 ?9次下載
    <b class='flag-5'>超聲波</b><b class='flag-5'>傳感器</b><b class='flag-5'>HC-SR04</b>(Arduino項目)