1. 程式人生 > >51微控制器驅動HC-SR04超聲波測距模組(LED1602顯示結果)

51微控制器驅動HC-SR04超聲波測距模組(LED1602顯示結果)

HC-SR04超聲波測距模組的使用時非常廣泛的,而且驅動它的微控制器也有很多。在這裡我主要說一下51微控制器的程式碼。

51微控制器雖然簡單,但是實際操作起來也會碰到很多問題:

1.ECHO返回的電平用什麼方式去判斷

2.20us的演示函式怎麼編寫

3.距離怎麼用自己的方法換算

在下面的程式中,我用了以下方法解決上述問題:

1.ECHO的返回電平用外部中斷的方式判斷

2.在12MHz的晶振下,51的機器週期是1us,所以執行一條_nop()指令的時間就是1us。而跳轉需要2us的時間,包括跳入函式和跳出函式,所以具體演示函式就可以根據這個要需要編寫。

3.採集完ECHO電平後,定時器計數器裡存放的是計數值,這個值得倒數是時間,再乘以340/2即可。

另外,LCD1602的驅動程式固定,可以自己去找。

sbit Trig  = P3^1; 
sbit Echo  = P3^2; 
sbit LED1  = P3^4;
sbit BEEP  = P3^5;

uchar ge,shi,bai,outcomeH,outcomeL; 
bit succeed_flag;  
unsigned int c=0;

void delay_20us();   
int Gotdis()   
{	
	uint distance_data=0;          
	Trig=0;         
	TMOD=0x11;         
	IT0=0;   //µÍµçƽ´¥·¢             
	EX0=0;
  ET1 = 0;
	TF1 = 0;	
	EA=0;  
	Trig=1;  
	delay_20us();  
	Trig=0;         
	while(Echo==0); 
	succeed_flag=0;
	EX0=1;          
	TH1=0;           
	TL1=0;
	ET1 = 1;
	//TF1 = 1;		
	TF1=0;          
	TR1=1;           
	EA=1;  
	while(TH1 < 30);    
	TR1=0;          
	EX0=0;            
	if(succeed_flag==1)   
	{      
		distance_data=outcomeH*256+outcomeL;   
		distance_data= (distance_data*1.87)/100;   //cm
		bai=distance_data/100;
	  shi=distance_data/10%10;
		ge=distance_data%10;
  }
	c++;
	if(c==5)
	{
		c=0;
		LcdDisplay();
	}
	return ge+shi*10+bai*100;
}  
void delay_20us()  
{  
   uchar bt;       
   for(bt=0;bt<100;bt++); 
}

void main()
{
	int sss;
	LcdInit();
	BEEP = 0;
	while(1)
	{
		sss = Gotdis();
		if(sss<20)
		{
			LED1 = 0;
			BEEP = 1;
		}
		else
		{
			LED1 = 1;
			BEEP = 0;
		}
	}
}
INTO_()  interrupt 0   //ÍⲿÖжÏ0
{           
	outcomeH =TH1;         
	outcomeL =TL1;         
	succeed_flag=1;      
	EX0=0;           
}  
INT1_() interrupt 1  //¶¨Ê±Æ÷0ÖжÏ
{
	TR1 = 0;
	ET1 = 0;
	TH1 = 0;
	TL1=  0;
	TR1 = 0;
	TF1 = 0;
	ET1 = 0;
}