📄 ir_yinyue.lst
字号:
276 0XCC,0XC2,0XB2,
277 0X16,0XC2,0X72,0X52,0X42,0X42,
278 0X3C,0X32,0X32,
279 0X26,0X22,0X24,0X42,0X32,
280 0x22,0x12,0x18,0x02,0x52,
281 0X46,0X12,0X44,0X72,0X82,
282 0X5C,0X52,0X52,
283 0X46,0X42,0X74,0X42,0X32,
284 0X36,0X42,0X58,
285 0X82,0X72,0X62,0X52,0X46,0X32,
286 0X3C,0X12,0XB2,
287 0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
288 0XC6,0X12,0XC4,0X12,0XC2,
289 0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
290 0X48,0X02,0X42,0X52,0X62,
291 0X76,0X82,0X74,0X82,0X72,
292 0X56,0X41,0X38,0X32,0X22,
293 0X16,0XC2,0X72,0X52,0X42,0X42,
294 0X3C,0X04,0X04,0X04,0X04,
295 0xFF};
296 //第十二首
297 unsigned char code song12[]={
298 0x34,0x32,0x34,0x34,0x24,0x34,0x32,0x32,0x24,0x38,0x44,0x58,0x48,
299 0x34,0x32,0x34,0x34,0x24,0x38,0x34,0x7F,0x34,0x32,0x34,0x32,
300 0x24,0x38,0x34,0x24,0x38,0x44,0x58,0x48,0x34,0x32,0x34,0x34,
301 0x24,0x38,0x34,0x7F,0x16,0x4C,0x74,
302 0x78,0x64,0x54,0x48,0x54,0x64,0x58,0x44,0x34,0x24,0x38,0x24,
303 0x14,0x12,0x21,0x11,0x78,0x68,0x3F,0x4C,0x74,
C51 COMPILER V7.06 IR_YINYUE 11/06/2006 10:20:13 PAGE 6
304 0x78,0x64,0x52,0x42,0x48,0x54,0x64,0x58,0x44,0x34,0x24,0x38,0x24,
305 0x24,0x38,0x44,0x58,0x48,0x3C,
306 0xFF};
307
308 unsigned char code* code songs[]={song1,song2,song3,song4,song5,song6,
309 song7,song8,song9,song10,song11,song12}; //指向12首歌
310
311
312
313 unsigned char code yin[30]={0xFF,0xFF,0xFB,0x90,0xFC,0x0C,0xFC,0x44,0xFC,0xAC,0xFD,0x09,0xFD,0x34,
314 0xFD,0x82,0xFD,0xC8,0xFE,0x06,0xFE,0x22,0xFA,0X15,0XFB,0x04,0xFA,0x67,0xFE,0x85}; //C调
-各音符频率与计数初值T的对照表
315
316
317 //0.9ms
318 void delay0_9ms(void)
319 {
320 1 unsigned char j,k;
321 1 for(j=18;j>0;j--)
322 1 for(k=20;k>0;k--) ;
323 1 }
324
325 //1ms
326 void delay1ms(void)
327 {
328 1 unsigned char i,j;
329 1 for(i=2;i>0;i--)
330 1 for(j=230;j>0;j--) ;
331 1 }
332
333 //4.5ms
334 void delay4_5ms(void)
335 {
336 1 unsigned char i,j;
337 1 for(i=10;i>0;i--)
338 1 for(j=225;j>0;j--) ;
339 1 }
340
341 //100ms
342 void delay100ms(void)
343 {
344 1 unsigned char i,j,k;
345 1 for(i=200;i>0;i--)
346 1 for(j=20;j>0;j--)
347 1 for(k=10;k>0;k--) ;
348 1 }
349
350
351 /*延时1/4拍时间即187ms*/
352 void delay187ms()
353 /*
354 {
355 unsigned char i,j,k;
356 for(i=200;i>0;i--)
357 for(j=20;j>0;j--)
358 for(k=15;k>0;k--) ;
359 }
360 */
361
362 {
363 1 unsigned char i,j;
364 1 for(i=255;i>0;i--)
C51 COMPILER V7.06 IR_YINYUE 11/06/2006 10:20:13 PAGE 7
365 1 {
366 2 for(j=120;j>0;j--)
367 2 {
368 3 if(IR_OK==1) {break;}
369 3 }
370 2 }
371 1 }
372
373
374
375 void t0(void) interrupt 0 using 2 //外部中断0的函数
376 {
377 1 unsigned char i,j,k;
378 1 EA=0; //暂时关闭CPU的所有中断请求
379 1
380 1 for(k=0;k<10;k++) //重复10次,目的是检测在9毫秒内如果出现高电平就退出解码程序
381 1 { //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
382 2
383 2 delay0_9ms(); //延时0.9毫秒
384 2 if (IR==1) {k=10;break;} //延时0.9毫秒后判断P3.2脚是否出现高电平如果有就退出解码程序
385 2 else if(k==9) //重复10次?
386 2 { //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
387 3 while(IR==0); //等待高电平避开9毫秒低电平引导脉冲
388 3 delay4_5ms(); //延时4.5毫秒避开4.5毫秒的结果码
389 3
390 3
391 3 /********************************************
392 3 //26位的用户码,前13位数据码,后13位数据反码
393 3 *********************************************/
394 3 for(j=1;j<=26;j++)//每组数据为26位
395 3 {
396 4 while(IR==0); //
397 4 delay0_9ms();
398 4 if(IR==1)
399 4 {
400 5 delay1ms();
401 5 dm=dm|0x2000000; //因为是26位,一个"1",后面25个"0",转化二进制即为"1000000
-"
402 5 if(j<26) dm=dm>>1; //数据"1",右移一个"1",一共25次
403 5 }
404 4 else if(j<26) dm=dm>>1; //数据"0",一共25次
405 4 }
406 3 bb=dm;
407 3 dm=0;
408 3
409 3
410 3
411 3 /***************************************************
412 3 //16位的用户码,前8位数据码,后8位数据反码
413 3 ****************************************************/
414 3
415 3 for(i=0;i<2;i++)
416 3 {
417 4 for(j=1;j<=8;j++)//每组数据为26位
418 4 {
419 5 while(IR==0); //
420 5 delay0_9ms();
421 5 if(IR==1)
422 5 {
423 6 delay1ms();
424 6 dm=dm|0x80;
425 6 if(j<8) dm=dm>>1; //数据"1",右移一个"1",一共7次
C51 COMPILER V7.06 IR_YINYUE 11/06/2006 10:20:13 PAGE 8
426 6 }
427 5 else if(j<8) dm=dm>>1; //数据"0",一共7次
428 5 }
429 4 aa[i]=dm;
430 4 dm=0;
431 4 }
432 3
433 3 /***************************************************
434 3 //解码成功的话,蜂鸣器叫一声
435 3 ****************************************************/
436 3 if(aa[0]==~aa[1]) //验证成功
437 3 {
438 4 IR_OK=1;
439 4 sound=0;
440 4 delay100ms();
441 4 sound=1;
442 4 }
443 3
444 3 } //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
445 2 } //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
446 1 EA=1;
447 1 }
448
449
450 /*每个音符的发声*/
451 void timer0() interrupt 1 using 1 //定时器T0
452 {
453 1 TH0=yin[2*l];
454 1 TL0=yin[2*l+1];
455 1 SPK = !SPK;
456 1
457 1 }
458
459
460
461
462 void sing_song()
463 {
464 1 unsigned int data j; //取码指针
465 1 unsigned char data i; //用于循环
466 1 unsigned char data k; //几个1/4拍
467 1 IR_OK=0; //不能少掉!!!!
468 1 song=songs[song_number];
469 1 j=0;
470 1 while(*(song+j)!=0xFF) //是否取到结束码
471 1 {
472 2 if(IR_OK==1){break;} //这一句很重要的!!!!!
473 2 k=*(song+j)&0x0F; //后4位为多少个1/4拍
474 2 l=*(song+j)>>4; //song(song+j)[]中所放的每个字节
475 2 //前4位乘2表示为音符频率在数组yin[]中的位置
476 2
477 2 TH0=yin[2*l]; //置初值
478 2 TL0=yin[2*l+1];
479 2 TR0=1; //起动定时器0
480 2 if ((yin[2*l]==0xff)&&(yin[2*l+1]==0xff)) //如果取到的都是休止符,则不输出音频
481 2 {
482 3 TR0=0;SPK=1;
483 3 }
484 2 for(i=k;i>0;--i) //节拍K为多少就执行多少个1/4拍
485 2 { delay187ms(); }
486 2 TR0=0;
487 2 j++;
C51 COMPILER V7.06 IR_YINYUE 11/06/2006 10:20:13 PAGE 9
488 2 } //回22222
489 1 } //回xxxxxx
490
491
492
493 void main()
494 {
495 1
496 1 EA=1; //总中断
497 1 TMOD=0x01; //timer0工作在方式1
498 1 IT0=1; //外部中断0触发方式控制位,下降沿触发
499 1 ET0=1; //允许定时器T0中断
500 1 EX0=1; //外部中断0(INT0)中断允许位
501 1 IP=0x01; //定义外部中断0优先于定时器中断的优先级
502 1
503 1 dm=0;
504 1 P2=0xc0;
505 1 P1=0x00;
506 1
507 1 while(1)
508 1 {
509 2 if(IR_OK==1)
510 2 { if(aa[0]==0x11)
511 3 {song_number=0;P1=0x00;P2=0xf9;sing_song();} //显示并演奏第1首
512 3 else if(aa[0]==0x12)
513 3 {song_number=1;P1=0x00;P2=0xa4;sing_song();} //显示并演奏第2首
514 3 else if(aa[0]==0x13)
515 3 {song_number=2;P1=0x00;P2=0xb0;sing_song();} //显示并演奏第3首
516 3 else if(aa[0]==0x14)
517 3 {song_number=3;P1=0x00;P2=0x99;sing_song();} //显示并演奏第4首
518 3 else if(aa[0]==0x15)
519 3 {song_number=4;P1=0x00;P2=0x92;sing_song();} //显示并演奏第5首
520 3 else if(aa[0]==0x16)
521 3 {song_number=5;P1=0x00;P2=0x82;sing_song();} //显示并演奏第6首
522 3 else if(aa[0]==0x17)
523 3 {song_number=6;P1=0x00;P2=0xf8;sing_song();} //显示并演奏第7首
524 3 else if(aa[0]==0x18)
525 3 {song_number=7;P1=0x00;P2=0x80;sing_song();} //显示并演奏第8首
526 3 else if(aa[0]==0x19)
527 3 {song_number=8;P1=0x00;P2=0x90;sing_song();} //显示并演奏第9首
528 3 else if(aa[0]==0x10)
529 3 {song_number=9;P1=0x00;P2=0x88;sing_song();} //显示并演奏第10首
530 3 else if(aa[0]==0x1a)
531 3 {song_number=10;P1=0x00;P2=0x83;sing_song();} //显示并演奏第11首
532 3 else if(aa[0]==0x1b)
533 3 {song_number=11;P1=0x00;P2=0xc6;sing_song();} //显示并演奏第12首
534 3 else{sound=0;delay100ms();sound=1;delay100ms();
535 4 sound=0;delay100ms();sound=1;P1=0x00;P2=0xb6;} //蜂鸣器叫,表明没有歌啦
536 3 }
537 2 }
538 1 }
539
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 666 ----
CONSTANT SIZE = 1389 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 1
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
C51 COMPILER V7.06 IR_YINYUE 11/06/2006 10:20:13 PAGE 10
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -