单片机音乐盒课程设计Word文档格式.docx
《单片机音乐盒课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机音乐盒课程设计Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上﹟号或者b号的叫变化音。
﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。
例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266Hz)的一倍;
同样的,高音RE的频率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294Hz)的一倍。
1)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
2)利用发单片的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。
此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;
若查表结果为FFH,则产生相应的停顿效果。
3)例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每次技术956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi
2
Fr
N:
计算值;
Fi:
内部计时一次为1us,故其频率为1MHz;
其计数值的求法如下:
T=65536-N=65536-Fi
Fr
例如:
设K=65536,F=1000000=Fi=1MHz,球低音DO(261Hz)。
中音DO(523Hz)。
高音的DO(1046Hz)的计算值
Fr=65536-1000000
Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
低音DO的T=65536-500000/523=64580
低音DO的T=65536-500000/1047=65059
C调各音符频率与计数值T的对照表如下表所示。
C调各音符频率与计数值T的对照表
低音
频率
T
参数
中音
高音
Do
262
1908
229
523
956
115
1046
57
Do﹟
277
1805
217
554
903
108
1109
54
Re
294
1701
204
587
852
102
1175
51
Re﹟
311
1608
193
622
804
97
1245
48
Mi
330
1515
182
659
759
91
1318
45
Fa
349
1433
172
698
716
86
1397
43
Fa﹟
370
1351
162
740
676
81
1480
41
So
392
1276
153
784
638
77
1568
38
So﹟
415
1205
145
831
602
72
1661
36
La
440
1136
136
880
568
68
1760
34
La﹟
464
1078
129
932
536
64
1865
32
Si
494
1012
121
988
506
61
1976
30
节拍的确定:
若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。
“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。
若1拍实0.5s,则1/4拍为0.125s。
至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。
音持续时间的长短即时值,一般用拍数表示。
休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。
了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。
对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时
/计数器来产生这样的方波频率信号。
因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
表4.2节拍与节拍码对照
节拍码
节拍数
1
1/4拍
1/8拍
2/4拍
3
3/4拍
3/8拍
4
1拍
2/1拍
5
1又1/4拍
5/8拍
6
1又1/2拍
8
2拍
A
2又1/2拍
C
3拍
F
3又3/4拍
每个音符使用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.31/4和1/8节拍的时间设定
曲调值
DELAY
调4/4
125毫秒
62毫秒
调3/4
187毫秒
94毫秒
调2/4
250毫秒
编码:
doremifasolasi分别编码为1~7,重音do编为8,重音re编为9,停顿编为0。
播放长度以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。
音调作为编码的高4
位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。
以0xff作为曲谱的结束标志。
举例1:
音调do,发音长度为两拍,即二分音符,将其编码为0x18。
举例2:
音调re,发音长度为半拍,即八分音符,将其编码为0x22
歌曲播放的设计。
先将歌曲的简谱进行编码,储存在一个数据类型为unsignedchar的数组中。
程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;
接着分离出该数的低4位,得到延时时间,接着调用软件延时。
表4.4简谱对应的简谱码、T值、节拍数
简谱
发音
简谱码
T值
低音SO
64260
低音LA
64400
7
低音TI
64524
中音DO
64580
中音RE
64684
中音MI
64777
中音FA
64820
中音SO
64898
中音LA
9
64968
中音TI
65030
高音DO
B
65058
高音RE
65110
高音MI
D
65157
高音FA
E
65178
高音SO
65217
为简便起见,以一定的频率方波产生的音在其每个周期内高低幅值得时间各占一半因此,输出引脚在每个方波周期内要动作两次:
一次升高,一次降低。
即输出引脚的频率是原音频率的两倍。
方波的产生由定时器控制。
定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。
必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。
一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数。
另外,为避免
T1中断可能引起杂音,应将定时器T0中断设为高优先级。
这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。
音乐播放器的基本硬件电路有六部分组成:
单片机、时钟与复位电路、选择按键输入电路、音频发生器、音频放大器和扬声器。
设计程序
#include<
reg51.h>
sbitspeaker=P2^5;
unsignedchartimer0h,timer0l,time;
//生日歌
codeunsignedcharsszymmh[]={5,1,1,5,1,1,6,1,2,5,1,2,1,2,2,7,1,4,
5,1,1,5,1,1,6,1,2,5,1,2,2,2,2,1,2,4,
5,1,1,5,1,1,5,2,2,3,2,2,1,2,2,7,1,2,6,1,2,
4,2,1,4,2,1,3,2,2,1,2,2,2,2,2,1,2,4};
//音阶频率表高八位
codeunsignedcharFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
//音阶频率表低八位
codeunsignedcharFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,8,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
voiddelay(unsignedchart)
{
unsignedchart1;
unsignedlongt2;
for(t1=0;
t1<
t;
t1++)
for(t2=0;
t2<
8000;
t2++)
;
}
TR0=0;
voidt0int()interrupt1
{
speaker=!
speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
voidsong()
delay(time);
voidmain(void)
unsignedchark,i;
TMOD=1;
//置CT0定时工作方式1
EA=1;
ET0=1;
//IE=0x82//CPU开中断,CT0开中断
while
(1)
i=0;
while(i<
75){//音乐数组长度,唱完从头再来
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
课程设计的意义及体会
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,
在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近四星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好
……通过这次课程设计之后,一定把以前所学过的知识重新温故。
通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。
.