#include "cj.h"
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
unsigned int overcount=0;
void NVIC_Config(void)//优先级设置
{
NVIC_InitTypeDef NVIC_InitStructer;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructer.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;//
NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructer);
}
void CH_SR04_Init(void)//超声波模块初始化
{
GPIO_InitTypeDef GPIO_InitStructer;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
GPIO_Init(GPIOB, &GPIO_InitStructer);//设置PB8作为触发引脚
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOB,&GPIO_InitStructer);//设置PB9作为接受引脚
TIM_DeInit(TIM2);
TIM_TimeBaseInitStructer.TIM_Period=65534;
TIM_TimeBaseInitStructer.TIM_Prescaler=71; //经过预分频后,计数器的值,每隔0.5us就加一。
TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//
TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);
//TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//
NVIC_Config();
TIM_Cmd(TIM2,DISABLE);//
}
float Senor_Using(void)//测距函数
{
float length=0,sum=0;
u16 tim;
unsigned int i=0;
while(i!=5)
{
PBout(8)=1; //
delay_us(20); //
PBout(8)=0;
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
TIM_Cmd(TIM2,ENABLE);//
i+=1;
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//
TIM_Cmd(TIM2,DISABLE);//
tim=TIM_GetCounter(TIM2);//
length=(tim+overcount*1000)/58.0;//
sum=length+sum;
TIM2->CNT=0; //
overcount=0; //
delay_ms(100);
}
length=sum/5;
return length;//
}
void TIM2_IRQHandler(void) //
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//
overcount++;
}
}
由于是复制粘贴过来的,所以只是对部分地方进行了注释。其实很简单,就是通过一个引脚输出超过10us高电平作为脉冲信号,在设置一个引脚作为接收引脚。当接收到高电平,就开启定时器计数,当检测到低电平,就停止计数。将数值取出来,通过公式计算即可得到距离。最后是这个串口输出,直接#include "stdio.h"后直接用pirntf即可。但是不要忘了在此之前还要对编译器相关配置,这里请自行百度,很简单的。
上一篇:关于STM32F103型号的矩阵按键的程序书写
下一篇:stm32中pwm频率和占空比设置
推荐阅读最新更新时间:2024-03-16 16:26