51单片机超声波测距(LCD1602显示)

您所在的位置:网站首页 声波测距实验步骤设计 51单片机超声波测距(LCD1602显示)

51单片机超声波测距(LCD1602显示)

2024-07-12 19:03:46| 来源: 网络整理| 查看: 265

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录 前言本文将介绍普中51单片机多功能超声波测距仪的概念、原理、硬件设计、软件设计、实验测试以及总结展望。 一、超声波测距原理二、硬件设计三、软件设计四、代码示例五、总结

前言 本文将介绍普中51单片机多功能超声波测距仪的概念、原理、硬件设计、软件设计、实验测试以及总结展望。 一、超声波测距原理

超声波测距原理基于声波在空气中传播的特性。超声波传感器发出超声波脉冲,当这些声波遇到物体并被反射回来后,传感器就接收到了返回的声波。通过测量发送和接收之间的时间差,可以计算出物体与传感器之间的距离。

超声波传感器一般由振荡器、发射器、接收器和信号处理电路组成。振荡器产生高频信号,发射器将信号转换为超声波脉冲并发射出去,接收器接收到返回的声波,并将其转换为电信号送至信号处理电路进行处理。

工作频率对测距精度有直接影响。较高的工作频率可以提供更高的测距分辨率,但传感器的检测范围会相应减小;较低的工作频率则反之。因此,在选择超声波传感器时需要根据实际需求平衡工作频率和测距精度。

二、硬件设计

下面是所需的硬件组件清单:

普中51单片机开发板 在这里插入图片描述

超声波模块 在这里插入图片描述

杜邦线 在这里插入图片描述

连接超声波传感器和普中51单片机的方法如下: 1.将超声波传感器的VCC引脚连接至普中51单片机的电源正极; 2.超声波传感器的GND引脚连接至普中51单片机的电源地线; 3.将超声波传感器的Trig引脚连接至普中51单片机的指定I/O引脚,用于触发超声波发送; 4.将超声波传感器的Echo引脚连接至普中51单片机的指定I/O引脚,用于接收返回的声波。 在电路设计考虑方面,需要注意选择合适的电源供应方式,保证电路工作稳定可靠。此外,还需进行引脚配置,确保超声波传感器与普中51单片机之间的信号传输正确。 实验说明: 根据自己使用的LCD1602是否带有转接板,如果带有转接板的即为4位,需在LCD.H头文件中 将宏#define LCD1602_4PINS打开,我们这里使用的LCD1602是8位,所以默认将该宏注释。 实验接线: LCD1602液晶模块–>单片机管脚 超声波模块–>单片机管脚 TRIG–>P21 ECHO–>P20

三、软件设计

软件设计包括以下几个步骤: 1.初始化普中51单片机的各个模块和引脚; 2.设置超声波传感器的触发引脚为输出模式,并将其置高,延时一段时间后置低,从而触发超声波的发送; 3.监听超声波传感器的接收引脚,等待返回的声波

四、代码示例

这是 LCD1602上显示超声波检测的距离,单位为mm的示例: main.c:

#include #include #include"lcd.h" sbit Trig = P2^1; sbit Echo = P2^0; unsigned char PuZh[]=" Pechin Science "; unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'}; static unsigned char DisNum = 0; //显示用指针 unsigned int time=0; unsigned long S=0; bit flag =0; unsigned char disbuff[4] ={ 0,0,0,0,}; /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Conut(void) { time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.7)/100; //算出来是CM if((S>=700)||flag==1) //超出测量范围显示“-” { flag=0; DisplayOneChar(0, 1, ASCII[11]); DisplayOneChar(1, 1, ASCII[10]); //显示点 DisplayOneChar(2, 1, ASCII[11]); DisplayOneChar(3, 1, ASCII[11]); DisplayOneChar(4, 1, ASCII[12]); //显示M } else { disbuff[0]=S%1000/100; disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10 %10; DisplayOneChar(0, 1, ASCII[disbuff[0]]); DisplayOneChar(1, 1, ASCII[10]); //显示点 DisplayOneChar(2, 1, ASCII[disbuff[1]]); DisplayOneChar(3, 1, ASCII[disbuff[2]]); DisplayOneChar(4, 1, ASCII[12]); //显示M } } void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 { flag=1; //中断溢出标志 } void StartModule() //启动模块 { Trig=1; //启动一次模块 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig=0; } void delayms(unsigned int ms) { unsigned char i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } } } void main(void) { TMOD=0x01; //设T0为方式1,GATE=1; TH0=0; TL0=0; ET0=1; //允许T0中断 EA=1; //开启总中断 LcdInit(); LcdShowStr(0,0,PuZh); while(1) { StartModule(); while(!Echo); //当RX为零时等待 TR0=1; //开启计数 while(Echo); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); //计算 delayms(80); } }

lcd.c:

#include"lcd.h" /******************************************************************************* * 函 数 名 : Lcd1602_Delay1ms * 函数功能 : 延时函数,延时1ms * 输 入 : c * 输 出 : 无 * 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。 *******************************************************************************/ void Lcd1602_Delay1ms(uint c) //误差 0us { uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } /******************************************************************************* * 函 数 名 : LcdWriteCom * 函数功能 : 向LCD写入一个字节的命令 * 输 入 : com * 输 出 : 无 *******************************************************************************/ #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com) //写入命令 { LCD1602_E = 0; //使能 LCD1602_RS = 0; //选择发送命令 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = com; //放入命令 Lcd1602_Delay1ms(1); //等待数据稳定 LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); //保持时间 LCD1602_E = 0; } #else void LcdWriteCom(uchar com) //写入命令 { LCD1602_E = 0; //使能清零 LCD1602_RS = 0; //选择写入命令 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; // Lcd1602_Delay1ms(1); LCD1602_DATAPINS = com LCD1602_E = 0; //使能清零 LCD1602_RS = 1; //选择写入数据 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; LCD1602_DATAPINS = dat LcdWriteCom(0x32); //将8位总线转为4位总线 LcdWriteCom(0x28); //在四位线下的初始化 LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //设置数据指针起点 } #endif void LcdSetCursor(unsigned char x,unsigned char y) //坐标显示 { unsigned char addr; if(y == 0) addr = 0x00 + x; else addr = 0x40 + x; LcdWriteCom(addr|0x80); } //按指定位置显示一个字符 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码 LcdWriteCom(X); //发命令字 LcdWriteData(DData); //发数据 } void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str) //显示字符串 { LcdSetCursor(x,y); //当前字符的坐标 while(*str != '\0') { LcdWriteData(*str++); } }

lcd.h:

#ifndef __LCD_H_ #define __LCD_H_ /********************************** 当使用的是4位数据传输的时候定义, 使用8位取消这个定义 **********************************/ //#define LCD1602_4PINS /********************************** 包含头文件 **********************************/ #include //---重定义关键词---// #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif /********************************** PIN口定义 **********************************/ #define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^7; sbit LCD1602_RW=P2^5; sbit LCD1602_RS=P2^6; /********************************** 函数声明 **********************************/ /*在51单片机12MHZ时钟下的延时函数*/ void Lcd1602_Delay1ms(uint c); //误差 0us /*LCD1602写入8位命令子函数*/ void LcdWriteCom(uchar com); /*LCD1602写入8位数据子函数*/ void LcdWriteData(uchar dat) ; /*LCD1602初始化子程序*/ void LcdInit(); void LcdSetCursor(unsigned char x,unsigned char y); //坐标显示 void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str); //显示字符串 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); #endif

在这里插入图片描述

五、总结

在物联网领域,超声波测距技术被广泛应用于距离测量场景。而在单片机开发中,通过使用普中的51单片机和LCD1602液晶显示屏,我们可以实现一个简单但有效的超声波测距系统。 首先,为了进行超声波测距,我们需要连接超声波传感器到单片机的特定IO口上。然后,在代码中设置IO口的输入输出模式,并配置定时器计数器来计量超声波信号的回波时间。 接下来,我们可以编写代码来处理超声波传感器的输入信号。当触发超声波发送信号后,等待一段时间后开始计时。当收到超声波回波信号后,停止计时并计算出距离(根据回波时间与声速之间的关系)。 最后,我们可以将测得的距离值显示在LCD1602液晶显示屏上。通过使用LCD1602库函数,我们可以轻松地初始化和控制液晶显示屏,并将距离值以合适的格式显示在屏幕上。 需要注意的是,该超声波测距系统只适用于近距离的测量,并且在应用中可能需要进行一些校准步骤以提高精确度。 总的来说,通过普中51单片机和LCD1602液晶显示屏,我们可以方便地实现超声波测距功能,并将测得的距离值以简洁清晰的方式展示出来。这为物联网和嵌入式系统开发提供了一个基础上的解决方案。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭