51单片机lcd1602显示超声波模块hc_sc04测距代码

LCD1602显示屏显示,测完距离然后用继电器控制水泵,还有一个问题只有原理图怎么看数码管锁存还有段选io口

img

它程序里面应该有英文的注释

原理图上的数码管器件一般会把引脚功能描述的!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这篇文章:51单片机HC-SR04超声波模块距离报警LCD1602显示距离例程
  • 除此之外, 这篇博客: 有距离与时间显示并实现避障的51循迹小车中的 3、LCD1602的使用与时钟和测距的实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    测距的实现,测距我们是使用了码盘和计数传感器(类似于光电门的设备),原理就是通过外部中断,记录通过码盘上孔的次数,然后再根据转一周孔的数量和轮胎的直径计算行驶距离(所以在设计转弯的时候我们一开始是很不情愿使用两侧轮胎反向的,对精度有影响),为了更加准确我们使用了两个这样的装置,给两个后轮装上,然后计算平均值。

    u16 num=0,number=0;//码盘计数
    
    void exit0_init()//外部中断0
    {
      IT0=1;
      PX0=1;
      EX0=1;
    }
    
    void exit0() interrupt 0
    {
       num++;
    }
    
    void exit1_init()//外部中断1
    {
      IT1=1;
      PX1=1;
      EX1=1;
    }
    
    void exit1() interrupt 2
    {
      number++;
    }
    
    u16 count()
    {
      	u16 Distance=0;//LCD显示实数太麻烦了,并且精度应该也没那么高,所以就干脆用整型
    	float k=0;
    	k=(num+number)/2.0;//求平均
    	Distance=k/20.0*6.6*3.1415926;
    	return Distance;	
    }
    

    运行时间的测算就比较简单了,计时器的简单应用就不多做介绍了。

    void timer0_on() //定时器0启动 设置200us 8位自动重装
    {
    	TMOD|=0x02;
    	TH0=72;
    	TL0=72;
    	ET0=1;
    	TR0=1;                                                                                                                                                                                                                                                                                                                                 
    }
    
    void time() interrupt 1
    {
    	times++;
    	if(times==5000)
    	{
    	 	if(min==99&&s==59){min=0;s=0;}
    		else if(s==59){min++;s=0;}
    			 else s++; 	
    		times=0;
    	}
    							            
    }
    

    LCD1602的使用我们是学习了b站上江科大自化协的视频,我51单片机业主要是看他的视频学习的,大佬的讲解真的十分细致啊,再次感谢大佬的分享。(这里有一点注意,自己买的51单片机最小系统上的I/O口和大佬提供程序里的定义可能不一样,要自己对照原理图修改一下)LCD1602的程序是直接写在主函数的。

    void main()
    {
    	u16 k=0;
    	EA_on;
    	LCD_Init();
    	timer0_on();
    	exit1_init();
    	exit0_init();
    	LCD_ShowString(1,1,"Time:  min  s");
    	LCD_ShowString(2,1,"Distance:     cm");	
      	while(1)
    	{
    		U_wave_control();delay1ms(30);//建议是超声波发射之间的时间达到六十毫秒,考虑到计时器用的时间和LCD用的时间,就只取了一半,不过现在来看还挺正常的(有时确实有点问题)	
    		LCD_ShowNum(1,6,min,2);
    		LCD_ShowNum(1,11,s,2);
    		LCD_ShowNum(2,10,count(),5);	
    	}
    }
    
  • 您还可以看一下 朱有鹏老师的LCD1602和12864显示器-第1季第17部分课程中的 1.17.3.开始学习LCD1602小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    对于使用51单片机配合LCD1602显示屏和HC-SR04超声波模块测量距离,并通过继电器控制水泵的问题,具体步骤如下:

    1. 连接硬件

    将51单片机、LCD1602显示屏、HC-SR04超声波模块和继电器按照电路连接图进行连接。具体的连接方式和电路图可参考以下链接:https://www.cnblogs.com/voidNations/p/7515188.html

    1. 编写程序

    (1) 初始化

    首先进行一些初始化操作,包括初始化LCD1602显示屏和进行端口设置,同时定义一些相关变量。这里使用STC89C52单片机,初始化操作的代码如下:

    #include<reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit RS = P1^0;
    sbit RW = P1^1;
    sbit EN = P1^2;
    
    sbit RELAY = P3^0;
    
    uchar DisData[] = "Distance:";
    uchar Period[] = "us";
    uchar Space[] = "   ";
    uchar DisValue[4];
    

    其中,DisData、Period、Space和DisValue是存储字符串和数组的变量,用于后续的LCD显示操作;RS、RW、EN和RELAY是定义单片机与LCD显示屏、继电器等器件连接的端口。

    (2) 显示LCD1602的距离信息

    按照HC-SR04超声波模块的测距原理进行编程,将距离信息写入DisValue数组中,再将字符串“Distance:”、距离信息和字符串“us”按顺序写入DisData数组中,最后将DisData数组写入LCD1602显示屏中。代码如下:

    void LCD_Display()
    {
        uchar dis;
    
        TR1 = 1;
        delay(10);
        TR1 = 0;
        dis = TH1*256 + TL1;
        dis = dis/58;
    
        DisValue[0] = dis/100 + 0x30;
        dis %= 100;
        DisValue[1] = dis/10 + 0x30;
        DisValue[2] = dis%10 + 0x30;
    
        DisValue[3] = '\0';
    
        LCD_Clear();
        LCD_Write_String(0, 0, DisData);
        LCD_Write_String(9, 0, DisValue);
        LCD_Write_String(12, 0, Period);
    }
    

    其中,TR1为定时器的计数控制位,delay(10),使定时器允许10us定时,从而将距离信息转化为脉冲宽度进行计算。将计算得到的距离信息分别存储到DisValue数组中的三个元素中,转换为字符串。 调用LCD_Clear函数清屏,并依次调用LCD_Write_String()函数将DisData、DisValue和Period字符串打印到LCD1602显示屏上。

    (3) 控制继电器打开或关闭水泵

    当测得的距离距离水位不足一定高度时,通过继电器控制水泵,补充水源。这里以一个距离临界值D为例,当距离小于D时,打开继电器,否则关闭继电器。代码如下:

    void Relay_Control(uint dis)
    {
        if (dis < D)
        {
            RELAY = 1;
        }
        else
        {
            RELAY = 0;
        }
    }
    

    (4) 主函数循环调用

    在主函数中,进行循环调用,实现测量距离和控制水泵的功能。代码如下:

    void main()
    {
        LCD_Init();
    
        while (1)
        {
            LCD_Display();
            Relay_Control(DisValue[0] * 100 + DisValue[1] * 10 + DisValue[2]);
        }
    }
    

    此时可以通过以上步骤,实现用51单片机配合LCD1602显示屏和HC-SR04超声波模块测量距离,并通过继电器控制水泵的功能。

    关于数码管锁存和段选IO口的原理图,首先要明确7段数码管是由多个发光二极管按一定顺序排列组成,其中每个发光二极管都有一个锁存端和一个段选端。锁存端用于显示器锁定,段选端用于选择显示的数码。

    在常用的LED数码管显示电路中,其主要部分是按位选通型显示电路,即依次在不同的位选发送高电平,在相应的锁存和段选端输入数字、字母和符号,以实现显示的功能。锁存器有一个数据锁存器,一个存储器和LATCH2电路,能记住操作的数字,即存储当前位的数字并在下一轮扫描之前锁定,避免数据被覆盖。

    锁存器是由锁存器芯片和数码管连接而成的电路。在锁存器电路中,每个数码管都有一个锁存器。由于数码管在不同的时间段内需要显示不同的数字或字母,因此需要向各个锁存器输入不同的控制信号,以达到显示目的。同时,由于数字都是由不同的发光二极管组成的,因此在锁存器电路中需要使用不同的输出线来控制各个发光二极管的亮灭,从而显示正确的数字或字母。

    在电路中,通过集成电路或外部电路来实现锁存和段选功能。一般来说,锁存器的输入都是由集成电路或外部电路提供的,每个数字对应锁存器中的一个输入,从而将每个数字或字母与锁存器相连。同时,构成一个分频器,在1秒内依次输出4个脉冲使得按位数码管可以依次实现数字或字母的显示。锁存和段选的原理电路图如下所示:

    img

    其中,控制电路主要包括两个锁存器,一个客户显示部分,一个分频器,一个脉冲发生器和一个n位二进制计数器。其中,二进制计数器通过不断调整数据线的状态获得从0到9的数字值。

    以上是基本的锁存和段选电路原理。在具体的应用中,还需要根据不同的需求和电路特点进行调整和优化,以实现更加准确和稳定的显示效果。如需进一步了解,请参考更多相关资料或具体问题询问专业人士。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^