- 接线
VCC-5V; GDN-GND;
TRIG-PB6; ECOH-PB9
也可自行选择不冲突引脚
2. 代码部分
csb.c //.c文件
#include "delay.h"
#include "csb.h"
uint overcount=0;
void CH_SR04_Init(void)
{ //引脚初始化
GPIO_InitTypeDef GPIO_InitStructer;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
NVIC_InitTypeDef NVIC_InitStructer;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/*TRIG触发*/
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;//PB6
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_6;
GPIO_Init(GPIOB, &GPIO_InitStructer);
/*ECOH回响*/
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9; // PB9
GPIO_Init(GPIOB, & GPIO_InitStructer);
/*TIM2初始化*/
TIM_DeInit(TIM2);
TIM_TimeBaseInitStructer.TIM_Period=999;//定时周期为1000
TIM_TimeBaseInitStructer.TIM_Prescaler=71; //分频系数72
TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);
//TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );//开启更新中断
//设置中断优先级
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);
TIM_Cmd(TIM2, DISABLE);//关闭定时器使能
}
float Senor_distance(void) //返回距离值
{
float length=0,sum=0;
u16 tim;
uint i=0;
while(i!=5)//测试五次算一次平均值
{
PBout(6)=1; //拉高信号,作为触发信号
delay_us(20); //高电平信号超过10us
PBout(6)=0;
//等待信号回响
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
TIM_Cmd(TIM2,ENABLE);//检测到,回响信号,开启TIM2计数
i+=1;//5次计算
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//回响信号消失了
TIM_Cmd(TIM2,DISABLE);//关闭定时器
tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间
length=(tim+overcount*1000)/58.0;
//length=(tim+overcount*1000)*0.0001*340/2;计算公式
sum=length+sum;
TIM2->CNT=0; //将TIM2计数寄存器的计数值清零
overcount=0; //中断溢出次数清零
}
length=sum/5;
return length;//距离作为函数返回值
}
//当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
overcount++;
}
}
csb.h
#ifndef _UW_H
#define _UW_H
#include "sys.h"
#define uint unsigned int
#define TRIG_Send PBout(6)
#define ECHO_Reci PBin(9)
void CH_SR04_Init(void);
float Senor_distance(void);
#endif
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "csb.h"
#include "beep.h"
float distance;
u8 i=20;
u8 j=0;
int main()
{
float distance;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
CH_SR04_Init();
uart_init(115200);
delay_init();
BEEP_Init();
while(1)
{
printf("距离为:%f\n",Senor_distance());
}
}
其他库文件使用正点原子库。所以可以直接用printf函数输出串口
评论(0)
您还未登录,请登录后发表或查看评论