********************************************************************
羲和
QQ394492028
*********************************************************************
#include
const unsigned int MusicDataD[7] = {262,293,329,349,392,440,494};
1~7
//低音
const unsigned int MusicData[7] = {523,586,658,697,783,879,987}; //中音 1~7
const unsigned int MusicDataG[7] = {1045,1171,1316,1393,1563,1755,1971}; //高音
1~7
unsigned int i=0,choose=0,PlayWord,jie;
unsigned int Music_Code[][500]=
{
{0x16,0x02, 0x16,0x03, 0x17,0x03, 0x15,0x02, 0x0F,0x03,
0x0F,0x03, 0x16,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x03,
0x15,0x16, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x15,0x03,
0x15,0x04, 0x16,0x04, 0x16,0x16, 0x17,0x03, 0x18,0x03,
0x17,0x03, 0x15,0x03, 0x15,0x03, 0x15,0x03, 0x16,0x04,
0x15,0x04, 0x11,0x02, 0x16,0x03, 0x16,0x03, 0x16,0x03,
0x17,0x03, 0x15,0x02, 0x0F,0x03, 0x0F,0x03, 0x16,0x03,
0x15,0x03, 0x16,0x03, 0x17,0x03, 0x15,0x16, 0x17,0x03,
0x18,0x03, 0x17,0x03, 0x15,0x03, 0x15,0x04, 0x16,0x04,
0x16,0x16, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,
0x19,0x03, 0x19,0x02, 0x00,0x00,
0x0F,0x03, 0x10,0x03, 0x15,0x02, 0x16,0x03, 0x17,0x03,
0x19,0x02, 0x17,0x03, 0x19,0x03, 0x1A,0x03, 0x1B,0x03,
0x1A,0x03, 0x19,0x03, 0x17,0x02, 0x16,0x03, 0x17,0x03,
0x19,0x03, 0x17,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x0F,0x01, 0x00,0x00
},
{0x1A,0x66, 0x19,0x03, 0x17,0x02, 0x19,0x02, 0x1F,0x02,
0x1A,0x03, 0x19,0x03, 0x1A,0x01, 0x17,0x02, 0x19,0x03,
0x1A,0x03, 0x19,0x02, 0x17,0x02, 0x15,0x03, 0x10,0x03,
0x19,0x03, 0x17,0x03, 0x16,0x01, 0x00,0x00},
{ 0x0B,0x02, 0x0C,0x02, 0x0D,0x02, 0x0E,0x02, 0x0F,0x02,0x10,0x02, 0x11,0x02,
0x15,0x02, 0x16,0x02, 0x17,0x02,
0x18,0x02, 0x19,0x02, 0x1A,0x02, 0x1B,0x02, 0x1F,0x02,0x20,0x02, 0x21,0x02,
0x22,0x02, 0x23,0x02, 0x24,0x02,
0x25,0x02, 0x00,0x00 },
};
void RCC_config(void);
void GPIO_config(void);
void PWM_TIMER_config(void);
void Music(unsigned int yin)
{
switch (yin)
{
case 0x0B:
PlayWord = MusicDataD[0];
break;
case 0x0C:
PlayWord = MusicDataD[1];
break;
case 0x0D:
PlayWord = MusicDataD[2];
break;
case 0x0E:
PlayWord = MusicDataD[3];
break;
case 0x0F:
PlayWord = MusicDataD[4];
break;
case 0x10:
PlayWord = MusicDataD[5];
break;
case 0x11:
PlayWord = MusicDataD[6];
break;
case 0x15:
PlayWord = MusicData[0];
break;
case 0x16:
PlayWord = MusicData[1];
break;
case 0x17:
PlayWord = MusicData[2];
break;
case 0x18:
PlayWord = MusicData[3];
break;
case 0x19:
PlayWord = MusicData[4];
break;
case 0x1a:
PlayWord = MusicData[5];
break;
case 0x1b:
PlayWord = MusicData[6];
break;
case 0x1f:
PlayWord = MusicDataG[0];
break;
case 0x20:
PlayWord = MusicDataG[1];
break;
case 0x21:
PlayWord = MusicDataG[2];
break;
case 0x22:
PlayWord = MusicDataG[3];
break;
case 0x23:
PlayWord = MusicDataG[4];
break;
case 0x24:
PlayWord = MusicDataG[5];
break;
case 0x25:
PlayWord = MusicDataG[6];
break;
default:
PlayWord = 0;//表示无声音
break;
}
}
void jiepai(unsigned int yin)
{
switch (yin)
{
case 0x00:
jie =1600;
case 0x01:
jie =800;
case 0x02:
jie =400;
break;
case 0x03:
jie = 200;
break;
case 0x04:
jie= 100;
break;
case 0x66:
jie= 600;
}
}
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //部分映射,将
TIM2_CH1 映射到 PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
//选择引脚 5
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大
50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//复用推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |
GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5
GPIO_Pin_7 ;
| GPIO_Pin_6 |
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率 50Hz
GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化 GPIOA
}
void Delay(unsigned int t)
//节拍延时
{
unsigned int m,n;
for(m=0; m
}
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;//定义结构体变量
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//选择优先级组
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//主优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
//次优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断
NVIC_Init(&NVIC_InitStructure);
}
void Ext_Init()
{
EXTI_InitTypeDef EXTn_Init;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);
EXTn_Init.EXTI_Line=EXTI_Line8|EXTI_Line9;//选择中断线
EXTn_Init.EXTI_Mode=EXTI_Mode_Interrupt;//中断方式
EXTn_Init.EXTI_Trigger=EXTI_Trigger_Rising;//触发方式_Falling
EXTn_Init.EXTI_LineCmd=ENABLE;//使能
EXTI_DeInit();
EXTI_Init(&EXTn_Init);
}//外部中断配置初始化
int main(void)
{
}
RCC_config();
GPIO_config();
NVIC_Config();
Ext_Init();
while(1)
{
Music(Music_Code[choose][i]);
i++;
jiepai(Music_Code[choose][i]) ;
i++;
PWM_TIMER_config();
TIM_Cmd(TIM3, ENABLE);
//使能 TIM3 计时器,开始输出 PWM
Delay(jie);
if(choose==5)
{choose=0;}
}
void RCC_config()
{
ErrorStatus HSEStartUpStatus;
//定义错误状态变量
RCC_DeInit();
//将 RCC 寄存器重新设置为默认值
RCC_HSEConfig(RCC_HSE_ON);
//打开外部高速时钟晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp();
//等待外部高速时钟晶振
工作
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);