0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > 基于AT89S51单片机超声波测距仪器设计方案

基于AT89S51单片机超声波测距仪器设计方案

来源:
2025-11-25
类别:工业控制
eye 1
文章创建人 拍明芯城

基于AT89S51单片机的超声波测距仪器设计方案

一、引言

随着工业自动化、机器人导航、智能交通等领域的快速发展,非接触式距离测量技术的重要性日益凸显。超声波测距技术凭借其非接触、成本低、抗干扰能力强等优势,成为中短距离测量的主流方案之一。本设计以AT89S51单片机为核心,结合超声波传感器、温度补偿模块和显示电路,构建一套高精度、低成本的超声波测距系统,适用于工业检测、智能车辆避障、液位监测等场景。

image.png

本方案的核心设计目标包括:

  1. 测量范围:0.2m至5m,精度±1cm;

  2. 实时性:单次测量时间≤100ms;

  3. 环境适应性:支持-10℃至+50℃温度范围,通过温度补偿修正声速误差;

  4. 用户交互:LED数码管实时显示距离值,按键触发测量与数据保存。

二、系统总体设计

系统采用模块化设计,分为硬件电路与软件程序两大部分。硬件电路包括单片机最小系统、超声波发射/接收模块、温度补偿模块、显示电路和按键电路;软件程序通过主循环调用发射、接收、数据处理和显示子程序,实现测距功能。

2.1 硬件系统架构

硬件系统以AT89S51单片机为核心,通过以下模块协同工作:

  1. 超声波发射模块:驱动超声波传感器发射脉冲信号;

  2. 超声波接收模块:接收回波信号并放大滤波,输出可识别的电平信号;

  3. 温度补偿模块:采集环境温度,修正声速计算误差;

  4. 显示模块:LED数码管显示测量距离;

  5. 按键模块:触发测量、保存数据或清零操作。

2.2 软件系统流程

软件程序采用C语言编写,主流程如下:

  1. 初始化:配置定时器、中断、I/O口和串口;

  2. 按键检测:判断是否触发测量;

  3. 发射超声波:启动定时器,发送脉冲信号;

  4. 接收回波:检测回波信号,停止定时器并记录时间差;

  5. 温度补偿:读取温度传感器数据,计算当前声速;

  6. 距离计算:根据时间差和声速计算距离;

  7. 数据显示:将结果输出至LED数码管;

  8. 数据存储:按需保存测量值至单片机内部RAM。

三、硬件电路设计

3.1 单片机最小系统

元器件型号:AT89S51-24PU(DIP40封装)
作用:作为系统核心控制器,负责信号处理、定时控制、数据计算和人机交互。
选型依据

  • 性能优势:AT89S51是8位高性能CMOS单片机,采用ATMEL高密度非易失存储器技术,支持1000次以上在线编程(ISP),兼容MCS-51指令集,便于代码移植与扩展。

  • 资源丰富:内置4KB Flash程序存储器、128字节RAM、4个8位I/O口(P0-P3)、2个16位定时器/计数器(T0/T1)和1个全双工串行口(UART),满足测距系统的存储与控制需求。

  • 成本效益:相比STM32等32位单片机,AT89S51价格更低(约6-10元/片),适合低成本批量应用。

电路设计

  • 时钟电路:采用12MHz晶振与22pF电容构成内部振荡器,为单片机提供稳定时钟信号;

  • 复位电路:由10μF电容和8.2kΩ电阻组成上电复位电路,确保系统可靠启动;

  • 电源电路:VCC接+5V直流电源,GND接地,通过0.1μF电容滤波消除电源噪声。

3.2 超声波发射模块

元器件型号:TCT40-10T超声波传感器(发射端)
作用:将电信号转换为40kHz超声波脉冲信号并发射至目标物体。
选型依据

  • 频率匹配:TCT40-10T工作频率为40kHz,与接收端TCT40-10R匹配,确保;

  • 发射功率:该传感器发射声压级≥105dB,可覆盖5m测量范围;

  • 成本低廉:单价约5-8元,适合低成本设计。

电路设计

  • 驱动电路:单片机P1.0口输出10μs高电平脉冲,通过三极管(如S8050)放大后驱动传感器发射超声波;

  • 保护电路:在传感器电源端并联100Ω电阻和0.1μF电容,抑制高频噪声。

3.3 超声波接收模块

元器件型号:TCT40-10R超声波传感器(接收端)+ CX20106A红外接收放大芯片
作用:接收目标物体反射的超声波信号,经放大滤波后输出可识别的电平信号。
选型依据

  • CX20106A优势

    • 集成前置放大器、限幅放大器、带通滤波器、检波器和积分器,可直接处理微弱回波信号;

    • 中心频率40kHz,带宽±2kHz,与发射信号匹配;

    • 输出端为TTL电平,可直接连接单片机I/O口。

  • TCT40-10R特性:接收灵敏度≥-70dB,满足5m距离检测需求。

电路设计

  • 接收电路:传感器输出信号接入CX20106A的1脚(IN),7脚(OUT)输出至单片机P3.2(INT0)引脚;

  • 参数调整:通过调节CX20106A的2脚(增益控制)和5脚(检测距离控制)电阻,优化信号灵敏度与抗干扰能力。

3.4 温度补偿模块

元器件型号:DS18B20数字温度传感器
作用:实时采集环境温度,修正声速计算误差,提高测距精度。
选型依据

  • 测量精度:DS18B20在-10℃至+85℃范围内精度±0.5℃,满足工业级需求;

  • 接口简单:采用单总线协议,仅需1根I/O线(P1.6)即可与单片机通信;

  • 封装多样:支持TO-92、SOIC等多种封装,便于安装与替换。

电路设计

  • 电源电路:VCC接+5V,GND接地,DQ引脚通过4.7kΩ上拉电阻连接至P1.6;

  • 防接反保护:在电源端串联二极管(如1N4148),防止极性接反损坏传感器。

3.5 显示模块

元器件型号:4位共阴极LED数码管(0.36英寸)
作用:实时显示测量距离,单位厘米(cm)。
选型依据

  • 显示清晰:共阴极数码管亮度高,适合室内外环境;

  • 驱动简单:通过4位锁存器(如74HC573)和限流电阻(220Ω)连接至单片机P0口,节省I/O资源;

  • 成本低:单价约2-3元,适合批量应用。

电路设计

  • 段选控制:P0口连接数码管段选端(a-g,dp),通过74HC573锁存;

  • 位选控制:P2口低4位(P2.0-P2.3)连接数码管位选端,通过三极管驱动。

3.6 按键模块

元器件型号:轻触按键(6mm×6mm)
作用:触发测量、保存数据或清零操作。
选型依据

  • 操作便捷:轻触按键体积小,寿命长(≥10万次);

  • 接口简单:通过上拉电阻(10kΩ)连接至单片机I/O口(P3.3-P3.5),检测低电平触发。

电路设计

  • 按键消抖:软件采用延时消抖(约10ms),避免机械抖动导致误触发。

四、软件程序设计

4.1 主程序设计

主程序流程如下:

#include <reg51.h>
#include <intrins.h>
#include "ds18b20.h"  // 温度传感器驱动头文件

#define uchar unsigned char
#define uint unsigned int

sbit Trig = P1^0;    // 发射控制引脚
sbit Echo = P3^2;    // 接收中断引脚
sbit KEY1 = P3^3;    // 测量按键
sbit KEY2 = P3^4;    // 保存按键
sbit KEY3 = P3^5;    // 清零按键

uchar code seg_table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // 数码管段码表
uchar display_buf[4] = {0}; // 显示缓冲区
float distance = 0;         // 距离值(cm)
float temperature = 25.0;   // 环境温度(℃)

void delay_ms(uint ms);      // 延时函数
void timer0_init();          // 定时器0初始化
void int0_init();            // 外部中断0初始化
void display();              // 数码管显示函数
void key_scan();             // 按键扫描函数
float calculate_distance();   // 距离计算函数
float get_temperature();      // 温度读取函数

void main() {
   timer0_init();
   int0_init();
   EA = 1;  // 开总中断
   while(1) {
       key_scan();      // 检测按键
       temperature = get_temperature(); // 读取温度
       display();       // 更新显示
   }
}

4.2 子程序设计

4.2.1 超声波发射子程序

void trigger_ultrasonic() {
   Trig = 1;      // 发射引脚置高
   _nop_(); _nop_(); _nop_(); _nop_(); // 延时约1μs(12MHz晶振)
   Trig = 0;      // 发射引脚置低
}

4.2.2 超声波接收子程序(中断服务)

void int0_isr() interrupt 0 {
   static uint time_count = 0;
   if (Echo == 1) {  // 上升沿触发,启动定时器
       TR0 = 1;      // 定时器0开始计时
   } else {          // 下降沿触发,停止定时器
       TR0 = 0;      // 定时器0停止计时
       time_count = TH0 * 256 + TL0; // 读取计数值
       TH0 = 0; TL0 = 0; // 清零定时器
       distance = calculate_distance(time_count); // 计算距离
   }
}

4.2.3 距离计算子程序

float calculate_distance(uint time) {
   float speed_of_sound; // 声速(m/s)
   // 声速修正公式:v = 331.4 + 0.607*T(T为温度,℃)
   speed_of_sound = 331.4 + 0.607 * temperature;
   // 距离 = (时间 * 声速) / 2(单位:cm)
   return (time * speed_of_sound * 0.01 / 2);
}

4.2.4 温度读取子程序

float get_temperature() {
   uchar temp_l, temp_h;
   float temp;
   DS18B20_Init();       // 初始化DS18B20
   DS18B20_WriteByte(0xCC); // 跳过ROM
   DS18B20_WriteByte(0x44); // 启动温度转换
   delay_ms(800);       // 等待转换完成
   DS18B20_Init();
   DS18B20_WriteByte(0xCC); // 跳过ROM
   DS18B20_WriteByte(0xBE); // 读取温度寄存器
   temp_l = DS18B20_ReadByte(); // 读取低字节
   temp_h = DS18B20_ReadByte(); // 读取高字节
   temp = (temp_h << 8) | temp_l; // 合并数据
   temp *= 0.0625;      // 转换为实际温度值
   return temp;
}

4.2.5 数码管显示子程序

void display() {
   static uchar i = 0;
   P2 = ~(0x01 << i);  // 位选控制
   P0 = seg_table[display_buf[i]]; // 段选控制
   if (++i == 4) i = 0; // 循环显示4位
   delay_ms(2);         // 动态扫描延时
}

4.2.6 按键扫描子程序

void key_scan() {
   if (KEY1 == 0) {      // 测量按键按下
       delay_ms(10);     // 消抖
       if (KEY1 == 0) {
           trigger_ultrasonic(); // 触发发射
           while(!Echo);  // 等待回波
       }
   }
   if (KEY2 == 0) {      // 保存按键按下
       delay_ms(10);
       if (KEY2 == 0) {
           // 保存距离值至EEPROM(需扩展)
       }
   }
   if (KEY3 == 0) {      // 清零按键按下
       delay_ms(10);
       if (KEY3 == 0) {
           distance = 0;  // 清零距离值
       }
   }
}

五、系统调试与优化

5.1 硬件调试

  1. 电源检查:确保VCC=5V,GND接地良好,无短路或虚焊;

  2. 晶振测试:用示波器观察XTAL1引脚波形,确认频率为12MHz;

  3. 传感器测试:用信号发生器模拟40kHz信号,检查CX20106A输出是否正确;

  4. 温度传感器测试:通过串口打印DS18B20读取值,验证温度精度。

5.2 软件调试

  1. 定时器校准:用逻辑分析仪捕获定时器输出,调整初值使计时准确;

  2. 中断响应测试:触发Echo信号,检查中断服务程序是否及时执行;

  3. 显示测试:手动修改display_buf值,观察数码管显示是否正确;

  4. 按键测试:按下按键,检查程序是否进入对应分支。

5.3 精度优化

  1. 声速修正:根据实际环境温度动态调整声速计算公式的系数;

  2. 滤波算法:采用移动平均滤波(如取最近5次测量值的平均)减少随机误差;

  3. 硬件滤波:在CX20106A输出端增加RC低通滤波器(如R=1kΩ,C=0.1μF),抑制高频噪声。

六、元器件采购与替代方案

6.1 元器件采购渠道

推荐通过拍明芯城查询元器件型号、品牌、价格及供应商信息。拍明芯城提供以下功能:

  1. 型号查询:输入AT89S51、DS18B20等型号,获取详细参数与数据手册;

  2. 价格参考:对比不同供应商报价,选择性价比最高的渠道;

  3. 国产替代:如AT89S51缺货,可查询STC89C52(兼容MCS-51指令集,性能更强)作为替代;

  4. 封装与规格:确认DIP40、SOIC等封装是否匹配设计需求。

6.2 关键元器件替代方案

元器件型号替代型号选型依据
AT89S51-24PUSTC89C52RC兼容MCS-51指令集,内置8KB Flash,支持更高时钟频率(最高11.0592MHz)
TCT40-10T/RMAXBOTIX HR-MAX测量范围更广(0-6.45m),精度±1cm,但成本较高(约50-80元)
CX20106ALM358+外围电路用运放搭建放大滤波电路,灵活性高,但设计复杂度增加
DS18B20LM35DZ模拟输出温度传感器,需ADC转换,但价格更低(约2-3元)

七、总结与展望

本设计基于AT89S51单片机,结合超声波传感器与温度补偿模块,实现了高精度、低成本的非接触式测距系统。通过模块化设计与软件优化,系统在5m范围内精度可达±1cm,满足工业检测与智能控制需求。未来可扩展以下功能:

  1. 无线通信:增加蓝牙或Wi-Fi模块,实现远程数据传输;

  2. 多传感器融合:结合红外或激光传感器,提高复杂环境下的可靠性;

  3. 上位机软件:开发PC端或手机APP,实现数据记录与分析。

本方案为超声波测距技术的低成本实现提供了完整参考,适用于教学实验、工业自动化与智能家居等领域。

责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告