PWM控制蜂鸣器播放音乐

2019-07-20 01:27发布

请各位路过的高手帮忙看下,我找了一份F1的程序,修改后放在探索者中实验,用PWM来控制蜂鸣器播放一节小音乐的,可是每次下载后,总是只响乐曲的第一个音符,往下就没有反应了。调试时程序看着也是按步骤走的,可为什么不响呢?//////////////////////////////////////////////////////

#include "pwm.h"
#include "led.h"
#include   "beep.h"
//TIM13 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM13_PWM_Init_Init(u32 arr,u32 psc)
{                                                          
        //此部分需手动修改IO口设置
       
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStruc;
        TIM_OCInitTypeDef  TIM_OCInitStruc;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE);          //TIM13时钟使能   
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);         //使能PORTF时钟       
       
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13); //GPIOF8复用为定时器13
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;           //GPIOF8
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;        //上拉
        GPIO_Init(GPIOF,&GPIO_InitStructure);              //初始化PF8
          
        TIM_TimeBaseStruc.TIM_Prescaler=psc;  //定时器分频
        TIM_TimeBaseStruc.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseStruc.TIM_Period=arr;   //自动重装载值
        TIM_TimeBaseStruc.TIM_ClockDivision=TIM_CKD_DIV1;
       
        TIM_TimeBaseInit(TIM13,&TIM_TimeBaseStruc);//初始化定时器13
        //初始化TIM13 Channel1 PWM模式         
        TIM_OCInitStruc.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
        TIM_OCInitStruc.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStruc.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
        TIM_OCInitStruc.TIM_Pulse=0;
        TIM_OC1Init(TIM13, &TIM_OCInitStruc);  //根据T指定的参数初始化外设TIM13 OC1

        TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable);  //使能TIM13在CCR1上的预装载寄存器

       TIM_ARRPreloadConfig(TIM13,ENABLE);//ARPE使能
       
        TIM_Cmd(TIM13, ENABLE);  //使能TIM13                                                                                  
}  

//////////////////////////////////////////////////////////////
//蜂鸣器初始化
#include "beep.h"
//初始化PF8为输出口                    
//BEEP IO初始化
void BEEP_Init(void)
{   
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
  //初始化蜂鸣器对应引脚GPIOF8
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO
       
  GPIO_ResetBits(GPIOF,GPIO_Pin_8);  //蜂鸣器对应引脚GPIOF8拉低
}


////////////////////////////////////////////////////////////////
//music.h
  //文件:music.h  
#ifndef __MUSIC_H__
#define __MUSIC_H__
#include  "sys.h"
// 定义低音音名(数值单位:Hz)  
#define L1 262 // c
#define L2 294 // d  
#define L3 330 // e  
#define L4 349 // f
#define L5 392 // g  
#define L6 440 // a1  
#define L7 494 // b1

// 定义中音音名
#define M1 523 // c1  
#define M2 587 // d1
#define M3 659 // e1  
#define M4 698 // f1
#define M5 784 // g1  
#define M6 880 // a2  
#define M7 988 // b2

// 定义高音音名
#define H1 1047 // c2
#define H2 1175 // d2
#define H3 1319 // e2  
#define H4 1397 // f2  
#define H5 1568 // g2  
#define H6 1760 // a3  
#define H7 1976 // b3   
// 定义时值单位,决定演奏速度(数值单位:ms)  
#define T 3600  
#define TT 2000

//定义音符结构
typedef struct  {  
short mName; // 音名:取值L1~L7、M1~M7、H1~H7分别表示低音、中音、高音的1234567,取值0表示休止符  
short mTime; // 时值:取值T、T/2、T/4、T/8、T/16、T/32分别表示全音符、 二分音符、四分音符、八分音符 ,取值0表示演奏结束
}tNote;

void buzzerQuiet(void);
void buzzerSound(unsigned short usFreq);
void musicPlay(void);
#endif


///////////////////////////////////////////////////////////
//music.c
#include "sys.h"  
#include "music.h"
#include  "delay.h"
#include "beep.h"   
//#include  "pwm.h"
// 定义乐曲:《化蝶》(梁祝)
const tNote MyScore[] =
{   
   {L3, T/4},

                {L5, T/8+T/16},
                //
                {L6, T/16},
                 
                {M1, T/8+T/16},  

                {M2, T/16},  

                {L6, T/16},

                {M1, T/16},

                {L5, T/8},  

                {M5, T/8+T/16},  

                {H1, T/16},

                 {M6, T/16},
                 
                 {M5, T/16},
                 
                {M3, T/16},  

                {M5, T/16},

{0, 0} // 结束
};   
// 蜂鸣器停止发声
void buzzerQuiet(void)  
{
   GPIO_InitTypeDef  GPIO_InitStructure;  
   TIM_Cmd(TIM13, DISABLE);  //停止TIM3
       
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB.5 端口配置
                   //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
   GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
       
   GPIO_Init(GPIOF, &GPIO_InitStructure);  //根据设定参数初始化GPIOB.5
       
   GPIO_ResetBits(GPIOF,GPIO_Pin_8); //PB.5 输出低
}
//蜂鸣器发出指定频率的声音
//usFreq是发声频率,取值 (系统时钟/65536)+1 ~ 20000,单位:Hz
void buzzerSound(unsigned short usFreq)   
{
    // GPIO_InitTypeDef  GPIO_InitStructure;  
   unsigned long  ulVal;                                                              
   if((usFreq<=8000000/65536UL)||(usFreq>20000))  
    {
     buzzerQuiet();// 蜂鸣器静音  
    }   
   else
     {  
                 GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13);
                                    
                  // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //速度50MHz
                  // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;           //GPIOF9
              // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
              // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
              // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;        //上拉
                 
                   ulVal=8000000/usFreq;
                   TIM13->ARR =ulVal;  //设置自动重装载寄存器周期的值(音调)   
                   TIM_SetCompare1(TIM13,ulVal/2);//音量   
                   TIM_Cmd(TIM13, ENABLE);  //启动TIM3  
     }   
}
// 演奏乐曲
//此为延时函数控
void musicPlay(void)  
{
  u8 i=0;  
  while(1)  

        {  
                if (MyScore[i].mTime == 0)
                break;
                buzzerSound(MyScore[i].mName);
                delay_ms(MyScore[i].mTime);
                i++;  
                buzzerQuiet(); // 蜂鸣器静音
            delay_ms(100);// 10 ms

    }  
}

//////////////////////////////////////////////////////////////////

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include   "beep.h"
#include   "music.h"
//延时函数控制时间
int main(void)  
{  
   delay_init(168);       //延时函数初始化   
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
   TIM13_PWM_Init_Init(14399,10);  //分频。PWM频率=72000/14400/11(Khz)
   for (;;)
     {  
        musicPlay();
        delay_ms(1500);  
        delay_ms(1500);
      }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
割风少年
1楼-- · 2019-07-20 02:48
搞定了
openedvadmin
2楼-- · 2019-07-20 08:01
 精彩回答 2  元偷偷看……
cdwy
3楼-- · 2019-07-20 13:13
用无源蜂鸣器,理论上是可行的。我做过消防警号的模拟。
如果误用了有源蜂鸣器,永远也搞不出来。
低语
4楼-- · 2019-07-20 15:31
 精彩回答 2  元偷偷看……
lxy
5楼-- · 2019-07-20 17:19
 精彩回答 2  元偷偷看……
jiangyy
6楼-- · 2019-07-20 22:16

一周热门 更多>