国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

基于STM32F103C8T6超聲波測距HC-SR04源碼及接線(已調(diào))

[復制鏈接]
樓主
路漫漫 發(fā)表于 2020-6-5 09:16:10 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
完整源碼: 基于STM32F103C8T6超聲波測距源碼及接線(已調(diào)).7z (1.15 MB, 售價: 2 E幣)
基于STM32F103C8T6超聲波測距HC-SR04源碼及接線(已調(diào)) 1.png 基于STM32F103C8T6超聲波測距HC-SR04源碼及接線(已調(diào)) 2.png 使用KEIL 5 打開
解壓文件后彈窗點擊選擇  Cancel
否則編譯會出現(xiàn)錯誤
如果第一次彈窗沒有點擊取消,則重新解壓。

基于STM32F103C8T6超聲波測距HC-SR04源碼及接線(已調(diào)) 3.png


部分代碼:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"         
  4. #include "led.h"        
  5. #include "key.h"        
  6. /***************************************************
  7. 硬件連接
  8. 串口1:RX PA10  TX PA9
  9. 超聲波:Trig PB11    ECHG PB10
  10. 備注:以下代碼非原創(chuàng),只是經(jīng)過修改適配成STM32F103C8T6
  11. 若侵權,請告知。

  12. ***************************************************/

  13. //超聲波硬件接口定義
  14. #define HCSR04_PORT     GPIOB
  15. #define HCSR04_CLK      RCC_APB2Periph_GPIOB
  16. #define HCSR04_TRIG     GPIO_Pin_15
  17. #define HCSR04_ECHO     GPIO_Pin_14



  18. //超聲波計數(shù)
  19. u16 msHcCount = 0;

  20. //定時器4設置
  21. void hcsr04_NVIC()
  22. {
  23.         NVIC_InitTypeDef NVIC_InitStructure;
  24.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  25.                         
  26.         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;            
  27.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  28.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         
  29.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      
  30.         NVIC_Init(&NVIC_InitStructure);
  31. }

  32. //IO口初始化 及其他初始化
  33. void Hcsr04Init()
  34. {  
  35.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   
  36.     GPIO_InitTypeDef GPIO_InitStructure;
  37.     RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);

  38.     GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;      
  39.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  40.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  41.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
  42.     GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);

  43.     GPIO_InitStructure.GPIO_Pin =   HCSR04_ECHO;     
  44.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  45.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  
  46.     GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);   


  47.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   

  48.     TIM_DeInit(TIM2);
  49.     TIM_TimeBaseStructure.TIM_Period = (1000-1);
  50.     TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
  51.     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  52.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  53.     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);         

  54.     TIM_ClearFlag(TIM4, TIM_FLAG_Update);  
  55.     TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);   
  56.     hcsr04_NVIC();
  57.     TIM_Cmd(TIM4,DISABLE);     
  58. }


  59. //打開定時器4
  60. static void OpenTimerForHc()  
  61. {
  62.    TIM_SetCounter(TIM4,0);
  63.    msHcCount = 0;
  64.    TIM_Cmd(TIM4, ENABLE);
  65. }

  66. //關閉定時器4
  67. static void CloseTimerForHc()   
  68. {
  69.    TIM_Cmd(TIM4, DISABLE);
  70. }

  71. //定時器4終中斷
  72. void TIM4_IRQHandler(void)  
  73. {
  74.    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  
  75.    {
  76.        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );
  77.        msHcCount++;
  78.    }
  79. }


  80. //獲取定時器4計數(shù)器值
  81. u32 GetEchoTimer(void)
  82. {
  83.    u32 t = 0;
  84.    t = msHcCount*1000;
  85.    t += TIM_GetCounter(TIM4);
  86.    TIM4->CNT = 0;  
  87.    delay_ms(50);
  88.    return t;
  89. }

  90. //通過定時器4計數(shù)器值推算距離
  91. float Hcsr04GetLength(void )
  92. {
  93.    u32 t = 0;
  94.    int i = 0;
  95.    float lengthTemp = 0;
  96.    float sum = 0;
  97.    while(i!=5)
  98.    {
  99.       TRIG_Send = 1;      
  100.       delay_us(20);
  101.       TRIG_Send = 0;
  102.       while(ECHO_Reci == 0);      
  103.       OpenTimerForHc();        
  104.       i = i + 1;
  105.       while(ECHO_Reci == 1);
  106.       CloseTimerForHc();        
  107.       t = GetEchoTimer();        
  108.       lengthTemp = ((float)t/58.0);//cm
  109.       sum = lengthTemp + sum ;

  110.     }
  111.     lengthTemp = sum/5.0;
  112.     return lengthTemp;
  113. }
  114.          
  115. //測試主函數(shù)
  116. int main(void)
  117. {         
  118.          float length;
  119.          delay_init();                     //延時函數(shù)初始化         
  120.          NVIC_Configuration();          //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
  121.          uart_init(9600);                 //串口初始化為9600
  122.          Hcsr04Init();
  123.          printf("串口測試\r\n");  

  124.    Hcsr04Init();   
  125.    printf("超聲波初始化成功!\n");
  126.         
  127.    while(1)
  128.          {                 
  129.      length = Hcsr04GetLength();
  130.      printf("距離為:%.3fcm\n",length);
  131.                  delay_ms(1000);   
  132.         }                        
  133. }
復制代碼

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

手機版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 03:09

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表