微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > 硬件电路设计讨论 > 超声波测距试验心得

超声波测距试验心得

时间:10-02 整理:3721RD 点击:

#include<reg52.h>

#include<intrins.h>

float distance;

Sbit led=P2^7;

sbit echo=P1^0;

sbit trig=P3^4;

/*  软件延时函数,延时时间(t*10)us */

void delay10us(unsigned char t)

{

do {

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

   } while (--t);

}

void main()

{

        EA=1;//开总中断

        EX0=1;//开外部中断0

        TMOD=0x01;//采用定时器0的定时模式的工作方式1

        IT0=1;//外部中断为负跳变触发方式       

        TH0=0;//定时器高8位和低8位都赋值为0

        TL0=0;

        while(1)

        {

                trig=1;//单片机给trig引脚一个20微秒的触发信号

                delay10us(2);

                trig=0;

                if(distance<0.1)//如果障碍物距离小于10cm,则亮第一位LED

                led=0;

                else

                led=1;

                delay10us(6);//延时60微秒

        }

}

/* ....

中断服务程序,外部中断的中断服务程序的执行时间可以很长,

没有时间的限制,不像定时器中断,中断服务程序执行时间有

一定要求,即在下一次中断请求到来之前本次中断必须执行完毕。

......*/

void wb0() interrupt 0

{

        TR0=1;//启动定时器,TH0和TL0开始计数

        while(echo);//当返回脉冲信号(echo上的高电平脉冲)结束时关闭定时器

        TR0=0;       

        distance=(TH0*256+TL0)*1.08507/1000000*340/2;//计算障碍物距离

    //distance=(定时器高8位*256+低8位)*一个机器周期*声速/2

        TH0=TL0=0;//清零TH0和TL0,准备下一次测距

}

    解释:在不加Q2三极管的情况下你,即Echo直接连接到单片机的IO口,单片机将会检测不到Echo输出的高脉冲信号。单片机的管脚在没有设定的情况下,默认输出高电平。然后看超声波测距模块的时序图,Echo在没有给触发信号的情况下保持低电平,有了触发信号之后,Echo输出一个高电平。按道理说如果将Echo引脚直接连接在单片机的IO口上,该IO口将会被Echo引脚拉为低电平,在Echo输出高脉冲的时候,单片机IO口保持原来的高电平。当Echo为低电平的时候,那么该IO口就会向Echo引脚灌电流。但是在实际电路中,Echo并不能将IO口拉低,我猜原因是Echo接受灌电流的能力太小,灌入的电流过大,导致该脚电平为不确定状态。解决的措施有两个,第一就是直接用外部中断引脚检测“低脉冲”(因为外部中断选用的触发方式是下降沿触发,所以原来的高脉冲信号要加一个三极管反相器,就变成了低脉冲),这样就变成IO口检测低电平了。第二就是上图里的方法,不将Echo直接连接在单片机的IO口上,而是将Echo通过一个PNP型的三极管连接在单片机IO口上。这样当Echo输出低时,三极管导通,单片机的这个IO口就会被三极管的集电极拉为低。当Echo输出高脉冲时,三极管截至,该IO口通过上拉电阻R4保持默认的高电平。这就解决了Echo接受灌电流能力不够的问题。



很厉害的样子

很厉害的样子

感谢经验分享,,值得好好学习

人才呀

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top