久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3093|回復: 2
收起左側

stm32超聲波程序 通過定時器4計數器值推算距離Hcsr04GetLength

[復制鏈接]
ID:765425 發表于 2020-12-28 15:43 | 顯示全部樓層 |閱讀模式
STM32F103C8T6超聲波程序
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"         
  4. #include "led.h"        
  5. #include "key.h"        


  6. //超聲波硬件接口定義
  7. #define HCSR04_PORT     GPIOB
  8. #define HCSR04_CLK      RCC_APB2Periph_GPIOB
  9. #define HCSR04_TRIG     GPIO_Pin_11
  10. #define HCSR04_ECHO     GPIO_Pin_10



  11. //超聲波計數
  12. u16 msHcCount = 0;

  13. //定時器4設置
  14. void hcsr04_NVIC()
  15. {
  16.         NVIC_InitTypeDef NVIC_InitStructure;
  17.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  18.                         
  19.         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;            
  20.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  21.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;         
  22.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      
  23.         NVIC_Init(&NVIC_InitStructure);
  24. }

  25. //IO口初始化 及其他初始化
  26. void Hcsr04Init()
  27. {  
  28.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   
  29.     GPIO_InitTypeDef GPIO_InitStructure;
  30.     RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
  31.    
  32.     GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;      
  33.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  35.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
  36.     GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
  37.      
  38.     GPIO_InitStructure.GPIO_Pin =   HCSR04_ECHO;     
  39.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  40.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  
  41.     GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);   
  42.      
  43.          
  44.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   
  45.      
  46.     TIM_DeInit(TIM4);
  47.     TIM_TimeBaseStructure.TIM_Period = (999);
  48.     TIM_TimeBaseStructure.TIM_Prescaler =(71);
  49.     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  50.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  51.     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);         
  52.         
  53.     TIM_ClearFlag(TIM4, TIM_FLAG_Update);  
  54.     TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);   
  55.     TIM_Cmd(TIM4,DISABLE);     
  56. }


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

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

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


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

  89. //通過定時器4計數器值推算距離
  90. float Hcsr04GetLength(void )
  91. {
  92.    u32 t = 0;
  93.    int i = 0;
  94.    float lengthTemp = 0;
  95.    float sum = 0;
  96.    while(i!=5)
  97.    {
  98.       TRIG_Send = 1;      
  99.       delay_us(20);
  100.       TRIG_Send = 0;
  101.       while(ECHO_Reci == 0);      
  102.       OpenTimerForHc();        
  103.       i = i + 1;
  104.       while(ECHO_Reci == 1);
  105.       CloseTimerForHc();        
  106.       t = GetEchoTimer();            
  107.                         lengthTemp = ((float)t*0.034/2);//cm
  108.       sum = lengthTemp + sum ;
  109.         
  110.     }
  111.     lengthTemp = sum/5.0;
  112.     return lengthTemp;
  113. }
  114.          
  115. //測試主函數
  116. int main(void)
  117. {         
  118.          float length;
  119.          delay_init();                     //延時函數初始化         
  120.          //NVIC_Configuration();          //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  121.          hcsr04_NVIC();
  122.          uart_init(9600);                 //串口初始化為9600
  123.          Hcsr04Init();
  124.          LED_Init();
  125.    
  126.   // Hcsr04Init();   
  127.         
  128.    while(1)
  129.          {                                         
  130.      length = Hcsr04GetLength();
  131.      printf("距離為:%.3fcm\n",length);
  132.                  if(length<30)
  133.                  {
  134.                                  GPIO_ResetBits(GPIOB,GPIO_Pin_0);               
  135.                  }
  136.                  else
  137.                  {
  138.                          GPIO_SetBits(GPIOB,GPIO_Pin_0);               
  139.                  }
  140.                  delay_ms(50);   
  141.         }                        
  142. }

復制代碼

全部程序51hei下載地址:
超聲波(用).7z (219.34 KB, 下載次數: 135)
回復

使用道具 舉報

ID:398975 發表于 2021-3-12 10:41 | 顯示全部樓層
網上很多不能用,謝謝樓主!
回復

使用道具 舉報

ID:208271 發表于 2021-3-20 12:50 | 顯示全部樓層
STM32F103C8T6核心板,可以直接用,程序很好,沒問題,容易移植。謝謝樓主。
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕精品一区二区三区精品 | 亚洲天堂免费在线 | 乱一性一乱一交一视频a∨ 色爱av | 国产精品美女久久久 | 国产一区二区欧美 | 日韩中文字幕 | 日本成人中文字幕在线观看 | 水蜜桃亚洲一二三四在线 | 福利久久 | 91麻豆精品一区二区三区 | 国产精品视频入口 | 国产91av视频在线观看 | 欧美国产视频一区二区 | 国产欧美日韩在线一区 | 欧美一级久久精品 | 亚洲午夜视频 | 久久精品91| 午夜一区二区三区在线观看 | 男人天堂网址 | 亚洲精品99 | 亚洲国产精品一区二区三区 | 国产99视频精品免费播放照片 | 国产精品久久久久久久久久妞妞 | 精品福利av导航 | av中文字幕在线观看 | 久久精品国产亚洲夜色av网站 | 一区二区三区视频 | 午夜影院网站 | 日韩欧美三区 | 男人av在线播放 | 国产一级在线观看 | 日韩av免费在线电影 | 免费欧美 | 男女在线网站 | 亚洲精品68久久久一区 | 中文字幕日韩一区 | 91免费看片| 欧美日韩高清 | 五月天激情电影 | 国产精品视频一区二区三区四区国 | 国产一区二区精品在线观看 |