51单片机超声波测距l用cd1602显示程序
时间: 2023-08-29 14:07:35 浏览: 31
以下是51单片机超声波测距并用CD1602液晶显示的程序:
```c
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit trigger = P3^5; // 超声波模块的触发引脚
sbit echo = P3^4; // 超声波模块的回响引脚
sbit rs = P2^6; // LCD1602的RS引脚
sbit rw = P2^5; // LCD1602的RW引脚
sbit en = P2^7; // LCD1602的EN引脚
sbit beep = P1^5; // 蜂鸣器引脚
uint distance = 0; // 存储距离
uchar temp = 0; // 存储LCD1602的命令或数据
void delay(uint ms) // 延时函数
{
uint i, j;
for (i = ms; i > 0; i--) {
for (j = 114; j > 0; j--);
}
}
void write_com(uchar com) // 写入LCD1602的命令
{
rs = 0;
rw = 0;
en = 1;
P0 = com;
delay(5);
en = 0;
}
void write_data(uchar dat) // 写入LCD1602的数据
{
rs = 1;
rw = 0;
en = 1;
P0 = dat;
delay(5);
en = 0;
}
void init() // LCD1602初始化
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void main()
{
while (1) {
trigger = 1;
delay(10);
trigger = 0;
while (!echo); // 等待回响引脚变高
TH0 = 0;
TL0 = 0;
while (echo); // 等待回响引脚变低
distance = (TH0 * 256 + TL0) / 58; // 计算距离
if (distance < 30) // 如果距离小于30cm,蜂鸣器响
beep = 1;
else
beep = 0;
temp = distance / 100 + 0x30; // 显示百位数
write_data(temp);
temp = (distance % 100) / 10 + 0x30; // 显示十位数
write_data(temp);
temp = distance % 10 + 0x30; // 显示个位数
write_data(temp);
write_data('c'); // 显示单位cm
write_com(0x80 + 0x40); // 移动光标到下一行开头
}
}
```
需要注意的是,此程序中使用了TIMER0来计时,计算超声波模块的回响时间,因此需要在代码中进行TIMER0的初始化。此外,程序中还使用了P1^5引脚控制蜂鸣器,如果您的电路中没有蜂鸣器,请将相关代码注释掉。