📄 music.lst
字号:
C51 COMPILER V7.06 MUSIC 09/13/2007 01:10:09 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MUSIC
OBJECT MODULE PLACED IN music.OBJ
COMPILER INVOKED BY: C:\tools\Keil\C51\BIN\C51.EXE music.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*实验名称:放音乐
2 功能:从蜂鸣里放出音乐
3 作者:http://www.mcuprog.com
4 05-02-01
5 */
6 #include <reg52.h>
7 #include <ctype.h>
8 #pragma ot(0)
9 #define uint unsigned int
10 #define uchar unsigned char
11 #define OSFREQ 11059200 //所使用的晶振频率
12
13 /**************音符频率表****************/
14 uint code notefreq[]={ 523, 587, 659, 698, 784, 880, 988,
15
16 1047,1175,1319,1396,1568,1760,1976,
17
18 2093,2349,2637,2793,3136,3520,3961};
19 /*************音名***************/
20 uchar code notename[]={'c','d','e','f','g','a','b',
21
22 '1','2','3','4','5','6','7',
23
24 'C','D','E','F','G','A','B',0};
25 /*************半音频率表*****************/
26 uint code halfnotefreq[]={ 554, 622, 740, 831, 933,
27
28 1109,1245,1480,1161,1865,
29
30 2218,2489,2960,3322,3729};
31 /*************音名***************/
32 uchar code halfnotename[]={'c','d','f','g','a',
33
34 '1','2','4','5','6',
35
36 'C','D','F','G','A',0};
37
38 sbit BEEP_PWR=P3^5;
39 uchar FreqSandH,FreqSandL; /*产生方波的定时器的初值*/
40 uchar timer1cnt; /*定时器延时计数 */
41 uchar timer1cntflg; /*定时器定时完成标志 */
42
43 /*********定时器0用来产生方波***************/
44 void timer0int () interrupt 1
45 {
46 1 TH0=FreqSandH;
47 1 TL0=FreqSandL;
48 1 BEEP_PWR=!BEEP_PWR;
49 1 }
50
51 /**********定时器用来进行比较准确的延时************/
52 void timer1int() interrupt 3
53 {
54 1 TH1=0xe0;
55 1 TL1=0x00;
C51 COMPILER V7.06 MUSIC 09/13/2007 01:10:09 PAGE 2
56 1 timer1cnt++;
57 1 if(timer1cnt>=(OSFREQ/1500000l))
58 1 {timer1cntflg=1; TR1=0;}
59 1 }
60
61 void delay(uchar time)
62 {
63 1 uchar i;
64 1 uint j;
65 1 for(i=0;i<time;i++)
66 1 for(j=0;j<0x900;j++);
67 1 /***
68 1 uchar i;
69 1 for(i=0;i<time;i++)
70 1 {timer1cnt=0; timer1cntflg=0;
71 1 TR1=1;
72 1 while(!timer1cntflg);
73 1 }
74 1 ***/
75 1 }
76
77 void Sound(uint freq)
78 {
79 1 uint timreg;
80 1 timreg=65536-(OSFREQ/(25*freq));
81 1 FreqSandH=timreg/256;
82 1 FreqSandL=timreg&0x00ff;
83 1 TR0=1; ET0=1;
84 1 }
85
86
87 void SoundOff(void)
88 {
89 1 TR0=0; ET0=0;
90 1 BEEP_PWR=0;
91 1 }
92
93 uint GetFreq(uchar ch,uchar flg)
94 {
95 1 uchar * pn,i=0;
96 1 uint * pf;
97 1 if(flg) {pn=halfnotename; pf=halfnotefreq;}
98 1 else {pn=notename; pf=notefreq;}
99 1 while(1)
100 1 {if(pn[i]==0) return 0;
101 2 if(ch==pn[i]) return pf[i];
102 2 i++;
103 2 }
104 1 }
105
106 void Play(char * str)
107 {
108 1 uchar i=0,ch,halfflg=0;
109 1 uchar lasttime;
110 1 uint freq;
111 1 while(1)
112 1 {for(;;i++)
113 2 {ch=str[i]; //允许曲谱用空格符 '|'符,换行回车等分隔以便阅读
114 3 if((ch==' ')||(ch=='|')||(ch=='\r')||(ch=='\n')) {i++;
115 4 continue;}
116 3 if(!ch) {SoundOff(); return;} //乐曲结束则播放完毕
117 3 if(ch=='#') {halfflg=1; continue;} //半音标志
C51 COMPILER V7.06 MUSIC 09/13/2007 01:10:09 PAGE 3
118 3 if(isdigit(ch)||isalpha(ch))
119 3 {freq=GetFreq(ch,halfflg); //从音名获取频率
120 4 lasttime=16;
121 4 break;
122 4 }
123 3 else {halfflg=0; continue;}
124 3 }
125 2 i++;
126 2 ch=str[i]; //从下一个符号获取额外音长符号
127 2 while(1)
128 2 {if(!ch) break;
129 3 if(isdigit(ch)||isalpha(ch)) break; //非音长符号则下次处理
130 3 if(ch=='-') lasttime+=8; //额外延时一拍
131 3 if(ch=='.') lasttime+=4; //额外延时半拍
132 3 if(ch=='_') lasttime/=2; //下划线相当于简谱中音名下面的下划线,延时减半
133 3 if(ch=='=') lasttime/=4; //双下划线相当于简谱中音名下面的双下划线,延时减为1/4
134 3 i++;
135 3 ch=str[i];
136 3 }
137 2 if(freq!=0) Sound(freq); //发声
138 2 else SoundOff();
139 2 delay(lasttime); //延时
140 2 }
141 1 }
142
143 //编谱说明,低音(简谱中数字下面有一个点的)1234567对应的为小写cdefgab
144 //中音(简谱中数字上下都没有点的)1234567对应的也为1234567
145 //高音(简谱中数字上面有一个点的)1234567对应的为大写CDEFGAB
146 //对于降音符b或声音符#一律用#+合适的音名例如#5
147 //一个音符本身为一拍,加下划线后为半拍加等号为1/4拍 如:65_ 4= 则音6为一拍,音5为半拍,音4为1/4拍
148 //下划线或等号连续书写则音长连续变短
149 //音符后加-或.表示延长。‘-’延长一拍‘.’延长半拍多加则延长连续增加
150 void main(void)
151 {
152 1 //uint i;
153 1 TMOD=0x11; ET1=1; ET0=1; EA=1;
154 1 while(1)
155 1 {
156 2 // Play("1_1_5_5_6_6_5 4_4_3_3_2_2_1 5_5_4_4_3_3_2 5_5_4_4_3_3_21_1_5_5_6_6_5 4_4_3_3_2_2_1"); //满天
-都是小星星
157 2 Play("1_2_3_1_ 1_2_3_1_ 3_4_5 3_4_5 5=6=5=4=3_1_ 5=6=5=4=3_1_ 2_g_12_g_1"); //两只老虎
158 2 //Play("a-a1-a2--a-b1b13-2a--a-- a-33-12--a-b1b13-21--1-- 5-55432--a-b1-12123--3-- 1-1_1_1235--4-32-b3-
-2a--a-- a-66565--4-34-56543--3--1-1_1_1235--4-32-b3-2a--a--"); //山楂树
159 2 Play("5._3=2_1_5-12_3_g-5.3_23_5_1a_3_2-356.5_352._3=2_1_a32_21_a1g05.3_6562_3_50"); //学习雷锋好榜样
160 2 //Play("C-53.2_1530C-53.2_1650 5_C6_5_C05_C6_5_6_0_3_C.6_53C.6_C0C53_6_5_3_2.1_30_5_C56_C_6_5_33_1_6-60C.
-_C=5_5_2._3=5_5_6.5_6DC6_5_C6_5_33_5_C-");
161 2 // Play("3- 2_3_4_3 3- 2_3_4_3 3- 4- 3_4_5_4 4- 3-2- 3- 2_3_4_3 3- 2_3_4_3 3-4- 3_4_5_4 4- 3-2");//许巍
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -