music.lst
来自「51写的一个定时时钟」· LST 代码 · 共 232 行
LST
232 行
C51 COMPILER V7.50 MUSIC 01/18/2001 17:29:02 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MUSIC
OBJECT MODULE PLACED IN music.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE music.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <ctype.h>
3
4 sbit spk=P1^3;
5
6 //------------------------------------------------------------------------------------
7 // Global CONSTANTS
8 //------------------------------------------------------------------------------------
9 #define uint unsigned int
10 #define uchar unsigned char
11 #define OSFREQ 6000000l /*所使用的晶振频率*/ /*所使用的晶振频率*/
12
13
14 /**************音符频率表****************/
15 uint code notefreq[]={ 523, 587, 659, 698, 784, 880, 988,
16 1047,1175,1319,1396,1568,1760,1976,
17 2093,2349,2637,2793,3136,3520,3961};
18 //uint code timreg[]={ 65058, 65110, 65157, 65178, 65217, 65252, 65283,
19 // 65297,65323,65347,65357,65377,65394,65410,
20 // 65417,65430,65441,65447,65456,65465,65473};
21 /*************音名***************/
22
23 uchar code notename[]={ 'c','d','e','f','g','a','b',
24 '1','2','3','4','5','6','7',
25 'C','D','E','F','G','A','B',0};
26
27 /*************半音频率表*****************/
28 uint code halfnotefreq[]={ 554, 622, 740, 831, 933,
29 1109,1245,1480,1161,1865,
30 2218,2489,2960,3322,3729};
31 //uint code halftimreg[]={ 65085, 65134, 65198, 65235, 65268,
32 // 65311,65335,65367,65321,65402,
33 // 65423,65436,65452,65461,65469};
34 /*************音名***************/
35 uchar code halfnotename[]={ 'c','d','f','g','a',
36 '1','2','4','5','6',
37 'C','D','F','G','A',0};
38
39 //sbit BEEP_PWR=P1^0;
40 uchar FreqSandH,FreqSandL; /*产生方波的定时器的初值*/
41 uchar timer1cnt; /*定时器延时计数 */
42 uchar timer1cntflg; /*定时器定时完成标志 */
43
44
45 /***************************************************************************************
46 函数名称: void timer0int() interrupt 1
47 功能描述: 定时器0中断用来产生方波
48 输入: 无
49 输出: 无
50 全局变量: TH0,TL0,P5
51 调用模块: 无
52 ***************************************************************************************/
53 void timer0int () interrupt 3
54 {
55 1 TH1=FreqSandH;
C51 COMPILER V7.50 MUSIC 01/18/2001 17:29:02 PAGE 2
56 1 TL1=FreqSandL;
57 1 spk^=1; // change state of P5.4
58 1 }
59
60
61 /*void delay1(unsigned char ms)
62 {
63 unsigned char j;
64 while(ms--)
65 {
66 for(j=0;j<120;j++);
67 }
68 }
69 /***************************************************************************************
70 函数名称: void delay(uchar time)
71 功能描述: 延时
72 输入: uchar time: 延时时间长度
73 输出: 无
74 全局变量: 无
75 调用模块: 无
76 ***************************************************************************************/
77 void delay2(uchar time)
78 {
79 1 uchar i;
80 1 uint j;
81 1 for(i=0;i<time;i++)
82 1 for(j=0;j<0x900;j++);
83 1 }
84
85 /***************************************************************************************
86 函数名称: void sound(uint freq)
87 功能描述:
88 输入: uint freq: 频率值
89 输出: 无
90 全局变量: OSFFEQ,FreqSandH,FreqSandL,TR0,ET0
91 调用模块: 无
92 ***************************************************************************************/
93 void Sound(uint freq)
94 {
95 1 uint timreg;
96 1 timreg=65536l-(OSFREQ/(24l*freq));
97 1 FreqSandH=timreg/256;
98 1 FreqSandL=timreg&0x00ff;
99 1 TR1=1;
100 1 ET1=1;
101 1 }
102
103
104 /***************************************************************************************
105 函数名称: void Soundoff(void)
106 功能描述: 停止发声
107 输入: 无
108 输出: 无
109 全局变量: TR0,ET0,P5
110 调用模块: 无
111 ***************************************************************************************/
112 void SoundOff(void)
113 {
114 1 TR1=0;
115 1 ET1=0;
116 1 //P5 = P5 & 0xef;
117 1 spk =1;
C51 COMPILER V7.50 MUSIC 01/18/2001 17:29:02 PAGE 3
118 1 }
119
120 /***************************************************************************************
121 函数名称: void GetFreq(uchar ch, uchar flag)
122 功能描述: 依据音名取对应的频率
123 输入: uchar ch: 音名
124 uchar flg: 全音/半音选择
125 输出: 返回频率值
126 全局变量: halfnotename[],notename[],halfnotefreq[],notefreq[]
127 调用模块: 无
128 ***************************************************************************************/
129 uint GetFreq(uchar ch,uchar flg)
130 {
131 1 uchar * pn,i=0;
132 1 uint * pf;
133 1 if(flg) {pn=halfnotename; pf=halfnotefreq;}
134 1 else {pn=notename; pf=notefreq;}
135 1 while(1)
136 1 {
137 2 if(pn[i]==0) return 0;
138 2 if(ch==pn[i]) return pf[i];
139 2 i++;
140 2 }
141 1 }
142
143 /***************************************************************************************
144 函数名称: void PORT_Init(void)
145 功能描述: 初始化I/O
146 输入: 无
147 输出: 无
148 全局变量: XBR2,P74OUT
149 调用模块: 无
150 ***************************************************************************************/
151 //void PORT_Init (void)
152 //{
153 // XBR2 = 0x40; /*使能交叉开关和弱上拉*/
154 // P74OUT |= 0xff; /*使能P6,P7推挽输出*/
155 //}
156
157 void Play(char * str)
158 {
159 1 uchar i=0,ch,halfflg=0;
160 1 uchar lasttime;
161 1 uint freq;
162 1 /*无效看门狗*/
163 1 // WDTCN = 0xde;
164 1 // WDTCN = 0xad;
165 1 // PORT_Init ();
166 1 // OSCICN=0x14; /*使用内部晶振*/
167 1 while(1)
168 1 {
169 2 for(;;i++)
170 2 {
171 3 ch=str[i]; /*允许曲谱用空格符 '|'符,换行回车等分隔以便阅读*/
172 3 if((ch==' ')||(ch=='|')||(ch=='\r')||(ch=='\n')) {i++;continue;}
173 3 if(!ch) {SoundOff(); return;} /*乐曲结束则播放完毕*/
174 3 if(ch=='#') {halfflg=1; continue;} /*半音标志*/
175 3 if(isdigit(ch)||isalpha(ch))
176 3 {
177 4 freq=GetFreq(ch,halfflg); /*从音名获取频率*/
178 4 lasttime=16;
179 4 break;
C51 COMPILER V7.50 MUSIC 01/18/2001 17:29:02 PAGE 4
180 4 }
181 3 else {halfflg=0; continue;}
182 3 }
183 2 i++;
184 2 ch=str[i]; /*从下一个符号获取额外音长符号*/
185 2 while(1)
186 2 {
187 3 if(!ch) break;
188 3 if(isdigit(ch)||isalpha(ch)) break; /*非音长符号则下次处理*/
189 3 if(ch=='-') lasttime+=8; /*额外延时一拍*/
190 3 if(ch=='.') lasttime+=4; /*额外延时半拍*/
191 3 if(ch=='_') lasttime/=2; /*下划线相当于简谱中音名下面的下划线,延时减半*/
192 3 if(ch=='=') lasttime/=4; /*双下划线相当于简谱中音名下面的双下划线,延时减为1/4*/
193 3 i++;
194 3 ch=str[i];
195 3 }
196 2 if(freq!=0) Sound(freq); /*发声*/
197 2 else SoundOff();
198 2 delay2(lasttime); /*延时*/
199 2 SoundOff();
200 2 delay2(1); /*两个引之间的间歇*/
201 2 }
202 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 415 ----
CONSTANT SIZE = 110 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 15
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?