- static void TimingDelayDecrement(void)
- {
- if (TimingDelay != 0x00) {
- TimingDelay--;
- }
- ms++;
- space_n++; //音乐节拍计时
- }
微秒定时器是启用了tim2,在定时器中断里,我开始用引脚置位后再复位的办法,也许是时间太短,喇叭无反映,尝试加__NOP()延时也不起作用,而且延时太多会引起单片机假死,只有使用引脚翻转命令才有效,但输出的频率太低,效果很差。尝试缩短定时器延时时间,受主频影响无法继续缩短,最后只好采取降低音符频率数值的办法才达到目的。下面是定时器2的配置代码:
Tim2_UPCount_test(2,47); //控制扬声器
在定时器2的中断处理中代码如下:
- void TIM2_IRQHandler(void)
- {
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
- // ucTim2Flag++;
- if(space > 0){
- cycle_n++;
- if(cycle_n > cycle){
- SBK_TOGGLE(); //翻转引脚
- cycle_n = 0; //重新计数
- }
- }
- }
在主循环中的代码如下:
- //轮询按键状态
- keys[0] = GPIO_ReadInputDataBit(SW1_GPIO_Port,SW1_Pin);
- keys[1] = GPIO_ReadInputDataBit(SW2_GPIO_Port,SW2_Pin);
- keys[2] = GPIO_ReadInputDataBit(SW3_GPIO_Port,SW3_Pin);
- keys[3] = GPIO_ReadInputDataBit(SW4_GPIO_Port,SW4_Pin);
-
- if(0 == keys[3]){
- LED4_ON();
- song = 1; //启动音乐
- LED3_ON();
- space = 1;
- }
- else
- LED4_OFF();
-
- if(0 == keys[2]){ //中断播放
- song = 0;
- cycle = 0;
- LED3_OFF();
- }
-
- if(song > 0){ //音乐播放控制
- if((space > 0) & (space_n > space)){
- LED4_ON();
- cycle = SONG1[song][0]>>4;//取当前的音阶cycle及节拍space
- space = SONG1[song][1]<<1;
- cycle_n = 0; //音符及节拍计数清零
- space_n = 0;
- LCD_write_value(25,3,4,0,0,cycle);
- LCD_write_value(25,4,4,0,0,space);
- song++; //准备取下一音符
- LCD_write_value(60,3,3,0,0,song);
- if(space == 0){
- song = 0; //取得末尾的0时结束播放
- LED3_OFF();
- }
- LED4_OFF();
- }
- }
经过三天时间的反复测试,程序基本上达到了预期,只是休止符的节拍延时不正确,尚未找到原因。
下面是【城南旧事】主题歌【送别】的音乐数据:
- uint16_t SONG1[][2] = //数据表,音阶(微秒)、节拍(毫秒)
- {
- 0,0,
-
- 1276,250, //5
- 1517,125, //3
- 1276,125, //5
- 956, 500, //1^
- 1137,250, //6
- 956, 125, //1^
- 1137,125, //6
- 1276,500, //5
-
- 1276,250, //5
- 1912,125, //1
- 1703,125, //2
- 1517,250, //3
- 1703,125, //2
- 1912,125, //1
- 1703,750, //2
- 0,50, //0
-
- 1276,250, //5
- 1517,125, //3
- 1276,125, //5
- 956, 375, //1^
- 1013,125, //7
- 1137,250, //6
- 956, 250, //1^
- 1276,500, //5
-
- 1276,250, //5
- 1703,125, //2
- 1517,125, //3
- 1432,375, //4
- 2026,125, //7_
- 1912,750, //1
- 0,50, //0
- 1137,250, //6
- 956, 250, //1^
- 956,500, //1^
- 1013,250, //7
- 1137,125, //6
- 1013,125, //7
- 956,500, //1^
-
- 1137,125, //6
- 1013,125, //7
- 956, 125, //1^
- 1137,125, //6
- 1137,125, //6
- 1276,125, //5
- 1517,125, //3
- 1912,125, //1
- 1703,750, //2
- 0,50, //0
-
- 1276,250, //5
- 1517,125, //3
- 1276,125, //5
- 956,375, //1^
- 1013,125, //7
- 1137,250, //6
- 956, 250, //1^
- 1276,500, //5
-
- 1276,250, //5
- 1703,125, //2
- 1517,125, //3
- 1432,375, //4
- 2026,125, //7_
- 1912,1000, //1
-
- 0,0,
- 0,0,
-
- };