本文将介绍一款基于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 时序图
从时序图中可以看出,40kHz脉冲序列在10μs触发脉冲之后立即发射,音频输出则在一段时间后接收。下一个触发脉冲只能在音频信号衰减后才能引入,这段时间称为一个周期。HC-SR04的周期不得小于50ms。根据技术文档,可以使用以下公式,根据反射脉冲的宽度计算距离:
距离(厘米)= 反射脉冲宽度(微秒)/ 58
距离(英寸)= 反射脉冲宽度(微秒)/ 148
基于 8051 单片机的超声波测距电路图
基于单片机的超声波测距电路图
超声波模块通过引脚 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 启动并执行后续操作。
|