找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2887|回復(fù): 1
收起左側(cè)

STM32音樂程序

[復(fù)制鏈接]
ID:334435 發(fā)表于 2019-7-30 18:24 | 顯示全部樓層 |閱讀模式
//定義低音音名
#define L1 262   //低調(diào) do 的周期
#define L2 294   //低調(diào) re 的周期
#define L3 330   //低調(diào) mi 的周期
#define L4 349   //低調(diào) fa 的周期
#define L5 392   //低調(diào) sol的周期
#define L6 440   //低調(diào) la 的周期
#define L7 494   //低調(diào) si 的周期
// 定義中音音名
#define M1 523   //中調(diào) do 的周期
#define M2 587   //中調(diào) re 的周期
#define M3 659   //中調(diào) mi 的周期
#define M4 698   //中調(diào) fa 的周期
#define M5 784   //中調(diào) sol的周期
#define M6 880   //中調(diào) la 的周期
#define M7 988   //中調(diào) si 的周期
//定義高音音名
#define H1 1047   //高調(diào) do 的周期
#define H2 1175   //高調(diào) re 的周期
#define H3 1319   //高調(diào) mi 的周期
#define H4 1397   //高調(diào) fa 的周期
#define H5 1568   //高調(diào) sol的周期
#define H6 176    //高調(diào) la 的周期
#define H7 1976   //高調(diào) si 的周期

#define TT    200

/**樂譜的數(shù)組,不同的音樂只需要更改這里
簡譜C語言表示方法
(M5,50)為(音調(diào),音長)
100表示為一個音長(節(jié)拍),
50位半個音長(節(jié)拍),
25位四分之一音長(節(jié)拍)******************/
int music[]=  
{
        ////生日快樂歌        
        M5,50,M5,25,M5,25,
        M6,100,M5,100,H1,100,
        M7,100,M7,100,M5,50,M5,25,M5,25,
        M6,100,M5,100,H2,100,
        H1,100,H1,100,M5,50,M5,25,M5,25,
        H5,100,H3,100,H1,100,
        M7,100,M6,100,H4,50,H4,25,H4,25,
        H3,100,H1,100,H2,100,H1,100,H1,100


//兩只老虎
// L1,4,L2,4,L3,4,L1,4,
// L1,4,L2,4,L3,4,L1,4,
// L3,4,L4,4,L5,8,
// L3,4,L4,4,L5,8,
// L5,3,L6,1,L5,3,L6,1,L3,4,L1,4,
// L5,3,L6,1,L5,3,L6,1,L3,4,L1,4,
// L2,4,M5,4,L1,8,
// L2,4,M5,4,L1,8


////歡樂頌        
//M3,8,M3,8,M4,8,M5,8,
//M5,8,M4,8,M3,8,M2,8,
//M1,8,M1,8,M2,8,M3,8,
//M3,12,M2,4,M2,16,
//M3,8,M3,8,M4,8,M5,8,
//M5,8,M4,8,M3,8,M2,8,
//M1,8,M1,8,M2,8,M3,8,
//M2,12,M1,4,M1,16,
//M2,8,M2,8,M3,8,M1,8,
//M2,8,M3,4,M4,4,M3,8,M1,8,
//M2,8,M3,4,M4,4,M3,8,M2,8,
//M1,8,M2,8,L5,8,M3,8,
//M3,8,M3,8,M4,8,M5,8,
//M5,8,M4,8,M3,8,M4,4,M2,4,
//M1,8,M1,8,M2,8,M3,8,
//M2,12,M1,4,M1,16,
//M2,8,M2,8,M3,8,M1,8,
//M2,8,M3,4,M4,4,M3,8,M1,8,
//M2,8,M3,4,M4,4,M3,8,M2,8,
//M1,8,M2,8,L5,8,M3,8,
//M3,8,M3,8,M4,8,M5,8,
//M5,8,M4,8,M3,8,M4,4,M2,4,
//M1,8,M1,8,M2,8,M3,8,
//M2,12,M1,4,M1,16



        ////最炫民族風(fēng)
//        L6,TT/4,L3,TT/8,L5,TT/8,L6,TT/4,L6,TT/8,M1,TT/8,M1,TT/4,M2,TT/8,M1,TT/8,L6,TT/2,M1,TT/4,M1,TT/8,L5,TT/8,M1,TT/8,M2,TT/8,M3,TT/8,M5,TT/8,
//        M5,TT/8,M3,TT/8,M2,TT/4,M3,TT/2,M6,TT/8,M6,TT/8,M6,TT/8,M5,TT/8,M3,TT/8,M3,TT/4,M1,TT/8,L6,TT/8,L6,TT/8,L6,TT/8,M3,TT/8,
//        M2,TT/2,M3,TT/8,M3,TT/8,M5,TT/8,M3,TT/8,M2,TT/8,M3,TT/8,M2,TT/8,M1,TT/8,L6,TT/4,L5,TT/4,L6,TT/2,
//        L6,TT/4,L3,TT/8,L5,TT/8,L6,TT/4,L6,TT/8,M1,TT/8,M1,TT/4,M2,TT/8,M1,TT/8,L6,TT/2,M1,TT/4,M1,TT/8,L5,TT/8,M1,TT/8,M2,TT/8,M3,TT/8,M5,TT/8,
//        M5,TT/8,M3,TT/8,M2,TT/4,M3,TT/2,M6,TT/8,M6,TT/8,M6,TT/8,M5,TT/8,M3,TT/8,M3,TT/4,M1,TT/8,L6,TT/8,L6,TT/8,L6,TT/8,M3,TT/8,
//        M2,TT/2,M3,TT/8,M3,TT/8,M5,TT/8,M3,TT/8,M2,TT/8,M3,TT/8,M2,TT/8,M1,TT/8,L6,TT/4,L5,TT/4,L6,TT/2,
//        M3,TT/8,M3,TT/8,M5,TT/8,M3,TT/8,M3,TT/8,M5,TT/8,M5,TT/8,M6,TT/8,H1,TT/8,M6,TT/8,M5,TT/4,M6,TT/2,L6,TT/4,L6,TT/8,
//        L5,TT/8,L6,TT/4,M1,TT/4,M2,TT/8,M3,TT/16,M2,TT/16,M1,TT/8,M2,TT/8,M3,TT/2,L6,TT/8,M6,TT/8,M6,TT/8,M5,TT/8,M2,TT/8,M3,TT/16,M2,TT/16,
//        M1,TT/8,M2,TT/8,M3,TT/2,
//        M1,TT/8,L6,TT/8,L6,TT/8,M1,TT/8,M2,TT/4,L5,TT/8,L5,TT/8,M3,TT/8,M5,TT/8,M3,TT/8,M2,TT/8,M1,TT/2,L6,TT/8,M1,TT/8,M2,TT/8,M3,TT/8,M2,TT/8,M1,TT/8,
//        L5,TT/8,L3,TT/8,L6,TT/2,L6,TT/4,L6,TT/8,L5,TT/8,L6,TT/4,M1,TT/4,M2,TT/8,M3,TT/16,M2,TT/16,M1,TT/8,M2,TT/8,M3,TT/2,L6,TT/8,M6,TT/8,
//        M6,TT/8,M5,TT/8,M2,TT/8,M3,TT/16,M2,TT/16,
//        M1,TT/8,M2,TT/8,M3,TT/2,
//        M1,TT/8,L6,TT/8,L6,TT/8,M1,TT/8,M2,TT/4,L5,TT/8,L5,TT/8,M3,TT/8,M5,TT/8,M3,TT/8,M2,TT/8,M1,TT/4+TT/8,M1,TT/8,L6,TT/8,
//        M1,TT/8,M2,TT/8,M3,TT/8,M5,TT/8,M3,TT/8,M3,TT/8,M5,TT/8,M6,TT/2,M6,TT/2,L6,TT/4,L6,TT/8,L5,TT/8,L6,TT/4,
//        L6,TT/8,M1,TT/8,M2,TT/8,M3,TT/16,M2,TT/16,M1,TT/8,M2,TT/8,M3,TT/2,
//        M6,TT/8,M5,TT/8,M3,TT/8,M2,TT/8,M5,TT/8,M3,TT/8,M2,TT/8,M1,TT/8,M1,TT/2,
//        L6,TT/4,L6,TT/8,L5,TT/8,L6,TT/4,M1,TT/4,M2,TT/8,M3,TT/16,M2,TT/16,M1,TT/8,M2,TT/8,M3,TT/2,L6,TT/8,M6,TT/8,M6,TT/8,M5,TT/8,M2,TT/8,M3,TT/16,M2,TT/16,
//        M1,TT/8,M2,TT/8,M3,TT/2,
//        M1,TT/8,L6,TT/8,L6,TT/8,M1,TT/8,M2,TT/4,L5,TT/8,L5,TT/8,M3,TT/8,M5,TT/8,M3,TT/8,M2,TT/8,M1,TT/2,L6,TT/8,M1,TT/8,M2,TT/8,M3,TT/8,M2,TT/8,M1,TT/8,
//        L5,TT/8,L3,TT/8,L6,TT/2,L6,TT/4,L6,TT/8,L5,TT/8,L6,TT/4,M1,TT/4,M2,TT/8,M3,TT/16,M2,TT/16,M1,TT/8,M2,TT/8,M3,TT/2,L6,TT/8,M6,TT/8,
//        M6,TT/8,M5,TT/8,M2,TT/8,M3,TT/16,M2,TT/16,
//        M1,TT/8,M2,TT/8,M3,TT/2,
//        M1,TT/8,L6,TT/8,L6,TT/8,M1,TT/8,M2,TT/4,L5,TT/8,L5,TT/8,M3,TT/8,M5,TT/8,M3,TT/8,M2,TT/8,M1,TT/4+TT/8,M1,TT/8,L6,TT/8,
//        M1,TT/8,M2,TT/8,M3,TT/8,M5,TT/8,M3,TT/8,M3,TT/8,M5,TT/8,M6,TT/2,M6,TT/2,
//        0,0
};



/*用來計算有多少個樂譜元素,這樣寫的好處是方便移植,
  在更改樂譜的時候不用自己去數(shù)有多少個元素*/
int length = sizeof(music)/sizeof(music[0]);//計算數(shù)組長度
int main()
{
        int i=0;
  BASE_TIM_Init();  
  while(100)
        {
                for(i=0; i<(length/2); i++)//取數(shù)組數(shù)據(jù)
                {  
                        TIM_MODE_Config(TIM4,music[2*i],7199); ///使用TIM4
                        //音長的時間都乘以5當(dāng)一拍,不一定是5,
                        //可以是其它的數(shù)字,作用就相當(dāng)于乘以一個倍率
                        SysTick_Delay_ms(5*music[2*i+1]);
                }        
               
                if(i>=(length/2))//當(dāng)i大于等于數(shù)組元素時I清零重新開始播放音樂
                {
                   i=0;
                }
        }
}



#include  "stm32f10x.h"
#include  "tim1_8.h"



/*初始化有關(guān)GPIO口*/
void  TIM_INIT_GPIO(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
        //TIMX的CHX時鐘
        CH1_TIM_GPIO_APB2_CLK(CH1_TIMX_GPIO_CHX_CLK,ENABLE );
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin=CH1_TIMX_GPIO_CHX_PIN;  
  GPIO_Init(CH1_TIMX_GPIO_CHX_PORN, &GPIO_InitStructure);
}


/*有關(guān)結(jié)構(gòu)體的定義,
這里定義了ARR=CCRX的值*/
void  TIM_MODE_Config(TIM_TypeDef* TIMx, uint16_t ARR, uint16_t PSC)  
{
        
          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
          TIM_OCInitTypeDef        TIM_OCInitStructure;
         //配置時基有關(guān)的結(jié)構(gòu)體
          TIM_RCC_APB2PeriphClockCmd(TIM_RCC_CLK,ENABLE); // 開啟定時器時鐘,即內(nèi)部時鐘CK_INT=72M  
          TIM_TimeBaseStructure.TIM_Period = ARR;        // 自動重裝載寄存器的值,累計TIM_Period+1個頻率后產(chǎn)生一個更新或者中斷
          TIM_TimeBaseStructure.TIM_Prescaler=PSC;      //分頻系數(shù)71+1
          TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        // 計數(shù)器計數(shù)模式向上計數(shù)
          TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);            // 初始化定時器
        
                /*定時器輸出有關(guān)結(jié)構(gòu)體*/
                TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;             // 配置為PWM模式1
                TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;    // 輸出通道空閑電平極性配置
                TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;     // 輸出通道電平極性配置,到達(dá)跳變值TIM_Pulse,電平跳變?yōu)榈?br />                 TIM_OCInitStructure.TIM_Pulse=ARR;                                 //配置占空比,我這里的配置為ARR=CCRX,這樣就可以使得占空比基本不變。
                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; // 輸出使能

                //配置輸出通道CH3
                TIM_OC3Init(TIMx, &TIM_OCInitStructure);        
                TIM_OC3PreloadConfig(TIMx, TIM_OCPreload_Enable);  //使能TIM3在CCR3上的預(yù)裝載寄存器
                // 使能計數(shù)TMX
                TIM_Cmd(TIMx, ENABLE);
}



void BASE_TIM_Init(void)
{
   TIM_INIT_GPIO();
}



#ifndef __TIM1_8_H
#define __TIM1_8_H
#include "stm32f10x.h"

//通用定時器有關(guān)配置
#define   TIM_RCC_APB2PeriphClockCmd                      RCC_APB1PeriphClockCmd
#define   TIM_RCC_CLK                                     RCC_APB1Periph_TIM4

//CH1
#define   CH1_TIM_GPIO_APB2_CLK                           RCC_APB2PeriphClockCmd
#define   CH1_TIMX_GPIO_CHX_PIN                           GPIO_Pin_8
#define   CH1_TIMX_GPIO_CHX_PORN                          GPIOB
#define   CH1_TIMX_GPIO_CHX_CLK                           RCC_APB2Periph_GPIOB

void BASE_TIM_Init(void);
void TIM_MODE_Config(TIM_TypeDef* TIMx,u16 ARR, u16 PSC);
#endif  /*__TIM1_8_H*/


music_PWM.7z

176.92 KB, 下載次數(shù): 49, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

ID:1 發(fā)表于 2019-7-30 23:24 | 顯示全部樓層
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表