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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2086|回復: 1
打印 上一主題 下一主題
收起左側

stm32驅動HCRS04超聲波測距模塊,分享一下我的驅動程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:405345 發表于 2019-4-17 21:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "RCWL.h"
   
#define RCWL1601_PORT GPIOB  
#define RCWL16014_CLK RCC_APB2Periph_GPIOB  
#define RCWL1601_TRIG GPIO_Pin_5  
#define RCWL1601_ECHO GPIO_Pin_6  
#define RCC_APB1Periph_TIM  RCC_APB1Periph_TIM2
#define RCTW_TIM TIM2
#define RCTW_IRQn  TIM2_IRQn
#define TRIG_Send PBout(5)   
#define ECHO_Reci PBin(6)  

  
u16 msRcCount = 0; //毫秒計數  
void RCWL1601_NVIC(void);  
  
void  RCWL1601_Init()  
{   
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure_RCWL;     //生成用于定時器設置的結構體  
    GPIO_InitTypeDef GPIO_InitStructure_RCWL;  
    RCC_APB2PeriphClockCmd(RCWL16014_CLK,ENABLE);  
      
        // IO初始化  
    GPIO_InitStructure_RCWL.GPIO_Pin = RCWL1601_TRIG;       //發送電平引腳  
    GPIO_InitStructure_RCWL.GPIO_Speed = GPIO_Speed_50MHz;  
    GPIO_InitStructure_RCWL.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出  
    GPIO_Init(RCWL1601_PORT,&GPIO_InitStructure_RCWL);  
    GPIO_ResetBits(RCWL1601_PORT,RCWL1601_TRIG);  
      
    GPIO_InitStructure_RCWL.GPIO_Pin = RCWL1601_ECHO;     //返回電平引腳  
    GPIO_InitStructure_RCWL.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入  
    GPIO_Init(RCWL1601_PORT,&GPIO_InitStructure_RCWL);   
    GPIO_ResetBits(RCWL1601_PORT,RCWL1601_ECHO);      
      
            //定時器初始化使用基本定時器TIM6  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM,ENABLE);   //使能對應RCC時鐘  
        //配置定時器基礎結構體  
    TIM_DeInit(RCTW_TIM);  
    TIM_TimeBaseStructure_RCWL.TIM_Period =(1000-1); //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的計數到1000為1ms  
    TIM_TimeBaseStructure_RCWL.TIM_Prescaler =(72-1); //設置用來作為TIMx時鐘頻率除數的預分頻值1M的計數頻率1US計數  
    TIM_TimeBaseStructure_RCWL.TIM_ClockDivision = TIM_CKD_DIV1; //不分頻  
    TIM_TimeBaseStructure_RCWL.TIM_CounterMode = TIM_CounterMode_Up;  // TIM向上計數模式  
    TIM_TimeBaseInit(RCTW_TIM,&TIM_TimeBaseStructure_RCWL); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMX的時間基數單位         
         
    TIM_ClearFlag(RCTW_TIM,TIM_FLAG_Update);   //清除更新中斷,免得一打開中斷立即產生中斷  
    TIM_ITConfig(RCTW_TIM,TIM_IT_Update,ENABLE);    //打開定時器更新中斷  
    RCWL1601_NVIC();  
    TIM_Cmd(RCTW_TIM,DISABLE);      
}  
  
  
//提示:靜態函數的作用域僅限于定義它的源文件內,所以不需要在頭文件里聲明  
static void  OpenTimerForHc()         //打開定時器   
{  
        TIM_SetCounter(RCTW_TIM,0); //清除計數  
        msRcCount = 0;  
        TIM_Cmd(RCTW_TIM,ENABLE);  //使能TIMX外設  
}  
   
static void  CloseTimerForHc()        //關閉定時器   
{  
     TIM_Cmd(RCTW_TIM,DISABLE);  //使能TIMX外設  
}  
   
   
// NVIC配置  
void RCWL1601_NVIC()  
{  
    NVIC_InitTypeDef NVIC_InitStructure;  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
      
    NVIC_InitStructure.NVIC_IRQChannel = RCTW_IRQn;             //選擇串口1個中斷  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //搶占式中斷優先級設置為1  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //響應式中斷優先級設置為1  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能中斷  
    NVIC_Init(&NVIC_InitStructure);  
}  
  
  
//定時器6中斷服務程序  
void  TIM2_IRQHandler(void)    // TIM3中斷  
{  
        if(TIM_GetITStatus(RCTW_TIM,TIM_IT_Update)!= RESET)   //檢查TIM3更新中斷發生與否  
        {  
                TIM_ClearITPendingBit(RCTW_TIM,TIM_IT_Update);  //清除TIMX更新中斷標志   
                msRcCount++;  
        }  
}  
   
  
//獲取定時器時間  
u32 GetEchoTimer(void)  
{  
        u32 t = 0;  
        t= msRcCount*1000; //得到MS  
        t+= TIM_GetCounter(RCTW_TIM); //得到us
        RCTW_TIM-> CNT = 0;  //將TIM2計數寄存器的計數值清零  
        Delay_Ms(50);  
        return t;  
}  
   
  
//一次獲取超聲波測距數據兩次測距之間需要相隔一段時間,隔斷回響信號  
//為了消除余震的影響,取五次數據的平均值進行加權濾波。  
float   RCWL1601GetLength(void)  
{  
        u32 t = 0;  
        int  i = 0;  
        float  lengthTemp = 0;  
        float  sum = 0;  
        while(i!=5)  
        {  
        TRIG_Send = 1;      //發送口高電平輸出  
        Delay_Us(20);  
        TRIG_Send = 0;  
        while (ECHO_Reci==0);      //等待接收口高電平輸出  
            OpenTimerForHc();        //打開定時器  
        i = i + 1;  
        while (ECHO_Reci==1);  
            CloseTimerForHc();        //關閉定時器  
        t = GetEchoTimer();        //獲取時間,分辨率為1US  
        lengthTemp =((float )t /58.0); //厘米  
        sum = lengthTemp + sum;  
         
    }  
        lengthTemp = sum / 5.0;  
        return lengthTemp;  
}  
  
  
/*
函數名稱:Delay_Ms_Ms
**功能描述:延時1MS(可通過仿真來判斷他的準確度)           
**參數描述:time(ms)注意時間<65535
*/  
void  Delay_Ms(uint16_t time)   //延時函數  
{   
    uint16_t i,j;  
    for (i = 0; i <time; i ++)  
        for (j = 0; j <10260; j ++);  
}  
/* :::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::
**函數名稱:Delay_Ms_Us
**功能描述:延時1us(可通過仿真來判斷他的準確度)
**參數描述:time(us)注意時間<65535                 
:::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::: */  
void  Delay_Us(uint16_t time)   //延時函數  
{   
    uint16_t i,j;  
    for (i = 0; i <time; i ++)  
        for (j = 0; j <9; j ++);  
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2019-4-17 21:26 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕亚洲欧美日韩在线不卡 | 亚洲欧美在线一区 | 国产成人99久久亚洲综合精品 | 亚洲欧美精品国产一级在线 | 国产精品国产a级 | 成人午夜激情 | 97久久精品午夜一区二区 | 亚洲国产高清在线观看 | 综合久久久 | 国产中的精品av涩差av | 99热最新网址 | 日韩欧美三区 | 黄色av网站在线观看 | 毛片在线视频 | 日韩欧美精品 | 欧美男人天堂 | 精品三区 | 日韩视频在线播放 | 久久综合av| 麻豆久久久久久久久久 | 亚洲国产精品久久久久 | 欧洲亚洲视频 | 综合自拍 | 一区在线播放 | 亚洲二区视频 | 中文字幕专区 | 99国产精品视频免费观看一公开 | 精品国产乱码久久久久久图片 | 老司机免费视频 | 国产高清无av久久 | 久久与欧美 | 亚洲精品久久区二区三区蜜桃臀 | 日韩成人精品 | 播放一级毛片 | 成人在线视频网 | www免费视频 | 91中文字幕在线 | 亚洲国产精品久久久久 | 日韩在线小视频 | 亚洲视频免费在线看 | 久久精品免费 |