52单片机超声波测距并用lcd1602显示
时间: 2023-07-03 22:10:10 浏览: 98
超声波测距(LCD1602显示).zip_1602显示屏测距_lcd1602_themhbc_单片机_超声波测距、显示
实现52单片机超声波测距并用lcd1602显示的步骤如下:
1. 连接超声波模块和LCD1602模块到52单片机上。
2. 初始化LCD1602模块,设置显示模式、光标位置等参数。
3. 初始化超声波模块,设置引脚输入输出模式。
4. 在主程序中循环执行以下操作:
a. 触发超声波模块,发送出超声波信号。
b. 接收超声波返回的信号,计算出距离。
c. 将距离值转换为字符串格式,存储到一个缓冲区中。
d. 清空LCD1602屏幕上原有的内容。
e. 将距离值字符串写入LCD1602显示屏幕上。
f. 等待一段时间后,再次执行上述操作。
完整的代码如下:
```c
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit E = P3^6; //LCD1602的使能端
sbit RW = P3^5; //LCD1602的读写选择端
sbit RS = P3^4; //LCD1602的指令数据选择端
sbit Trig = P1^0; //超声波发送端口
sbit Echo = P1^1; //超声波接收端口
uchar code DisStr[] = "Distance:"; //显示字符串
void delay_us(uint us)
{
while (us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(uint ms)
{
while (ms--)
{
delay_us(1000);
}
}
void WriteCommand(uchar cmd)
{
RS = 0; //选择指令数据
RW = 0; //选择写入模式
P0 = cmd; //写入指令
E = 1;
delay_us(5);
E = 0;
}
void WriteData(uchar dat)
{
RS = 1; //选择数据
RW = 0; //选择写入模式
P0 = dat; //写入数据
E = 1;
delay_us(5);
E = 0;
}
void LcdInit()
{
WriteCommand(0x38); //设置16×2显示,5×7点阵,8位数据接口
WriteCommand(0x0c); //开启显示不显示光标
WriteCommand(0x06); //设置文字不动,光标动
WriteCommand(0x01); //清屏
}
void UtrasonicInit()
{
Trig = 0;
}
uint GetDistance()
{
uint distance;
uint time;
Trig = 1;
delay_us(10);
Trig = 0;
while (!Echo);
TR0 = 1;
while (Echo);
TR0 = 0;
time = TH0 * 256 + TL0;
distance = time * 17 / 1000;
return distance;
}
void DisplayDistance(uint distance)
{
uchar i;
uchar buf[8];
sprintf(buf, "%d", distance); //将距离值转换为字符串
WriteCommand(0x80); //设置光标位置为第一行第一列
for (i = 0; i < 10; i++)
{
if (DisStr[i] == '\0')
break;
WriteData(DisStr[i]); //写入显示字符串
}
WriteCommand(0x8c); //设置光标位置为第一行第十一列
for (i = 0; i < 8; i++)
{
if (buf[i] == '\0')
break;
WriteData(buf[i]); //写入距离值字符串
}
}
void main()
{
LcdInit();
UtrasonicInit();
TMOD = 0x01; //设置计时器0为16位定时器模式
while (1)
{
DisplayDistance(GetDistance());
delay_ms(500);
}
}
```
在程序中,我们使用了定时器0来计算超声波发送和返回的时间,然后通过公式计算出距离值。距离值转换成字符串后,通过LCD1602显示出来。
需要注意的是,此程序仅供参考,实际应用中需要根据硬件连接和具体需求进行调整。
阅读全文