电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
【嵌入式】——STM32F401VE 时钟复用+蜂鸣器乐器编程
分 享
扫描二维码分享
【嵌入式】——STM32F401VE 时钟复用+蜂鸣器乐器编程
STM32F4
嵌入式基础
蜂鸣器
78e55d08da9592e3
关注
发布时间: 2020-06-16
丨
阅读: 1008
## 实验目的 了解STM32时钟复用技术,并实现蜂鸣器奏乐 ## 实验器材 操作系统:Windows 10 家庭中文版 软件:keil5(编译)、source insight4.0(写程序)、Proteus8.8(仿真运行) 仿真器件:STM32F401VE芯片、LED灯、电阻、电容 ## 实验代码 rj_buzzer.c ```c #include "stm32f4xx.h" #include "main.h" #include "systick.h" #define ZERO 3000// #define R 10000 //F_CLOCK/(N+1)=10000 #define L1 (R/262)-1 //DO #define half_L1 (R/277)-1 //#1低音DO# #define L2 (R/294)-1 #define half_L2 (R/311)-1 #define L3 (R/330)-1 #define L4 (R/349)-1 #define half_L4 (R/370)-1 #define L5 (R/392)-1 #define half_L5 (R/410)-1 #define L6 (R/440)-1 #define half_L6 (R/466)-1 #define L7 (R/494)-1 #define M1 (R/523)-1 //中音DO #define half_M1 ??R/554)-1 //#1 DO# #define M2 (R/587)-1 #define half_M2 (R/622)-1 #define M3 (R/659)-1 #define M4 (R/698)-1 #define half_M4 (R/740)-1 #define M5 (R/784)-1 #define half_M5 (R/831)-1 #define M6 (R/880)-1 #define half_M6 (R/932)-1 #define M7 (R/988)-1 #define H1 (R/1046)-1 //高音DO #define half_H1 ??R/1109)-1 //#1DO# #define H2 (R/1175)-1 #define half_H2 (R/1245)-1 #define H3 (R/1318)-1 #define H4 (R/1397)-1 #define half_H4 (R/1480)-1 #define H5 (R/1568)-1 #define half_H5 (R/1661)-1 #define H6 (R/1760)-1 #define half_H6 (R/1865)-1 #define H7 (R/1967)-1 int flag=1;//标志 int x; //音符数组 int tune[] = { H1,M7,H1,M3,M2,M3,M3,M5, M2,M1,M2,M2,M7,M7,H1,H1,H1,M3,M5,M5, H1,M7,H1,M6,M5,M6,M6,H1, M5,H1,M5,M5,M3,M4,M6,M5,M5,M6,M3,M3,M2, H1,M7,H1,M3,M2,M3,M3,M5, M2,M1,M2,M2,M7,M7,H1,H1,H1,H2,H3,H3, H2,H3,H1,H1,M6,M6,M6,M6, M5,H1,M5,M5,M3,M4,M5,M6,M6,H1,H3,H2, H1,H1,H1 }; //节拍数组 float duration[]= { 1,1,1,1,0.5,0.5,0.5,1.5, 1,0.5,0.5,0.5,1.5,1,0.5,0.5,1,0.5,0.5,2, 1,1,1,1,0.5,0.5,0.5,1.5, 1,0.5,0.5,0.5,1.5,1,0.5,0.5,1,0.5,0.5,0.5,1.5, 1,1,1,1,0.5,0.5,0.5,1.5, 1,0.5,0.5,0.5,1.5,1,0.5,0.5,0.5,1,0.5,1, 1,0.5,0.5,1,0.5,0.5,1.5,0.5, 1,0.5,0.5,1.5,0.5,1,0.5,0.5,0.5,1.5,2,1, 2,2,2 }; int length = sizeof(tune)/sizeof(tune[0]); void buzzer_init(int f) { /@@*时钟使能*/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE); //1 GPIO_InitTypeDef p; p.GPIO_Pin = GPIO_Pin_8; p.GPIO_Mode = GPIO_Mode_AF; //多路复用模式 p.GPIO_PuPd = GPIO_PuPd_NOPULL; p.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOF,&p); GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13); //2 /@@*配置GPIO引脚的功能,AF:复用功能*/ TIM_TimeBaseInitTypeDef t; t.TIM_Prescaler = 8399; //预分频值 10000HZ=TIM13_CLK t.TIM_CounterMode = TIM_CounterMode_Down;//递减模式 t.TIM_Period = f; //N值 t.TIM_RepetitionCounter = 0; //不需要重复计数 TIM_TimeBaseInit(TIM13, &t); //3 //输出通道的配置 TIM_OCInitTypeDef t_oc; t_oc.TIM_OCMode = TIM_OCMode_PWM2; t_oc.TIM_OCPolarity = TIM_OCPolarity_High; t_oc.TIM_OutputState = TIM_OutputState_Enable; t_oc.TIM_Pulse = f*0.9; TIM_OC1Init(TIM13, &t_oc); TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable);// //4 //使能定时器 TIM_ARRPreloadConfig(TIM13, ENABLE); // TIM_Cmd(TIM13, ENABLE); } void music_fun() { for(x=0;x<length;x++) { if(flag==1) { flag=0; } if(tune[x]==ZERO) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, DISABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, DISABLE); flag=1; } buzzer_init(tune[x]); if(flag==1) { delay_ms((uint32_t)(1000*duration[x])); flag = 0; } else delay_ms((uint32_t)(400*duration[x])); } //关闭时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, DISABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, DISABLE); } ``` main.c ```c #include "main.h" #include "rj_led.h" #include "rj_int_key.h" #include "systick.h" #include "rj_buzzer.h" extern uint8_t status; int main(void) { while (1) { music_fun(); } } ``` ## 实验现象 演示视频:https://www.bilibili.com/video/BV1Pi4y1x7q1
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
78e55d08da9592e3
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交