📄 auto_music doorbell.lst
字号:
138 255-FREQ/24/1112/256,256-FREQ/24/1112%256, //1 do
139 255-FREQ/24/1248/256,256-FREQ/24/1248%256, //2 re
140 255-FREQ/24/1400/256,256-FREQ/24/1400%256, //3 mi
141 255-FREQ/24/1484/256,256-FREQ/24/1484%256, //4 fa
142 255-FREQ/24/1618/256,256-FREQ/24/1618%256, //5 suo
143 255-FREQ/24/1764/256,256-FREQ/24/1764%256, //6 la
144 255-FREQ/24/1968/256,256-FREQ/24/1968%256, //7 xi
145 };
146 unsigned char temp_TH1;
147 unsigned char temp_TL1;
148
149 // 音乐_编码2 -- IO定义 //
150 sbit PIN_MSC=P1^0; // 音乐输出端口 //
151
152 // 音乐_编码2 -- 函数原型//
153 void music_delay(unsigned char x); //音乐节拍延时
154 void music_play(unsigned char *msc); //播放音乐子程序
155
156 // 音乐_编码2 -- 函数 //
157 //---------------------------------------------------------------------------//
158 void music_int_t1 (void) interrupt 3 using 1 //定时中断1//
159 {
160 1 PIN_MSC=~PIN_MSC;
161 1 TH1=temp_TH1;
162 1 TL1=temp_TL1;
163 1 }
164
165 //---------------------------------------------------------------------------//
166 void music_delay(unsigned char n) //延时 125*n 毫秒
167 {
168 1 unsigned char i=125,j;
169 1 do {
C51 COMPILER V8.08 AUTO_MUSIC_DOORBELL 04/24/2009 16:41:45 PAGE 4
170 2 do {
171 3 for (j=0; j<230; j++) _nop_(); //j=(11159KHz/12-10)/4
172 3 }while(--i);
173 2 }while(--n);
174 1 }
175
176 //---------------------------------------------------------------------------//
177 void music_play(unsigned char *msc) //音乐
178 {
179 1 unsigned char music_freq=32; //音高
180 1 unsigned char music_long; //节拍
181 1 unsigned char music_data=0; //音符数据
182 1 bit music_up=0; //升半音
183 1 bit music_break=0; //断奏
184 1 temp_TH1=0xff;
185 1 temp_TL1=0xea; //关输出(输出超声波)
186 1 TMOD=0x11; //T0:16位定时器、T1:16位定时器
187 1 // ET0=0; //关T0定时器中断
188 1 ET1=1; //开T1定时器中断
189 1 //---------------------------------------------------------
190 1 while (*msc != 0x00)
191 1 {
192 2 music_data=*msc & 0x07;
193 2 music_long=*msc>>4;
194 2 //---------------------------------------------------------
195 2 if (music_long != 0) //是音符
196 2 {
197 3 if (*msc >=128) //需升降调
198 3 {
199 4 if (((*msc) & 0x08) == 0)
200 4 {if (music_freq >= 16) music_freq -= 16;} //音高下降
201 4 else
202 4 {if (music_freq < 48) music_freq += 16;} //音高上升
203 4 }
204 3 //---------------------------------------------------------
205 3 if (music_up==1) //升半音
206 3 {
207 4 temp_TH1=music_frequp_tab[(music_freq + (music_data <<1))];
208 4 temp_TL1=music_frequp_tab[(music_freq + (music_data <<1)+1)];
209 4 }
210 3 else //不升半音
211 3 {
212 4 temp_TH1=music_freq_tab[(music_freq + (music_data <<1))];
213 4 temp_TL1=music_freq_tab[(music_freq + (music_data <<1)+ 1)];
214 4 }
215 3 //---------------------------------------------------------
216 3 if (music_break) //断奏
217 3 {
218 4 music_delay(music_l_tab[music_long&0x07]-1);
219 4 temp_TH1=0xff;
220 4 temp_TL1=0xea;
221 4 music_delay(1);
222 4 }
223 3 else //连奏
224 3 music_delay(music_l_tab[music_long&0x07]);
225 3 }
226 2 //---------------------------------------------------------
227 2 else //是功能码
228 2 {
229 3 switch(music_data)
230 3 {
231 4 case 0x04:
C51 COMPILER V8.08 AUTO_MUSIC_DOORBELL 04/24/2009 16:41:45 PAGE 5
232 4 music_up=0; //不升半音
233 4 break;
234 4 case 0x05:
235 4 music_up=1; //升半音
236 4 break;
237 4 case 0x06:
238 4 music_break=0; //断奏
239 4 break;
240 4 case 0x07:
241 4 music_break=1; //连奏
242 4 break;
243 4 default:
244 4 break;
245 4 }
246 3 }
247 2 //---------------------------------------------------------
248 2 msc++;
249 2 }
250 1 ET1=0; //播放结束,关T1中断
251 1 PIN_MSC=1; //关输出
252 1 // temp_TH1=0xff;
253 1 // temp_TL1=0xea; //关输出(输出超声波)
254 1 // ET0=1; //开T0定时器中断
255 1 // TMOD=0x51; //T0:16位定时器、T1:16位计数器
256 1 }
257
258 //---------------------------------------------------------------------------//
259 void main(void) //示例
260 {
261 1 // 设置定时器--------------------------------------
262 1 TMOD = 0x11; // TMOD: 定时器1:模式1:16位;定时器2:模式1:16
263 1 位 //
*** ERROR C100 IN LINE 263 OF AUTO_MUSIC DOORBELL.C: unprintable character 0xCE skipped
*** ERROR C100 IN LINE 263 OF AUTO_MUSIC DOORBELL.C: unprintable character 0xBB skipped
264 1 // TCON = 0x50; // TCON: 定时器 1运行; 定时器 2运
265 1 行 //
*** ERROR C100 IN LINE 265 OF AUTO_MUSIC DOORBELL.C: unprintable character 0xD0 skipped
*** ERROR C100 IN LINE 265 OF AUTO_MUSIC DOORBELL.C: unprintable character 0xD0 skipped
266 1 // 设置并开启中断:
267 1 IP = 0x08; //中断优先寄存器IP:|D7_x |x|x
268 1 |PS|PT1|PX1|PT0|D0_PX0|//
*** ERROR C141 IN LINE 268 OF AUTO_MUSIC DOORBELL.C: syntax error near '|'
*** ERROR C202 IN LINE 268 OF AUTO_MUSIC DOORBELL.C: 'D0_PX0': undefined identifier
269 1 IE = 0x88; //中断允许寄存器
*** ERROR C141 IN LINE 269 OF AUTO_MUSIC DOORBELL.C: syntax error near '='
270 1 IE:|D7_EA|x|ET2|ES|ET1|EX1|ET0|D0_EX0|//
*** ERROR C141 IN LINE 270 OF AUTO_MUSIC DOORBELL.C: syntax error near '|'
*** ERROR C202 IN LINE 270 OF AUTO_MUSIC DOORBELL.C: 'D7_EA': undefined identifier
271 1 for (;;) {
*** ERROR C141 IN LINE 271 OF AUTO_MUSIC DOORBELL.C: syntax error near 'for'
272 2 //在此调用键盘和显示函数//
273 2 music_play(music_tab1);
274 2 music_play(music_tab2);
275 2 music_play(music_tab3);
276 2 music_play(music_tab4);
277 2 }
278 1 }
279 //---------------------------------------------------------------------------//
C51 COMPILATION COMPLETE. 0 WARNING(S), 20 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -