51单片机超声波测距l用cd1602显示程序
时间: 2023-08-29 09:07:34 浏览: 44
下面是一个简单的51单片机超声波测距并用CD1602液晶显示的程序:
```c
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^0; //定义液晶控制线
sbit RW = P2^1;
sbit E = P2^2;
sbit Trig = P1^0; //定义超声波控制线
sbit Echo = P1^1;
uchar Dis_Data[4];
void Delay_Us(uint time) //微秒延时函数
{
while(time--)
{
_nop_();
_nop_();
}
}
void Delay_Ms(uint time) //毫秒延时函数
{
while(time--)
{
Delay_Us(1000);
}
}
void Write_Cmd(uchar cmd) //向液晶发送命令函数
{
RS = 0;
RW = 0;
E = 1;
P0 = cmd;
Delay_Us(5);
E = 0;
}
void Write_Data(uchar dat) //向液晶发送数据函数
{
RS = 1;
RW = 0;
E = 1;
P0 = dat;
Delay_Us(5);
E = 0;
}
void Init_Lcd() //初始化液晶函数
{
Write_Cmd(0x38);
Write_Cmd(0x0c);
Write_Cmd(0x06);
Write_Cmd(0x01);
Write_Cmd(0x80);
}
void Write_String(uchar x, uchar y, uchar *s) //向液晶指定位置写字符串
{
uchar i = 0;
if(x < 16)
{
if(y == 0)
{
Write_Cmd(0x80 + x);
}
else
{
Write_Cmd(0xc0 + x);
}
}
while(s[i] != '\0')
{
Write_Data(s[i]);
i++;
}
}
void Display_Dis(uchar *dis_data) //显示距离函数
{
Write_String(0, 1, "Dis: ");
Write_Data(dis_data[0] + '0');
Write_Data(dis_data[1] + '0');
Write_Data(dis_data[2] + '0');
Write_String(3, 1, "cm");
}
void Ultrasonic() //超声波测距函数
{
uint dis;
uchar i;
Trig = 1;
Delay_Us(10);
Trig = 0;
while(!Echo);
TR0 = 1;
while(Echo);
TR0 = 0;
dis = TH0 * 256 + TL0;
dis = dis / 58;
Dis_Data[0] = dis / 100;
Dis_Data[1] = (dis % 100) / 10;
Dis_Data[2] = dis % 10;
Dis_Data[3] = '\0';
Display_Dis(Dis_Data);
for(i = 0; i < 10; i++) //每隔一段时间进行一次测距和显示
{
Delay_Ms(100);
}
}
void main()
{
TMOD = 0x01; //定时器0工作模式1
TH0 = 0;
TL0 = 0;
Init_Lcd();
while(1)
{
Ultrasonic();
}
}
```
程序中用到了定时器0来计时,实现了超声波测距和CD1602液晶显示。需要注意的是,程序中的液晶控制线和超声波控制线需要根据具体的电路连接情况进行修改。