头文件:
void csb_init(void);
void starttimer(void);
void endtimer(void);
u32 gettime(void);
csb.c:
u8 conter=0;//ÖжÏÒç³ö´ÎÊý
void csb_init(void)
{
GPIO_InitTypeDef GPIO_InitT;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitT;
TIM_ICInitTypeDef TIM_ICInitT;
NVIC_InitTypeDef NVIC_InitT;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
GPIO_InitT.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_InitT.GPIO_Pin =GPIO_Pin_1;
GPIO_InitT.GPIO_Speed =GPIO_Speed_2MHz;
GPIO_Init(GPIOB,&GPIO_InitT);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);//ÖÃ0
GPIO_InitT.GPIO_Mode =GPIO_Mode_IN_FLOATING;
GPIO_InitT.GPIO_Pin =GPIO_Pin_1;
GPIO_Init(GPIOA,&GPIO_InitT);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);//ÖÃ0
TIM_TimeBaseInitT.TIM_ClockDivision =TIM_CKD_DIV1;
TIM_TimeBaseInitT.TIM_CounterMode =TIM_CounterMode_Up;
TIM_TimeBaseInitT.TIM_Period =65535-1;
TIM_TimeBaseInitT.TIM_Prescaler =71;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitT);
NVIC_InitT.NVIC_IRQChannel =TIM5_IRQn;
NVIC_InitT.NVIC_IRQChannelCmd =ENABLE;
NVIC_InitT.NVIC_IRQChannelPreemptionPriority =0;
NVIC_InitT.NVIC_IRQChannelSubPriority =0;
NVIC_Init(&NVIC_InitT);
TIM_ITConfig(TIM5,TIM_IT_Update ,ENABLE);
TIM_Cmd(TIM5,DISABLE);
}
void TIM5_IRQHandler()
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)==1)
{
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
conter++;
}
}
void starttimer(void)
{
TIM_SetCounter(TIM5,0);
conter=0;
TIM_Cmd(TIM5,ENABLE);
}
void endtimer(void)
{
TIM_Cmd(TIM5,DISABLE);
}
u32 gettime(void)
{
u32 t=0;
t=conter * 65535;
t=t+TIM_GetCounter(TIM5);
TIM_SetCounter(TIM5,0);
return t;
}
主函数:
int main(void)
{
u32 time;
float distance=0;
float sum=0;
u8 i;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(9600);
csb_init();
while(i!=5)
{
TRIG=1;
delay_us(20);
TRIG=0;
while(ECHO==0);
starttimer();
while(ECHO==1);
endtimer();
time=gettime();
delay_ms(50);
distance=((float)time/58.0);
sum=sum+distance;
i=i+1;
}
distance=sum/5.0;
printf("distance:%f cm\r\n",distance);
}
实验现象:打开串口,没有数值显示。但是按下复位键,会依次出现3个数值,并且拔下TRIG线,按复位键还是会有数值出现