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

 

四、仿真電路

 

左肩理想右肩擔當,君子不怨永遠不會停下腳步!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章