找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6015|回復(fù): 6
收起左側(cè)

基于STM32F4ZG的HC_SR04超聲波測(cè)距例程

[復(fù)制鏈接]
ID:427725 發(fā)表于 2018-11-16 14:54 | 顯示全部樓層 |閱讀模式
基于STM32F4系列單片機(jī)的超聲波測(cè)距歷程,利用串口顯示距離(默認(rèn)115200波特率)

單片機(jī)源程序如下:
  1. #include "stm32f4xx.h"

  2. #include "Systick.h"
  3. #include "sys.h"
  4. #include "usart.h"

  5. #include "hc_sr04.h"

  6. //LED
  7. //宏替換PFout(9)成LED0
  8. #define LED0 PFout(9)
  9. #define LED1 PFout(10)
  10. #define LED2 PEout(13)
  11. #define LED3 PEout(14)
  12. //BEEP蜂鳴器
  13. #define BEEP PFout(8)
  14. //按鍵
  15. #define KEY0 PAin(0)
  16. #define KEY1 PEin(2)
  17. #define KEY2 PEin(3)
  18. #define KEY3 PEin(4)

  19. void delay_s()         //簡(jiǎn)單的延時(shí)函數(shù)
  20. {
  21.         volatile int i = 0x0FE5178;
  22.         while(i--);
  23. }

  24. //初始化LED端口,
  25. void LED_Config(void)
  26. {
  27.         //定義一個(gè)LED的GPIO信息結(jié)構(gòu)體
  28.         GPIO_InitTypeDef  GPIO_InitStructure;

  29.         //1.使能(打開(kāi))RCC時(shí)鐘(失能,關(guān)閉)
  30.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);                        //使能GPIOE,GPIOF時(shí)鐘

  31.         //2.設(shè)置GPIO的信息結(jié)構(gòu)體
  32.         //GPIOF9,F10初始化設(shè)置
  33.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9 | GPIO_Pin_10;                //LED0和LED1對(duì)應(yīng)IO口
  34.         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                            //普通輸出模式,
  35.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                //推挽輸出,驅(qū)動(dòng)LED需要電流驅(qū)動(dòng)
  36.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                    //100MHz
  37.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                                    //上拉
  38.         
  39.         //3.初始化GPIO信息結(jié)構(gòu)體
  40.         GPIO_Init(GPIOF, &GPIO_InitStructure);
  41.         
  42.         //如果不同組,需要另外設(shè)置和初始化
  43.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13 | GPIO_Pin_14;                //LED0和LED1對(duì)應(yīng)IO口
  44.         GPIO_Init(GPIOE, &GPIO_InitStructure);
  45.         
  46.         //給LED一個(gè)初始化狀態(tài),高電平,全滅
  47. //        GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);
  48. //        GPIO_SetBits(GPIOE,GPIO_Pin_13 | GPIO_Pin_14);
  49.         LED0 = 1;
  50.         LED1 = 1;
  51.         LED2 = 1;
  52.         LED3 = 1;
  53. }

  54. //蜂鳴器的初始化
  55. void BEEP_Config(void)
  56. {
  57.         //定義一個(gè)蜂鳴器的GPIO信息結(jié)構(gòu)體
  58.         GPIO_InitTypeDef  GPIO_BEEP_InitStructure;

  59.         //1.使能(打開(kāi))RCC時(shí)鐘(失能,關(guān)閉)
  60.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);                        //使能GPIOF時(shí)鐘

  61.         //2.設(shè)置GPIO的信息結(jié)構(gòu)體
  62.         //GPIOF8初始化設(shè)置
  63.         GPIO_BEEP_InitStructure.GPIO_Pin   = GPIO_Pin_8;                //蜂鳴器PF8對(duì)應(yīng)IO口
  64.         GPIO_BEEP_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                            //普通輸出模式,
  65.         GPIO_BEEP_InitStructure.GPIO_OType = GPIO_OType_PP;                                //推挽輸出,驅(qū)動(dòng)BEEP需要電流驅(qū)動(dòng)
  66.         GPIO_BEEP_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                    //100MHz
  67.         GPIO_BEEP_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;                                    //下拉
  68.         
  69.         //3.初始化GPIO信息結(jié)構(gòu)體
  70.         GPIO_Init(GPIOF, &GPIO_BEEP_InitStructure);
  71.         
  72.         //給蜂鳴器BEEP一個(gè)初始化狀態(tài),
  73.         //GPIO_SetBits(GPIOF,GPIO_Pin_8);        //高電平
  74.         //GPIO_ResetBits(GPIOF,GPIO_Pin_8);        //低電平
  75.         BEEP = 0;
  76. }

  77. //按鍵的初始化函數(shù)
  78. void KEY_Config(void)
  79. {
  80.         //定義一個(gè)按鍵的GPIO信息結(jié)構(gòu)體
  81.         GPIO_InitTypeDef  GPIO_KEY_InitStructure;

  82.         //1.使能(打開(kāi))RCC時(shí)鐘(失能,關(guān)閉)
  83.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);                        //使能GPIOA時(shí)鐘

  84.         //2.設(shè)置GPIO的信息結(jié)構(gòu)體
  85.         //GPIOA0初始化設(shè)置
  86.         GPIO_KEY_InitStructure.GPIO_Pin   = GPIO_Pin_0;                //按鍵KEY0對(duì)應(yīng)IO口
  87.         GPIO_KEY_InitStructure.GPIO_Mode  = GPIO_Mode_IN;                            //普通輸入模式
  88.         GPIO_KEY_InitStructure.GPIO_OType = GPIO_OType_PP;                                //推挽輸出,需要電流驅(qū)動(dòng)
  89.         GPIO_KEY_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                    //100MHz
  90.         GPIO_KEY_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                                    //上拉
  91.         
  92.         //3.初始化GPIO信息結(jié)構(gòu)體
  93.         GPIO_Init(GPIOA, &GPIO_KEY_InitStructure);

  94.         //如果不同組,需要另外設(shè)置和初始化
  95.         GPIO_KEY_InitStructure.GPIO_Pin   = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;                //按鍵KEY1,2,3對(duì)應(yīng)IO口
  96.         GPIO_Init(GPIOE, &GPIO_KEY_InitStructure);
  97. }

  98. //檢測(cè)按下哪一個(gè)按鍵
  99. int Key_Scan(void)
  100. {
  101.         int key_num = -1;
  102.         
  103.         //if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0)        //按下KEY0
  104.         if(KEY0 == 0)        //按下KEY0
  105.         {
  106.                 key_num = 0;
  107.         }
  108.         else if(KEY1 == 0)        //按下KEY1
  109.         {
  110.                 key_num = 1;
  111.         }
  112.         else if(KEY2 == 0)        //按下KEY2
  113.         {
  114.                 key_num = 2;
  115.         }
  116.         else if(KEY3 == 0)        //按下KEY3
  117.         {
  118.                 key_num = 3;
  119.         }
  120.         
  121.         return key_num;
  122. }

  123. //main函數(shù),程序的入口,從這里開(kāi)始運(yùn)行
  124. int main(void)
  125. {
  126.         /***************變量的定義***************/
  127.         //int i;
  128.         u16 distance = 0;
  129.         
  130.         /***************外設(shè)函數(shù)初始化***************/
  131.         //函數(shù)的調(diào)用,LED初始化函數(shù),PF9,PF10..PE13,PE14
  132.         LED_Config();
  133.         
  134.         //蜂鳴器的GPIO初始化,P8
  135.         BEEP_Config();
  136.         
  137.         //系統(tǒng)時(shí)鐘初始化,168MHz的芯片主頻
  138.         Systick_init(168);
  139.         
  140.         //按鍵的GPIO初始化,PA0,PE2.3.4
  141.         KEY_Config();
  142.         
  143.         //串口的初始化
  144.         uart_init(9600);
  145.         
  146.         //超聲波模塊HC_SR04初始化,TRIG:PE6,ECHO:PB6
  147.         HC_SR04_Config();
  148.         
  149.         /***************程序循環(huán)執(zhí)行語(yǔ)句***************/
  150.         
  151.         //程序所有外設(shè)都已經(jīng)初始化完畢
  152.         LED0=0;
  153.         LED1=0;
  154.         LED2=0;
  155.         LED3=0;
  156.         delay_ms(500);
  157.         LED0=1;
  158.         LED1=1;
  159.         LED2=1;
  160.         LED3=1;
  161.         
  162.   /**下面是通過(guò)直接操作庫(kù)函數(shù)的方式實(shí)現(xiàn)IO控制**/        
  163.         //死循環(huán),程序會(huì)一直循環(huán)執(zhí)行里面的語(yǔ)句
  164.         while(1)
  165.         {
  166.                 distance = Get_Distance();        //讀取超聲波模塊檢測(cè)到的距離,單位為毫米mm
  167.                 printf("distance = %d\r\n",distance);        //串口顯示
  168.                 delay_ms(500);
  169.                 LED0=!LED0;
  170.         }
  171. }
復(fù)制代碼

所有資料51hei提供下載:
實(shí)驗(yàn)1_超聲波測(cè)距模塊.rar (456.77 KB, 下載次數(shù): 154)


回復(fù)

使用道具 舉報(bào)

ID:241242 發(fā)表于 2019-8-7 15:01 | 顯示全部樓層
感謝分享,非常棒的學(xué)習(xí)資料!
回復(fù)

使用道具 舉報(bào)

ID:241242 發(fā)表于 2019-8-7 15:00 | 顯示全部樓層
感謝分享,非常棒的學(xué)習(xí)資料!
回復(fù)

使用道具 舉報(bào)

ID:587157 發(fā)表于 2019-8-6 16:47 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:401257 發(fā)表于 2019-3-10 21:08 | 顯示全部樓層
【串口打印的值是0】
回復(fù)

使用道具 舉報(bào)

ID:401257 發(fā)表于 2019-3-10 21:08 | 顯示全部樓層
不得行啊
回復(fù)

使用道具 舉報(bào)

ID:298272 發(fā)表于 2019-2-12 17:40 | 顯示全部樓層
謝謝樓主分享。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表