51单片机超声波测距用lcd1602显示距离写个程序‘’
时间: 2023-08-30 09:04:04 浏览: 63
下面是一个基于51单片机的超声波测距和LCD1602显示距离的程序,供参考:
```c
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit Trig = P3^2;
sbit Echo = P3^3;
void delayms(uint xms);
void WriteCommand(uchar com);
void WriteData(uchar dat);
void InitLcd1602();
void DisplayDistance(uint distance);
void main()
{
uint distance = 0;
uint tmp = 0;
InitLcd1602();
while(1)
{
// 发送超声波信号
Trig = 1;
delayms(10);
Trig = 0;
// 接收回波并计算距离
while(!Echo);
tmp = TH1;
tmp = (tmp << 8) | TL1;
distance = tmp / 58;
// 显示距离
DisplayDistance(distance);
// 延时
delayms(500);
}
}
// 毫秒级延时函数
void delayms(uint xms)
{
uint i, j;
for(i = xms; i > 0; i--)
for(j = 110; j > 0; j--);
}
// 写入命令到LCD1602
void WriteCommand(uchar com)
{
P0 = com;
P2 &= ~0x01; // RS=0
P2 &= ~0x04; // RW=0
P2 |= 0x08; // E=1
_nop_(); // 稍作延时
P2 &= ~0x08; // E=0
}
// 写入数据到LCD1602
void WriteData(uchar dat)
{
P0 = dat;
P2 |= 0x01; // RS=1
P2 &= ~0x04; // RW=0
P2 |= 0x08; // E=1
_nop_(); // 稍作延时
P2 &= ~0x08; // E=0
}
// 初始化LCD1602
void InitLcd1602()
{
WriteCommand(0x38); // 8位数据总线,2行×16字符
WriteCommand(0x0c); // 显示开,无光标,不闪烁
WriteCommand(0x06); // 光标右移,字符不移动
WriteCommand(0x01); // 显示清屏
}
// 显示距离到LCD1602
void DisplayDistance(uint distance)
{
uchar str[6];
sprintf(str, "%dcm", distance);
WriteCommand(0x80); // 第1行第1列
for(uchar i = 0; i < 3; i++)
WriteData(str[i]);
WriteData(' ');
for(uchar i = 3; i < 6; i++)
WriteData(str[i]);
}
```
在此程序中,我们使用 P3^2 作为超声波发射管的输出口,P3^3 作为超声波接收管的输入口。在主循环中,我们不断发送超声波信号并接收回波,计算出距离后显示到LCD1602屏幕上。其中,`delayms()` 函数用于毫秒级延时,`WriteCommand()` 和 `WriteData()` 函数分别用于向LCD1602写入命令和数据,`InitLcd1602()` 函数用于初始化LCD1602屏幕,`DisplayDistance()` 函数用于显示距离到LCD1602屏幕上。
阅读全文