完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1. 接线
VCC-5V; GDN-GND; TRIG-PB6; ECOH-PB9 也可自行选择不冲突引脚 2. 代码部分 c***.c //.c文件 #include "delay.h" #include "c***.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++; } } c***.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 "c***.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("距离为:%fn",Senor_distance()); } } 其他库文件使用正点原子库。所以可以直接用printf函数输出串口 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
652浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
520浏览 3评论
539浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
508浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 02:18 , Processed in 0.931548 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号