超声波测距LCD1602显示

news/2025/2/13 3:17:13/

超声波测距模块:

1、采用IO口TRIG触发测距,给至少10us的高电平信号;

2、模块自动发送8个40khz的方波,自动检测是否有信号返回;

3、有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。

液晶LCD1602电路接口

超声波测距LCD1602显示程序源代码

/*******************超声波测距1602显示********************

* 单片机:51单片机

* 开发环境:keil

* 名称:超声波测距1602显示

注意:用杜邦线将超声波模块的VCC接开发板5V对外供电接口

用杜邦线将超声波模块的GND接开发板GND

用杜邦线将超声波模块的Trig接单片机的P1.5

用杜邦线将超声波模块的Echo接单片机的P1.6

/************************包含头文件************************/

#include <reg51.h>

#define LCD_Data P0

#define Busy 0x80

/**************************宏定义**************************/

#define SPEED_30C 3495 //30摄氏度时的声速,声速V=331.5+0.6*温度;

#define SPEED_23C 3453 //23摄氏度时的声速,声速V=331.5+0.6*温度;

/**************************位定义**************************/

sbit ECHO = P2^1; //回声接收端口

sbit TRIG = P2^0; //超声触发端口

sbit BEEP = P2^3; //蜂鸣器 

sbit LCD_RS = P1^0;

sbit LCD_RW = P1^1;

sbit LCD_E =P2^5;

/**********************定义变量和数组**********************/

long int distance = 0; //距离变量

unsigned char code table0[] = {" SL-51A "};

unsigned char code table1[] = {" NO ECHO "};

unsigned char code table2[] = {"Distance:xxx.xcm"};

unsigned char count;

void Delay5Ms(void);

void delay(int In,int Out);

void WriteDataLCD(unsigned char WDLCD);

void WriteCommandLCD(unsigned char WCLCD,BuysC);

unsigned char ReadDataLCD(void);

unsigned char ReadStatusLCD(void);

void LCDInit(void);

void DisplayOneChar(unsigned char X,unsigned charY,unsigned char DData);

void DisplayListChar(unsigned char X,unsigned charY,unsigned char code *DData);

/**********************************************************/

/* 函数名称 : Delay_xMs */

/* 函数描述 : 延时函数 */

/* 输入参数 : x */

/* 参数描述 : 延时时间 */

/* 返回值 : 无 */

/**********************************************************/

void Delay_xMs(unsigned int x)

{

unsigned inti,j;

for(i=0;i<x;i++)

{for(j=0;j<3;j++){;}}

}

/**********************************************************/

/* 函数名称 : delayt */

/* 函数描述 : 延时函数 */

/* 输入参数 : x */

/* 参数描述 : 延时时间数据 */

/* 返回值 : 无 */

/**********************************************************/

void delayt(unsigned int x)

{

unsigned charj;

while(x-->0)

{for(j=0;j<125;j++){;}}

}

/***********************5ms延时函数*********************/

void Delay5Ms(void)

{

unsigned intTempCyc = 3552;

while(TempCyc--);

}

/*************************延迟函数***********************/

void delay(int In,int Out)

{

int i,j;

for(i=0;i<In;i++)

{for(j=0;j<Out;j++){;}}

}

/**********************************************************/

/* 函数名称 : Alarm */

/* 函数描述 : 蜂鸣器发声函数 */

/* 输入参数 : t */

/* 参数描述 : 发声的次数 */

/* 返回值 : 无 */

/**********************************************************/

void Alarm(unsigned char t)

{

unsigned chari;

for(i=0;i<t;i++)

{BEEP=0;delay(10,1000);BEEP=1;delay(10,1000);}

}

/**********************************************************/

/* 函数名称 : Init_timer */

/* 函数描述 : 初始化单片机函数 */

/* 输入参数 : 无 */

/* 参数描述 : 无 */

/* 返回值 : 无 */

/**********************************************************/

void Init_timer(void)

{

TMOD=0x01; //定时器2初始化,设置为16位自动重装模式

TL0=0x66;TH0=0xfc; //1ms

ET0=1; //开定时器2

EA=1; //总中断使能

}

/**********************************************************/

/* 函数名称 : Init_Parameter */

/* 函数描述 : 初始化参数和IO口函数 */

/* 输入参数 : 无 */

/* 参数描述 : 无 */

/* 返回值 : 无 */

/**********************************************************/

void Init_Parameter(void)

{TRIG=1;ECHO=1;count=0;distance=0;}

/**********************************************************/

/* 函数名称 : display */

/* 函数描述 : 显示数字 */

/* 输入参数 : number,address */

/* 参数描述 : number写入的数据 */

/* 返回值 : 无 */

/**********************************************************/

void display(int number)

{

unsigned charb,c,d,e;

b=(number/1000);c=(number/100)%10;d=(number/10)%10;e=number%10;

DisplayOneChar(9,1,(0x30+b));

DisplayOneChar(10,1,(0x30+c));

DisplayOneChar(11,1,(0x30+d));

DisplayOneChar(13,1,(0x30+e));

}

/**********************************************************/

/* 函数名称 : Trig_SuperSonic */

/* 函数描述 : 发出声波函数 */

/* 输入参数 : 无 */

/* 参数描述 : 无 */

/* 返回值 : 无 */

/**********************************************************/

void Trig_SuperSonic(void) //出发声波

{TRIG=1;delayt(1);TRIG=0;}

/**********************************************************/

/* 函数名称 : Measure_Distance */

/* 函数描述 : 计算距离函数 */

/* 输入参数 : 无 */

/* 参数描述 : 无 */

/* 返回值 : 无 */

/**********************************************************/

void Measure_Distance(void)

{

unsigned charl;

unsigned inth,y;

TR0=1;

while(ECHO){;}

TR0=0;l=TL0;h=TH0;

y=(h<<8)+l;

y=y-0xfc66; //us部分

distance=y+1000*count; //计算总时间

TL0=0x66;TH0=0xfc;

delayt(30);

distance=SPEED_30C*distance/20000;

}

/*********************写数据函数***************************/

void WriteDataLCD(unsigned char WDLCD)

{

ReadStatusLCD(); //检测忙

LCD_Data=WDLCD;

LCD_E=0; //若晶振速度太高可以在这后加小的延时

LCD_E=0; //延时

LCD_RS=1;

LCD_RW=0;

LCD_E=1;

LCD_E=0;

}

/***********************写指令函数*************************/

void WriteCommandLCD(unsigned char WCLCD,BuysC)//BuysC为0时忽略忙检测

{

if (BuysC)ReadStatusLCD(); //根据需要检测忙

LCD_Data=WCLCD;

LCD_E=0;

LCD_E=0;

LCD_RS=0;

LCD_RW=0;

LCD_E=1;

LCD_E=0;

}

/************************读数据函数************************/

unsigned char ReadDataLCD(void)

{

LCD_RS=1;

LCD_RW=1;

LCD_E=0;

LCD_E=0;

LCD_E=1;

return(LCD_Data);

}

/************************读状态函数************************/

unsigned char ReadStatusLCD(void)

{

LCD_Data=0xFF;

LCD_RS=0;

LCD_RW=1;

LCD_E=0;

LCD_E=0;

LCD_E=1;

while (LCD_Data& Busy); //检测忙信号

return(LCD_Data);

}

/************************LCD初始化*************************/

void LCDInit(void) //LCD初始化

{

LCD_Data=0;

WriteCommandLCD(0x38,0);Delay5Ms(); //三次显示模式设置,不检测忙信号

WriteCommandLCD(0x38,0);Delay5Ms();

WriteCommandLCD(0x38,0);Delay5Ms();

WriteCommandLCD(0x38,1); //显示模式设置, 开始要求每次检测忙信号

WriteCommandLCD(0x08,1); //关闭显示

WriteCommandLCD(0x01,1); //显示清屏

WriteCommandLCD(0x06,1); //显示光标移动设置

WriteCommandLCD(0x0C,1); //显示开及光标设置

}

/***********************清屏 函数***************************/

void LCD_Clear(void)

{WriteCommandLCD(0x01,1);Delay5Ms();}

/*******************按指定位置显示一个字符******************/

void DisplayOneChar(unsigned char X,unsigned charY,unsigned char DData)

{

Y&=0x1;

X&=0xF; //限制X不能大于15,Y不能大于1

if(Y)X|=0x40; //当要显示第二行时地址码+0x40;

X|=0x80; //算出指令码

WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码

WriteDataLCD(DData);

}

/********************按指定位置显示一串字符*****************/

void DisplayListChar(unsigned char X,unsigned charY,unsigned char code *DData)

{

unsigned charListLength;

ListLength=0;

Y&=0x1;X&=0xF; //限制X不能大于15,Y不能大于1

while(DData[ListLength]>=0x20) //若到达字串尾则退出

{

if(X<=0xF) //X坐标应小于0xF

{

DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符

ListLength++;

X++;

}

}

}

/**********************************************************/

/* 函数名称 : main */

/* 函数描述 : 主函数 */

/* 输入参数 : 无 */

/* 参数描述 : 无 */

/* 返回值 : 无 */

/**********************************************************/

void main(void)

{

LCDInit();

Init_timer();

Init_Parameter();

Alarm(2);

DisplayListChar(0,0,table0);

DisplayListChar(0,1,table1);

while(1)

{

Trig_SuperSonic(); //触发超声波发射

while(ECHO==0){;} //等待回声

Measure_Distance(); //计算脉宽并转换为距离

DisplayListChar(0,1,table2);

display(distance); //显示距离

Init_Parameter(); //参数重新初始化

delayt(100); //延时,两次发射之间要至少有10ms间隔

}

}

/**********************************************************/

/* 函数名称 : timer0 */

/* 函数描述 : T0中断处理函数 */

/* 输入参数 : 无 */

/* 参数描述 : 无 */

/* 返回值 : 无 */

/**********************************************************/

void timer0 (void) interrupt 1

{

TF0=0;TL0=0x66;TH0=0xfc;count++;

if(count==18) //超声波回声脉宽最多18ms

{TR0=0;TL0=0x66;TH0=0xfc;count=0;}

}


http://www.ppmy.cn/news/22298.html

相关文章

《枢纽》- 在起伏的浪潮中,一个人怎么认知环境?

01关于作者施展&#xff0c;外交学院世界政治研究中心主任&#xff0c;青年学者&#xff0c;工科出身的北京大学史学博士&#xff0c;"得到"App大师课《中国史纲50讲》主讲人。主要研究西方政治思想史、西方文明史等领域。02关于本书《枢纽》这个书名形容的是今天中国…

2023最新版多线程面试题(四)(持续更新中)

41、在java 中 wait和 sleep 方法的不同? 最大的不同是在等待时 wait 会释放锁&#xff0c;而 sleep一直持有锁。Wait 通常被用于线程间交互&#xff0c;sleep 通常被用于暂停执行。 直接了解的深入一点吧: 在 Java 中线程的状态一共被分成 6种: 初始态: NEW 创建一个 Th…

【蓝桥日记②】2018第九届省赛(软件类)JavaA组★答案解析

【蓝桥日记②】2018第九届省赛&#xff08;软件类&#xff09;JavaA组&#x1f3c5;答案解析 文章目录【蓝桥日记②】2018第九届省赛&#xff08;软件类&#xff09;JavaA组&#x1f3c5;答案解析1、分数2、星期一3、复数幂4、方格计数5、打印图形6、航班时间7、三体攻击8、全球…

【自动驾驶100问】第一问到第三问

配套视频&#xff1a; 自动驾驶100问第三问 1、四元数在表示空间旋转时的优势是什么&#xff1f; &#xff08;1&#xff09;四元数解决了其他3维空间旋转算法会遇到的恼人的问题&#xff0c;比如使用欧拉角来表示旋转操作时会遇到的万向节锁问题(Gimbal lock)&#xff1b; …

第九章(13):STL之常用排序算法

文章目录前情回顾常用排序算法sortrandom_shufflemergereverse下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的智能制造专业学生&#xff0c;在学习C/C的路上会越走越远&#xff0c;后面不定期更新有关C/C语法&#xff0c;数据结构&#xff0…

OpenCV 图像形态学处理

本文是OpenCV图像视觉入门之路的第11篇文章&#xff0c;本文详细的在图像形态学进行了图像处理&#xff0c;例如&#xff1a;腐蚀操作、膨胀操作、开闭运算、梯度运算、Top Hat Black Hat运算等操作。 OpenCV 图像形态学处理目录 1 腐蚀操作 2 膨胀操作 3 开闭运算 4 梯度运…

【博客608】源ip是本地网卡ip的流量都发往lo网卡的原因剖析

源ip是本地网卡ip的流量都发往lo网卡的原因剖析 场景&#xff1a;本地ip之间通信&#xff0c;流量都会发现lo&#xff0c;不会发往本地ip所在device example&#xff1a; ubuntu10.200.60.4:~$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNK…

CQF项目课程学习介绍(三)—— 高级选修课

✏️写作&#xff1a;个人博客&#xff0c;InfoQ&#xff0c;掘金&#xff0c;知乎&#xff0c;CSDN &#x1f4e7;公众号&#xff1a;进击的Matrix &#x1f6ab;特别声明&#xff1a;原创不易&#xff0c;未经授权不得转载或抄袭&#xff0c;如需转载可联系小编授权。 概述 …