stm32F103+HC-SR04 超声波测距程序编程

本文介绍了HC-SR04超声波测距模块的特性、工作原理,包括触发、测量和信号处理过程,并提供了使用该模块的主函数代码示例。
摘要由CSDN通过智能技术生成
1、产品特点
HC-SR04  超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能, 距精度可达高到3mm.
2、基本工作原理:
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
3、主函数代码

 int main(void)
 {		
  float Dis;
	delay_init();	    	 //ÑÓʱº¯Êý³õʼ»¯	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
	uart_init(115200);	 //´®¿Ú³õʼ»¯Îª115200
 	LED_Init();			     //LED¶Ë¿Ú³õʼ»¯
	TIM3_Int_Init(); 
   	while(1)
	{
		Dis=Distance_test();
		printf("\r\n²âÊÔ¾àÀëΪ£º%.2fcm  \r\n",Dis);
		LED0=!LED0;
		delay_ms(1000);		   
	}	 

 
}	 
void TIM3_Int_Init(void)
{
     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	
	 GPIO_InitTypeDef  GPIO_InitStructure;
 	
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 
	
	
	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
	 GPIO_Init(GPIOC, &GPIO_InitStructure);					 
	 GPIO_ResetBits(GPIOC,GPIO_Pin_0);						 

	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;	
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 	
	 GPIO_Init(GPIOC, &GPIO_InitStructure);	  				
	 						   
	
	TIM_TimeBaseStructure.TIM_Period = 65535; 
	TIM_TimeBaseStructure.TIM_Prescaler =72-1; 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
 
	
					 
}


float Distance_test(void)
{
    
	TRIG_H;
	delay_us(20);
	TRIG_L;
	
	while(ECHO_Read==0);
	TIM_SetCounter(TIM3,0); 
	TIM_Cmd(TIM3, ENABLE);  //ʹÄÜTIMx	
    while(ECHO_Read==1);
	TIM_Cmd(TIM3, DISABLE);
	
	return (float)(TIM_GetCounter(TIM3))/1000000*340/2*100;
	
}

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 硬件连接 将HC-SR04的VCC接到STM32F103ZET6的5V电源,GND接到GND,Trig接到STM32F103ZET6的PB0引脚,Echo接到STM32F103ZET6的PB1引脚。 2. 配置GPIO 使用HAL库配置PB0和PB1引脚为输出和输入模式,分别用来控制HC-SR04的Trig和读取Echo信号。 void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟 GPIO_InitStruct.Pin = GPIO_PIN_0; // PB0 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 输出模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不带上下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_1; // PB1 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 输入模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不带上下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } 3. 发送超声波信号 使用HAL库的GPIO_WritePin函数将Trig引脚输出高电平,持续10us,然后输出低电平。 void Send_Trigger_Pulse(void) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 输出高电平 HAL_Delay(10); // 持续10us HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 输出低电平 } 4. 接收回波信号 使用HAL库的pulseIn函数读取Echo引脚的信号,计算回波信号的时间差,再通过声速计算距离。 uint32_t pulseIn(uint16_t pin, uint8_t state, uint32_t timeout) { uint32_t start, end; GPIO_PinState bit; start = HAL_GetTick(); // 获取当前时间 do { end = HAL_GetTick(); // 获取当前时间 if (end - start > timeout) return 0; // 超时返回0 bit = HAL_GPIO_ReadPin(GPIOB, pin); // 读取引脚状态 } while (bit != state); // 等待状态变化 start = HAL_GetTick(); do { end = HAL_GetTick(); if (end - start > timeout) return 0; bit = HAL_GPIO_ReadPin(GPIOB, pin); } while (bit == state); // 等待状态变化 return end - start; // 返回时间差 } float Measure_Distance(void) { uint32_t duration; float distance; Send_Trigger_Pulse(); // 发送超声波信号 duration = pulseIn(GPIO_PIN_1, GPIO_PIN_SET, 1000); // 读取回波信号 distance = duration * 0.034 / 2; // 声速为340m/s,距离等于时间差乘以声速再除以2 return distance; } 5. 完整代码 #include "stm32f1xx_hal.h" void GPIO_Config(void); void Send_Trigger_Pulse(void); uint32_t pulseIn(uint16_t pin, uint8_t state, uint32_t timeout); float Measure_Distance(void); int main(void) { float distance; HAL_Init(); GPIO_Config(); while (1) { distance = Measure_Distance(); printf("Distance: %.2fcm\n", distance); HAL_Delay(1000); } } void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void Send_Trigger_Pulse(void) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); HAL_Delay(10); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); } uint32_t pulseIn(uint16_t pin, uint8_t state, uint32_t timeout) { uint32_t start, end; GPIO_PinState bit; start = HAL_GetTick(); do { end = HAL_GetTick(); if (end - start > timeout) return 0; bit = HAL_GPIO_ReadPin(GPIOB, pin); } while (bit != state); start = HAL_GetTick(); do { end = HAL_GetTick(); if (end - start > timeout) return 0; bit = HAL_GPIO_ReadPin(GPIOB, pin); } while (bit == state); return end - start; } float Measure_Distance(void) { uint32_t duration; float distance; Send_Trigger_Pulse(); duration = pulseIn(GPIO_PIN_1, GPIO_PIN_SET, 1000); distance = duration * 0.034 / 2; return distance; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值