music.lst

来自「51写的一个定时时钟」· LST 代码 · 共 232 行

LST
232
字号
C51 COMPILER V7.50   MUSIC                                                                 01/18/2001 17:29:02 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MUSIC
OBJECT MODULE PLACED IN music.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE music.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          #include <ctype.h>
   3          
   4          sbit spk=P1^3;
   5          
   6          //------------------------------------------------------------------------------------
   7          // Global CONSTANTS
   8          //------------------------------------------------------------------------------------
   9          #define uint  unsigned int
  10          #define uchar unsigned char
  11          #define OSFREQ 6000000l                 /*所使用的晶振频率*/              /*所使用的晶振频率*/
  12          
  13          
  14          /**************音符频率表****************/
  15          uint code notefreq[]={  523, 587, 659, 698, 784, 880, 988,
  16                                                          1047,1175,1319,1396,1568,1760,1976,
  17                                                          2093,2349,2637,2793,3136,3520,3961};
  18          //uint code timreg[]={  65058, 65110, 65157, 65178, 65217, 65252, 65283,
  19          //                                              65297,65323,65347,65357,65377,65394,65410,
  20          //                                              65417,65430,65441,65447,65456,65465,65473};
  21          /*************音名***************/
  22          
  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          /*************半音频率表*****************/
  28          uint code halfnotefreq[]={      554, 622, 740, 831, 933,
  29                                                                  1109,1245,1480,1161,1865,
  30                                                                  2218,2489,2960,3322,3729};
  31          //uint code halftimreg[]={      65085, 65134, 65198, 65235, 65268,
  32          //                                                      65311,65335,65367,65321,65402,
  33          //                                                      65423,65436,65452,65461,65469};
  34          /*************音名***************/
  35          uchar code halfnotename[]={     'c','d','f','g','a',
  36                                                                  '1','2','4','5','6',
  37                                                                  'C','D','F','G','A',0};
  38          
  39          //sbit  BEEP_PWR=P1^0;
  40          uchar  FreqSandH,FreqSandL;  /*产生方波的定时器的初值*/
  41          uchar timer1cnt;             /*定时器延时计数        */
  42          uchar timer1cntflg;          /*定时器定时完成标志    */
  43          
  44          
  45          /***************************************************************************************
  46          函数名称:      void timer0int() interrupt 1
  47          功能描述:      定时器0中断用来产生方波
  48          输入:          无
  49          输出:          无
  50          全局变量:      TH0,TL0,P5
  51          调用模块:      无
  52          ***************************************************************************************/
  53          void timer0int () interrupt 3
  54          {
  55   1              TH1=FreqSandH;          
C51 COMPILER V7.50   MUSIC                                                                 01/18/2001 17:29:02 PAGE 2   

  56   1              TL1=FreqSandL;
  57   1              spk^=1;         // change state of P5.4
  58   1      }
  59          
  60          
  61          /*void delay1(unsigned char ms)
  62          {
  63            unsigned char j;
  64             while(ms--)
  65             {
  66              for(j=0;j<120;j++);
  67                    }
  68                  }
  69          /***************************************************************************************
  70          函数名称:      void delay(uchar time)
  71          功能描述:      延时
  72          输入:          uchar time:     延时时间长度
  73          输出:          无
  74          全局变量:      无
  75          调用模块:      无
  76          ***************************************************************************************/
  77          void delay2(uchar time)
  78          {
  79   1              uchar i;
  80   1              uint j;
  81   1              for(i=0;i<time;i++)
  82   1              for(j=0;j<0x900;j++);
  83   1      }
  84          
  85          /***************************************************************************************
  86          函数名称:      void sound(uint freq)
  87          功能描述:      
  88          输入:          uint freq:      频率值
  89          输出:          无
  90          全局变量:      OSFFEQ,FreqSandH,FreqSandL,TR0,ET0
  91          调用模块:      无
  92          ***************************************************************************************/
  93          void Sound(uint freq)
  94          {
  95   1              uint timreg;
  96   1              timreg=65536l-(OSFREQ/(24l*freq));
  97   1              FreqSandH=timreg/256;
  98   1              FreqSandL=timreg&0x00ff;
  99   1              TR1=1;
 100   1              ET1=1;
 101   1      }
 102          
 103          
 104          /***************************************************************************************
 105          函数名称:      void Soundoff(void)
 106          功能描述:      停止发声
 107          输入:          无
 108          输出:          无
 109          全局变量:      TR0,ET0,P5
 110          调用模块:      无
 111          ***************************************************************************************/
 112          void SoundOff(void)
 113          {
 114   1              TR1=0;            
 115   1              ET1=0;
 116   1              //P5 = P5 & 0xef;
 117   1              spk =1;
C51 COMPILER V7.50   MUSIC                                                                 01/18/2001 17:29:02 PAGE 3   

 118   1      }
 119          
 120          /***************************************************************************************
 121          函数名称:      void GetFreq(uchar ch, uchar flag)
 122          功能描述:      依据音名取对应的频率
 123          输入:          uchar ch:       音名
 124                                  uchar flg:      全音/半音选择
 125          输出:          返回频率值
 126          全局变量:      halfnotename[],notename[],halfnotefreq[],notefreq[]
 127          调用模块:      无
 128          ***************************************************************************************/
 129          uint GetFreq(uchar ch,uchar flg)
 130          {
 131   1              uchar * pn,i=0;
 132   1              uint * pf;
 133   1              if(flg)   {pn=halfnotename; pf=halfnotefreq;}
 134   1              else      {pn=notename;     pf=notefreq;}
 135   1              while(1)
 136   1          {
 137   2                      if(pn[i]==0)     return 0;
 138   2              if(ch==pn[i])  return pf[i];
 139   2              i++;
 140   2          }
 141   1      }
 142          
 143          /***************************************************************************************
 144          函数名称:      void PORT_Init(void)
 145          功能描述:      初始化I/O
 146          输入:          无
 147          输出:          无
 148          全局变量:      XBR2,P74OUT
 149          调用模块:      无
 150          ***************************************************************************************/
 151          //void PORT_Init (void)
 152          //{
 153          //   XBR2    = 0x40;      /*使能交叉开关和弱上拉*/
 154          //   P74OUT |= 0xff;      /*使能P6,P7推挽输出*/
 155          //}
 156          
 157          void Play(char * str)
 158          {
 159   1              uchar i=0,ch,halfflg=0;
 160   1              uchar lasttime;
 161   1              uint freq;
 162   1              /*无效看门狗*/
 163   1         //   WDTCN = 0xde;
 164   1         //   WDTCN = 0xad;
 165   1         //   PORT_Init ();
 166   1      //      OSCICN=0x14;            /*使用内部晶振*/
 167   1              while(1)
 168   1          {
 169   2                      for(;;i++)
 170   2              {
 171   3                              ch=str[i];   /*允许曲谱用空格符 '|'符,换行回车等分隔以便阅读*/
 172   3                      if((ch==' ')||(ch=='|')||(ch=='\r')||(ch=='\n')) {i++;continue;}
 173   3                      if(!ch) {SoundOff(); return;}         /*乐曲结束则播放完毕*/
 174   3                      if(ch=='#')  {halfflg=1;  continue;}  /*半音标志*/
 175   3                      if(isdigit(ch)||isalpha(ch))
 176   3                  {
 177   4                                      freq=GetFreq(ch,halfflg);               /*从音名获取频率*/
 178   4                      lasttime=16;
 179   4                      break;
C51 COMPILER V7.50   MUSIC                                                                 01/18/2001 17:29:02 PAGE 4   

 180   4                  }
 181   3                      else {halfflg=0;  continue;}
 182   3              }
 183   2              i++;
 184   2              ch=str[i];       /*从下一个符号获取额外音长符号*/
 185   2              while(1)
 186   2              {
 187   3                              if(!ch) break;
 188   3                      if(isdigit(ch)||isalpha(ch)) break;   /*非音长符号则下次处理*/
 189   3                      if(ch=='-') lasttime+=8;              /*额外延时一拍*/
 190   3                      if(ch=='.') lasttime+=4;              /*额外延时半拍*/
 191   3                      if(ch=='_') lasttime/=2;              /*下划线相当于简谱中音名下面的下划线,延时减半*/
 192   3                      if(ch=='=') lasttime/=4;              /*双下划线相当于简谱中音名下面的双下划线,延时减为1/4*/
 193   3                      i++;
 194   3                      ch=str[i];
 195   3              }
 196   2              if(freq!=0) Sound(freq);                /*发声*/
 197   2              else        SoundOff();
 198   2              delay2(lasttime);                       /*延时*/
 199   2              SoundOff();
 200   2              delay2(1);                                      /*两个引之间的间歇*/
 201   2          }
 202   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    415    ----
   CONSTANT SIZE    =    110    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4      15
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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