码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-10-15 09:40:42      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:src   char   alc   void   电源   mod   play   image   接收   

  一,模块介绍

技术图片

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液晶显示

标签:src   char   alc   void   电源   mod   play   image   接收   

原文地址:https://www.cnblogs.com/xiejinxu/p/11675295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!