一、模块介绍
1.1 模块图示
模块共有四个引脚,分别是Vcc(供5V电源)、Trig(控制端,下文简称Tr)、Echo(接收端,下文简称Ec)、Gnd(地线)
2.2 产品参数
二、 工作原理(时序)
在初始状态时,Tr引脚电平由单片机拉高,Ec引脚电平由传感器拉低。工作时,首先由单片机将Tr引脚拉低后再给一个高电平脉冲(持续时间至少为10us),传感器收到该脉冲信号后开始向外发射8个40KHz的方波即用来测距的超声波。该测距超声波以声速(340m/s)向前传播,在遇到障碍物时,该超声波被反弹向回传播,因此最终能够被传感器接收到,传感器会记录从发射超声波到接收到超声波的所经历的时间t。传感器在收到返回的信号后,由Ec引脚输出一个与t相同时间的高电平脉冲。此时,我们只需要通过单片机内部定时/计数器记录Ec引脚高电平脉冲时间即可得超声波的传播时间t。因此可算出传感器到障碍物间的距离=340*(t/2) (因为t是超声波一来一回经历的时间,所以单程时间要除以2)。
三、例程(例程均为自己编写且仿真通过)
单片机为AT89C52,工作频率为12Mhz,最终结果通过八段数码管显示。
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit Tr=P1^0;//触发信号
sbit Ec=P1^1;//回响信号
void Delay10us(void);//10us延时函数
void Delay1ms(void);//1ms延时函数
uint Read_value(void);//读值函数
void InitTimer0(void);//定时器0初始化
void show(uint Out);//显示函数
void main()
{
uint distance;
Tr=0;//出发引脚首先拉低
InitTimer0();//初始化定时器0
distance=Read_value();//读值
show(distance);//显示距离
}
/********************读值函数***********************/
uint Read_value()
{
float temp;
uint result;
Tr=1;//触发引脚发出11us的触发信号(至少10us)
Delay10us();
_nop_();
Tr=0;
while(!Ec);//度过回响信号的低电平
TR0=1;//开启定时器0
while(Ec);//度过回响信号高电平
TR0=0;//关闭定时器0
temp=TH0*256+TL0;//最终us时间
temp/=1000.0;//最终ms时间
temp*=17.0;//距离(cm) (17=光速34cm/ms 除2)
result=temp;//四舍五入
if(temp-result>=0.5)
{
result+=1;
}
return result;
}
/***********************10us延时函数*****************************/
void Delay10us()
{
uchar i;
i=2;
while(--i);
}
/***********************1ms延时函数*****************************/
void Delay1ms() //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
/************************定时器0初始化*****************************/
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x00;
TL0 = 0x00;
TR0 = 0;//先关闭定时器0
}
/**********************显示函数*************************************/
void Show(uint Out)
{
char duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码
while(1)
{
P2=0x01;//第四位(个位)
Delay10us();
P3=duan[Out%10];
Delay1ms();
P3=0xff;
P2=0x02;//第三位(十位)
Delay10us();
P3=duan[(Out/10)%10];
Delay1ms();
P3=0xff;
P2=0x04;//第二位(百位)
Delay10us();
P3=duan[(Out/100)%10];
Delay1ms();
P3=0xff;
P2=0x08;//第一位(千位)
Delay10us();
P3=duan[(Out/1000)%10];
Delay1ms();
P3=0xff;
}
}
注意:因为12MHz的单片机的机器周期为1us,即计数值就等于以us为单位的时间值,因此计算公式 可以写为 时间=TH0*256+TL0;但如果使用的单片机工作频率为11.0592MHz,其机器周期为1.085us,因此时间计算公式需写为 时间=(TH0*256+TL0)*1.085
四、仿真电路
左肩理想右肩担当,君子不怨永远不会停下脚步!