历史上的今天
今天是:2025年01月30日(星期四)
2019年01月30日 | 基于STM32使用超声波HC-SR04模块
2019-01-30 来源:eefocus
写在前面注意的几点:
1、HC-SR04模块必须使用5V供电,不能是3.3V
2、若单是测距,无需使用中断
3、Echo和Trig两个引脚可以任意接可用的GPIO,和定时器无关
说一下超声波的工作原理

单片机给Trig引脚一个最少10us的高电平,然后拉低引脚,便启动了模块,
然后超声波就被发了出去,超声波遇到障碍物后返回被模块接收,Echo引脚会输出一段高电平,高电平的时间与距离成比例;
那么我们所需要做的就是出发Trig引脚,然后测出Echo持续高电平的时间
以下是GPIO的设置:
void Ultrasonic_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//Trig
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//Echo
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
以下是定时器2设置
void Timer2_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
TIM_TimeBaseInitStructure.TIM_Period = 49999;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
}
以下是距离转换函数
u32 Distance_Calculate(u32 count)
{
u32 Distance = 0;
Distance = (u32)(((float)count / 58) * 100);
return Distance;
}
main函数
void main(void)
{
u32 count = 0;
u32 Distance = 0;
USART_Config();
NVIC_Configuration();
LED_Init();
Ultrasonic_Config();
Timer2_Config();
GPIO_ResetBits(GPIOB, GPIO_Pin_0);//点亮LED
printf("Test start!");
while(1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_8);//预先拉低Trig引脚
GPIO_SetBits(GPIOB, GPIO_Pin_8);
delay_nus(10);
GPIO_ResetBits(GPIOB, GPIO_Pin_8);//发出10us的脉冲
TIM2->CNT = 0;
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) == 0);
TIM_Cmd(TIM2, ENABLE);
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) == 1);
TIM_Cmd(TIM2, DISABLE);
count = TIM2->CNT;
Distance = Distance_Calculate(count);
printf("Distance = %d.", Distance / 100);
printf("%d cm\r\n", Distance % 100);
delay_nms(500);
}
}
史海拾趣
|
辩论一下--学单片机需不需要学习汇编语言,只用C语言就可以完全搞定单片机程序? 呵呵,这个讨论是一个很老套的讨论。 有很多人都议论过的。 经典的说法是:可以用C语言来进行单片机开发,但是想要真正搞懂单片机的结构原理,就要好好学学汇编语言。 现在一般的单片机开发,很少见用汇编的了,汇编语言的讲解 ...… 查看全部问答> |
|
wince编译完成后,在vs2005中选择Attach Device,WinCE的image就下载下来了。但是模拟器启动起来是黑的,为什么? output中显示Filesys doesn\'t exist, no app started,应如何解决?… 查看全部问答> |
|
PDA端的现有程序是用C#写的基于CF2.0的程序, 目前PC端的程序是用RAPI的方式操纵PDA上的数据的. 但是这样PDA必须用线跟PC连接起来才能进行数据操作,因为PDA支持无线网络,所以这样就显的很麻烦, 设想是希望PDA与PC间通过类似于SOCKET之类的方式进 ...… 查看全部问答> |
|
我是专科毕业,工作两年了,一直从事C++,在mobile上做应用软件,今年27了,考研一直是我的一个必须要完成的任务,因为没有高数的基础,而且工作忙,所以北大北航这类学校不在我考虑的范围内,想考成电的软件学院或兰州大学,不知道各位觉得考兰大 ...… 查看全部问答> |
|
当我们要对一个数同时做取模和取商的操作时在 KEIL C 中这样表示 unsigned int i,j,k; i=k%15; j=k/15; 复制代码 然后察看KEIL C生成的汇编码,发现它调用了两次除法子程序,实际上应该是只需要调用一次就可以的啊。 查KEIL C 的库函数好像也没 ...… 查看全部问答> |




