51单片机超声波测距用lcd1602显示距离写个程序
时间: 2023-09-01 15:10:21 浏览: 89
下面是一个简单的51单片机超声波测距并用LCD1602显示距离的程序:
```C
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Trig = P1^0; // 超声波发射引脚
sbit Echo = P1^1; // 超声波接收引脚
sbit RS = P2^6; // LCD命令/数据选择引脚
sbit RW = P2^5; // LCD读/写选择引脚
sbit EN = P2^7; // LCD使能控制引脚
void delay(uint t)
{
while(t--);
}
void LcdWriteCmd(uchar cmd)
{
RS = 0; // 命令模式
RW = 0; // 写入模式
P0 = cmd;
EN = 1;
_nop_();
_nop_();
EN = 0;
}
void LcdWriteData(uchar dat)
{
RS = 1; // 数据模式
RW = 0; // 写入模式
P0 = dat;
EN = 1;
_nop_();
_nop_();
EN = 0;
}
void LcdInit()
{
LcdWriteCmd(0x38); // 8位数据总线,2行显示,5x7点阵字符
LcdWriteCmd(0x0c); // 显示开,光标关,光标闪烁关
LcdWriteCmd(0x06); // 光标右移,字符不移动
LcdWriteCmd(0x01); // 清屏
}
void LcdShowNum(uint num)
{
uchar i, j, k;
LcdWriteCmd(0x80); // 第1行第1个字符
delay(1000);
LcdWriteData('D');
LcdWriteData('i');
LcdWriteData('s');
LcdWriteData('t');
LcdWriteData('a');
LcdWriteData('n');
LcdWriteData('c');
LcdWriteData('e');
LcdWriteData(':');
LcdWriteData(' ');
j = num / 1000; // 千位
k = num % 1000;
i = k / 100; // 百位
k %= 100;
LcdWriteData(j + '0');
LcdWriteData(i + '0');
LcdWriteData('.');
i = k / 10; // 十位
k %= 10;
LcdWriteData(i + '0');
LcdWriteData(k + '0'); // 个位
LcdWriteData('c');
LcdWriteData('m');
}
void main()
{
uint distance;
LcdInit();
while(1)
{
Trig = 1;
delay(10);
Trig = 0;
while(!Echo);
TR0 = 1;
while(Echo);
TR0 = 0;
distance = TH0 * 256 + TL0;
distance = distance / 58;
LcdShowNum(distance);
delay(1000);
}
}
```
该程序通过超声波模块测量距离,然后将距离值显示在LCD1602上。其中,`LcdWriteCmd()`和`LcdWriteData()`函数用于向LCD1602写入命令和数据,`LcdInit()`函数用于初始化LCD1602,`LcdShowNum()`函数用于将距离值以字符串形式显示在LCD1602上。需要注意的是,该程序使用了定时器0来计算超声波回波时间,需要在代码中打开定时器0。
阅读全文