完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
.h文件内容:
#ifndef __HC_SR04_H #define __HC_SR04_H #define Trig PBout(5) #define Echo PAin(2) void GPIO_Config(void); void tiM_Config(void); float HC_SR04_Init(void); void NVIC_Config(void); #endif .c文件内容: #include "STM32f10x.h" #include "hc-sr04.h" #include "sys.h" #include "delay.h" u32 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 GPIO_Config(void) 函数说明:配置相应管脚,Trig->PB.5;Echo->TIM2_CH3(PA.2) 入口参数:无 返回值:无 *********************************************************/ void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitTypeStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_2; GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitTypeStruct); GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_5; GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitTypeStruct); } /********************************************************************** 函数名称:void TIM_Config(void) 函数说明:配置TIM2_CH3,通过TIM2计算HC-SR4返回的高电平时间 入口参数:无 返回值:无 **********************************************************************/ void TIM_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); TIM_TimeBaseInitTypeStruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitTypeStruct.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitTypeStruct.TIM_Period=5999; TIM_TimeBaseInitTypeStruct.TIM_Prescaler=719; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitTypeStruct); TIM_Cmd(TIM2,DISABLE); NVIC_Config(); } /*********************************************************************** 函数名称:float HC_SR04_Init(void) 函数说明:对超声波模块进行相应的配置 入口参数:无 返回值: ************************************************************************/ float HC_SR04_Init(void) { float time=0; Trig=1; //给超声波模块20us的高电平 delay_us(20); Trig=0; while(!Echo); //等待回响信号为高 while(Echo) //回响信号为高则开启TIM2进行计时 { TIM_Cmd(TIM2,ENABLE); } time=TIM_GetCounter(TIM2)+overcount*60000; //获取TIM2的值,单位为us TIM2->CNT=0; delay_ms(60); return time; } void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数 { if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志 overcount++; } } 主函数内容: #include "delay.h" #include "sys.h" #include "led.h" #include "key.h" #include "usart.h" #include "lcd.h" #include "hc-sr04.h" int main(void) { float s=0; float temp=0; uart_init(115200); GPIO_Config(); TIM_Config(); NVIC_Config(); temp=HC_SR04_Init(); s=340*temp/2000000; while(1) { printf("%fn",temp);//打印时间 printf("%fn",s); //打印距离 } } |
|
相关推荐
4个回答
|
|
先把串口调试好把!
|
|
|
|
|
|
|
|
没什么大问题
|
|
|
|
你好 你的问题解决了吗 我现在也出现了这样的问题 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 应用层更改引脚复用的方法
3440 浏览 0 评论
1395 浏览 0 评论
【英飞凌PSoC 6 RTT开发板试用】串口测试标准输入输出重定向
1129 浏览 0 评论
4809 浏览 0 评论
1865 浏览 0 评论
56075 浏览 21 评论
【参与有奖】激扬代码,千元现金!RT-Thread主题征文大赛
57080 浏览 88 评论
野火 ISO STM32资料合集(程序、原理图、项目初高级篇)
18169 浏览 47 评论
278915 浏览 76 评论
51110 浏览 31 评论
16015 浏览 53 评论
13290 浏览 50 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-6 10:40 , Processed in 0.550322 second(s), Total 73, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号