1、2)P1.0P1.7控制LED。3)P2.3控制蜂鸣器。4)电路为12MHZ晶振频率工作,起振电路中C1、C2均为30PF。图3.4 硬件电路图4软件设计在本程序中设置了两个标志count1和count2,分别初始化为1和0。按键1使得count1在1和2之间切换,按键2使得count2在14之间切换。程序检测count1的值,count1等于1时播放第一首歌曲,等于2时播放第二首。另一方面根据count2的值来切换LED的花样。count1和count2的值是互斥的,设置count1等于1、2时,count2同时设置为0;设置count2等于14时,count1也同时设置为0。4.1 音调、
2、节拍以及编码的确定方法一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个音符唱多长的时间。4.1.1 音调的确定不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。两个音之间
3、的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,CD、DE、FG、GA、AB两音之间隔着一个黑键,他们之间的距离就是全音;EF、BC两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上号或者b号的叫变化音。叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266 Hz)的一倍;同样的,高音RE的频率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率
4、(587Hz)刚好是低音RE频率(294 Hz)的一倍。 1)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。 2)利用AT89C51的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。 此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。 3)例如频率为523Hz,其周期T=1/523=191
5、2us,因此只要令计数器计时956us/1us=956,在每次技术956次时将I/O反相,就可得到中音DO(523Hz)。 计数脉冲值与频率的关系公式如下: N=Fi2Fr N:计算值; Fi:内部计时一次为1us,故其频率为1MHz;4)其计数值的求法如下:T=65536-N=65536-FiFr例如:设K=65536,F=1000000=Fi=1MHz,球低音DO(261Hz)。中音DO(523Hz)。高音的DO(1046Hz)的计算值Fr=65536-1000000Fr=65536-500000/Fr低音DO的T=65536-500000/262=63627低音DO的T=65536-50
6、0000/523=64580低音DO的T=65536-500000/1047=650595)C调各音符频率与计数值T的对照表如表4.1所示。表4.1 C调各音符频率与计数值T的对照表低音频率T参数中音高音Do2621908229523956115104657Do2771805217554903108110954Re2941701204587852102117551Re311160819362280497124548Mi330151518265975991131845Fa349143317269871686139743Fa370135116274067681148041So39212761537
7、8463877156838So415120514583160272166136La440113613688056868176034La464107812993253664186532Si4941012121988506611976304.1.2 节拍的确定若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快慢度。“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s,则1/4 拍为0.125s。至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦
8、耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。表4.2节拍与节拍码对照节拍码节拍数11/4拍1/8拍2/4拍33/4拍3/8拍41拍2/1拍51又1/4拍5/8拍61又1/2拍82拍A2又1/2拍C3拍F3又3/4拍每个
9、音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,图5.2为节拍码的对照。如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如图5.3为1/4和1/8节拍的时间设定。表4.3 1/4和1/8节拍的时间设定曲调值DELAY调4/4125毫秒62毫秒调3/4187毫秒94毫秒调2/4250毫秒4.1.3 编码do re mi fa so la si分别编码为17,重音do编为8,重音re编为9,停顿编为0。播放长度以十六分音符为单位
10、(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。以0xff作为曲谱的结束标志。举例1:音调do,发音长度为两拍,即二分音符,将其编码为0x18。举例2:音调re,发音长度为半拍,即八分音符,将其编码为0x22歌曲播放的设计。先将歌曲的简谱进行编码,储存在一个数据类型为unsigned char 的数组中。程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,接着调用软件延时。
11、表4.4 简谱对应的简谱码、T值、节拍数简谱发音简谱码T值低音SO64260低音LA644007低音TI64524中音DO64580中音RE64684中音MI64777中音FA64820中音SO64898中音LA964968中音TI65030高音DOB65058高音RE65110高音MID65157高音FAE65178高音SO652174.2 软件程序设计4.2.1 程序流程图及相应代码块主程序流程图图4.1 主程序流程图主程序代码:main() uchar x; count1=0;/流水灯无花样 count2=1;/唱第一首歌 P34=0;/选取矩阵键盘的一列 EA=1;/开总中断 EX0=
12、1;/开外部中断0 IT0=1;/外部中断0下降沿触发方式 EX1=1;/开外部中断1 IT1=1;/外部中断1下降沿触发方式 TMOD=0x01;/定时器0工作在方式1 TH0=0; TL0=0; ET0=1; while(1) if(count1!=0) /音乐停止,花样灯开始按照花样闪烁 switch(count1) case 1: for(x=0;x0;x-) for(y=19000;yy-);void delay1(uint z) /延时1MS for(y=112;4.2.2 程序源代码(见附录A)5调试5.1 检查硬件连接 在PROTUES检查各硬件管脚是否连接正确,线路逻辑是否正
13、确,例如:晶振电路的连接,复位电路是否设计正确。5.2 检查软件系统 1根据系统的原理结构检查各流程图是否正确,再根据流程图来检查程序是否也正确。2将所有程序组织起来,在软件环境下运行,检查程序是否正确。通过对硬件和软件系统的认真检查,反复测试,如果没有出现问题即可把源程序编译成HEX文件装载到单片机中,对硬件进行仿真。5.3 测试结果 5.3.1总体运行图图5.1 系统总体运行图5.3.2花样灯3种花样图由于截图只能看到静态图,不能看到整体图样,下面画图说明:图5.2 花样灯(1)第一种花样灯显示方式为:从D1移向D2,然后D1熄灭,再从D2移向D3,然后D2熄灭,以此类推,往复循环。图5.
14、2 第一种花样(2)第二种花样灯显示方式为:从两边向中间移动,首先从D1移向D8,再从D8移向D2,以此类推,往复循环。具体如图5.3。图5.3 第2种花样(3)第三种花样灯显示方式为:从D1移向D2,然后D1熄灭,再从D2移向D3,然后D2熄灭,以此往复循环。与第一种方式的不同之处为:当D1移向D2时,D1不熄灭,再从D2移向D3时,D2也不熄灭,以此类推。图5.4 第3中花样附录A 程序源代码及注释#include #define uchar unsigned char#define uint unsigned intsbit duan=P26;sbit key1=P32;/按key1可切
15、换花样sbit key2=P33;/按key2可切换歌曲sbit fm=P37;/蜂鸣器连续的IO口sbit P34=P34;/矩阵键盘的一列uchar code huayang1=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xfd,0xfb,0xf7,0xef,0xdf,0xbf;/花样1uchar code huayang2=0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7, 0xef,0xfb,0xdf,0xfd,0xbf,0xfe;/花样2uchar code huayang3=0x7f,0x3f,0x1f,0x0f
16、,0x07,0x03,0x01,0x0, 0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff;char code huayang4= 0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0;uchar count1;/花样标志 uchar count2;/歌曲标志 uchar timeh,timel,i;/-简谱-/编程规则:字节高位是简谱,低位是持续时间,/代表多少个十六分音符/1-7代表中央C调,8-E代表高八度,0代表停顿/最后的0是结束标志uchar code qnzl= /千年之恋0x12,0x22,0x34,0x84,0x74,0
17、x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,/前奏0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,/竹林的灯火 到过的沙漠 0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,/七色的国度 不断飘逸风中 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,/有一种神秘 灰色的旋涡 0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x7
18、2,0x02,/将我卷入了迷雾中 0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,/看不清的双手 0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,/一朵花传来谁经过的温柔 0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,/穿越千年的伤痛 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,/只为求一个结果 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,/你留下的轮廓 指引我 0x42,0x63,0x
19、83,0x83,0x91,0x91,/黑夜中不寂寞 0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,/穿越千年的哀愁/是你在尽头等我/最美丽的感动 会值得 0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff/结束标志/用一生守候;uchar code jmszl= /寂寞沙洲冷0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,/自你走后心憔悴0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,/白色油桐风中纷飞0x51,0x52,0x31,0x52,0x62,0x13,0x11,0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1