代码使用方法:
1 需要初始化引脚:init_sr04_pin();
2 在循环中,不断调用 distance_sr04=get_distance(); 获得距离。单位是毫米。
注意:超声波两次读取间隔应该大于75ms,好像以前在超声波模块说明书里见过如此的说明。
注意:代码里用了TIM3定时器。
代码:
unsigned int distance_sr04; /* 距离 单位是毫米 */
char over_flow_sr04 = 0; /* 溢出 */
#define trig PBout( 3 ) /* trig ouput */
#define echo GPIO_ReadInputDataBit( GPIOB, GPIO_Pin_4 ) /* echo input */
void TIM3_Int_Init( u16 arr, u16 psc )
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE ); /* TIM4时钟使能 */
/* 定时器TIM3初始化 */
TIM_TimeBaseStructure.TIM_Period = arr; /* 设置在下一个更新事件装入活动的自动重装载寄存器周期的值 */
TIM_TimeBaseStructure.TIM_Prescaler = psc; /* 设置用来作为TIMx时钟频率除数的预分频值 */
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /* 设置时钟分割:TDTS = Tck_tim */
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* TIM向上计数模式 */
TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure ); /* 根据指定的参数初始化TIMx的时间基数单位 */
TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE ); /* 使能指定的TIM4中断,允许更新中断 */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; /* 抢占优先级2 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; /* 子优先级2 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* IRQ通道使能 */
NVIC_Init( &NVIC_InitStructure ); /* 根据指定的参数初始化VIC寄存器 */
}
|