这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【原创】51单片机超声波模块--from阿斌

共2条 1/1 1 跳转至

【原创】51单片机超声波模块--from阿斌

工程师
2023-05-21 20:18:24     打赏

51单片机超声波模块SR04是一种基于超声波检测的测距系统,通过超声波反射回的反射波来测量距离。使用51单片机作为控制核心,通过编程控制超声波模块SR04,使其能够识别并处理接收到的反射信号,并完成测距。、

 

此外,在使用超声波传感器模块时需注意一下几点:

1.     本模块采用IO触发测距,最低不低于10us的高电平信号。

2.     SR04不宜带电连接。

3.     被测物体的面积不少于0.5平方米,且被测物体表面平整

 

在超声波实验中常用的超声波模块是4针的SR04,原理图如下所示。

1.png

实物图如下

2.png

超声波模块参数说明:

1:使用电压:直流 5V

2:静态电流:<2mA

3:电平输出:高 5V

4:电平输出:底 0V

5:感应角度:不大于15

6:探测距离:2厘米至450厘米

7: 高精度: 0.2cm

 

主函数代码展示如下

 

#include<reg51.h>
#include<intrins.h>	


sbit Trig = P2^1;
sbit Echo = P2^0;



unsigned char PuZh[]=" haohao xuexi";
unsigned char code ASCII[16] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M','C'};

static unsigned char DisNum = 0; //显示用指针				  
       unsigned int  time=0;
	   unsigned long S=0;
	   bit      flag =0;
	   unsigned char disbuff[4]	   ={ 0,0,0,0,};

	   
	   
void Conut(void)
	{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	
	 S=(time*1.7)/100;     //算出来是CM
	 if((S>=700)||flag==1) //超出测量范围显示“-”
	 {	 
	  flag=0;
	 
	  DisplayOneChar(0, 1, ASCII[11]);
	  DisplayOneChar(1, 1, ASCII[11]);	//显示点
	  DisplayOneChar(2, 1, ASCII[11]);
	  DisplayOneChar(3, 1, ASCII[13]);
	  DisplayOneChar(4, 1, ASCII[12]);	//显示M
	 }
	 else
	 {
	  disbuff[0]=S%1000/100;
	  disbuff[1]=S%1000%100/10;
	  disbuff[2]=S%1000%10 %10;
	  DisplayOneChar(0, 1, ASCII[disbuff[0]]);
	 
	  DisplayOneChar(1, 1, ASCII[disbuff[1]]);
	  DisplayOneChar(2, 1, ASCII[disbuff[2]]);
	  DisplayOneChar(3, 1, ASCII[13]);	//显示点
	  DisplayOneChar(4, 1, ASCII[12]);	//显示M
	 }
	}

void zd0() interrupt 1 		 //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;							 //中断溢出标志
  }

 void  StartModule() 		         //启动模块
  {
	  Trig=1;			                     //启动一次模块
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  Trig=0;
  }



void delayms(unsigned int ms)
{
	unsigned char i=100,j;
	for(;ms;ms--)
	{
		while(--i)
		{
			j=10;
			while(--j);
		}
	}
}

void main(void)
{

	 TMOD=0x01;		   //设T0为方式1,GATE=1;
	 TH0=0;
	 TL0=0;          
	 ET0=1;             //允许T0中断
	 EA=1;			   //开启总中断	

	while(1)
	{
		 StartModule();
	     while(!Echo);		//当RX为零时等待
	     TR0=1;			    //开启计数
	     while(Echo);			//当RX为1计数并等待
	     TR0=0;				//关闭计数
         Conut();			//计算
		 delayms(80);
	}
			
}




院士
2023-06-17 18:11:15     打赏
2楼

学习了,谢谢分享。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]