日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于STM32F103ZET6 HC_SR04超声波测距模块

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于STM32F103ZET6 HC_SR04超声波测距模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是最后的實驗現象,改變不同的角度即可測得距離

板子 PZ6806L 超聲波模塊 HC_SR04

HC_SR04模塊講解

通過該超聲波模塊說明書,可明白供電需VCC 5V ?還需GND ?ECHO(回響信號) ?TRIG(觸發信號)

也就是說總共需要4根線,其中VCC和GND只需要接到開發板上的5V電源和GND即可

這是我的接線圖

?

?ECHO 使用的是PC3引腳,TRIG 使用的是PC2引腳

PC3和PC2只是普通的引腳,沒任何特殊性,可憑自己想法配置不同的引腳

?

從超聲波時序圖看出,若想能夠使用該模塊,

1 使用你要觸發信號拉高10us以上

?

2 接著模塊內部自己發出8個40khz脈沖,不需要管,接著模塊會輸出回響信號,而回響信號高電平的

脈沖寬度,與距離成正比

?

以上知道這些就可以正常使用,至于距離公式后面會再解釋

注意

?

接著就是代碼部分,主函數最后再介紹

HC_SR04配置函數及ECHO高電平時間

首先是頭文件

配置一個變量 time,用于存儲回響信號高電平的時間

void hc_sr04_init(void); 該函數是引腳的配置函數

float ?Get_hcsr04length(void);該函數是用來發送觸發信號,并得到回響信號的高電平時間

?

?

void hc_sr04_init(void)
{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);//打開GPIOC的時鐘

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//配置引腳2,trig觸發信號
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置為推挽輸出
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);//觸發信號,首先把它拉低,避免額外影響

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//配置引腳3,echo回響信號
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//配置為模擬輸入
GPIO_Init(GPIOC, &GPIO_InitStructure);//echo信號
GPIO_ResetBits(GPIOC,GPIO_Pin_3);//也同樣拉低
}

?

?

?

float Get_hcsr04length(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_2);
delay_us(20);
GPIO_ResetBits(GPIOC,GPIO_Pin_2); //TRIG發送觸發信號,延時10us以上就可以了

while(PCI(3)==0) //當echo一直是低電平的時候,就清空,并且關閉計時器
{
TIM_SetCounter(TIM2, 0);
TIM_Cmd(TIM2,DISABLE);
}
while(PCI(3)==1)//一旦echo被拉高了,就說明模塊傳需要的數據回來了,打開計時器
{
TIM_Cmd(TIM2,ENABLE);
}
time=TIM_GetCounter(TIM2);//當被拉高的echo再次變回低電平時,將計時器的值賦給time
return time;//返回time
}

?

計時器函數的配置

?

void TIM_Counter(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM2的時鐘

TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 71;//72MHx/72=1us,
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上計數模式
TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
TIM_Cmd(TIM2,DISABLE);//關閉,需要的時候再打開
}

?

部分主函數

?

int main(void)
{

float Distance=0;//存儲距離
delay_init(72); //配置滴答計時器
RCC_Configuration();//時鐘配置
GPIO_Configuration();//GPIO配置,只是PC0(LED0),用來提示系統正常運行
TIM_Counter();//計時器的配置
USART1_Configuration();//串口配置,
hc_sr04_init();//HC_SR04初始化配置好(即PC2,PC3的配置)


  while(1)
  {
GPIO_ResetBits(GPIOC,GPIO_Pin_0);//提示系統正常運行進該循環

?


Distance =(Get_hcsr04length()*340/2/1000);//從函數得到距離值,340是聲音的速度,除于2,是因為聲波發出到接收,是一次來回,除于1000,是將距離定為mm(毫米),該函數返回的就是之前time的值
printf("距離是%.2f\r\n",Distance);
delay_ms(1000);//延時1秒鐘,這樣不會輸出太過頻繁
  }
}

?

這是我的工程文件

?

百度網盤 ?密碼?v3y7

https://pan.baidu.com/s/1MNVf70_gnZ5aqSm6XInrMA

?

如有需要,可結合自己板子修改下代碼即可使用,歡迎交流,咱們共同進步

?

轉載于:https://www.cnblogs.com/zzlloveyty/p/10696656.html

總結

以上是生活随笔為你收集整理的基于STM32F103ZET6 HC_SR04超声波测距模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。