原作者链接:http://blog.sina.com.cn/s/blog_bf63e2650102wibs.html
如若侵犯原作者,请及时联系本人,本人立刻删除
单片机产生音乐的原理:
通常,利用单片机的内部定时器0,工作在方式一下,改变计数初始值TH0和TL0来产生不同的率。
音频 | 定时器初值 |
低1do | 63628 |
低2re | 63835 |
低3mi | 64021 |
低4fa | 64103 |
低5so | 64260 |
低6la | 64400 |
低7si | 64524 |
中1do | 64580 |
中2re | 64684 |
中3mi | 64777 |
中4fa | 64820 |
中5so | 64898 |
中6la | 64968 |
中7si | 65030 |
高1do | 65058 |
高2re | 65110 |
高3mi | 65157 |
高4fa | 65160 |
高5so | 65217 |
高6la | 65252 |
高7si | 65282 |
#include"STC12C5A.h"
int tab[]={64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65282}; //网上找到的音符与定时器初值对照表中的数据,用来设定时器0初值
sbit bell=P1^3;//位定义蜂鸣器
int i; //用于赋定时器0初值
void delay_ms(unsigned int time)
{
}
void Timer0_init()
{
}
void Timer0_Isp() interrupt 1
{
}
//放音符的数组前面记得加个code,延迟时间凭乐感吧!要关掉蜂鸣器貌似蜂鸣器跟定时器都要关哦,歌曲暂停与播放,强烈推荐用外部中断!
void main()
{
i=4;
}
如果我们能够控制好频率和节拍,那就有可能演奏出动听的音乐。因此,我们首先需要搞清楚各音调的频率,具体见下表(分别为低音、中音和高音):
这里我们具体以《欢乐颂》为例:
第一,普通音符。如第一个音符3 ,对应频率350 ,占1 拍。
第二,带下划线音符,表示0.5 拍; 两个下划线是四分之一拍(0.25)。
第三,有的音符后带一个点,表示多加0.5 拍,即1+0.5。
第四,有的音符后带一个“ —” ,表示多加1 拍,即1+1。
第五,有的两个连续的音符上面带弧线,表示连音,可以稍微改下连音后面那个音的频率,比如减少或增加一些数值(需自己调试),这样表现会更流畅,其实不做处理,影响也不大。
1.
2.
3.
4.
5.
6.
7.
8.
9.
10. #define NTDL1 147
11. #define NTDL2 165
12. #define NTDL3 175
13. #define NTDL4 196
14. #define NTDL5 221
15. #define NTDL6 248
16. #define NTDL7 278
17.
18. #define NTDH1 589
19. #define NTDH2 661
20. #define NTDH3 700
21. #define NTDH4 786
22. #define NTDH5 882
23. #define NTDH6 990
24. #define NTDH7 112
25. //列出全部D调的频率
26.
27. #define WHOLE
28. #define HALF
29. #define QUARTER
30. #define EIGHTH
31. #define SIXTEENTH
32. //列出所有节拍
33. int tune[]=
34. {
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51. };
52. float durt[]=
53. {
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70. };
71. int length;
72. int tonepin=6;
73. void setup()
74. {
75.
76.
77. }
78. void loop()
79. {
80.
81.
82.
83.
84.
85.
86.
87. }