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;
}


你可能感兴趣的:(嵌入式)