[51单片机]HC-SR04超声波模块与1602液晶显示

Posted xiejinxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[51单片机]HC-SR04超声波模块与1602液晶显示相关的知识,希望对你有一定的参考价值。

  一,模块介绍

技术图片

trig-使能引脚<输出超过10us高电平启动模块>

echo-接收引脚<模块启动后在此脚发出8个40khz脉冲并产生高电平,高电平开始到结束的时间就是探测时间>

vcc-电源

gnd-接地

二,使用

trig 与 echo 接单片机IO口;

vcc 与 gnd 接单片机VCC,GND;

代码:

#include<reg52.h>
#include<intrins.h>
void delay(unsigned char z)//延时 z 个毫秒
{
    unsigned char x,y;
    for(x=0;x<z;x++)
    {
        for(y=0;y<110;y--)
        {
            ;
        }
    }
}
/***********************LCD1602**************************/
sbit EN = P2^7;
sbit RS = P2^6;           //数据/命令选择        1/0
sbit RW = P2^5;        //读/写选择            1/0
void lcd_bus()        //检测忙
{
    unsigned char i;
    P0 = 0XFF;
    RS = 0;
    RW = 1;
    for(i=0;i<200;i++)
    {
        EN = 0;
        EN = 1;
        if(!(P0&0X80))
        {
            break;
        }    
    }
    EN = 0;
}
void lcd_date(unsigned char date)        //写数据
{
    lcd_bus();
    RS = 1;
    RW = 0;
    P0 = date;
    delay(5);
    EN = 1;
    delay(5);
    EN = 0;
}
void lcd_com(unsigned char com)            //写命令
{
    lcd_bus();
    RS = 0;
    RW = 0;
    P0 = com;
    delay(5);
    EN = 1;
    delay(5);
    EN = 0;
}
/***********************超声波**************************/
unsigned int distance[]={0,0,0,0};
sbit trig = P1^0;
sbit echo = P1^1;
void trigger();
void calculate();
void loop()
{
    trigger();
    while(!echo);
    TR0 = 1;
    while(echo);
    TR0 = 0;
    //TH0 = 0;                        错误!!!!
    //TL0 = 0;                        后面要用到!
    calculate();
    delay(5);        
}
void trigger()        //触发模块启动
{
    trig = 0;
    trig = 1;
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    trig = 0;    
}
void calculate()    //计算距离
{
    unsigned int x,y;
    x = TH0 * 256 +TL0;
    x *= 12/11.0592;
    y = x * 0.017;//此时 Y 就是距离    
    TH0 = 0;
    TL0 = 0;
    distance[3] = y / 1 % 10;             //个
    distance[2]    = y / 10 % 10;             //     十
    distance[1]    = y    / 100 % 10;             //       百
    distance[0]    = y    / 1000 % 10;         //         千
}
void lcd_display()    //显示距离
{
    unsigned char i;
    lcd_com(0x80+0x40);
    for(i=0;i<4;i++)
    {
        lcd_date(0x30+distance[i]);
        delay(5);
    }    
}
/***********************初始化**************************/
void init()
{
    EA = 1;
    ET0 = 1;
    TMOD = 0X01;
    TH0 = 0;
    TL0 = 0;
    lcd_com(0x38);
    lcd_com(0x0c);
    lcd_com(0x06);
    lcd_com(0x01);
}
/***********************主函数**************************/
void main()
{                          /*                */
    unsigned char yi[] = {"The Distace is :"};
    unsigned char er[] = {"cm"};
    unsigned int k = 0;
    init();
    lcd_com(0x80);
    for(k=0;k<16;k++)
    {
        lcd_date(yi[k]);
        delay(5);
    }
    lcd_com(0x80+0x44);
    for(k=0;k<2;k++)
    {
        lcd_date(er[k]);
        delay(5);
    }
    //lcd_com(0x80+0x40);
    while(1)
    {    
        loop();
        lcd_display();    
    }    
}

以上是关于[51单片机]HC-SR04超声波模块与1602液晶显示的主要内容,如果未能解决你的问题,请参考以下文章

4.9 51单片机-(HC-SR04)超声波测距模块

51单片机 HC-SR04超声波测距 我写的C语言代码,请问

利用LCD1602显示超声波测距

超声波模块 hc-sr04 arduino 怎么接线

51单片机 超声波红外避障 程序

HC-SR04超声波测距模块使用