基于STM32和超声波模块的超声波测距,使用OLED显示距离和温度(附详细源代码)

1、 HC-SR04模块介绍

基于STM32和超声波模块的超声波测距,使用OLED显示距离和温度(附详细源代码)_第1张图片

HC-SR04模块优势

此模块性能稳定,测度距离精确,模块高精度,盲区小。

产品应用领域:

1、机器人避障

2、物体测距

3、液位检测

4、公共安防

5、停车场检测

超声波测距模块工作原理

(1)采用IO口TRIG触发测距,给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

(4)本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,即可以达到你移动测量的值
  
  超声波测距模块电路图
  基于STM32和超声波模块的超声波测距,使用OLED显示距离和温度(附详细源代码)_第2张图片

超声波测距模块工作原理_HC-SR04模块详解

电气参数
  基于STM32和超声波模块的超声波测距,使用OLED显示距离和温度(附详细源代码)_第3张图片

具体测距原理
  基于STM32和超声波模块的超声波测距,使用OLED显示距离和温度(附详细源代码)_第4张图片

初始化时将trig和echo端口都置低,首先向给trig 发送至少10 us的高电平脉冲(模块自动向外发送8个40K的方波),然后等待,捕捉 echo 端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo的下降沿,当捕捉到下降沿,读出计时器的时间,这就是超声波在空气中运行的时间,按照 测试距离=(高电平时间*声速(340M/S))/2 就可以算出超声波到障碍物的距离。

具体程序源码,这里只贴主要部分,其他可在我上传的工程中下载
链接: STM32F103RCT6-OLED显示温度+超声波测距.
链接: stm32f103rct6+hcsr04超声波模块.

int main(void)
{		
	u8 a=0;	
	u8 t=20;//trig引脚高电平持续时间
	short temperature;    	 		 		
	u8 Distance;
	
	uart_init(115200);//串口初始化
	Wave_SRD_Init();//初始化超声波
	Timer_SRD_Init(9998,7199);//定时器初始化	

	extern const u8 BMP1[];
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	delay_init();
	OLED_Init();		 	//OLED屏幕初始化		
	DS18B20_Init();		//DS18B20初始化	
	
	while(Wave_SRD_Strat(t))
	{
	}
	
	OLED_Clear();	
	
	while(1)
	{		
		//18B20读取温度		
		if(a%10==0)			//每100ms读取一次
		{									  
			temperature=DS18B20_Get_Temp();
			if(temperature<0)
			{
				OLED_ShowCH(50,6,"-");			//显示负号
				temperature=-temperature;			//转为正数
			}else{
				OLED_ShowCH(50,6," ");			//去掉负号
			}
			OLED_ShowNum(60,6,temperature/10,2,16);			//显示整数部分	    
   			OLED_ShowNum(60+28,6,temperature%10,1,16);	//显示小数部分 		   
		}				   
	 	delay_ms(10);
		a++;
		if(a==20)
		{
			a=0;
		}

		OLED_ShowCH(15,0,"屏幕显示测试");		//测试显示中文

		OLED_ShowCH(0,3,"距离:");		//显示中文:距离
//		OLED_ShowCH(0,3,"Distance: ");	//显示英文
		OLED_ShowCH(100,3,"cm");		//测试显示中文

		OLED_ShowCH(0,6,"温度:");		//显示中文:温度
//		OLED_ShowCH(0,6,"Temp: ");		//显示英文
		OLED_ShowCH(78,6,".");			//显示.			
		OLED_ShowCH(101,6,"℃");		//显示:℃

		//产生高于10Us的高电平与OLED上显示超声波所测距离	
			delay_ms(900);
		Wave_SRD_Strat(t);
		Distance = TIM_GetCounter(TIM3)*340/200.0;
		if(Distance>0)
		{
			OLED_ShowNum(50,3,Distance,6,16);		//显示超声波测量距离
			
			printf("distance %dcm   ",Distance);
			
			delay_ms(10);
		}

/*		
		OLED_ShowCH(20,1,"屏幕显示测试");		//测试显示中文

		OLED_ShowNum(20,3,314159265,9,0);		//测试显示数字

		OLED_DrawBMP(0,0,128,8,(u8 *)BMP1);		//测试显示图片
*/
	}
}

2、OLED介绍

本设计使用的比较简单的4针 0.96寸OLED。

基于STM32和超声波模块的超声波测距,使用OLED显示距离和温度(附详细源代码)_第5张图片
基于STM32和超声波模块的超声波测距,使用OLED显示距离和温度(附详细源代码)_第6张图片

3、连接实物,调试

超声波发射引脚接PB7,超声波接收引脚接PB6,PB8接OLED的SCL,PB9接OLED的SDA,在代码里也能看出来。

基于STM32和超声波模块的超声波测距,使用OLED显示距离和温度(附详细源代码)_第7张图片

工程源代码下载
链接: STM32F103RCT6-OLED显示温度+超声波测距.
链接: stm32f103rct6+hcsr04超声波模块.

基于STM32和超声波模块的超声波测距,使用OLED显示距离和温度(附详细源代码)_第8张图片

你可能感兴趣的