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

📄 yinyue.lst

📁 用AT89S52做的音乐盒
💻 LST
字号:
C51 COMPILER V8.02   YINYUE                                                                03/11/2002 19:47:50 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE YINYUE
OBJECT MODULE PLACED IN yinyue.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE yinyue.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1           #include <c8051f330.h>
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          #include <ctype.h>
   5          #pragma ot(0)
   6          sbit sound=P1^0;
   7          #define OSFREQ 24500000                             /*所使用的晶振频率*/ 
   8          //uchar code string1[]=("g=a=1=a=|11=2=3=2=3g=a=1=a=|1=1_1=2_3=2=2g=a=1=a=|11=2=3=2=3g=a=1=a=|1=1_1=2_6=5=
             -53_5_|5_5_5_6=C=C=6._0_5=3=|2=2=2=3=2_1=3=3=5._0_3=5=|5_5_5_6=C=C=6._0._3=|3_2_2_6=5=55=6=C=6=|CC=6_5=6_C=3=3_0=3=|3=2=2
             -=2=2_1=3=3=2._5=6=C=6=|CC=6_5=6_C=3=3_0=3=|3_2_03_3_2_3_|2._1=1--|  5=6=C=D=|E._E=E=E=E_D.D=D=G=D_|C._C=C=D=E=C=6_D=7=7=
             -7=C_|C5=6=C=D=|E._E=E=G=E_D._D=D=G=D_|C0_6=6=7_C_C|C---|  5=6=C=D=|E._E=E=G=E_D._D=D=G=D_|C._C=C=D=E=C=6_D=7=7=7=C_|C5=6
             -=C=D=|E._E=E=G=E_D._D=D=G=D_|C0_6=6=7_C_C|C---|  0_5=5=5=6=C=E=E_5=5=5=6=C=D=D0=D=E=D|=D=C=C=C=C=G=D=E=E._E=E=D=D=E=D=C=
             -C=D=D_C_A=A=G=E=C=0=6=6=E=E=D=C=C=C=6=C=D=0_5=5=5=6=C=D=D_5=5=6=C=D=D0=D=D=E=D=C=C=D=D=5=A=6=G=D=C=0=6=6=E|=3=D=C=6=6=5=
             -6=D=D_C.");//吻别  很爱很爱你  认真的雪
   9          //uchar code string2[]=("3_5.6._C=6_5_6_5_6.C=6_56_5_3_2_3-2._3_2_1_2._3=2_1|3_5_C_7_6-a._1=a_g_a._1=a_g_a
             -_1-2_1_a-2._3=2_1_2._3=2_1_2_1_1_2_3-6_6_5_3_2_3_5_6_5_3_2_3-2_2_1_a_g_a_1|_2_1a_g_a-|a1ag|a1_2_3-|6_6_6_5=6=6.6=6=6_5_2
             -_3_3-a1aga1_2_3-2_2_2_1=2=2.3=5=C_7_6__6-6._C=6_5=6._C=6_5_|6_5_6_5_3-6_6_5_3_2_3_5_C_7_6_5_6-6._C=6_5_6-6_5_6_5_3-2._3=
             -2_1_2-3_5_3_2_33_5_6._C=6_5_|_6_5_6_53-|2_2_3_2_a_g_a---a1236._C=6_5_6._C_5_6_5_6_5_3-66_5_3_2_3_5_C_7_6_5_6-C7656---6--
             --");//中国人 
  10          //uchar code string3[]=("C3_2=1=132=113_2_3_1_3_6=5=5.3=5=6_6=5=5_6=5=53=2_1_2_2=3=2_123_3_213_2=1=13_2_3_
             -1_1=6_6_5=5.3=5=6_6_C_6=5=53=2=2_1_22=1=3=2=23_3_211.  5_6=C=6=5=3=5=3_2.1_1=25_3_2=3=1.5_3=5=6._5=3_5_32._1=a_g_1---1_1
             -2=35_53_2._1=a_g_1_a5_C_6._5=3_5_a1_1=25_3_2._3=1=2=1=a=g---"); //老鼠爱大米  浏阳河
  11          //uchar code string4[]=("3_3=5=3_2_3_2_1_2_2=3=e_g_a-3_3=5=3_2_3_6_5_3=5=2-203_6_5_3=5=6.a._a._3_2_1_=2=3-
             -a_3_=3=2_1_3_5_5_2_3-303_3=5=3_2_32_1_2_2=3=e_g_a-3_3=5=3_2_3_6_5_3=5=2-203_6_5_3=5=6.a_a_3_2_1=2=3-a_3=3=2_1_3_5_g_a-3_
             -6=6=63_6=6=63_6_5_3=5=6-a_2=2=2a_5_3_2_3-3_6_5_3=2_1_2=3=23_5_5_1_2-3_6_5_3=2=1_2=3=22_5=5=5_g_a-3_5=5=5_3=5=6-6-    |5_
             -5=5=5=C._5._C=C=D=E=D=|7._6=7=6=5_(C=7=5=2=2_0=)5=|D_D=D=D=D_D=D_6_6=5=3=5=|5=5_4=404_5_|6._6=6=6=C_70_6_|5_5_5=D_C=C0=6
             -7=|C._C=C=D=E_D._D=C_7_|C---|C._C=C=D=E_D._D=D=C_7=|D._C=C-5=6=C=D=|E._E=E=G=E_D._D=D=G=D_|C._C=C=D=E=C=6_D=7=7=7=C_|C5=
             -6=C=D=|E._E=E=G=E_D._D=D=G=D_|C0_6=6=7_C_C|C---|");   //无聊的游戏 很爱很爱你
  12          uchar code string5[]=("0=G=G=E=D=E=6_D=E=G=E=D0=G=G=E=D=E=5_D=E=G=D=C0=C=D=E=G=A=G=E=G=E=E=D=D0=C=D=C=D_C=
             -D=D=E_G=E=E._0=G=G=E=D=E=A_D=E=G=E=D0=G=G=E=D=E=G_D=E=G=D=C0=C=D=E=G=A=G=E=G=E=E=D=D._G=E_D=D=D_C_C-  0=5=6=C=E=E=E=E=E.
             -_D=D_C_0_6=C=DD=E_5=50=5=5=6=C=C=C=C=C=6._D.=E=D=C=G=A=C_C=C=C=6=6=C=D0=5=6=C=E=E=E=E=E._D=D_C_0_A=C=DD=E_5=50=5=5=6=C=C
             -=C=C=C=C-6._D._E=D=C=5=6=C_C=C=C=6=6=C=D.C_C--   "); /* /青花瓷  一万个理由  */
  13          //uchar code string6[]=("22_3_1g_g_2_1_2_3_10_3_4_3_1_2_20_3_4_3_1_1_1b2_2_2_3_1g_g_2_1_2_3_10_3_4_3_1_2_2
             -0_3_4_3_4_5_5g_a_12_3_53_5_6_7_6_5_32_3_5_33_2_3_2_1_g-0g_a_12_3_53_5_6_7_6_5_32_3_5_33__2_3_2_1_g---g---06_5.2_3_300006
             -_5.2_3_3_3_3=2=1_1-06_5.7_7_70_7_C7_6_6-00g--g_a_g--- ");  //super star  
  14          //uchar code string7[]=("5._3=2_1_5-12_3_g-5.3_23_5_1a_3_2-356.5_352._3=2_1_a32_21_a1g05.3_6562_3_50  a-a1
             --a2--a-b1b13-2a--a--a-33-12--a-b1b13-21--1--5-55432--a-b1-12123--3--1-1_1_1235--4-32-b3-2a--a--a-66565--4-34-56543--3--1
             --1_1_1235--4-32-b3-2a--a--   C-53.2_1530C-53.2_1650 5_C6_5_C05_C6_5_6_0_3_C.6_53C.6_C0C53_6_5_3_2.1_30_5_C56_C_6_5_33_1_
             -6-60C._C=5_5_2._3=5_5_6.5_6DC6_5_C6_5_33_5_C-  3- 2_3_4_3 3- 2_3_4_3 3- 4- 3_4_5_4 4- 3-2-  3- 2_3_4_3 3- 2_3_4_3 3-4- 3
             -_4_5_4 4- 3-2");       /*学习雷锋好榜样 山楂树  团结就是力量   许巍-星空前奏*/
  15          //uchar code string8[]={"c_1_5_5_6_6_54_4_3_3_2_2_15_5_4_4_3_3_25_5_4_4_3_3_21_1_5_5_6_6_54_4_3_3_2_2_1  1
             -_2_3_1_1_2_3_1_3_4_5 3_4_55=6=5=4=3_1_5=6=5=4=3_1_2_g_12_g_1                    543 3_2_1_2_30 g53 3_2_1_2_30 a65 4_3_2_
             -3_4 1 b a g  g_g_ag  1b- g_g_ag  21-  g_g_53  1ba 004_4_  312  1--1  "};/* 满天都是小星星 两只老虎 许巍-时光  生日快乐*/
             - 
  16          //uchar code string9[]=("e=a_b=1=1.0=2=|b_a_g=a._3C_7=C=|6._e=a_b=1=1.0=2=|b_a=g=g=2_3=30_1=2=|3_3_2=1_2=2
             -0_b=1=|2_2_b_g=a=a.0=e=|f_1=1=1._2=b_a_g=a_b=|b-0(E_D_)|0=1=1=2=|3_3_2=1_2=20=2=2=3=|4_4_3=2_3=3_0_0_3=4=|5_5=4=4=2_6=6=
             -5=5=4=4_3=1=|1_1=2=3=2=20=1=1=2=|3_3_2=1_2=20=2=2=3=|4_4_3=2_3=30_3=4=|5_5_4_3=6=6=5=5=4=4=3=3_|1--b._a=|a1_b_1.2|b=a=g_
             -g00|ab_1_1.2|b5-|  |D_D_D_C_C0_C_|7_7_7_7_C7_5_|6_6_6_5_66_5_|6_6_6_E_D0_C_|D_D_D_C_C0_C_|7_7_7_7_C._7=7_5_|6._5=1-0_2=3
             -=|4_3_1_4_4_3_0_1_|1---|");//一千个伤心的理由 
  17          
  18          /**************音符频率表****************/
  19          uint code notefreq[]={  523, 587, 659, 698, 784, 880, 988,
  20                                  1047,1175,1319,1396,1568,1760,1976,
  21                                  2093,2349,2637,2793,3136,3520,3961};
  22          /*************音名***************/
C51 COMPILER V8.02   YINYUE                                                                03/11/2002 19:47:50 PAGE 2   

  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          /*uint code halfnotefreq[]={  554, 622, 740, 831, 933,
  28                                      1109,1245,1480,1161,1865,
  29                                      2218,2489,2960,3322,3729};*/
  30          /*************音名***************/
  31          /*uchar code halfnotename[]={ 'c','d','f','g','a',
  32                                      '1','2','4','5','6',
  33                                      'C','D','F','G','A',0};*/
  34            uint  n1,n2;                         /*产生方波的定时器的初值*/
  35           void main(void)
  36          { 
  37   1        SYSCLK_Init ( );
  38   1        PORT_Init( );
  39   1        TMOD=0x01;                                     //设定T0为方式1(16位计数)
  40   1        //delay(10);
  41   1         EA=1;
  42   1         ET0=1;
  43   1         TR0=1;               
  44   1         TH0 = 0x3C;
  45   1         TL0 = 0xB0;
  46   1        while(1)
  47   1        {
  48   2         Play(string5);
  49   2         }
  50   1          
  51   1              }
  52          //      while(1); 
  53          
  54          
  55          void delay (uint x)
  56          {
  57   1              uint a;
  58   1              uint b;
  59   1              for(a=x;a>0;a--)
  60   1                 for(b=250;b>0;b--);
  61   1      }
  62          
  63          
  64          void Sound(uint freq)                             // 发声
  65          {
  66   1          uint timreg;
  67   1          timreg=65536-(OSFREQ/(24*freq));
  68   1      //      delay(1);
  69   1          n2=timreg/256;
  70   1          n1=timreg&0x00ff;
  71   1              TL0=n1;
  72   1              TH0=n2; 
  73   1              TR0=1;
  74   1          ET0=1;
  75   1      }
  76          void SoundOff(void)                               // 停止发声
  77            { //  TR0=0;            
  78   1            ET0=0;
  79   1            sound=0;
  80   1        }                               //1111 0111
  81          uint GetFreq(uchar ch)                            // 依据音名取对应的频率
  82          {
  83   1          uchar * pn,i=0;
  84   1          uint * pf;  
C51 COMPILER V8.02   YINYUE                                                                03/11/2002 19:47:50 PAGE 3   

  85   1           pn=notename;     
  86   1               pf=notefreq;           
  87   1          while(1)
  88   1          {
  89   2              if(pn[i]==0)     return 0;
  90   2                  if(ch==pn[i])  return pf[i];
  91   2              i++;
  92   2                      
  93   2          }
  94   1      }
  95          
  96           void Play(char * str)
  97          {
  98   1          uint j=0,ch;
  99   1          uint lasttime;
 100   1          uint freq;
 101   1          while(1)
 102   1          {
 103   2                  for(;;j++)
 104   2              {
 105   3                  ch=str[j];                            /*允许曲谱用空格符 '|'符,换行回车等分隔以便阅读*/
 106   3                  if((ch==' ')||(ch=='|')||(ch=='\r')||(ch=='\n')) {j++;continue;}
 107   3                  if(!ch) 
 108   3                              { SoundOff();
 109   4                               return;
 110   4                               }         /*乐曲结束则播放完毕*/
 111   3                  if(isdigit(ch)||isalpha(ch))
 112   3                  {
 113   4                      freq=GetFreq(ch);                 /*从音名获取频率*/
 114   4                      lasttime=256;
 115   4                      break;
 116   4                  }
 117   3              }
 118   2              j++;
 119   2              ch=str[j];
 120   2      //              delay(10);                               /*从下一个符号获取额外音长符号*/
 121   2              while(1)
 122   2              {
 123   3                  if(!ch) break;
 124   3                  if(isdigit(ch)||isalpha(ch)) break;   /*非音长符号则下次处理*/
 125   3                  if(ch=='-') lasttime +=8;             /*额外延时一拍*/
 126   3                  if(ch=='.') lasttime +=4;              /*额外延时半拍*/
 127   3                              if(ch=='_') lasttime /=2;              /*下划线相当于简谱中音名下面的下划线,延时减半*/
 128   3                              if(ch=='=') lasttime /=4;              /*双下划线相当于简谱中音名下面的双下划线,延时减为1/4*/
 129   3                  j++;
 130   3                  ch=str[j];
 131   3      //                      break;
 132   3              }
 133   2              if(freq!=0) 
 134   2                         Sound(freq);                  /*发声*/
 135   2               else        
 136   2                          SoundOff();   //它是为了播放结束
 137   2             delay(lasttime);                         /*延时*/
 138   2              SoundOff();
 139   2             delay(5);
 140   2                                                        /*两个引之间的间歇*/
 141   2         }
 142   1      }
 143          void SYSCLK_Init (void)
 144           { PCA0MD &= ~0x40;
 145   1         OSCICN = 0x83;  //内部时钟不分频;                   
 146   1         RSTSRC  = 0x04;                     
C51 COMPILER V8.02   YINYUE                                                                03/11/2002 19:47:50 PAGE 4   

 147   1        }
 148           void  PORT_Init(void)
 149           { XBR0=0x00;                     
 150   1         XBR1=0x40;                                           
 151   1         P0MDOUT=0xff;
 152   1         P1MDOUT=0xff;
 153   1       }
 154            
 155           
 156          
 157          void time0_int (void) interrupt 1
 158          { 
 159   1         ET0=0;
 160   1         TR0=0;
 161   1         TL0=n1;
 162   1         TH0=n2;
 163   1         sound=!sound;
 164   1         ET0=1;
 165   1         TR0=1;
 166   1       }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    664    ----
   CONSTANT SIZE    =    437    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     33    ----
   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 + -