52单片机超声波测距并用lcd1602显示
时间: 2023-07-03 13:10:10 浏览: 66
下面是使用52单片机实现超声波测距并用LCD1602显示的代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit RS=P2^6; //LCD1602控制引脚定义
sbit RW=P2^5;
sbit E=P2^7;
void delay_ms(uint x) //延时函数,单位毫秒
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com) //写命令函数
{
RS=0;
RW=0;
E=0;
P0=com;
delay_ms(1);
E=1;
delay_ms(1);
E=0;
}
void write_data(uchar date) //写数据函数
{
RS=1;
RW=0;
E=0;
P0=date;
delay_ms(1);
E=1;
delay_ms(1);
E=0;
}
void init() //LCD1602初始化函数
{
write_com(0x38); //设置16*2显示,5*7点阵
write_com(0x0c); //开启显示,不显示光标
write_com(0x06); //写入字符后光标右移,整屏不移动
write_com(0x01); //清屏
}
uchar distance() //超声波测距函数
{
uchar dis;
TR1=1; //启动定时器T1
P3|=0x08; //产生一个10us的脉冲
delay_ms(1);
P3&=~0x08;
while(!INT1); //等待接收到超声波信号
TR1=0; //关闭定时器T1
dis=TH1*256+TL1; //计算时间差
dis=dis/58; //计算距离,单位厘米
return dis;
}
void main()
{
uchar dis;
TMOD=0x10; //定时器T1工作在模式1
TH1=0;
TL1=0; //初始化定时器T1
init(); //LCD1602初始化
while(1)
{
dis=distance(); //测距
write_com(0x80); //第一行第一个字符
write_data('D');
write_data('i');
write_data('s');
write_data('t');
write_data(':');
write_data(dis/100+'0'); //显示距离,百位
write_data(dis%100/10+'0'); //十位
write_data(dis%10+'0'); //个位
write_data('c');
write_data('m');
delay_ms(500); //延时0.5秒
}
}
```
需要注意的是,上述代码使用的是定时器T1来测量超声波信号的时间差,因此需要将超声波传感器的信号引脚连接到P3.3,同时需要在程序中启动和关闭定时器T1。另外,需要根据实际情况调整延时函数中的参数值,以保证测距准确。