基于STM32F4系列單片機的超聲波測距歷程,利用串口顯示距離(默認115200波特率)
單片機源程序如下:
- #include "stm32f4xx.h"
- #include "Systick.h"
- #include "sys.h"
- #include "usart.h"
- #include "hc_sr04.h"
- //LED
- //宏替換PFout(9)成LED0
- #define LED0 PFout(9)
- #define LED1 PFout(10)
- #define LED2 PEout(13)
- #define LED3 PEout(14)
- //BEEP蜂鳴器
- #define BEEP PFout(8)
- //按鍵
- #define KEY0 PAin(0)
- #define KEY1 PEin(2)
- #define KEY2 PEin(3)
- #define KEY3 PEin(4)
- void delay_s() //簡單的延時函數
- {
- volatile int i = 0x0FE5178;
- while(i--);
- }
- //初始化LED端口,
- void LED_Config(void)
- {
- //定義一個LED的GPIO信息結構體
- GPIO_InitTypeDef GPIO_InitStructure;
- //1.使能(打開)RCC時鐘(失能,關閉)
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE); //使能GPIOE,GPIOF時鐘
- //2.設置GPIO的信息結構體
- //GPIOF9,F10初始化設置
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //LED0和LED1對應IO口
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通輸出模式,
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,驅動LED需要電流驅動
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
-
- //3.初始化GPIO信息結構體
- GPIO_Init(GPIOF, &GPIO_InitStructure);
-
- //如果不同組,需要另外設置和初始化
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; //LED0和LED1對應IO口
- GPIO_Init(GPIOE, &GPIO_InitStructure);
-
- //給LED一個初始化狀態,高電平,全滅
- // GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);
- // GPIO_SetBits(GPIOE,GPIO_Pin_13 | GPIO_Pin_14);
- LED0 = 1;
- LED1 = 1;
- LED2 = 1;
- LED3 = 1;
- }
- //蜂鳴器的初始化
- void BEEP_Config(void)
- {
- //定義一個蜂鳴器的GPIO信息結構體
- GPIO_InitTypeDef GPIO_BEEP_InitStructure;
- //1.使能(打開)RCC時鐘(失能,關閉)
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能GPIOF時鐘
- //2.設置GPIO的信息結構體
- //GPIOF8初始化設置
- GPIO_BEEP_InitStructure.GPIO_Pin = GPIO_Pin_8; //蜂鳴器PF8對應IO口
- GPIO_BEEP_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通輸出模式,
- GPIO_BEEP_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,驅動BEEP需要電流驅動
- GPIO_BEEP_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
- GPIO_BEEP_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
-
- //3.初始化GPIO信息結構體
- GPIO_Init(GPIOF, &GPIO_BEEP_InitStructure);
-
- //給蜂鳴器BEEP一個初始化狀態,
- //GPIO_SetBits(GPIOF,GPIO_Pin_8); //高電平
- //GPIO_ResetBits(GPIOF,GPIO_Pin_8); //低電平
- BEEP = 0;
- }
- //按鍵的初始化函數
- void KEY_Config(void)
- {
- //定義一個按鍵的GPIO信息結構體
- GPIO_InitTypeDef GPIO_KEY_InitStructure;
- //1.使能(打開)RCC時鐘(失能,關閉)
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE); //使能GPIOA時鐘
- //2.設置GPIO的信息結構體
- //GPIOA0初始化設置
- GPIO_KEY_InitStructure.GPIO_Pin = GPIO_Pin_0; //按鍵KEY0對應IO口
- GPIO_KEY_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通輸入模式
- GPIO_KEY_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,需要電流驅動
- GPIO_KEY_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
- GPIO_KEY_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
-
- //3.初始化GPIO信息結構體
- GPIO_Init(GPIOA, &GPIO_KEY_InitStructure);
- //如果不同組,需要另外設置和初始化
- GPIO_KEY_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; //按鍵KEY1,2,3對應IO口
- GPIO_Init(GPIOE, &GPIO_KEY_InitStructure);
- }
- //檢測按下哪一個按鍵
- int Key_Scan(void)
- {
- int key_num = -1;
-
- //if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0) //按下KEY0
- if(KEY0 == 0) //按下KEY0
- {
- key_num = 0;
- }
- else if(KEY1 == 0) //按下KEY1
- {
- key_num = 1;
- }
- else if(KEY2 == 0) //按下KEY2
- {
- key_num = 2;
- }
- else if(KEY3 == 0) //按下KEY3
- {
- key_num = 3;
- }
-
- return key_num;
- }
- //main函數,程序的入口,從這里開始運行
- int main(void)
- {
- /***************變量的定義***************/
- //int i;
- u16 distance = 0;
-
- /***************外設函數初始化***************/
- //函數的調用,LED初始化函數,PF9,PF10..PE13,PE14
- LED_Config();
-
- //蜂鳴器的GPIO初始化,P8
- BEEP_Config();
-
- //系統時鐘初始化,168MHz的芯片主頻
- Systick_init(168);
-
- //按鍵的GPIO初始化,PA0,PE2.3.4
- KEY_Config();
-
- //串口的初始化
- uart_init(9600);
-
- //超聲波模塊HC_SR04初始化,TRIG:PE6,ECHO:PB6
- HC_SR04_Config();
-
- /***************程序循環執行語句***************/
-
- //程序所有外設都已經初始化完畢
- LED0=0;
- LED1=0;
- LED2=0;
- LED3=0;
- delay_ms(500);
- LED0=1;
- LED1=1;
- LED2=1;
- LED3=1;
-
- /**下面是通過直接操作庫函數的方式實現IO控制**/
- //死循環,程序會一直循環執行里面的語句
- while(1)
- {
- distance = Get_Distance(); //讀取超聲波模塊檢測到的距離,單位為毫米mm
- printf("distance = %d\r\n",distance); //串口顯示
- delay_ms(500);
- LED0=!LED0;
- }
- }
復制代碼
所有資料51hei提供下載:
實驗1_超聲波測距模塊.rar
(456.77 KB, 下載次數: 154)
2018-11-16 16:59 上傳
點擊文件名下載附件
超聲波
|