基于STM32F103C8T6超声波测距HC-SR04源码及接线(已调)

[复制链接]
查看74 | 回复0 | 2020-6-5 09:16:10 | 显示全部楼层 |阅读模式
完整源码: 基于STM32F103C8T6超声波测距源码及接线(已调).7z (1.15 MB, 售价: 1 工控币)
1.png 2.png 使用KEIL 5 打开
解压文件后弹窗点击选择  Cancel
否则编译会出现错误
如果第一次弹窗没有点击取消,则重新解压。

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. 备注:以下代码非原创,只是经过修改适配成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. //超声波计数
  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计数器值
  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计数器值推算距离
  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. //测试主函数
  116. int main(void)
  117. {         
  118.          float length;
  119.          delay_init();                     //延时函数初始化         
  120.          NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  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. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则