微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 源码 4 -- 喇叭播放插曲 You

源码 4 -- 喇叭播放插曲 You

时间:11-17 来源:互联网 点击:
单片机到喇叭部分,觉得挺好玩,编写了喇叭播放音乐的程序……

BGM 取自插曲 You,简谱由网络提供,感谢作者……先把简谱附上:

还有一张自制的“钢琴按键频率分布”,没写那么全,只对应本程序,图如下:

附上源码:(初出茅庐,难免有写的不好的地方,仅作备份之用,欢迎指点,喷子退散……)

/*******************************************************************
喇叭播放音乐

BGM 取自的插曲 You

缺点:

1、没有添加调节音量的功能
2、音高、节拍 都要自己提前写好,工作量大
可以改进成:通过解析 midi 文件进行音乐播放
(midi 里边就是音高、节拍信息)
********************************************************************/

#include

sbitSPK = P1^0;// 喇叭输入

/************************************************************************************************************************************
PIANO_F[ ]:是钢琴按键的频率,数组下标对应钢琴按键,如上图所示
例:图上可以看出:8 号键对应钢琴的中央 C,正好是 PIANO_F[8],对应频率为 261.6 Hz
注:PIANO_F[0] 不代表任何按键,为了方便计数,数组下标从 1 开始有意义
*************************************************************************************************************************************/

float codePIANO_F[ ] = {7.63,
130.8, 146.8, 164.8, 174.5, 196.0, 220.0, 247.1,
261.6, 293.6, 329.6, 349.0, 392.0, 440.0, 494.0,
523.2, 587.2, 659.2, 698.3, 784.0, 880.0, 988.0,
1046.4, 1174.4, 1318.4, 1396.8, 1567.7, 1760.0, 1975.3};

/******************************************************************************************************
PITCH[ ]:指的是 音高,对应上图中的按键号
例:中音 do:如图对应 8 号键
高音 do:如图对应 15 号键
好处:假如歌曲播放到了第 i 个音,那么 PITCH[i] 就是对应钢琴上的按键
那么 PIANO_F[ PITCH[i] ] 就是对应的琴键的频率,方便编程使用
注:255 代表 音乐结束
0 代表 八分休止符
******************************************************************************************************/

unsigned char codePITCH[ ] = {16, 17, 16, 15, 16, 12, 17, 16, 15,
16, 17, 16, 15, 15, 19, 16,
16, 17, 16, 15, 16, 12, 17, 16, 15,
16, 17, 16, 15, 15, 12,
12, 10, 12, 15, 15,
16, 16, 16, 17, 17, 12,
12, 10, 12, 0, 15, 15, 16,
16, 16, 16, 19, 17, 12,
12, 10, 0, 12, 0, 15, 15, 15,
16, 16, 16, 17, 17, 12,
12, 10, 0, 12, 0, 15, 15, 16,
16, 16, 16, 19, 17, 26,
26, 24, 0, 26, 26, 22, 0, 23,
23, 22, 23, 0, 24, 23, 24, 26,
26, 24, 0, 26, 26, 22, 0, 23,
23, 22, 0, 23, 22,
255};

/***************************************************************************************************************
BEAT[ ]:指的是 节拍,数值代表基本节拍的倍数,这里基本节拍为 十六分音符 长
例:8,代表 8 倍 十六分音符 长,即:二分音符
4,代表 4 倍 十六分音符 长,即:四分音符
2,代表 2 倍 十六分音符 长,即:八分音符
1,代表 1 倍 十六分音符 长,即:十六分音符
6,代表 6 倍 十六分音符 长,即:符点四分音符
***************************************************************************************************************/

unsigned char codeBEAT[ ] = {4, 1, 1, 2, 2, 2, 1, 1, 2, 4, 1, 1, 2, 2, 2, 4,
4, 1, 1, 2, 2, 2, 1, 1, 2, 4, 1, 1, 2, 6, 2,
2, 4, 2, 6, 2, 2, 2, 2, 2, 6, 2,
2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8,
255};

unsigned chartime_h = 0;// 用于向定时器中断程序传递下一步定时信息
unsigned chartime_l = 0;

unsigned inttime = 0;// 根据按键频率,换算出应该定时多长时间
unsigned chari;

voidInit_Timer0(void);// 初始化 定时器 0
voidDelay(unsigned intt);// 普通延时
voidDelay_ms(unsigned intt);// 相当近似的延迟 t ms

voidmain (void)
{
Init_Timer0();

for(i = 0; PITCH[i] != 255; i++) {// 顺序播放,255 为音乐结束

TR0 = 0;// 关 定时器0

Delay_ms(20);// 延时一段时

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top