📄 music.lst
字号:
C51 COMPILER V7.20 MUSIC 05/01/2007 17:13:37 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE MUSIC
OBJECT MODULE PLACED IN music.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE music.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************
2 //模 块 名 : PWM音乐演示程序
3 //创 建 者 : 杨 勇
4 日期 : 2007年4月29日 23:10
5 //修 改 者 :
6 日期 :
7 //功能描述 :
8 //其他说明 : 22.1184MHz晶振
9 //芯片型号 : AT89S52
10 //配 置 :
11 //版 本 : V1.0
12 ********************************************************************/
13
14
15
16 #include <reg52.h>
17 #include <intrins.h>
18
19 #define uint unsigned int
20 #define uchar unsigned char
21
22 //本例采用89C52, 晶振为 22.1184MHzMHZ
23 //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
24 //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
25
26 unsigned char n=0; //n为节拍常数变量
27 unsigned char code music_tab[] ={
28 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
29 0x20, 0x40, 0x1C , 0x10,
30 0x18, 0x10, 0x20 , 0x10,
31 0x1C, 0x10, 0x18 , 0x40,
32 0x1C, 0x20, 0x20 , 0x20,
33 0x1C, 0x20, 0x18 , 0x20,
34 0x20, 0x80, 0xFF , 0x20,
35 0x30, 0x1C, 0x10 , 0x18,
36 0x20, 0x15, 0x20 , 0x1C,
37 0x20, 0x20, 0x20 , 0x26,
38 0x40, 0x20, 0x20 , 0x2B,
39 0x20, 0x26, 0x20 , 0x20,
40 0x20, 0x30, 0x80 , 0xFF,
41 0x20, 0x20, 0x1C , 0x10,
42 0x18, 0x10, 0x20 , 0x20,
43 0x26, 0x20, 0x2B , 0x20,
44 0x30, 0x20, 0x2B , 0x40,
45 0x20, 0x20, 0x1C , 0x10,
46 0x18, 0x10, 0x20 , 0x20,
47 0x26, 0x20, 0x2B , 0x20,
48 0x30, 0x20, 0x2B , 0x40,
49 0x20, 0x30, 0x1C , 0x10,
50 0x18, 0x20, 0x15 , 0x20,
51 0x1C, 0x20, 0x20 , 0x20,
52 0x26, 0x40, 0x20 , 0x20,
53 0x2B, 0x20, 0x26 , 0x20,
54 0x20, 0x20, 0x30 , 0x80,
55 0x20, 0x30, 0x1C , 0x10,
C51 COMPILER V7.20 MUSIC 05/01/2007 17:13:37 PAGE 2
56 0x20, 0x10, 0x1C , 0x10,
57 0x20, 0x20, 0x26 , 0x20,
58 0x2B, 0x20, 0x30 , 0x20,
59 0x2B, 0x40, 0x20 , 0x15,
60 0x1F, 0x05, 0x20 , 0x10,
61 0x1C, 0x10, 0x20 , 0x20,
62 0x26, 0x20, 0x2B , 0x20,
63 0x30, 0x20, 0x2B , 0x40,
64 0x20, 0x30, 0x1C , 0x10,
65 0x18, 0x20, 0x15 , 0x20,
66 0x1C, 0x20, 0x20 , 0x20,
67 0x26, 0x40, 0x20 , 0x20,
68 0x2B, 0x20, 0x26 , 0x20,
69 0x20, 0x20, 0x30 , 0x30,
70 0x20, 0x30, 0x1C , 0x10,
71 0x18, 0x40, 0x1C , 0x20,
72 0x20, 0x20, 0x26 , 0x40,
73 0x13, 0x60, 0x18 , 0x20,
74 0x15, 0x40, 0x13 , 0x40,
75 0x18, 0x80, 0x00
76 };
77
78
79 void Music_Play(void);
80 void delay (unsigned char m);
81 void delayms(unsigned char a);
82
83
84 /*=============================================================================
85 //函 数 名: void Music_Play(void)
86 //参 数: 无
87 //返 回 值: 无
88 //函数功能: 音乐播放函数
89 //编 写 者: 杨 勇
90 //编写日期: 2007年4月29日 23:12
91 ===============================================================================*/
92 void Music_Play(void)
93 {
94 1 uchar p,m; //m为频率常数变量
95 1 uchar i=0;
96 1 TMOD&=0x0f;
97 1 TMOD =0x01;
98 1 TH0=0xc6;
99 1 TL0=0xb6;
100 1 IE=0x82;
101 1
102 1 play:
103 1 while(1)
104 1 {
105 2 a: p=music_tab[i];
106 2 if(p==0x00)
107 2 {
108 3 i=0;
109 3 delayms(2000);
110 3 goto play;
111 3 } //如果碰到结束符,延时1秒,回到开始再来一遍
112 2 else
113 2 if(p==0xff)
114 2 {
115 3 i=i+1;
116 3 delayms(200);
117 3 TR0=0;
C51 COMPILER V7.20 MUSIC 05/01/2007 17:13:37 PAGE 3
118 3 goto a;
119 3 } //若碰到休止符,延时100ms,继续取下一音符
120 2 else
121 2 {
122 3 m=music_tab[i++];
123 3 n=music_tab[i++];
124 3 } //取频率常数 和 节拍常数
125 2 TR0=1; //开定时器1
126 2 while(n!=0)
127 2 {
128 3 P3 |=0x40;
129 3 delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)
130 3 P3 &=0xbf;
131 3 delay(m);
132 3 }
133 2 TR0=0; //关定时器1
134 2 }
135 1 }
136
137
138 /*=============================================================================
139 //函 数 名: void int0() interrupt 1
140 //参 数: 无
141 //返 回 值: 无
142 //函数功能: 定时器0中断服务函数
143 //编 写 者: 杨 勇
144 //编写日期: 2007年4月29日 23:16
145 ===============================================================================*/
146 void int0() interrupt 1 //采用中断0 控制节拍
147 {
148 1 TH0=0xc6;
149 1 TL0=0xb6;
150 1 n--;
151 1 }
152
153 /*=============================================================================
154 //函 数 名: void delay (unsigned char m)
155 //参 数: 无
156 //返 回 值: 无
157 //函数功能: 延时函数
158 //编 写 者: 杨 勇
159 //编写日期: 2007年4月29日 23:17
160 ===============================================================================*/
161 void delay (unsigned char m) //控制频率延时
162 {
163 1 unsigned i=3*m;
164 1 while(--i);
165 1 }
166
167 /*=============================================================================
168 //函 数 名: void delay (unsigned char m)
169 //参 数: 无
170 //返 回 值: 无
171 //函数功能: 延时函数
172 //编 写 者: 杨 勇
173 //编写日期: 2007年4月29日 23:17
174 ===============================================================================*/
175 void delayms(unsigned char a) //豪秒延时子程序
176 {
177 1 while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
178 1 }
179
C51 COMPILER V7.20 MUSIC 05/01/2007 17:13:37 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 130 ----
CONSTANT SIZE = 191 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -