本文练习硬件使用STM32F103C8芯片开发板,软件使用Keil5-5.23版本安装对应Keil4兼容包,使用Keil4标准库函数开发,练习目的为掌握STM32单片机操作方法,最终独立完成相关项目,为巩固学习并分享学习经验现分享如下:

文章目录

  • 蜂鸣器相关操作
    • 1.1 相关函数定义
    • 1.2 蜂鸣器驱动
    • 1.3 MIDI音乐播放程序

蜂鸣器相关操作

1.1 相关函数定义

  1. delay.h

    #ifndef __DELAY_H
    #define __DELAY_H
    #include "sys.h"void delay_s(u16 s);
    void delay_ms(u16 ms);
    void delay_us(u32 us);#endif
    
  2. delay.c
    #include "delay.h"
    #define AHB_INPUT  72  //请按RCC中设置的AHB时钟频率填写到这里(单位MHz)void delay_us(u32 uS){ //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)    SysTick->LOAD=AHB_INPUT*uS;      //重装计数初值(当主频是72MHz,72次为1微秒)SysTick->VAL=0x00;        //清空定时器的计数器SysTick->CTRL=0x00000005;//时钟源HCLK,打开定时器while(!(SysTick->CTRL&0x00010000)); //等待计数到0SysTick->CTRL=0x00000004;//关闭定时器
    }void delay_ms(u16 ms){ //mS毫秒级延时程序(参考值即是延时数,最大值65535)               while( ms-- != 0){delay_us(1000);    //调用1000微秒的延时}
    }void delay_s(u16 s){ //S秒级延时程序(参考值即是延时数,最大值65535)               while( s-- != 0){delay_ms(1000); //调用1000毫秒的延时
    }
    }
    
  3. buzzer.h
    #ifndef __BUZZER_H
    #define __BUZZER_H
    #include "sys.h"
    #define BUZZERPORT  GPIOB   //定义IO接口
    #define BUZZER  GPIO_Pin_5  //定义IO接口void BUZZER_Init(void);//初始化
    void BUZZER_BEEP1(void);//响一声
    void MIDI_PLAY(void);
    #endif
    
  4. buzzer.c
     #include "buzzer.h"#include "delay.h"void BUZZER_Init(void){ //蜂鸣器的接口初始化GPIO_InitTypeDef  GPIO_InitStructure;    GPIO_InitStructure.GPIO_Pin = BUZZER; //选择端口号                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    GPIO_Init(BUZZERPORT, &GPIO_InitStructure);   GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1      }void BUZZER_BEEP1(void){ //蜂鸣器响一声u16 i;for(i=0;i<200;i++){GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0delay_us(500); //延时     GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1delay_us(500); //延时       }}uc16 music1[78]={ //音乐1的数据表(奇数是音调,偶数是长度)330,750,440,375,494,375,523,750,587,375,659,375,587,750,494,375,392,375,440,1500,330,750,440,375,494,375,523,750,587,375,659,375,587,750,494,375,392,375,784,1500,659,750,698,375,784,375,880,750,784,375,698,375,659,750,587,750,659,750,523,375,494,375,440,750,440,375,494,375,523,750,523,750,494,750,392,750,440,3000};void MIDI_PLAY(void){ //MIDI音乐u16 i,e;for(i=0;i<39;i++){for(e=0;e<music1[i*2]*music1[i*2+1]/1000;e++){GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0delay_us(500000/music1[i*2]); //延时        GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1delay_us(500000/music1[i*2]); //延时    }   }}
    

1.2 蜂鸣器驱动

  1. 初始化,按键蜂鸣音

    1. 初始化时钟,LED,按键

    2. 初始化蜂鸣器
      BUZZER_Init
      void BUZZER_Init(void)
      功能:
      蜂鸣器接口初始化
      参数:

      返回值:

      void BUZZER_Init(void){ //蜂鸣器的接口初始化GPIO_InitTypeDef  GPIO_InitStructure;    GPIO_InitStructure.GPIO_Pin = BUZZER; //选择端口号                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    GPIO_Init(BUZZERPORT, &GPIO_InitStructure);   GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1
      }
      
    3. 蜂鸣器以1KHz鸣响一声
      BUZZER_BEEP1
      void BUZZER_BEEP1(void)
      功能:
      蜂鸣器响一声
      参数:

      返回值:

      void BUZZER_BEEP1(void){ //蜂鸣器响一声u16 i;for(i=0;i<200;i++){//可以调整鸣响时长GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0delay_us(500); //可以调整频率GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1delay_us(500); //可以调整频率     }
      }
      
    4. FLASH写入LED端口状态时注意转换,确保LED以外端口状态不变

      GPIO_Write(LEDPORT,a|0xfffc&GPIO_ReadOutputData(LEDPORT));
      

      GPIO_ReadOutputData
      u16 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
      功能:
      读取指定的 GPIO 端口输出
      参数:
      GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设
      返回值:
      GPIO 输出数据端口值

    5. 相关概念

      1. 蜂鸣器种类

        1. 有源蜂鸣器:

          1. 内置频率发生电路
          2. 通电就能发声
          3. 声音频率固定
          4. 成本较高
        2. 无源蜂鸣器:
          1. 无内置频率发生电路
          2. 需要外部给与频率发声
          3. 声音频率可调
          4. 成本低
      2. 频率周期
        一个低电平与一个高电平组成一个频率周期,发出1KHz声音,每秒1000个周期,每个周期1000us
      3. 无源蜂鸣器工作原理

      低电平下PNP三极管导通,给出频率后蜂鸣器工作,单纯低电平导通并不会使蜂鸣器发声而长时间导通会使其内部线圈发热损坏,所以蜂鸣器要以高电平结束,高电平下三极管C端E端断开,蜂鸣器断电

1.3 MIDI音乐播放程序

  1. MIDI音乐播放程序

    1. 初始化时钟,LED,按键,蜂鸣器
    2. 创建数组保存音符的频率(奇数位)与长度(偶数位)
      uc16 music1[78]={ //音乐1的数据表(偶数位是频率,奇数位是长度)
      330,750,
      440,375,
      494,375,
      523,750,
      587,375,
      659,375,
      587,750,
      494,375,
      392,375,
      440,1500,
      330,750,
      440,375,
      494,375,
      523,750,
      587,375,
      659,375,
      587,750,
      494,375,
      392,375,
      784,1500,
      659,750,
      698,375,
      784,375,
      880,750,
      784,375,
      698,375,
      659,750,
      587,750,
      659,750,
      523,375,
      494,375,
      440,750,
      440,375,
      494,375,
      523,750,
      523,750,
      494,750,
      392,750,
      440,3000
      };
      
    3. MIDI_PLAY
      void MIDI_PLAY(void)
      功能:
      播放指定数量的音调与节拍
      参数:

      返回值:
    void MIDI_PLAY(void){ u16 i,e;for(i=0;i<39;i++){//播放全部音符for(e=0;e<music1[i*2]*music1[i*2+1]/1000;e++){//求节拍,长度*频率(s)/1000=播放时间(ms)GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0delay_us(500000/music1[i*2]); //0.5S内振动相应次数的延时长度,音调GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1delay_us(500000/music1[i*2]);  //0.5S内振动相应次数的延时长度,音调} }
    }
    
    1. 相关概念

      1. 频率f
        频率是单位时间内完成周期性变化的次数,是描述周期运动频繁程度的量
      2. 周期T
        周期,物体作往复运动或物理量作周而复始的变化时,重复一次所经历的时间
      3. f=1/T
      4. C调音符频率对照表

STM32控制蜂鸣器相关推荐

  1. 基于STM32制作的音乐播放器,用PWM控制蜂鸣器

    目录 效果展示 前言 一.设计背景 1.1.知识储备 二.系统设计方案 2.1.实现功能 2.2.硬件部分 2.3.软件部分 三.软件设计 3.1.设计流程图 3.2.音乐频率的设置 3.3.编程主要 ...

  2. 【跟着江科大学Stm32】GPIO_按键控制LED_光敏传感器控制蜂鸣器

    不要管别人怎么说,一定要坚持,坚持一定会有收获! 一.按键控制LED 用两个按键来分别控制两个LED的状态,初始状态两灯均熄灭,按下1次点亮,再按下熄灭 因为江科大的套餐抢不到 我就自己看着图和利用现 ...

  3. STM32之蜂鸣器实验

    本章知识点 STM32GPIO的应用 蜂鸣器的原理(最好网上看看) 蜂鸣器概述 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机.打印机.复印机.报警器.电子玩具.汽车电子设备. ...

  4. STM32实例-蜂鸣器实验

    本章我们通过另外一个实验来讲述 STM32 IO 口的输出.通过 STM32F1 芯片的一个 IO口控制板载有源/无源蜂鸣器,实现蜂鸣器控制. 蜂鸣器介绍 蜂鸣器是一种一体化结构的电子讯响器,采用直流 ...

  5. 03_基于wiringPi的GPIO控制-蜂鸣器

    主要目的: 了解蜂鸣器的基础知识点: 掌握wiringPi的GPIO调用方法: 实现蜂鸣器的鸣叫. 目录 1.安装wiringPi库 1.1.下载和安装wiringPi 1.2.查看GPIO版本 2. ...

  6. stm32无源蜂鸣器定时器_stm32实现无源蜂鸣器发声

    蜂鸣器是一种发声设备,被广泛用于计算机.打印机.复印机.报警器.电子玩具等.蜂鸣器分为有源蜂鸣器和无源蜂鸣器.那么什么是有源,什么是无源呢?这里的"源"指的是,振荡电路.也就是说, ...

  7. stm32无源蜂鸣器定时器_STM32无源蜂鸣器播放音乐

    1.STM32产生PWM波驱动无源蜂鸣器使其发声 1)查看原理图,找到对应引脚(我这里时PA1) 2)打开CubeMax,输入自己芯片的类型确定后,配置好系统时钟RCC,我这里是80Mhz,找到相应引 ...

  8. STM32F030控制蜂鸣器定时响和控制LED亮

    一:STM32F030控制蜂鸣器定时响 (1)main.c中: u16 StartTime=0; void main() {StartTime=500;//蜂鸣器响的时长SPEEK(1); }void ...

  9. 51单片机怎么显示当前时间_(进阶篇)51单片机之按键控制蜂鸣器、数码管、按键值移位显示...

    一.实操演示- 按键控制蜂鸣器 1.图文详细 独立按键硬件电路 蜂鸣器硬件电路 2.连接方式: J20的第3号引脚连接到J7引脚,即P15连接J7. J29的第7.8号引脚连接到JP1的第1.2号引脚 ...

最新文章

  1. 车道线检测:几何约束联合车道分割和车道边界检测
  2. High Performance之android高性能之路
  3. grep -R 关键字 目录
  4. mysql日期序列填充_MySQL如何在范围内填充缺失的日期?
  5. VTK:图片之ImageSlice
  6. Python全栈工程师(文件操作、编码)
  7. No.1010_第七次团队会议
  8. ThinkPHP框架配置自定义的模板变量(十)
  9. matlab在图像处理中的应用实验,MATLAB实验Matlab在数字图像处理中的应用
  10. java向注册表单传递数据php_form表单传递数组数据、php脚本接收的实例
  11. php在线拍照代码,PHP+Javascript实现在线拍照功能实例
  12. 看漫画用什么软件最好?另外,好看的百合漫画有哪些?
  13. css版权备案等居于页面底部与超出不换行可滑动
  14. php支付宝手机网站支付源码,Ecshop 支付宝手机网页支付免费版
  15. 《墨宝非宝经典作品合集(套装共10册)》墨宝非宝(作者)epub+mobi+azw3格式下载...
  16. npm run dev报错 Class constructor ServeCommand cannot be invoked without new
  17. 送给年轻而不服输的你
  18. 【Linux】共享内存
  19. 什么是 ETL ?什么是 ELT ?
  20. crm客户管理系统的功能有哪些?

热门文章

  1. 快速批量修改文件夹中图片的格式
  2. pyecharts x轴字体大小调整_pyecharts极简入门教程
  3. AVAYA 最快下个月宣布破产 积极出售传呼中心业务解决债务
  4. 联想关键业务服务器 sysytem X3850 X6 4U机架式服务器
  5. PR视频玻璃放大效果
  6. 利用Wireshark截取ICMP数据包,并对数据包进行解析
  7. hp服务器bios如何改高性能,HPE ProLiant DL380 Gen10 不同BIOS设置内存性能测试
  8. Verilog给reg型变量赋初值
  9. linux下安装MySQL8及其远程可视化连接
  10. yolov3学习笔记-labelImg数据标注工具安装