【外设1】超声波传感器的驱动

一、简介

本文介绍如何用51STC单片机驱动超声波传感器来实现测距等功能。

二、实验平台

单片机型号:STC12C5A60S2

外设模块型号:HC-SR04

编译软件:KEIL

硬件平台:达芬奇51开发版

三、版权声明

博主:文武大侠

声明:喝水不忘挖井人,转载请注明出处。

原文地址:

联系方式:644746740@qq.com

老蔡51单片机群:463850023

四、讲解

  超声波传感器对于51单片机外设来讲是很常见的,它的工作原理也很简单,所以看到此篇博客的同学按照我的步骤往下看完,一定会学明白的,如果有不明白的就暂停一下,自己想一想或者百度一下,再或者在下面留言,我会及时回复的。

4.1 超声波传感器原理

  由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2 。这就是所谓的时间差测距法。
  超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。由此可见,超声波测距原理与雷达原理是一样的。

      测距的公式表示为:L=C×T

  式中L为测量的距离长度;C为超声波在空气中的传播速度;T为测量距离传播的时间差(T为发射到接收时间数值的一半)。
  HC-SR04超声波模块可提供2cm~400cm的距离感测功能,测量精度可以达到3mm。模块包括超声波发射器,接收器与控制电路。

基本工作原理

1) 采用Trig引脚触发,给至少10us的高电平脉冲信号
2) 模块自动发送8个40kHz的方波,自动检测是否有信号返回
3) 有信号返回,通过Echo引脚输出一个高电平脉冲,高电平脉冲持续的时间就是超声波从发射到反射返回的时间。距离=(高电平脉冲时间*340)/2
image.png

4.2 程序逻辑

Created with Raphaël 2.1.2 Start 发送>10us的高电平 检测ECHO引脚 是否有信号返回? 用定时器检测高电平时间长度 利用波在空气中的事件,通过算法算出距离 End 检查硬件 yes no

4.2 用代码来实现它

//主程序
void main(void)
{  
    TMOD=0x01;         //ÉèT1Ϊ·½Ê½2£¬T0Ϊ·½Ê½1 GATE=0
    SCON=0x10;
    UartInit();
    TH0=0;
    TL0=0; 
    TR0=1;  
    ET0=1;             
    TI=1;
    EA=1;              
    while(1)
    {
        LED1 = ~LED1;
        StartModule();  //发送大于10us的高电平
        while(!RX);     //等待返回信号
        TR0=1;              //打开定时器
        while(RX);          //监测到返回信号主程序停止,定时器计时
        TR0=0;              //信号
        Conut();            //通过定时器的时间,算出距离
        delayms(100);       //100MS
    }
} 

StartModule()

void  StartModule() 
{
    unsigned char i, j, k;
    i = 68;
    j = 61;
    k = 50;
    TX=1;                            //800MS启动一次模块
    do
    {
        do
        {
            while (--k);
        } 
        while (--j);
    } 
    while (--i);
    TX=0;
}

void Conut(void)

void Conut(void)
{
    time=TH0*256+TL0;
    TH0=0;
    TL0=0;
    S=(time*1.87)/100/2 - 0.7;     //通过定时器时间计算距离公式
    if(flag==1)         //超出测量
    {
        flag=0;
        printf("-----\n"); 
    }
    printf("S=%f\n",S); 
}

休息一下 等会把代码上传到git上
源代码git下载:https://gitee.com/caibinguitar/51_routines_code.git

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值