STM32F103超声波HCSR04模块串口输出距离(附代码)

it2023-06-11  66

1. 接线 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)