51单片机超声波测距l用cd1602显示程序
时间: 2023-08-31 16:06:22 浏览: 30
以下是基于51单片机的超声波测距程序,使用CD1602液晶显示距离信息:
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Trig = P1^0; // 超声波发射端口
sbit Echo = P1^1; // 超声波接收端口
void InitTimer0() // 定时器0初始化
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0; // 定时器0初始值高8位清零
TL0 = 0; // 定时器0初始值低8位清零
TR0 = 1; // 定时器0开始计时
}
uint GetDistance() // 获取距离
{
uint distance;
Trig = 1; // 发射超声波
_nop_(); // 延时10us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig = 0; // 停止发射超声波
while(!Echo); // 等待接收到超声波
TH0 = 0; // 定时器0初始值高8位清零
TL0 = 0; // 定时器0初始值低8位清零
while(Echo); // 等待超声波结束
distance = (TH0 << 8) | TL0; // 计算距离
distance = distance / 58; // 距离计算公式
return distance;
}
void LcdWriteCmd(uchar cmd) // 写命令到LCD
{
P0 = cmd;
P2 &= ~0x01; // RS = 0, 选择命令
P2 &= ~0x04; // RW = 0, 写入模式
P2 |= 0x02; // EN = 1, 允许数据写入
_nop_();
_nop_();
P2 &= ~0x02; // EN = 0, 禁止数据写入
}
void LcdWriteData(uchar dat) // 写数据到LCD
{
P0 = dat;
P2 |= 0x01; // RS = 1, 选择数据
P2 &= ~0x04; // RW = 0, 写入模式
P2 |= 0x02; // EN = 1, 允许数据写入
_nop_();
_nop_();
P2 &= ~0x02; // EN = 0, 禁止数据写入
}
void LcdInit() // 初始化LCD
{
LcdWriteCmd(0x38); // 设置显示模式为2行,5x7点阵字符
LcdWriteCmd(0x0c); // 开启显示,关闭光标
LcdWriteCmd(0x06); // 设置光标移动方向为右
LcdWriteCmd(0x01); // 清屏
}
void LcdShowDistance(uint distance) // 在LCD中显示距离信息
{
uchar str[6] = {0};
sprintf(str, "%dcm", distance);
LcdWriteCmd(0x01); // 清屏
LcdWriteCmd(0x80); // 光标移动到第1行第1列
for(int i = 0; i < 6; i++)
{
if(str[i] == '\0')
break;
LcdWriteData(str[i]);
}
}
void main()
{
uint distance;
InitTimer0(); // 初始化定时器0
LcdInit(); // 初始化LCD
while(1)
{
distance = GetDistance(); // 获取距离
LcdShowDistance(distance); // 在LCD中显示距离信息
}
}
```
注意:本程序只是简单地演示了如何使用51单片机和CD1602液晶显示器进行超声波测距和距离显示,实际应用中需要根据具体情况进行修改和优化。