52单片机超声波测距用lcd1602显示程序
时间: 2023-07-26 11:03:25 浏览: 158
下面是一份基于STC51单片机和LCD1602的超声波测距程序,可以实现测量距离并在LCD上显示结果:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig = P1^0; // 超声波发射引脚
sbit echo = P1^1; // 超声波接收引脚
uchar dis[4]; // 存储距离数据
uint time; // 存储超声波回波时间
void delay(uint ms) // 延时函数
{
uint i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void lcd_init() // LCD初始化
{
lcd_write(0x38, 0); // 初始化
lcd_write(0x0c, 0); // 开启显示,不显示光标
lcd_write(0x06, 0); // 写入字符后地址自动加1
lcd_write(0x01, 0); // 清屏
}
void lcd_write(uchar dat, uint cmd) // LCD写入函数
{
P2 = dat; // 将数据写入P2口
if (cmd == 0) // 0表示写入命令
RS = 0; // RS为0表示写入命令
else // 非0表示写入数据
RS = 1; // RS为1表示写入数据
EN = 1; // 使能
delay(5); // 延时
EN = 0; // 失能
}
void lcd_show(uchar dat) // LCD显示函数
{
uchar ge, shi, bai;
ge = dat % 10; // 取个位数
shi = dat / 10 % 10; // 取十位数
bai = dat / 100; // 取百位数
lcd_write(bai + '0', 1); // 写入百位数
lcd_write(shi + '0', 1); // 写入十位数
lcd_write(ge + '0', 1); // 写入个位数
}
void ultrasonic() // 超声波测距函数
{
trig = 1; // 发射超声波
delay(10); // 发射10us的超声波脉冲
trig = 0; // 停止发射
while (!echo); // 等待回波高电平到来
TR0 = 1; // 启动定时器0
while (echo); // 等待回波结束
TR0 = 0; // 停止定时器0
time = TH0 * 256 + TL0; // 计算回波时间
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1,16位定时器
TH0 = 0; // 定时器0高8位清零
TL0 = 0; // 定时器0低8位清零
lcd_init(); // LCD初始化
while (1)
{
ultrasonic(); // 超声波测距
dis[0] = time / 58; // 计算距离
lcd_write(0x80, 0); // 光标移到第一行第一列
lcd_write('d', 1); // 显示字符d
lcd_write('i', 1); // 显示字符i
lcd_write('s', 1); // 显示字符s
lcd_write(':', 1); // 显示字符:
lcd_show(dis[0]); // 显示距离
delay(500); // 延时
}
}
```
这份程序的基本思路是,通过超声波测距模块获取距离数据,然后将数据转换成LCD可以显示的格式并在LCD上显示。需要注意的是,LCD的控制线需要引出并设置正确的端口。
阅读全文