HC-SRF04超声波测距传感器+Proteus仿真(附源码与仿真电路)

一、模块介绍

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

 

四、仿真电路

 

左肩理想右肩担当,君子不怨永远不会停下脚步!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_37707218/article/details/105063539
今日推荐