本文將介紹一款基于8051單片機的簡易超聲波測距傳感器。該傳感器可測量最遠2.5米的距離,精度為1厘米。AT89S51單片機和HC-SR04超聲波傳感器模塊構成了該電路的基礎。超聲波模塊向目標物體發送信號,接收反射信號,并輸出一個周期與距離成正比的波形。單片機接收該信號,進行必要的處理,并在3位七段數碼管上顯示相應的距離值。該電路廣泛應用于停車傳感器、障礙物預警系統、地形跟隨機器人、工業測距等領域。
HC-SR04超聲波模塊
HC-SR04是一款專為嵌入式項目設計的超聲波測距模塊。其分辨率為0.3厘米,測量范圍為2厘米至500厘米。該模塊采用5V直流電源供電,待機電流小于2mA。該模塊發射超聲波信號,接收其反射信號,測量兩次事件之間的時間間隔,并輸出一個波形,該波形的高電平周期由測量時間調制,測量時間與距離成正比。HC-SR04 模塊的圖片如下所示。
HC-SR04 超聲波測距模塊
HC-SR04 超聲波測距模塊
該模塊內置電路使其幾乎全自動運行,編程人員只需發送一個觸發信號即可啟動發射和接收反射信號,從而計算距離。HC-SR04 有四個引腳:Vcc、Trigger、Echo 和 GND,以下將詳細介紹。
VCC:此引腳連接 5V 直流電源電壓。
Trigger:此引腳用于施加啟動發射的觸發信號。觸發信號必須是持續時間為 10μs 的高電平脈沖。當模塊接收到有效的觸發信號時,它會從發射器發射 8 個 40kHz 的超聲波脈沖。接收器接收到反射的聲音信號。
回聲:模塊在此引腳輸出一個持續時間與距離成正比的高電平波形。
GND:此引腳接地。
HC-SR04 時序圖
HC-SR04 時序圖
HC-SR04 時間表.png (121.27 KB, 下載次數: 0)
下載附件
2026-4-2 12:24 上傳
從時序圖中可以看出,40kHz脈沖序列在10μs觸發脈沖之后立即發射,音頻輸出則在一段時間后接收。下一個觸發脈沖只能在音頻信號衰減后才能引入,這段時間稱為一個周期。HC-SR04的周期不得小于50ms。根據技術文檔,可以使用以下公式,根據反射脈沖的寬度計算距離:
距離(厘米)= 反射脈沖寬度(微秒)/ 58
距離(英寸)= 反射脈沖寬度(微秒)/ 148
基于 8051 單片機的超聲波測距電路圖
基于單片機的超聲波測距電路圖
基于微控制器的超聲波測距電路圖。.png (421.85 KB, 下載次數: 0)
下載附件
2026-4-2 12:28 上傳
超聲波模塊通過引腳 P3.0 和 P3.1 連接到微控制器。端口 0 用于向屏幕傳輸 8 位顯示數據,端口 P1.0、P1.1 和 P1.2 用于向相應的顯示單元 D1、D2 和 D3 傳輸顯示控制信號。按鈕 S1、電容 C3 和電阻 R9 構成噪聲復位電路。電容 C1、C2 和晶振 X1 與時鐘電路相關。
程序。
ORG 00H // 原點
MOV DPTR,#LUT // 將查找表 (LUT) 的地址移動到 DPTR
MOV P1,#00000000B // 將 P1 設置為輸出端口
MOV P0,#00000000B // 將 P0 設置為輸出端口
CLR P3.0 // 將 P3.0 設置為發送觸發信號的輸出端口
SETB P3.1 // 將 P3.1 設置為接收回顯信號的輸入端口
MOV TMOD,#00100000B // 將定時器 1 設置為模式 2 自動重載定時器
MAIN: MOV TL1,#207D // 加載初始計數值
MOV TH1,#207D // 加載重載值
MOV A,#00000000B // 清零累加器
SETB P3.0 // 開始觸發脈沖
ACALL DELAY1 // 為觸發脈沖設置 10 微秒的寬度
CLR P3.0 // 結束觸發脈沖。脈沖
此處:JNB P3.1,此處 // 循環至此處,直到收到回聲
返回:SETB TR1 // 啟動定時器1
此處1:JNB TF1,此處1 // 循環至此處,直到定時器溢出(例如:計數48)
CLR TR1 // 停止定時器
CLR TF1 // 清除定時器標志1
INC A // 每次定時器1溢出時,A值加一
JB P3.1,返回 // 如果仍有回聲,則跳轉至返回
MOV R4,A // 將A的值保存到R4
ACALL DLOOP // 調用顯示循環
SJMP MAIN // 跳轉至主循環
DELAY1:MOV R6,#2D // 延遲10微秒
LABEL1:DJNZ R6,LABEL1
返回
DLOOP:MOV R5,#100D // 將R5的值設置為100D
返回1:MOV A,R4 // 將A的值加載到R4 R4 到 A
MOV B,#100D // 將 100D 加載到 B 寄存器
DIV AB // 分離出第一個數字
SETB P1.0 // 激活 LED 顯示單元 D1
ACALL DISPLAY // 調用 DISPLAY 子程序
MOV P0,A // 將第一個數字的驅動模式移動到 P0 寄存器
ACALL DELAY // 延遲 1 毫秒
ACALL DELAY
MOV A,B // 將第一次除法的余數移動到 A 寄存器
MOV B,#10D // 將 10D 加載到 B 寄存器
DIV AB // 分離出第二個數字
CLR P1.0 // 關閉 LED 顯示單元 D1
SETB P1.1 // 激活 LED 顯示單元 D2
ACALL DISPLAY
MOV P0,A // 將第二個數字的驅動模式移動到 P0 寄存器
ACALL DELAY
ACALL DELAY
MOV A,B // 將第二次除法的余數移動到 A 寄存器
CLR P1.1 // 關閉 LED 顯示單元 D2
SETB P1.2 // 激活 LED 顯示單元 D3
ACALL DISPLAY
MOV P0,A // 將第三位數字的驅動模式移動到 P0
ACALL DELAY
ACALL DELAY
CLR P1.2 // 關閉 LED 顯示單元 D3
DJNZ R5,BACK1 // 重復顯示循環 100 次
RET
DELAY: MOV R7,#250D // 延遲 1 毫秒
LABEL2: DJNZ R7,LABEL2
RET
DISPLAY: MOVC A,@A+DPTR // 獲取 A 中內容的數字驅動模式
CPL A // 對數字驅動模式進行補碼(參見注釋 1)
RET
LUT: DB 3FH // 查找表 (LUT) 從此處開始
DB 06H
DB 5BH
DB 4FH
DB 66H
DB 6DH
DB 7DH
DB 07H
DB 7FH
DB 6FH
結束
程序的第一部分設置初始條件。端口 0 和端口 1 設置為輸出端口,用于發送相應的數字控制信號和數字控制信號。端口 3.0 設置為輸出引腳,用于向超聲波模塊發送觸發信號以啟動發射;端口 3.1 設置為輸入引腳,用于接收反射信號。微控制器的 TMOD 寄存器被加載,使定時器 1 工作在 2 位 8 位自動重載模式。此處未使用微控制器的定時器 0。在程序的下一部分(主循環)中,定時器 1 的 TL1 和 TH1 寄存器被加載初始值。TL1 被加載初始值,從該值開始計數,并持續計數直到循環結束(即 255D)。當循環發生時,TF1 標志位被置位,TL1 自動加載 TH1 中存儲的重載值,該序列重復執行,直到程序將 TR1 置低。TF1 在第一次循環后變為高電平,如果希望它作為每次循環的指示器,則必須在每次循環后使用程序將其清除。在主循環的下一部分,P3.0 被置高 10 微秒,然后清除以產生一個 10 微秒的觸發脈沖。超聲波模塊在接收到此觸發信號后會發射一個 40kHz 的脈沖波形,程序會等待直到在 P3.1 接收到有效的反射信號。反射信號的脈沖寬度與到障礙物的距離成正比,因此程序的下一個任務是測量脈沖寬度。當 P3.1 接收到有效的反射脈沖時,定時器 1 啟動并執行后續操作。
|