找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1500|回复: 0
收起左侧

stm32f103超声波驱动程序

[复制链接]
ID:831137 发表于 2021-6-27 20:37 | 显示全部楼层 |阅读模式
  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>100)
  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. }
复制代码

代码: 超声波(用).7z (219.91 KB, 下载次数: 35)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表