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

📄 music.lst

📁 51音乐播放 C程序,希望对大家有用
💻 LST
字号:
C51 COMPILER V7.20   MUSIC                                                                 12/25/2004 11:42:19 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE MUSIC
OBJECT MODULE PLACED IN music.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE music.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /* =========================================================== */
   2          /* ----------------------------------------------------------- */
   3          /* 曲谱存贮格式 uchar code 数组名{音高,音长,音高,音长....} */
   4          /* 音高由三位数字组成: */
   5          /* 个位是表示 1~7 这七个音符. */
   6          /* 十位是表示音符所在的音区,1-低音,2-中音,3-高音; */
   7          /* 百位表示这个音符是否要升半音 0(不写)-不升,1-升半音。 */
   8          /* 音长最多由三位数字组成: */
   9          /* 个位表示音符的时值,其对应关系是: */
  10          /* 数值(n) 0 1 2 3 4 5 6 */
  11          /* --------------------------------------------- */
  12          /* 几分音符 1 2 4 8 16 32 64 */
  13          /* 即:音符=2^n ,这样做的目的是为了节省曲谱的存贮空间。 */
  14          /* 十位表示音符的演奏效果(0-2),0-普通,1-连音,2-顿音。 */
  15          /* 百位是符点位,0(不写)-无符点,1-有符点。 */
  16          /* ----------------------------------------------------------- */
  17          /* 调用演奏子程序的方法为: */
  18          /* play(乐曲数组名,调号,升降八度,演奏速度,开始指针,结束指针) */
  19          /* 调号(0-11)是指乐曲升多少个半音演奏;升降八度(1-3)是指在演奏 */
  20          /* 在哪个八度演奏: 1-降八度,2-不升不降,3-升八度.开始指针(0- ) */
  21          /* 是从哪个音符开始演奏,结束指针是演奏到哪个音符为止. */
  22          /* ----------------------------------------------------------- */
  23          
  24          //本程序用T0来产生音调,用T1产生音长 
  25          #include <reg51.h>
  26          #define uchar unsigned char
  27          #define yx 4/5 /* 定义普通音符演奏的长度分率 */
  28          #define plen 2 /* 定义晶振的时钟周期(us) */
  29          #define uchar unsigned char
  30          #define uint unsigned int
  31          sbit speaker=P3^5;
  32          /* ------------------下面是曲谱 ------------------------------ */
  33          uchar code sound[100]=
  34          {25,2,23,3,25,3,31,1,26,2,31,3,26,3,25,1,25,2,21,3,22,3,23,2,22,3,21,3,22,0,
  35          25,2,23,3,25,3,31,102,27,3,26,2,31,2,25,1,25,2,22,3,23,3,24,102,17,3, 21,0};
  36          uchar tc0,tc1,sc0,sc1; /* 音长和音符两个计数器初值暂存 */
  37          void play(sound,dh,sj,speed,point1,point2)
  38          uchar code sound[]; /* 接受乐曲数组的地址 */
*** WARNING C258 IN LINE 38 OF MUSIC.C: 'sound': mspace on parameter ignored
  39          uchar speed,sj,dh; /* 速度、八度、调号 */
  40          uint point1,point2; /* 乐曲开始、结束指针 */
  41          {
  42   1      uint code fftab[12]={262,277,294,311,330,349,369,392,415,440,466,494}; /* 频率表*/
  43   1      uchar code stab[7]={0,2,4,5,7,9,11}; /* 1~7在频率表中的位置 */
  44   1      uchar code ltab[7]={1,2,4,8,16,32,64};
  45   1      uchar tl,ts,sl,sm,sh,slen,xg,ii,fd;
  46   1      uint point,hz,tc,sc,len,len0,len1,len2,len4,i,ftab[12];
  47   1      speaker=1;
  48   1      for(i=0;i<12;i++) /* 根据调号及升降八度来计算音符频率 */
  49   1      {
  50   2      ii=i+dh;
  51   2      if(ii>11)
  52   2      {
  53   3      ii=ii-12;
  54   3      ftab[i]=fftab[ii]*2;
C51 COMPILER V7.20   MUSIC                                                                 12/25/2004 11:42:19 PAGE 2   

  55   3      }
  56   2      else
  57   2      ftab[i]=fftab[ii];
  58   2      if(sj==1) ftab[i]>>=2;
  59   2      if(sj==3) ftab[i]<<=2;
  60   2      }
  61   1      point=point1;
  62   1      ts=sound[point];
  63   1      tl=sound[point+1]; /* 读出第一个音符和它时时值 */
  64   1      tc=65535-10000/plen; /* 算出10ms的初装值 */
  65   1      tc0=tc%256; /* 计算TL1应装入的初值 */
  66   1      tc1=tc/256; /* 计算TH1应装入的初值 */
  67   1      len0=12000/speed; /* 算出1分音符的长度(几个10ms) */
  68   1      len4=len0/4; /* 算出4分音符的长度 */
  69   1      len4=len4-len4*yx; /* 普通音最长间隔标准 */
  70   1      TMOD=0x11;
  71   1      TH1=tc1; TL1=tc0;
  72   1      ET0=1; EA=1;
  73   1      TR0=0; TR1=1;
  74   1      while(point<=point2)
  75   1      {
  76   2      sl=ts%10; /* 计算出音符 */
  77   2      sh=ts/100; /* 计算出是否升半 */
  78   2      sm=ts/10%10; /* 计算出高低音 */
  79   2      hz=ftab[stab[sl-1]+sh]; /* 查出对应音符的频率 */
  80   2      if(sl!=0)
  81   2      {
  82   3      if (sm==1) hz>>=2; /* 若是低音 */
  83   3      if (sm==3) hz<<=2; /* 若是高音 */
  84   3      sc=(50000/hz)*10/plen; /* 计算脉冲个数 */
  85   3      sc=65536-sc; /* 计算计数器初值 */
  86   3      sc0=sc%256; /* 算出TL0应装初值 */
  87   3      sc1=sc/256; /* 算出TH0应装初值 */
  88   3      TH0=sc1; /* 装入初值 */
  89   3      TL0=sc0+12; /* 加12是对中断延时的补偿 */
  90   3      }
  91   2      slen=ltab[tl%10]; /* 算出是几分音符 */
  92   2      xg=tl/10%10; /* 算出音符类型(0普通1连音2顿音) */
  93   2      fd=tl/100;
  94   2      len=len0/slen; /* 算出连音音符演奏的长度(多少个10ms)*/
  95   2      if (fd==1) len=len+len/2;
  96   2      if(xg!=1)
  97   2      if(xg==0) /* 算出普通音符的演奏长度 */
  98   2      if (slen<=4)
  99   2      len1=len-len4;
 100   2      else
 101   2      len1=len*yx;
 102   2      else
 103   2      len1=len/2; /* 算出顿音的演奏长度 */
 104   2      else
 105   2      len1=len;
 106   2      if(sl==0) len1=0;
 107   2      len2=len-len1; /* 算出不发音的长度 */
 108   2      if (sl!=0)
 109   2      {
 110   3      TR0=1;
 111   3      for(i=len1;i>0;i--) /* 发规定长度的音 */
 112   3      {
 113   4      while(TF1==0);
 114   4      TH1=tc1; TL1=tc0;
 115   4      TF1=0;
 116   4      }
C51 COMPILER V7.20   MUSIC                                                                 12/25/2004 11:42:19 PAGE 3   

 117   3      }
 118   2      if(len2!=0)
 119   2      {
 120   3      TR0=0; speaker=1;
 121   3      for(i=len2;i>0;i--) /* 音符间的间隔 */
 122   3      {
 123   4      while(TF1==0);
 124   4      TH1=tc1; TL1=tc0;
 125   4      TF1=0;
 126   4      }
 127   3      }
 128   2      point+=2; /* 音符指针下移 */
 129   2      ts=sound[point]; tl=sound[point+1]; /* 读出下一个音符和它时时值 */
 130   2      }
 131   1      }
 132          void yin() interrupt 1 /* 音符发生程序(中断服务程序)*/
 133          {
 134   1      speaker=~speaker;
 135   1      TH0=sc1; TL0=sc0;
 136   1      }
 137          //==============================================
 138          main()
 139          {
 140   1        while(1)
 141   1        {
 142   2              play(sound,0,2,60,0,57);
 143   2              play(sound,0,1,60,0,57);
 144   2              play(sound,0,3,60,0,57);
 145   2              play(sound,0,2,40,0,57);
 146   2              play(sound,5,2,60,0,57);
 147   2              play(sound,0,2,80,0,57);
 148   2        }
 149   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    849    ----
   CONSTANT SIZE    =    138    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4      52
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -