⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir_yinyue.lst

📁 红外遥控音乐的播放
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -