//定義低音音名
#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
/**樂(lè)譜的數(shù)組,不同的音樂(lè)只需要更改這里
簡(jiǎn)譜C語(yǔ)言表示方法
(M5,50)為(音調(diào),音長(zhǎng))
100表示為一個(gè)音長(zhǎng)(節(jié)拍),
50位半個(gè)音長(zhǎng)(節(jié)拍),
25位四分之一音長(zhǎng)(節(jié)拍)******************/
int music[]=
{
////生日快樂(lè)歌
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
////歡樂(lè)頌
//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
};
/*用來(lái)計(jì)算有多少個(gè)樂(lè)譜元素,這樣寫(xiě)的好處是方便移植,
在更改樂(lè)譜的時(shí)候不用自己去數(shù)有多少個(gè)元素*/
int length = sizeof(music)/sizeof(music[0]);//計(jì)算數(shù)組長(zhǎng)度
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
//音長(zhǎng)的時(shí)間都乘以5當(dāng)一拍,不一定是5,
//可以是其它的數(shù)字,作用就相當(dāng)于乘以一個(gè)倍率
SysTick_Delay_ms(5*music[2*i+1]);
}
if(i>=(length/2))//當(dāng)i大于等于數(shù)組元素時(shí)I清零重新開(kāi)始播放音樂(lè)
{
i=0;
}
}
}
#include "stm32f10x.h"
#include "tim1_8.h"
/*初始化有關(guān)GPIO口*/
void TIM_INIT_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//TIMX的CHX時(shí)鐘
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;
//配置時(shí)基有關(guān)的結(jié)構(gòu)體
TIM_RCC_APB2PeriphClockCmd(TIM_RCC_CLK,ENABLE); // 開(kāi)啟定時(shí)器時(shí)鐘,即內(nèi)部時(shí)鐘CK_INT=72M
TIM_TimeBaseStructure.TIM_Period = ARR; // 自動(dòng)重裝載寄存器的值,累計(jì)TIM_Period+1個(gè)頻率后產(chǎn)生一個(gè)更新或者中斷
TIM_TimeBaseStructure.TIM_Prescaler=PSC; //分頻系數(shù)71+1
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 計(jì)數(shù)器計(jì)數(shù)模式向上計(jì)數(shù)
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure); // 初始化定時(shí)器
/*定時(shí)器輸出有關(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ù)裝載寄存器
// 使能計(jì)數(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"
//通用定時(shí)器有關(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*/
|