超声波测距在LCD1602上显示

一:超声波作用:

        超声波测距模块是用来测量距离的一种产品,通过发送和就接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。

二:超声波模块介绍 :

 此模块性能稳定,测度距离精确,模块高精度,盲区小。
产品应用领域: 机器人避障 物体测距 液位检测 公共安防 停车场检测 。
接线方式:VCC、trig(控制端)、 echo(接收端)、 GND

三:超声波工作时序:

介绍:

        初始化时将trig和echo端口都置低,首先向给trig 发送至少10 us的高电平脉冲,启动超声波模块,模块自动向外发送8个40K的方波,在一定范围内(大概2~400cm),方波反弹回来,超声波接收到方波时,echo会被拉高,这个高电平的持续时间就是从发送到接收到方波的时间,接收到方波时打开定时器开始计时,等待echo变成低电平,关闭定时器,读出计时器的时间,这就是超声波在空气中运行的时间,按照 测试距离=(高电平时间*声速(340M/S))/2 就可以算出超声波到障碍物的距离。

时序图

四:LCD1602介绍:

        LCD602液晶显示屏除了电源、地以外,有3个控制引脚 RS R/W E 和8个数据引脚DB0-7。建议8个数据引脚接在同一组上,程序写起来比较简单。硬件连接参考如图。

 五:LCD1602初始化设置:

显示模式设置:

有关lcd1602的基础知识我就不给大家赘述了,大家可以找一下相关知识 

注:由于sr04_count()函数的限制,超声波测距的定时器中断并没有太大用处,但是只要用到定时器,一定要把定时器中断函数写出来,哪怕用不到,也得写出来,要不然很容易报错,我就写超声波的程序的时候就嘎嘎报错。

代码部分 

lcd1602.c

#include "lcd1602.h"
#include "main.h"

void lcd1602_busy()//检测lcd1602是否处于忙碌状态
{
	u8 sta;
	IO=0xff;//单片机IO口作为输入的时候先拉高
	RS=0;
	RW=1;//设置成读取模式
	do   //先执行里面语句,在判断while()是否成立
	{
		EN=1;
		sta=IO;
		EN=0;
	}
	while(sta & 0x80);//第七位等于1,表示液晶正在忙,重复检测直到其等于0
}

void lcd1602_cmd(u8 cmd)//输入指令
{
	lcd1602_busy();
	RS=0;
	RW=0;
	IO=cmd;
	EN=1;
	EN=0;
}

void lcd1602_date(u8 date)//输入数据
{
	lcd1602_busy();
	RS=1;
	RW=0;
	IO=date;
	EN=1;
	EN=0;
}

void lcd1602_sor(u8 x,u8 y)//显示字符的位置
{
	u8 add;
	if(y==1)
	{
		add=0x80+x;//第一行
	}
	else
	{
		add=0xc0+x;//第二行
	}
	lcd1602_cmd(add);
}

void lcd1602_str(unsigned char x,unsigned char y,unsigned char *str)//设置字符位置以及显示的字符
{
	lcd1602_sor(x,y);
	while(*str!='\0')//字符串最后一位是空字符
	{
		lcd1602_date(*str++);//先取str指向的数据,然后地址在自加
	}		
}

void lcd1602_init()
{
	lcd1602_cmd(lcd1602_cmd1);//16*2显示  5*7点阵   8位数据接口
	lcd1602_cmd(lcd1602_cmd7);//开显示器,光标关闭
	lcd1602_cmd(lcd1602_cmd9);//文字不动,地址自动加1
	lcd1602_cmd(lcd1602_cmd3);//清屏
}

 lcd1602.h

#ifndef __lcd1602_H__
#define __lcd1602_H__

#include "main.h"

#define IO P0//定义P0口

/*LCD1602指令控制*/

#define lcd1602_cmd1    0x38//八位数据口,两行,5*8点阵
#define lcd1602_cmd2    0x28//四位数据口,两行,5*8点阵

#define lcd1602_cmd3    0x01//清屏
#define lcd1602_cmd4    0x02//光标复位

/*显示开关控制指令*/
#define lcd1602_cmd5    0x0f//显示开,光标开,光标闪烁
#define lcd1602_cmd6    0x0e//显示开,光标开,光标不闪烁
#define lcd1602_cmd7    0x0c//显示开,光标关,光标不闪烁
#define lcd1602_cmd8    0x08//显示关,光标关,光标不闪烁

/*显示模式控制*/
#define lcd1602_cmd9    0x06//光标右移,显示不移动
#define lcd1602_cmd10   0x04//光标左移,显示不移动
#define lcd1602_cmd11   0x07//操作后,AC自加,画面平移
#define lcd1602_cmd12   0x05//操作后,AC自减,画面平移

/*光标,显示移动指令*/
#define lcd1602_cmd13   0x10//光标左移
#define lcd1602_cmd14   0x14//光标右移
#define lcd1602_cmd15   0x18//显示左移
#define lcd1602_cmd16   0x1c//显示右移

sbit EN=P2^7;
sbit RS=P2^6;
sbit RW=P2^5;

void lcd1602_init();//其他函数可以用到,声名一下
void lcd1602_str(unsigned char x,unsigned char y,unsigned char *str);
//需要被调用的函数,形参得写成直接形式,u8和u16没有被头文件调用

#endif

HC_SR04.c 

#include "HC_SR04.h"
#include "delay.h"
#include "lcd1602.h"

unsigned long time=0;
u16 S=0;
u16 dis_table[]={0x3f,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管段码
u16 dis_table1[]={0,0,0,0,0,0,0,0};

u8 dis_table2[]="jvli: 000CM";
u8 dis_table3[]="-----------";

void sr04_init()
{
	TMOD=0x01;//定时器0,工作方式1,16位
	TH0=0;//定时器1来计算,声波返回的时间
	TL0=0;
	EA=1;
	ET0=1;
	TR0=0;
}

void sr04_count()
{
	time=TH0*256+TL0;
	TH0=0;
	TL0=0;
	
	S=(time*1.7)/100;
	delayms(100);
	
/*******//*超声波基于lcd1602显示*//********/
	if(S>=30)
	{
		lcd1602_str(0,1,dis_table3);
	}
	else
	{
		dis_table2[6]=S/100%10+'0';
		dis_table2[7]=S/10%10+'0';
		dis_table2[8]=S%10+'0';
		lcd1602_str(0,1,dis_table2);
	}
}

void sr04()
{
	Trig=0;
	Trig=1;
	delay10us(2);
	Trig=0;

	while(!Echo);
	TR0=1;
	while(Echo);
	TR0=0;
}

void Timer() interrupt 1  //定时器中断,防止时间过长超出定时器最长时间
{
	flag=1;
}



 HC_SR04.h

#ifndef __HC_SR04_H__
#define __HC_SR04_H__

//头文件包含
#include "main.h"

//管脚定义
sbit Trig=P1^7;
sbit Echo=P1^6;

//函数声明
void sr04_init();
void sr04_count();
void sr04();

#endif


 main.c

#include "main.h"
#include "HC_SR04.h"
#include "lcd1602.h"



void main()
{
	sr04_init();
	lcd1602_init();
	while(1)
	{
		sr04();
		sr04_count();
	}
}

main.h 

#ifndef __main_H__
#define __main_H__

#include <REGX52.H>
#include <intrins.H>

#define u16 unsigned int
#define u8 unsigned char



#endif

以下是使用51单片机和超声波传感器实现测距,并在LCD1602显示时间和距离的示例代码: ```c #include <reg51.h> #include <stdio.h> #define LCD_DATA P0 sbit RS = P2^0; sbit EN = P2^1; sbit trig = P3^0; sbit echo = P3^1; void delay(unsigned int count) { unsigned int i, j; for (i = 0; i < count; i++) for (j = 0; j < 10; j++); } void lcd_command(unsigned char command) { RS = 0; // RS为0表示发送命令 LCD_DATA = command; EN = 1; // 使能信号置高 delay(5); EN = 0; // 使能信号置低 } void lcd_data(unsigned char data) { RS = 1; // RS为1表示发送数据 LCD_DATA = data; EN = 1; // 使能信号置高 delay(5); EN = 0; // 使能信号置低 } void lcd_init() { lcd_command(0x38); // 初始化16×2显示模式 lcd_command(0x0C); // 打开显示,关闭光标 lcd_command(0x06); // 显示光标移动设置 lcd_command(0x01); // 清屏 } void lcd_display_time_distance(unsigned int time, unsigned int distance) { lcd_command(0x80); // 设置显示位置为第一行第一列 printf("Time: %d ms", time); lcd_command(0xC0); // 设置显示位置为第二行第一列 printf("Distance: %d cm", distance); } void ultrasonic_init() { TMOD = 0x01; // 设置定时器0为工作方式1 TH0 = 0; TL0 = 0; } unsigned int ultrasonic_measure() { unsigned int time; trig = 1; // 发送触发信号 delay(10); trig = 0; while (!echo); // 等待接收到回波信号 TR0 = 1; // 启动定时器0 while (echo); // 等待回波信号结束 TR0 = 0; // 停止定时器0 time = ((unsigned int)TH0 << 8) | TL0; // 计算时间 return (time * 17) / 100; // 计算距离(单位:厘米) } void main() { unsigned int distance; unsigned int time; lcd_init(); ultrasonic_init(); while(1) { distance = ultrasonic_measure(); // 测量距离 time = (TH0 << 8) + TL0; // 记录时间 lcd_display_time_distance(time, distance); // 显示时间和距离 delay(500); // 延时500ms lcd_command(0x01); // 清屏 delay(500); // 延时500ms } } ``` 请注意,以上代码是一个示例,并且可能需要根据具体的硬件配置进行调整。还需要注意,LCD1602显示需要相应的驱动程序支持,这里假设已经提供了相应的库函数。 希望以上代码能帮到你!如果还有其他问题,请随时提问。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫咪死了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值