目录
一、设计背景
随着科技的迅猛发展,各种自动化系统在日常生活中的应用越来越广泛。超声波测距技术作为一种非接触式测距方法,因其精度高、响应速度快以及适应性强而受到广泛关注。特别是在智能车辆、智能家居和工业自动化等领域,超声波测距技术已经成为不可或缺的重要组成部分。
基于51单片机的超声波测距设计利用了51单片机本身的高性能和灵活性,通过合理的硬件设计和精确的软件控制,实现了精准的距离测量功能。51单片机因其结构简单、价格低廉以及丰富的开发资源,成为了实现这类应用的理想选择。
在设计中,首先需要考虑的是超声波传感器与51单片机的接口设计。超声波传感器能够发射超声波脉冲,并接收回波,通过计算发送与接收之间的时间差来计算目标物体与传感器之间的距离。通过合适的电路设计和单片机的定时器功能,可以精确地捕捉超声波信号的时间差,从而计算出距离。
其次,为了提高测量精度和系统的稳定性,设计中需要考虑噪声滤波、数据处理算法以及数据校准等关键问题。通过精确的数据处理和算法优化,可以有效地消除测量中的干扰信号,并提高测距系统的准确性和可靠性。
本设计中,51单片机充当了核心控制器的角色,通过IO口与各个功能模块相连接。使用HC-SR04超声波测距传感器测量距离,并将测得的距离数据实时显示在LCD1602液晶显示屏上。
软件系统采用C语言编写程序,包括显示程序,中断服务,延时程序等,并在KEIL5中调试运行,硬件系统利用PROTEUS8.11强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。
二、实现功能
以51单片机为控制核心,设计一种超声波测距系统。整个系统包括MCU、晶振电路、时钟电路、测距电路以及LCD1602显示电路。可具体实现以下功能:
(1)使用HC-SR04超声波传感器测量距离。
(2)将测得的距离实时显示在LCD1602显示屏上。
三、仿真演示
完整仿真图如下:
测距结果1如下:
测距结果2如下:
测距结果3如下:
测距结果4如下:
测距结果5:
四、源程序(部分)
main.c文件
//宏定义
#define uchar unsigned char
#define uint unsigned int
#define ULint unsigned long int
//温度零上与零下的标志位
char flag=0;
//超声波
char flags=0;
//超声波距离
char flag1s=0;
//计算定时间
uint time=0;
//计算距离
ULint L_=0;
//头函数
#include <reg52.h>
#include <intrins.h>
#include "display.h" //显示头函数
#include "ultrasonic_wave.h"//超声波头函数
//函数声明
void delayms(uint ms);
//主函数
void main()
{
Init_ultrasonic_wave();
//屏幕初始化
Init1602();
//温度初始化
//循环显示
while(1)
{
StartModule();//启动超声波
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
delayms(20); //20MS
Conut(); //计算距离
Display_1602(L_);
//调整显示
}
}
void delayms(uint ms)
{
uchar i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
//T0中断用来计数器溢出,超过测距范围
void CJ_T0() interrupt 1
{
flags=1; //中断溢出标志
}
display.h文件
//LCD管脚声明
sbit LCDRS = P3^5;
sbit LCDEN= P3^4;
sbit LCDRW= P3^6;
//初始画时显示的内容
uchar code Init2[]="Distance: 000CM";
//LCD延时
void LCDdelay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
//写命令
void write_com(uchar com)
{
LCDRS=0;
P0=com;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//写数据
void write_data(uchar date)
{
LCDRS=1;
P0=date;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//1602初始化
void Init1602()
{
uchar i=0;
LCDRW=0;
write_com(0x38);//屏幕初始化
write_com(0x0C);//打开显示 无光标 无光标闪烁
write_com(0x06);//当读或写一个字符是指针后一一位
write_com(0x01);//清屏
write_com(0x80+0x40);//设置位置
for(i=0;i<16;i++)
{
write_data(Init2[i]);
}
}
//距离显示
void Display_1602(uint L)
{
//长度值显示
if(flag1s==1)
{
write_com(0x80+0x00+0x0a);
write_data(' ');
write_data('0'+L/100);
write_data('0'+L/10%10);
write_data('0'+L%10);
}
else if(flag1s==0)
{
write_com(0x80+0x00+0x0a);
write_data('-');
write_data('-');
write_data('-');
write_data('-');
}
}
ultrasonic_wave.h文件
//超声波管脚定义
sbit RX=P2^0;
sbit TX=P2^1;
//超声波初始化
void Init_ultrasonic_wave()
{
TX=0; //关闭发射
TMOD=0x11; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允许T0中断
TH1=0x3c;
TL1=0xb0;
ET1=1;
TR0=0;
EA=1; //开启总中断
}
//启动超声波
void StartModule() //启动模块
{
TX=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
//距离计算 SD为当时的超声速度
void Conut()
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
L_=(time*3.49)/200; //算出来是CM;
//距离大于200或者超时
if(L_>500||flags==1)
{
flags=0;
//无效显示
flag1s=0;
L_=0;
}
//距离小于100
else if(L_<=500)
{
flag1s=1;
}
}
仿真源文件及源程序百度网盘链接: https://pan.baidu.com/s/1ZwK-yUFEIPkh8UD8FQI5IA?pwd=7cha 提取码: 7cha