通过使用定时器的计数来实现HCSR04超声波模块测距的功能。
单片机源程序如下:
- #include "timer.h"
- #include "hc.h"
- #include "sys.h"
- #include "usart.h"
- #include "delay.h"
- #include "stdio.h"
- //PA9为模块trig引脚接口
- //PA10为Echo引脚接口
- int main(void)
- {
- static u8 time;//单程运行时间,单位s
- static u8 length;//路程,单位m
- uart_init(115200); //串口初始化波特率为115200
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
- delay_init(168); //初始化延时函数
- while(1)
- {
- TIM3_Int_Init(100-1,16800-1); //初始化TIM3定时器,计数周期为0.02s
-
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
- {
- while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1);//echo为高电平时,则等待至低电平,才启动超声波
- GPIO_SetBits(GPIOA,GPIO_Pin_9); //TRIG置高
- delay_us(20);
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
- }
-
- while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 0)//等待echo的高电平到来
- TIM_SetCounter(TIM2,0); //清零计数器
-
- TIM_Cmd(TIM3, ENABLE); //使能定时器3,开始计数
-
- while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 1);//等待echo的高电平结束
- TIM_Cmd(TIM3, DISABLE); //失能定时器3,截止计数
-
- TIM_GetCounter(TIM2);//得到计数器的值
- time=TIM_GetCounter(TIM2)/20000;//单程时间
- length=time*344;//计算出长度
-
- printf("\r\n当前距离为:\r\n");
- }
- }
复制代码
Keil代码下载:
代码.7z
(314.21 KB, 下载次数: 29)
|