標(biāo)題:
基于STM32F4ZG的HC_SR04超聲波測(cè)距例程
[打印本頁(yè)]
作者:
hzl3128
時(shí)間:
2018-11-16 14:54
標(biāo)題:
基于STM32F4ZG的HC_SR04超聲波測(cè)距例程
基于STM32F4系列單片機(jī)的超聲波測(cè)距歷程,利用串口顯示距離(默認(rèn)115200波特率)
單片機(jī)源程序如下:
#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() //簡(jiǎn)單的延時(shí)函數(shù)
{
volatile int i = 0x0FE5178;
while(i--);
}
//初始化LED端口,
void LED_Config(void)
{
//定義一個(gè)LED的GPIO信息結(jié)構(gòu)體
GPIO_InitTypeDef GPIO_InitStructure;
//1.使能(打開(kāi))RCC時(shí)鐘(失能,關(guān)閉)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE); //使能GPIOE,GPIOF時(shí)鐘
//2.設(shè)置GPIO的信息結(jié)構(gòu)體
//GPIOF9,F10初始化設(shè)置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //LED0和LED1對(duì)應(yīng)IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通輸出模式,
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,驅(qū)動(dòng)LED需要電流驅(qū)動(dòng)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
//3.初始化GPIO信息結(jié)構(gòu)體
GPIO_Init(GPIOF, &GPIO_InitStructure);
//如果不同組,需要另外設(shè)置和初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; //LED0和LED1對(duì)應(yīng)IO口
GPIO_Init(GPIOE, &GPIO_InitStructure);
//給LED一個(gè)初始化狀態(tài),高電平,全滅
// 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)
{
//定義一個(gè)蜂鳴器的GPIO信息結(jié)構(gòu)體
GPIO_InitTypeDef GPIO_BEEP_InitStructure;
//1.使能(打開(kāi))RCC時(shí)鐘(失能,關(guān)閉)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能GPIOF時(shí)鐘
//2.設(shè)置GPIO的信息結(jié)構(gòu)體
//GPIOF8初始化設(shè)置
GPIO_BEEP_InitStructure.GPIO_Pin = GPIO_Pin_8; //蜂鳴器PF8對(duì)應(yīng)IO口
GPIO_BEEP_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通輸出模式,
GPIO_BEEP_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,驅(qū)動(dòng)BEEP需要電流驅(qū)動(dòng)
GPIO_BEEP_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_BEEP_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
//3.初始化GPIO信息結(jié)構(gòu)體
GPIO_Init(GPIOF, &GPIO_BEEP_InitStructure);
//給蜂鳴器BEEP一個(gè)初始化狀態(tài),
//GPIO_SetBits(GPIOF,GPIO_Pin_8); //高電平
//GPIO_ResetBits(GPIOF,GPIO_Pin_8); //低電平
BEEP = 0;
}
//按鍵的初始化函數(shù)
void KEY_Config(void)
{
//定義一個(gè)按鍵的GPIO信息結(jié)構(gòu)體
GPIO_InitTypeDef GPIO_KEY_InitStructure;
//1.使能(打開(kāi))RCC時(shí)鐘(失能,關(guān)閉)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE); //使能GPIOA時(shí)鐘
//2.設(shè)置GPIO的信息結(jié)構(gòu)體
//GPIOA0初始化設(shè)置
GPIO_KEY_InitStructure.GPIO_Pin = GPIO_Pin_0; //按鍵KEY0對(duì)應(yīng)IO口
GPIO_KEY_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通輸入模式
GPIO_KEY_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,需要電流驅(qū)動(dòng)
GPIO_KEY_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_KEY_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
//3.初始化GPIO信息結(jié)構(gòu)體
GPIO_Init(GPIOA, &GPIO_KEY_InitStructure);
//如果不同組,需要另外設(shè)置和初始化
GPIO_KEY_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; //按鍵KEY1,2,3對(duì)應(yīng)IO口
GPIO_Init(GPIOE, &GPIO_KEY_InitStructure);
}
//檢測(cè)按下哪一個(gè)按鍵
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函數(shù),程序的入口,從這里開(kāi)始運(yùn)行
int main(void)
{
/***************變量的定義***************/
//int i;
u16 distance = 0;
/***************外設(shè)函數(shù)初始化***************/
//函數(shù)的調(diào)用,LED初始化函數(shù),PF9,PF10..PE13,PE14
LED_Config();
//蜂鳴器的GPIO初始化,P8
BEEP_Config();
//系統(tǒng)時(shí)鐘初始化,168MHz的芯片主頻
Systick_init(168);
//按鍵的GPIO初始化,PA0,PE2.3.4
KEY_Config();
//串口的初始化
uart_init(9600);
//超聲波模塊HC_SR04初始化,TRIG:PE6,ECHO:PB6
HC_SR04_Config();
/***************程序循環(huán)執(zhí)行語(yǔ)句***************/
//程序所有外設(shè)都已經(jīng)初始化完畢
LED0=0;
LED1=0;
LED2=0;
LED3=0;
delay_ms(500);
LED0=1;
LED1=1;
LED2=1;
LED3=1;
/**下面是通過(guò)直接操作庫(kù)函數(shù)的方式實(shí)現(xiàn)IO控制**/
//死循環(huán),程序會(huì)一直循環(huán)執(zhí)行里面的語(yǔ)句
while(1)
{
distance = Get_Distance(); //讀取超聲波模塊檢測(cè)到的距離,單位為毫米mm
printf("distance = %d\r\n",distance); //串口顯示
delay_ms(500);
LED0=!LED0;
}
}
復(fù)制代碼
所有資料51hei提供下載:
實(shí)驗(yàn)1_超聲波測(cè)距模塊.rar
(456.77 KB, 下載次數(shù): 154)
2018-11-16 16:59 上傳
點(diǎn)擊文件名下載附件
超聲波
下載積分: 黑幣 -5
作者:
暮筱峰下
時(shí)間:
2019-2-12 17:40
謝謝樓主分享!
作者:
高大尚
時(shí)間:
2019-3-10 21:08
不得行啊
作者:
高大尚
時(shí)間:
2019-3-10 21:08
【串口打印的值是0】
作者:
hmjb888
時(shí)間:
2019-8-6 16:47
謝謝樓主分享
作者:
todaljy
時(shí)間:
2019-8-7 15:00
感謝分享,非常棒的學(xué)習(xí)資料!
作者:
todaljy
時(shí)間:
2019-8-7 15:01
感謝分享,非常棒的學(xué)習(xí)資料!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1