51单片机超声波测距lcd1602显示
时间: 2023-07-02 17:10:08 浏览: 198
51单片机超声波测距(LCD1602显示)
5星 · 资源好评率100%
实现51单片机超声波测距并将结果显示到LCD1602上,具体步骤如下:
1. 确定超声波测距模块的接口,一般包括Trig引脚、Echo引脚和Vcc、GND两个电源引脚。
2. 在51单片机上选择一个IO口作为Trig引脚,通过程序将该IO口输出高电平信号,持续10us,然后将其拉低。
3. 监听Echo引脚的电平变化,当Echo引脚变为高电平时,开始计时,并记录当前时间。
4. 当Echo引脚变为低电平时,停止计时,并根据计时结果计算出距离值。
5. 将距离值转化为字符串,并将其通过LCD1602显示出来。
下面是一个简单的示例代码,供参考:
```c
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_EN P2_2
#define LCD_DATA P0
sbit TRIG = P3^1;
sbit ECHO = P3^2;
unsigned int distance = 0;
void delay_us(unsigned int t)
{
while(t--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int t)
{
while(t--)
{
delay_us(1000);
}
}
void LCD_SendCmd(unsigned char cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = cmd;
LCD_EN = 1;
delay_us(1);
LCD_EN = 0;
delay_ms(2);
}
void LCD_SendData(unsigned char dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = dat;
LCD_EN = 1;
delay_us(1);
LCD_EN = 0;
delay_ms(2);
}
void LCD_Init()
{
LCD_SendCmd(0x38); // 8位数据总线,2行显示,5x7点阵字符
LCD_SendCmd(0x0c); // 显示开,光标关,光标闪烁关
LCD_SendCmd(0x06); // 光标右移,字符不移动
LCD_SendCmd(0x01); // 清屏
delay_ms(2);
}
void Usart_SendString(char* str)
{
while(*str)
{
SBUF = *str++;
while(!TI);
TI = 0;
}
}
void Usart_Init()
{
TMOD = 0x20; // 定时器1工作在方式2,8位自动重装载模式
TH1 = 0xfd; // 波特率9600
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SM0 = 0;
SM1 = 1; // 串口工作在方式1,波特率可变
REN = 1; // 允许接收
EA = 1; // 开启全局中断
ES = 1; // 开启串口中断
}
void main()
{
char buf[16];
LCD_Init();
Usart_Init();
while(1)
{
TRIG = 1;
delay_us(10);
TRIG = 0;
while(!ECHO);
TH0 = 0;
TL0 = 0;
while(ECHO);
distance = (unsigned int)(TH0 << 8) | TL0;
distance = distance / 58;
sprintf(buf, "Distance: %d cm", distance);
LCD_SendCmd(0x01); // 清屏
delay_ms(2);
Usart_SendString(buf);
LCD_SendCmd(0x80); // 第1行第1列
delay_ms(2);
while(*buf)
{
LCD_SendData(*buf++);
}
}
}
void Serial_ISR() interrupt 4
{
if(RI)
{
RI = 0;
}
if(TI)
{
TI = 0;
}
}
```
注意:以上代码仅供参考,具体实现方式可能因硬件环境、编译器版本等因素而有所不同。在实际应用中,需要根据具体情况进行调整和优化。
阅读全文