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

📄 music.lst

📁 单片机开发板源程序适合初学者 第六部分 继电器输出控制
💻 LST
字号:
C51 COMPILER V7.06   MUSIC                                                                 09/13/2007 01:10:09 PAGE 1   


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

stmt level    source

   1          /*实验名称:放音乐
   2            功能:从蜂鸣里放出音乐
   3            作者:http://www.mcuprog.com
   4                  05-02-01
   5          */
   6          #include <reg52.h>
   7          #include <ctype.h>
   8          #pragma ot(0)
   9          #define uint  unsigned int
  10          #define uchar unsigned char
  11          #define OSFREQ 11059200                 //所使用的晶振频率
  12          
  13          /**************音符频率表****************/
  14          uint code notefreq[]={ 523, 587, 659, 698, 784, 880, 988,
  15                                
  16          1047,1175,1319,1396,1568,1760,1976,
  17                                
  18          2093,2349,2637,2793,3136,3520,3961};
  19          /*************音名***************/
  20          uchar code notename[]={'c','d','e','f','g','a','b',
  21                          
  22                 '1','2','3','4','5','6','7',
  23                          
  24                 'C','D','E','F','G','A','B',0};
  25          /*************半音频率表*****************/
  26          uint code halfnotefreq[]={ 554, 622, 740, 831, 933,
  27                                    
  28          1109,1245,1480,1161,1865,
  29                                    
  30          2218,2489,2960,3322,3729};
  31          /*************音名***************/
  32          uchar code halfnotename[]={'c','d','f','g','a',
  33                              
  34                 '1','2','4','5','6',
  35                              
  36                 'C','D','F','G','A',0};
  37          
  38          sbit  BEEP_PWR=P3^5;
  39          uchar  FreqSandH,FreqSandL;  /*产生方波的定时器的初值*/
  40          uchar timer1cnt;             /*定时器延时计数        */
  41          uchar timer1cntflg;          /*定时器定时完成标志    */
  42          
  43          /*********定时器0用来产生方波***************/
  44          void timer0int () interrupt 1
  45          {
  46   1       TH0=FreqSandH;
  47   1       TL0=FreqSandL;
  48   1       BEEP_PWR=!BEEP_PWR;
  49   1      }
  50          
  51          /**********定时器用来进行比较准确的延时************/
  52          void timer1int() interrupt 3
  53          {
  54   1       TH1=0xe0;
  55   1       TL1=0x00;
C51 COMPILER V7.06   MUSIC                                                                 09/13/2007 01:10:09 PAGE 2   

  56   1       timer1cnt++;
  57   1       if(timer1cnt>=(OSFREQ/1500000l))
  58   1           {timer1cntflg=1;  TR1=0;}
  59   1      }
  60          
  61          void delay(uchar time)
  62          {
  63   1       uchar i;
  64   1       uint j;
  65   1       for(i=0;i<time;i++)
  66   1          for(j=0;j<0x900;j++);
  67   1      /***
  68   1       uchar i;
  69   1       for(i=0;i<time;i++)
  70   1          {timer1cnt=0;  timer1cntflg=0;
  71   1           TR1=1;
  72   1           while(!timer1cntflg);
  73   1          }
  74   1      ***/
  75   1      }
  76          
  77          void Sound(uint freq)
  78          {
  79   1       uint timreg;
  80   1       timreg=65536-(OSFREQ/(25*freq));
  81   1       FreqSandH=timreg/256;
  82   1       FreqSandL=timreg&0x00ff;
  83   1       TR0=1;  ET0=1;
  84   1      }
  85          
  86          
  87          void SoundOff(void)
  88          {
  89   1       TR0=0;  ET0=0;
  90   1       BEEP_PWR=0;
  91   1      }
  92          
  93          uint GetFreq(uchar ch,uchar flg)
  94          {
  95   1       uchar * pn,i=0;
  96   1       uint * pf;
  97   1       if(flg)   {pn=halfnotename; pf=halfnotefreq;}
  98   1       else      {pn=notename;     pf=notefreq;}
  99   1       while(1)
 100   1          {if(pn[i]==0)     return 0;
 101   2           if(ch==pn[i])  return pf[i];
 102   2           i++;
 103   2          }
 104   1      }
 105          
 106          void Play(char * str)
 107          {
 108   1       uchar i=0,ch,halfflg=0;
 109   1       uchar lasttime;
 110   1       uint freq;
 111   1       while(1)
 112   1           {for(;;i++)
 113   2               {ch=str[i];   //允许曲谱用空格符 '|'符,换行回车等分隔以便阅读
 114   3                if((ch==' ')||(ch=='|')||(ch=='\r')||(ch=='\n')) {i++; 
 115   4      continue;}
 116   3                if(!ch) {SoundOff(); return;}         //乐曲结束则播放完毕
 117   3                if(ch=='#')  {halfflg=1;  continue;}  //半音标志
C51 COMPILER V7.06   MUSIC                                                                 09/13/2007 01:10:09 PAGE 3   

 118   3                if(isdigit(ch)||isalpha(ch))
 119   3                    {freq=GetFreq(ch,halfflg);    //从音名获取频率
 120   4                     lasttime=16;
 121   4                     break;
 122   4                    }
 123   3                else {halfflg=0;  continue;}
 124   3               }
 125   2            i++;
 126   2            ch=str[i];              //从下一个符号获取额外音长符号
 127   2            while(1)
 128   2               {if(!ch) break;
 129   3                if(isdigit(ch)||isalpha(ch)) break;   //非音长符号则下次处理
 130   3                if(ch=='-') lasttime+=8;              //额外延时一拍
 131   3                if(ch=='.') lasttime+=4;              //额外延时半拍
 132   3                if(ch=='_') lasttime/=2;              //下划线相当于简谱中音名下面的下划线,延时减半
 133   3                if(ch=='=') lasttime/=4;              //双下划线相当于简谱中音名下面的双下划线,延时减为1/4
 134   3                i++;
 135   3                ch=str[i];
 136   3               }
 137   2           if(freq!=0) Sound(freq);              //发声
 138   2           else        SoundOff();
 139   2           delay(lasttime);                      //延时
 140   2          }
 141   1      }
 142          
 143          //编谱说明,低音(简谱中数字下面有一个点的)1234567对应的为小写cdefgab
 144          //中音(简谱中数字上下都没有点的)1234567对应的也为1234567
 145          //高音(简谱中数字上面有一个点的)1234567对应的为大写CDEFGAB
 146          //对于降音符b或声音符#一律用#+合适的音名例如#5
 147          //一个音符本身为一拍,加下划线后为半拍加等号为1/4拍 如:65_ 4= 则音6为一拍,音5为半拍,音4为1/4拍
 148          //下划线或等号连续书写则音长连续变短
 149          //音符后加-或.表示延长。‘-’延长一拍‘.’延长半拍多加则延长连续增加
 150          void main(void)
 151          {
 152   1       //uint i;
 153   1       TMOD=0x11; ET1=1; ET0=1;  EA=1;
 154   1      while(1)
 155   1              {
 156   2              // Play("1_1_5_5_6_6_5   4_4_3_3_2_2_1  5_5_4_4_3_3_2 5_5_4_4_3_3_21_1_5_5_6_6_5  4_4_3_3_2_2_1"); //满天
             -都是小星星
 157   2              Play("1_2_3_1_  1_2_3_1_  3_4_5 3_4_5  5=6=5=4=3_1_ 5=6=5=4=3_1_ 2_g_12_g_1");    //两只老虎
 158   2              //Play("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--"); //山楂树
 159   2              Play("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"); //学习雷锋好榜样
 160   2              //Play("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-");
 161   2              // Play("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");//许巍

⌨️ 快捷键说明

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