超声波测距试验心得
#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接受灌电流能力不够的问题。
很厉害的样子
很厉害的样子
感谢经验分享,,值得好好学习
人才呀