基于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)
|