本实验旨在使用51单片机(AT89C51)结合超声波传感器HC-SR04和LCD1602液晶显示屏,通过Proteus仿真平台实现超声波测距功能,并将测得的距离显示在LCD1602上。该系统可以用于智能小车避障、距离检测等应用场景。
51单片机(AT89C51)
主频:12MHz
存储器:4KB Flash,128B RAM
定时器:两个16位定时器
I/O口:4个8位并行I/O口
超声波传感器(HC-SR04)
工作电压:5V
工作频率:40kHz
测量范围:2cm-400cm
测量精度:±3mm
引脚:VCC, GND, Trig, Echo
LCD1602液晶显示屏
显示内容:2行16字符
工作电压:5V
控制接口:8位并行数据接口或4位并行数据接口
HC-SR04连接
VCC连接到5V电源
GND连接到地
Trig连接到P1.5
Echo连接到P1.6
LCD1602连接
RS连接到P2.0
RW连接到P2.1
E连接到P2.2
数据线D4-D7分别连接到P2.4-P2.7
超声波传感器通过发射40kHz的超声波脉冲,当遇到障碍物时,超声波反射回来。传感器接收反射波并计算从发射到接收的时间差,根据公式:
[ \text{距离} = \frac{\text{时间差} \times \text{声速}}{2} ]
计算出距离。声速在空气中约为340m/s。
定时器0配置为模式1(16位定时器),用于测量Echo引脚的高电平时间。通过中断处理溢出情况,确保测量的精确性。
LCD1602使用4位数据接口模式连接到单片机。通过初始化函数LCD_init
进行初始化,之后通过LCD_write_str
函数将测量结果显示到屏幕上。
Trig引脚通过软件控制发射超声波脉冲,Echo引脚接收反射信号,并由定时器0记录高电平持续时间。
定时器0的溢出中断服务程序设置一个标志位Flag_Ultrasonic
,表示测量超时,防止因未接收到反射信号而导致程序卡死。
通过定义的函数库实现对LCD1602的控制,包括初始化、清屏、光标移动和字符串显示等功能。
程序主要包括以下几个部分:
初始化部分
初始化LCD1602
初始化定时器0
测距过程
控制Trig引脚发出10us高电平脉冲
等待Echo引脚变高,启动定时器0
Echo引脚变低,停止定时器0
计算时间差并转换为距离
显示部分
将计算出的距离转换为字符串格式
调用LCD_write_str
函数显示到LCD1602上
cvoid main() {
unsigned char disp[10];
unsigned int distance = 0;
Trig = 0;
Echo = 1;
LCD_init();
Init_Timer0();
delay_ms(100);
while (1) {
TR0 = 0;
TH0 = 0;
TL0 = 0;
Trig = 1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
Trig = 0;
while (!Echo);
TR0 = 1;
while (Echo);
TR0 = 0;
distance = Conut();
sprintf(disp, "%dmm", distance);
LCD_write_str(6, 1, disp);
}
}
main
函数初始化硬件和软件环境,进入主循环。
通过控制Trig引脚发出超声波信号,并测量Echo引脚高电平持续时间。
计算距离并转换为字符串格式,显示在LCD1602上。
本实验通过Proteus仿真平台,成功实现了51单片机结合超声波传感器和LCD1602显示屏的距离测量系统。实验过程中,熟悉了定时器的使用、中断的处理以及液晶显示屏的控制方法,为后续更加复杂的应用奠定了基础。
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!