52单片机超声波测距并用lcd1602显示
时间: 2023-07-03 08:10:09 浏览: 96
以下是基于51单片机的超声波测距代码,可以通过简单的修改适配到52单片机上并且添加LCD1602显示功能。
```c
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit Trig = P1^0;
sbit Echo = P1^1;
void delayms(uint xms);
void lcd_init();
void lcd_write_command(uchar command);
void lcd_write_data(uchar data);
void lcd_display_string(uchar x,uchar y,uchar *s);
void ultrasonic();
void main()
{
lcd_init();
lcd_display_string(1,0,"Distance:");
while(1)
{
ultrasonic();
}
}
void ultrasonic()
{
uint distance;
uchar dis_str[16] = {0};
Trig = 1;
delayms(10);
Trig = 0;
while(!Echo);
TR0 = 1;
while(Echo);
TR0 = 0;
distance = TL0 + TH0*256;
distance = distance/58;
sprintf(dis_str,"%dcm",distance);
lcd_display_string(1,1,dis_str);
delayms(100);
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
{
for(j=110;j>0;j--);
}
}
void lcd_init()
{
lcd_write_command(0x38);
lcd_write_command(0x0c);
lcd_write_command(0x06);
lcd_write_command(0x01);
}
void lcd_write_command(uchar command)
{
RS = 0;
RW = 0;
P0 = command;
EN = 1;
_nop_();
EN = 0;
}
void lcd_write_data(uchar data)
{
RS = 1;
RW = 0;
P0 = data;
EN = 1;
_nop_();
EN = 0;
}
void lcd_display_string(uchar x,uchar y,uchar *s)
{
uchar i;
if(x<1) x = 1;
if(y<1) y = 1;
if(y==1) lcd_write_command(0x80+x-1);
else lcd_write_command(0x80+0x40+x-1);
for(i=0;s[i]!='\0';i++)
{
lcd_write_data(s[i]);
}
}
```
其中,超声波测距原理为通过控制Trig引脚发送一个10us的高电平脉冲,然后通过Echo引脚接收到回波信号。接着通过计算回波时间并除以58得到距离值。最后通过sprintf将距离值转换为字符串并调用lcd_display_string函数在LCD1602上显示。注意,本代码需要使用定时器0来计算回波时间,所以需要在头文件中包含intrins.h,并且需要在main函数之外定义T0和TH0。
阅读全文