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

📄 music.lst

📁 此文档是网上一款开发板的完整系统,内附有电路图纸!系统有完整的接口程式,包含了字符型LCD驱动,pc串口通讯程式,flash读写驱动程式,中文字库,ad芯片驱动程式,keyscan4*4扫描程式
💻 LST
字号:
C51 COMPILER V7.10   MUSIC                                                                 07/01/2005 09:27:02 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE MUSIC
OBJECT MODULE PLACED IN music.OBJ
COMPILER INVOKED BY: D:\PROGRAM FILES\KEIL\C51\BIN\C51.EXE music.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //**********************************************************************************
   2          //本函数模块来自"51单片机世界",作者版主丁丁(聂小猛)。
   3          //主页地址http://www.mcu51.com
   4          //本程序为本站推出的"MCU51-63K仿真器"及"DX-51多功能试验板"而设计的,详情请到本站查看.
   5          //"51单片机世界"版权所有,未经允许,不得抄袭作为商业用途
   6          //**********************************************************************************
   7          //音乐输出函数模块
   8          #define uchar unsigned char
   9          #define uint  unsigned int
  10          #define ulong unsigned long
  11          #include <reg52.h>
  12          #include "study.h"
  13          //*************************
  14          //T0的值,及输出频率对照表
  15          uchar code freq[74*2]={
  16          0x20,0xE6,//00139HZ 
  17          0x89,0xE7,//00147HZ 
  18          0xF3,0xE8,//00156HZ 
  19          0x35,0xEA,//00165HZ  
  20          0x74,0xEB,//00175HZ 
  21          0x91,0xEC,//00185HZ 
  22          0xA8,0xED,//00196HZ 
  23          0xB8,0xEE,//00208HZ 
  24          0xA9,0xEF,//00220HZ ,1
  25          0x93,0xF0,//00233HZ ,1#
  26          0x73,0xF1,//00247HZ ,2
  27          0x49,0xF2,//00262HZ ,2#
  28          0x07,0xF3,//00277HZ ,3
  29          0xC8,0xF3,//00294HZ ,4
  30          0x73,0xF4,//00311HZ ,4#
  31          0x1E,0xF5,//00330HZ ,5 
  32          0xB6,0xF5,//00349HZ ,5#
  33          0x4C,0xF6,//00370HZ ,6
  34          0xD7,0xF6,//00392HZ ,6#
  35          0x5A,0xF7,//00415HZ ,7    
  36          0xD8,0xF7,//00440HZ 1     //21
  37          0x4D,0xF8,//00466HZ 1#    //22
  38          0xBD,0xF8,//00494HZ 2     //23
  39          0x24,0xF9,//00523HZ 2#    //24
  40          0x87,0xF9,//00554HZ 3     //25
  41          0xE4,0xF9,//00587HZ 4     //26
  42          0x3D,0xFA,//00622HZ 4#    //27
  43          0x90,0xFA,//00659HZ 5     //28
  44          0xDE,0xFA,//00698HZ 5#    //29
  45          0x29,0xFB,//00740HZ 6     //30
  46          0x6F,0xFB,//00784HZ 6#    //31
  47          0xB1,0xFB,//00831HZ 7     //32
  48          0xEF,0xFB,//00880HZ `1
  49          0x2A,0xFC,//00932HZ `1#
  50          0x62,0xFC,//00988HZ `2
  51          0x95,0xFC,//01046HZ `2#
  52          0xC7,0xFC,//01109HZ `3
  53          0xF6,0xFC,//01175HZ `4
  54          0x22,0xFD,//01244HZ     `4#
  55          0x4B,0xFD,//01318HZ `5
C51 COMPILER V7.10   MUSIC                                                                 07/01/2005 09:27:02 PAGE 2   

  56          0x73,0xFD,//01397HZ `5#
  57          0x98,0xFD,//01480HZ `6
  58          0xBB,0xFD,//01568HZ `6#
  59          0xDC,0xFD,//01661HZ `7
  60          0xFB,0xFD,//01760HZ 
  61          0x18,0xFE,//01865HZ
  62          0x28,0xFE,//01926HZ
  63          0x43,0xFE,//02039HZ
  64          0x5C,0xFE,//02160HZ
  65          0x74,0xFE,//02288HZ
  66          0x8A,0xFE,//02422HZ
  67          0x9F,0xFE,//02565HZ
  68          0xB3,0xFE,//02716HZ
  69          0xC6,0xFE,//02877HZ
  70          0xD8,0xFE,//03047HZ
  71          0xE9,0xFE,//03226HZ
  72          0xF9,0xFE,//03417HZ
  73          0x08,0xFF,//03618HZ
  74          0x16,0xFF,//03832HZ
  75          0x23,0xFF,//04058HZ
  76          0x30,0xFF,//04297HZ
  77          0x3C,0xFF,//04551HZ
  78          0x47,0xFF,//04819HZ
  79          0x52,0xFF,//05104HZ
  80          0x5C,0xFF,//05405HZ
  81          0x65,0xFF,//05724HZ
  82          0x6E,0xFF,//06061HZ
  83          0x77,0xFF,//06419HZ
  84          0x7F,0xFF,//06798HZ
  85          0x86,0xFF,//07166HZ
  86          0x8E,0xFF//07625HZ
  87          };
  88          uchar th0_f; //在中断中装载的T0的值
  89          uchar tl0_f; //
  90          //******************************
  91          //音乐符号串解释函数
  92          //入口:要解释的音乐符号串,输出的音调串,输出的时长串
  93          changedata(uchar *song,uchar *diao,uchar *jie)
  94          {
  95   1              uchar i,i1,j;
  96   1              char gaodi; //高低+/-12音阶
  97   1              uchar banyin;//有没有半个升音阶
  98   1              uchar yinchang;//音长
  99   1              uchar code jie7[8]={0,20,22,24,25,27,29,31}; //C调的7个值
 100   1              *diao=*song;
 101   1              for(i=0,i1=0;;)
 102   1              {
 103   2                      gaodi=0; //高低=0
 104   2                      banyin=0;//半音=0
 105   2                      yinchang=4;//音长1拍
 106   2                      if((*(song+i)=='|') || (*(song+i)==' ')) i++; //拍子间隔和一个空格过滤
 107   2                      switch(*(song+i)) 
 108   2                      {    
 109   3                              case ',': gaodi=-12;i++;//低音
 110   3                              break;
 111   3              
 112   3                              case '`': gaodi=12;i++; //高音
 113   3                              break;
 114   3                      }
 115   2      
 116   2                      if(*(song+i)==0)  //遇到0结束
 117   2                      {
C51 COMPILER V7.10   MUSIC                                                                 07/01/2005 09:27:02 PAGE 3   

 118   3                              *(diao+i1)=0; //加入结束标志0
 119   3                              *(jie+i1)=0;
 120   3                              return;
 121   3                      }
 122   2      
 123   2                      j=*(song+i)-0x30; i++; //取出基准音
 124   2                      j=jie7[j]+gaodi; //加上高低音
 125   2      
 126   2      yinc:   switch(*(song+i)) 
 127   2                      {    
 128   3                              case '#': //有半音j加一个音阶 
 129   3                                      i++;j++; 
 130   3                                      
 131   3                              break;
 132   3      
 133   3                              case '-': //有一个音节加长
 134   3                                      yinchang+=4;
 135   3                                      i++; 
 136   3                                      goto yinc;
 137   3      
 138   3                              case '_': //有一个音节缩短
 139   3                                      yinchang/=2;
 140   3                                      i++; 
 141   3                              break;
 142   3                              
 143   3                              case '.': //有一个加半拍
 144   3                                      i++;
 145   3                                      yinchang=yinchang+yinchang/2;
 146   3                              break;
 147   3                      }
 148   2                      if(*(song+i)=='.') {i++;yinchang=yinchang+yinchang/2; }; //对反向排列的延时符号处理
 149   2                      if(*(song+i)=='-'){yinchang+=4;i++;}
 150   2                      if(*(song+i)=='-'){yinchang+=4;i++;}
 151   2                      if(*(song+i)=='-'){yinchang+=4;i++;}
 152   2      
 153   2                      *(diao+i1)=j; //记录音符
 154   2                      *(jie+i1)=yinchang; //记录音长
 155   2                      i1++;   
 156   2      
 157   2                      if(*(song+i)==0) //遇到0结束
 158   2                      {
 159   3                              *(diao+i1)=0; //加入结束标志0
 160   3                              *(jie+i1)=0;
 161   3                              return;
 162   3                      }
 163   2              }
 164   1      }
 165          //******************************************
 166          //奏乐函数
 167          //入口:要演奏的音乐符号串
 168          void play(uchar *songdata)
 169          {
 170   1              uchar i,c;
 171   1              uint xdata n;
 172   1              uchar xdata diaodata[256]; //音调缓冲,最大256字节
 173   1              uchar xdata jiedata[256];  //音长缓冲,最大256字节
 174   1      
 175   1              changedata(songdata,diaodata,jiedata); //解释音乐符号串
 176   1              ET0=1;
 177   1              for(i=0;diaodata[i]!=0;i++)  //逐个符号演奏
 178   1              {
 179   2                      tl0_f=freq[diaodata[i]*2]; //取出对应的定时值送给T0
C51 COMPILER V7.10   MUSIC                                                                 07/01/2005 09:27:02 PAGE 4   

 180   2                      th0_f=freq[diaodata[i]*2+1];
 181   2                      for(c=0;c<jiedata[i];c++) //按照音长延时
 182   2                              for(n=0;n<12000;n++);
 183   2                      ET0=0;
 184   2                      for(n=0;n<500;n++);    //音符间延时
 185   2                      ET0=1;
 186   2              }
 187   1              ET0=0;
 188   1      }
 189          //**********************************
 190          //定时中断0,用于产生唱歌频率
 191          sbit MIO=P1^7;
 192          timer0() interrupt 1 
 193          {
 194   1              TL0=tl0_f;TH0=th0_f;  //调入新的定时值
 195   1              MIO=~MIO;                               //取反音乐输出IO
 196   1      }
 197          
 198          //****************************************
 199          //音乐符号的书写规定
 200          //1 2 3 4 5 6 7 为7个基本音阶
 201          //前面加逗号','表示这是低音
 202          //前面加上点号'`'表示这是高音
 203          //后面加'#',表示这个音符升半个音阶
 204          //后面加'.',表示这个音符要再加长自身一半的延时
 205          //后面加'-',每个表示延时一拍
 206          //后面加'_',表示这个音符要缩短自身一半的时长
 207          //************************************************
 208          
 209          //仙剑
 210          uchar code song0[]={
 211          "|3_3_3_2_3-|2_3_2_2_,6,6_,7_|12_1_,7,6_,5_|,6---|"
 212          "3_3_3_2_3.6_|5_6_5_5_22_3_|45_4_32_1_|3.--3_|"
 213          "67_6_55_3_|5--3_5_|26_5_32_3_|3---|"
 214          "26_6_6-|16_6_66_7_|`17_6_76_7_|3.--3_|"
 215          "67_6_55_3_|5--3_5_|67_6_76_7_|3---|"
 216          "26_6_6-|16_6_66_7_|`17_6_7.5_|6---|"
 217          };
 218          //小兔子乖乖
 219          uchar code song1[]={
 220          "|5`1_6_55|3_5_6_`1_55|65_3_22|35_3_2_3_1|6_5_6_5_3_6_5|2_5_3_2_1-|,6_1_2_3_1-|"
 221          };
 222          //我是一只菠萝
 223          uchar code song2[]={
 224          "1-|2_4_3_2_55|5_6_3_4_22|2_4_3_2_1_`1_7_6_|5_4_2_3_11|"
 225          "2_4_3_2_55|5_6_3_4_22|2_4_3_2_1_5_2_3_|1---|"
 226          };
 227          
 228          //************************************************
 229          //唱歌菜单
 230          void playmusic(void)
 231          {
 232   1              uchar ch;
 233   1              while(1)
 234   1              {
 235   2                      cls(8);  //打印提示
 236   2                      setcursor(0,0);
 237   2                      lcdstring("1.仙剑奇侠传\r\n2.小兔子乖乖\r\n3.我是只菠萝");
 238   2                      while((ch=getkey(1000))==0); //等待按键
 239   2                      switch(ch) 
 240   2                      {
 241   3                              case '1':
C51 COMPILER V7.10   MUSIC                                                                 07/01/2005 09:27:02 PAGE 5   

 242   3                                      play(song0);
 243   3                              break;
 244   3              
 245   3                              case '2':
 246   3                                      play(song1);
 247   3                              break;
 248   3              
 249   3                              case '3':       
 250   3                                      play(song2);
 251   3                              break;
 252   3      
 253   3                              case '4':
 254   3                                      play(song0);
 255   3                                      play(song1);    
 256   3                                      play(song2);
 257   3                              break;
 258   3      
 259   3                              case 'C':
 260   3                              return;
 261   3                      }
 262   2              }
 263   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    717    ----
   CONSTANT SIZE    =    613    ----
   XDATA SIZE       =   ----     514
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2      15
   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 + -