STM32F103:二.(5)控制HC-SR04超声波

模块详细信息就不贴了
整体流程就是初始化IO口和定时器
然后等待响应然后开启定时器使能,统计定时器的时间,然后计算距离

#include "sr04.h"
#include "delay.h"
#include "usart.h"
u32 Count_update,Distance1;
 
//超声波模块Trig、Echo初始化
void Ultras_GPIO_Init(void)
{
//设置Trig引脚GPIO的输出模式为推挽输出
//设置Echo引脚GPIO的输入模式为浮空输入
//并打开相应GPIO的时钟
	GPIO_InitTypeDef GPIO_InitStructure;
	
  /* Configure TRIG Button */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //设置成推挽输出
  GPIO_InitStructure.GPIO_Pin = GPIO_TRIG_Pin;    //配置TRIG的引脚是PB1
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	  
  GPIO_Init(GPIO_TRIG_PORT, &GPIO_InitStructure);   //端口  B
 
  /* Configure ECHO Button */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //模式设置成浮空输入
  GPIO_InitStructure.GPIO_Pin = GPIO_ECHO_Pin; //PB0
  GPIO_Init(GPIO_ECHO_PORT, &GPIO_InitStructure);
}
 
//定时器TIM3初始化
void Ultras_TIM3_Init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  /* 开启定时器3的时钟*/
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   
  //定时时间 1us   计数一次
  //这个就是自动装载的计数值,计数器的值从零开始
  TIM_TimeBaseStructure.TIM_Period = 65535;  //计数值记一次 1us
  // 这个就是预分频系数,当由于为0时表示不分频所以要减1
  TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1);
  // 使用的采样频率之间的分频比例
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  //向上计数
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  //初始化定时器3
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  TIM_ClearFlag(TIM3, TIM_FLAG_Update);							    		/* 清除溢出中断标志 */
  //  TIM_Cmd(TIM3, ENABLE);  //计数器使能,开始工作  先关闭时钟  等待使用
}
 
//超声波模块初始化
void Ultrasonic_Init(void)
{
  Ultras_GPIO_Init();
	Ultras_TIM3_Init();
}
void GetDistance(void)//根据定时器的值计算距离
{
	u8 i;
	u32 UltrasonicWave_Distance,s_Distance=0;
	//这里取六次的数据的平均值
	for(i=0;i<6;i++)
	{
		GPIO_SetBits(GPIO_TRIG_PORT,GPIO_TRIG_Pin); 		  //送>10US的高电平
		delay_us(15);		                      //延迟15us
		GPIO_ResetBits(GPIO_TRIG_PORT,GPIO_TRIG_Pin);
		while(GPIO_ReadInputDataBit(GPIO_ECHO_PORT,GPIO_ECHO_Pin) ==RESET);	             //等待高电平
		TIM_Cmd(TIM3, ENABLE);                                             //开启时钟
		while(GPIO_ReadInputDataBit(GPIO_ECHO_PORT,GPIO_ECHO_Pin) !=RESET);	                 //等待低电平
		TIM_Cmd(TIM3, DISABLE);			                                 //定时器3关闭使能
		UltrasonicWave_Distance=TIM_GetCounter(TIM3)*170/10000;		     //计算距离
		TIM_SetCounter(TIM3,0);//清空TIM3的值
		s_Distance+=UltrasonicWave_Distance;
	}
	s_Distance=s_Distance/6;
	printf("Distance:%d cm\r\n",s_Distance);
	delay_ms(200);
}



#ifndef __SR04_H
#define __SR04_H	 
#include "sys.h"
#include "stm32f10x.h"
#define GPIO_TRIG_PORT GPIOB
#define GPIO_ECHO_PORT GPIOB
#define GPIO_TRIG_Pin  GPIO_Pin_1
#define GPIO_ECHO_Pin  GPIO_Pin_0
void Ultrasonic_Init(void);
void GetDistance(void);	
 
void Ultras_GPIO_Init(void);
void Ultras_TIM3_Init(void);
 
void TIM3_IRQHandler(void);
u32 calculer(u32 count);	
void Display(u32 Distance);

#endif


#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"	 
#include "oled.h"
#include "timer.h"
#include "sr04.h"
int main(void)
{
	delay_init();	    	 //延时函数初始化	  
	uart_init(115200);	 	//串口初始化为115200
	LED_Init();		  		//初始化与LED连接的硬件接口
	OLED_Init();
	OLED_ShowString(0,0,"Welcome To STM32",16);
	Ultrasonic_Init();
	printf("I'm ok!\r\n");
	//TIM3_Int_Init(1999,7199);//Tout= (arr+1)(psc+1)/TCLK;
	//TIM3_PWM_Init(1999,719);//PWM周期为20ms = (7200*200)/72000000
	while(1)
	{
		GetDistance();
	} 
}



串口显示如下
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值