单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 344|回复: 1
收起左侧

基于STM32F4ZG的HC_SR04超声波测距例程

[复制链接]
hzl3128 发表于 2018-11-16 14:54 | 显示全部楼层 |阅读模式
基于STM32F4系列单片机的超声波测距历程,利用串口显示距离(默认115200波特率)

单片机源程序如下:
  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()         //简单的延时函数
  20. {
  21.         volatile int i = 0x0FE5178;
  22.         while(i--);
  23. }

  24. //初始化LED端口,
  25. void LED_Config(void)
  26. {
  27.         //定义一个LED的GPIO信息结构体
  28.         GPIO_InitTypeDef  GPIO_InitStructure;

  29.         //1.使能(打开)RCC时钟(失能,关闭)
  30.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);                        //使能GPIOE,GPIOF时钟

  31.         //2.设置GPIO的信息结构体
  32.         //GPIOF9,F10初始化设置
  33.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9 | GPIO_Pin_10;                //LED0和LED1对应IO口
  34.         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                            //普通输出模式,
  35.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                //推挽输出,驱动LED需要电流驱动
  36.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                    //100MHz
  37.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                                    //上拉
  38.         
  39.         //3.初始化GPIO信息结构体
  40.         GPIO_Init(GPIOF, &GPIO_InitStructure);
  41.         
  42.         //如果不同组,需要另外设置和初始化
  43.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13 | GPIO_Pin_14;                //LED0和LED1对应IO口
  44.         GPIO_Init(GPIOE, &GPIO_InitStructure);
  45.         
  46.         //给LED一个初始化状态,高电平,全灭
  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.         //定义一个蜂鸣器的GPIO信息结构体
  58.         GPIO_InitTypeDef  GPIO_BEEP_InitStructure;

  59.         //1.使能(打开)RCC时钟(失能,关闭)
  60.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);                        //使能GPIOF时钟

  61.         //2.设置GPIO的信息结构体
  62.         //GPIOF8初始化设置
  63.         GPIO_BEEP_InitStructure.GPIO_Pin   = GPIO_Pin_8;                //蜂鸣器PF8对应IO口
  64.         GPIO_BEEP_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                            //普通输出模式,
  65.         GPIO_BEEP_InitStructure.GPIO_OType = GPIO_OType_PP;                                //推挽输出,驱动BEEP需要电流驱动
  66.         GPIO_BEEP_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                    //100MHz
  67.         GPIO_BEEP_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;                                    //下拉
  68.         
  69.         //3.初始化GPIO信息结构体
  70.         GPIO_Init(GPIOF, &GPIO_BEEP_InitStructure);
  71.         
  72.         //给蜂鸣器BEEP一个初始化状态,
  73.         //GPIO_SetBits(GPIOF,GPIO_Pin_8);        //高电平
  74.         //GPIO_ResetBits(GPIOF,GPIO_Pin_8);        //低电平
  75.         BEEP = 0;
  76. }

  77. //按键的初始化函数
  78. void KEY_Config(void)
  79. {
  80.         //定义一个按键的GPIO信息结构体
  81.         GPIO_InitTypeDef  GPIO_KEY_InitStructure;

  82.         //1.使能(打开)RCC时钟(失能,关闭)
  83.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);                        //使能GPIOA时钟

  84.         //2.设置GPIO的信息结构体
  85.         //GPIOA0初始化设置
  86.         GPIO_KEY_InitStructure.GPIO_Pin   = GPIO_Pin_0;                //按键KEY0对应IO口
  87.         GPIO_KEY_InitStructure.GPIO_Mode  = GPIO_Mode_IN;                            //普通输入模式
  88.         GPIO_KEY_InitStructure.GPIO_OType = GPIO_OType_PP;                                //推挽输出,需要电流驱动
  89.         GPIO_KEY_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                    //100MHz
  90.         GPIO_KEY_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                                    //上拉
  91.         
  92.         //3.初始化GPIO信息结构体
  93.         GPIO_Init(GPIOA, &GPIO_KEY_InitStructure);

  94.         //如果不同组,需要另外设置和初始化
  95.         GPIO_KEY_InitStructure.GPIO_Pin   = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;                //按键KEY1,2,3对应IO口
  96.         GPIO_Init(GPIOE, &GPIO_KEY_InitStructure);
  97. }

  98. //检测按下哪一个按键
  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函数,程序的入口,从这里开始运行
  124. int main(void)
  125. {
  126.         /***************变量的定义***************/
  127.         //int i;
  128.         u16 distance = 0;
  129.         
  130.         /***************外设函数初始化***************/
  131.         //函数的调用,LED初始化函数,PF9,PF10..PE13,PE14
  132.         LED_Config();
  133.         
  134.         //蜂鸣器的GPIO初始化,P8
  135.         BEEP_Config();
  136.         
  137.         //系统时钟初始化,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.         /***************程序循环执行语句***************/
  150.         
  151.         //程序所有外设都已经初始化完毕
  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.   /**下面是通过直接操作库函数的方式实现IO控制**/        
  163.         //死循环,程序会一直循环执行里面的语句
  164.         while(1)
  165.         {
  166.                 distance = Get_Distance();        //读取超声波模块检测到的距离,单位为毫米mm
  167.                 printf("distance = %d\r\n",distance);        //串口显示
  168.                 delay_ms(500);
  169.                 LED0=!LED0;
  170.         }
  171. }
复制代码

所有资料51hei提供下载:
实验1_超声波测距模块.rar (456.77 KB, 下载次数: 12)
回复

使用道具 举报

暮筱峰下 发表于 2019-2-12 17:40 | 显示全部楼层
谢谢楼主分享!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

快速回复 返回顶部 返回列表