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

📄 beep.lst

📁 一个很好的音乐发生程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.50   BEEP                                                                  06/19/2008 11:23:16 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE BEEP
OBJECT MODULE PLACED IN beep.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE beep.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //**************************************************************************//
   2          //   
   3          //   程序名:     单片机音乐智能播放
   4          //   晶  振:     11.0592MHZ                            CPU型号: AT89S52
   5          //   功能描述:   实现单片机音乐的播放.音乐播放首数的显示.个性签名的间断显
   6          //               示.播放时间的间断显示.跑马等伴奏闪烁.暂停-开始功能键使用
   7          //   参考文献:   HTTP://WWW.MCUBLOG.COM的署名为JJJ(Jiang Jian Jun)的作品
   8          //                                            
   9          //
  10          //
  11          //                                                 寂寞高手--令狐冲
  12          //                                                    2006-05-28
  13          //**************************************************************************//
  14          //该程序被稍作修改以适应本学习板配置
  15          //////////////////////////////////////////////////////////////////////////////
  16          #include<reg52.h>                                      
  17          
  18          #ifndef __SOUNDPLAY_H_REVISION_FIRST__
  19          #define __SOUNDPLAY_H_REVISION_FIRST__
  20          #define SYSTEM_OSC   11059200                    //定义晶振频率11059200HZ
  21          #define SOUND_SPACE  4/5        //定义普通音符演奏的长度分率,//每4分音符间隔
  22            /**************************************************************************/
  23          sbit P1_0 = P0 ^ 0;                  //对跑马灯的定义使用
  24          sbit P1_1 = P0 ^ 1;     
  25          sbit P1_2 = P0 ^ 2;
  26          sbit P1_3 = P0 ^ 3;
  27          sbit P1_4 = P0 ^ 4;
  28          sbit P1_5 = P0 ^ 5;
  29          sbit P1_6 = P0 ^ 6;
  30          sbit P1_7 = P0 ^ 7;
  31          
  32          sbit P3_4 = P1 ^ 0;                 //对功能键的定义使用
  33          sbit P3_5 = P1 ^ 1;                 
  34           
  35          /**************************************************************************/
  36          unsigned int code FreTab[12]  = { 262,277,294,311,330,349,369,392,415,440,466,494 }; 
  37          //原始频率表
  38          unsigned char code SignTab[7]  = { 0,2,4,5,7,9,11 };           //1~7在频率表中的位置
  39          unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };      
  40          unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存 
  41          unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存
  42          sbit    BeepIO =  P3^7;//定义输出管脚 
  43            /**************************************************************************/
  44          unsigned char Count=0;                            //0.05秒的变量定义
  45          unsigned int  del;                                //过渡变量
  46          unsigned int tcnt;                                 //过渡变量
  47          unsigned int numble=0;                            //歌曲曲数的定义
  48          unsigned char  min=0, sec=0;                      //1秒钟 1分钟的定义
  49            /**************************************************************************
  50            对整个中断系统的设置
  51            为了得到较好的音效,定时器0和定时器1用于音乐播放子程序
  52                                初值都为10MS
  53            定时器2 用于播放时间的间断显示子程序,初值为50MS
  54          **************************************************************************/
  55          void InitialSound(void)
C51 COMPILER V7.50   BEEP                                                                  06/19/2008 11:23:16 PAGE 2   

  56          {
  57   1       BeepIO = 0;
  58   1           Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值  
  59   1       Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 计算TH1应装入的初值 
  60   1       TH1 = Sound_Temp_TH1;
  61   1       TL1 = Sound_Temp_TL1;
  62   1       TMOD  |= 0x11;
  63   1       ET0    = 1;
  64   1       ET1    = 0;
  65   1       TR0    = 0;
  66   1       TR1    = 0;
  67   1      
  68   1       RCAP2H = 0x2c;                      //对定时器2的初始化的定义使用
  69   1       RCAP2L = 0x13;
  70   1       TH2 = 0x2c;                          // 定时器初值
  71   1       TL2 = 0x13; 
  72   1       ES = 0;                              // 关闭通信中断
  73   1       ET2 = 1;                             // 允许T2中断
  74   1       T2CON = 0X04;
  75   1       EA = 1;
  76   1      }
  77          
  78          
  79          
  80          void BeepTimer0(void) interrupt 1         //音符发生中断
  81          {
  82   1       BeepIO = !BeepIO;
  83   1       TH0    = Sound_Temp_TH0;
  84   1       TL0    = Sound_Temp_TL0;
  85   1      }
  86          
  87          void timer2Int(void) interrupt 5            //时钟发生中断
  88          {
  89   1       TF2 = 0;                             // 溢出标志必须由软件清零
  90   1       EXF2 = 0;                            // 捕获标志必须由软件清零
  91   1       Count++;
  92   1       if(Count==20)
  93   1        {  
  94   2         sec++;
  95   2         Count=0;
  96   2        }
  97   1       if(sec==60)
  98   1        {
  99   2         min++;
 100   2         sec=0;
 101   2        }
 102   1      }
 103          
 104          
 105          
 106          /*说明**********************************************************************
 107            曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0};
 108            末尾:0,0 表示结束(Important)
 109          
 110            音高由三位数字组成:
 111              个位是表示 1~7 这七个音符 
 112              十位是表示音符所在的音区:1-低音,2-中音,3-高音;
 113              百位表示这个音符是否要升半音: 0-不升,1-升半音。
 114           
 115            音长最多由三位数字组成: 
 116              个位表示音符的时值,其对应关系是: 
 117               |数值(n):  |0 |1 |2 |3 | 4 | 5 | 6 
C51 COMPILER V7.50   BEEP                                                                  06/19/2008 11:23:16 PAGE 3   

 118               |几分音符: |1 |2 |4 |8 |16 |32 |64   音符=2^n
 119              十位表示音符的演奏效果(0-2):  0-普通,1-连音,2-顿音
 120              百位是符点位: 0-无符点,1-有符点
 121          
 122            调用演奏子程序的格式
 123              Play(乐曲名,调号,升降八度,演奏速度);
 124            |乐曲名           : 要播放的乐曲指针,结尾以(0,0)结束;
 125            |调号(0-11)       : 是指乐曲升多少个半音演奏;
 126            |升降八度(1-3)   : 1:降八度, 2:不升不降, 3:升八度;
 127            |演奏速度(1-12000): 值越大速度越快;
 128          ***************************************************************************/
 129          
 130          
 131          /**************************************************************************/
 132          void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
 133          {
 134   1       unsigned int NewFreTab[12];  //新的频率表
 135   1       unsigned char i,j;
 136   1       unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
 137   1       unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
 138   1      
 139   1       
 140   1       for(i=0;i<12;i++)     // 根据调号及升降八度来生成新的频率表 
 141   1       {
 142   2        j = i + Signature;
 143   2        if(j > 11)
 144   2        {
 145   3         j = j-12;
 146   3         NewFreTab[i] = FreTab[j]*2;
 147   3        }
 148   2        else
 149   2         NewFreTab[i] = FreTab[j];
 150   2      
 151   2      
 152   2        if(Octachord == 1)
 153   2         NewFreTab[i]>>=2;
 154   2        else if(Octachord == 3)
 155   2         NewFreTab[i]<<=2;
 156   2       }         
 157   1       
 158   1       SoundLength = 0;
 159   1       while(Sound[SoundLength] != 0x00) //计算歌曲长度
 160   1       {
 161   2        SoundLength+=2;
 162   2       }
 163   1      
 164   1      
 165   1       Point = 0;
 166   1       Tone   = Sound[Point]; 
 167   1       Length = Sound[Point+1];    // 读出第一个音符和它时时值
 168   1       
 169   1       LDiv0 = 12000/Speed;    // 算出1分音符的长度(几个10ms)  
 170   1       LDiv4 = LDiv0/4;      // 算出4分音符的长度 
 171   1       LDiv4 = LDiv4-LDiv4*SOUND_SPACE;  // 普通音最长间隔标准 
 172   1       TR0   = 0;
 173   1       TR1   = 1;
 174   1       while(Point < SoundLength)
 175   1       {
 176   2        SL=Tone%10;         //计算出音符 
 177   2        SM=Tone/10%10;         //计算出高低音 
 178   2        SH=Tone/100;         //计算出是否升半 
 179   2        CurrentFre = NewFreTab[SignTab[SL-1]+SH];  //查出对应音符的频率  
C51 COMPILER V7.50   BEEP                                                                  06/19/2008 11:23:16 PAGE 4   

 180   2        if(SL!=0)
 181   2        {
 182   3         if (SM==1) CurrentFre >>= 2;   //低音 
 183   3         if (SM==3) CurrentFre <<= 2;   //高音
 184   3         Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值
 185   3         Sound_Temp_TH0 = Temp_T/256; 
 186   3         Sound_Temp_TL0 = Temp_T%256; 
 187   3         TH0 = Sound_Temp_TH0;  
 188   3         TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿 
 189   3        }
 190   2        SLen=LengthTab[Length%10];  //算出是几分音符
 191   2        XG=Length/10%10;    //算出音符类型(0普通1连音2顿音) 
 192   2        FD=Length/100;
 193   2        LDiv=LDiv0/SLen;    //算出连音音符演奏的长度(多少个10ms)
 194   2        if (FD==1) 
 195   2         LDiv=LDiv+LDiv/2;
 196   2        if(XG!=1) 
 197   2         if(XG==0)     //算出普通音符的演奏长度 
 198   2          if (SLen<=4) 
 199   2           LDiv1=LDiv-LDiv4;
 200   2          else
 201   2           LDiv1=LDiv*SOUND_SPACE;
 202   2         else
 203   2          LDiv1=LDiv/2;   //算出顿音的演奏长度 
 204   2        else
 205   2         LDiv1=LDiv;
 206   2        if(SL==0) LDiv1=0;
 207   2         LDiv2=LDiv-LDiv1;   //算出不发音的长度 
 208   2          if (SL!=0)
 209   2        {
 210   3         TR0=1;
 211   3         for(i=LDiv1;i>0;i--)  //发规定长度的音 
 212   3         {
 213   4          while(TF1==0);
 214   4          TH1 = Sound_Temp_TH1;
 215   4          TL1 = Sound_Temp_TL1;
 216   4          TF1=0;
 217   4        }
 218   3      /*************************************************************************
 219   3      功能键子程序,直接嵌入音乐播放程序之中
 220   3      P1-0 P1-1 P1-2 P1-3 P1-4 P1-5 P1-6 P1-7六个跑马灯实现发出每个音符时的间断闪烁
 221   3      P3-4 P3-5两键 实现暂停和开始的功能
 222   3      为以后的二次开发,特留下两个功能键  以备后用
 223   3      *************************************************************************/
 224   3         {
 225   4         if(i==1*LDiv1/1024)
 226   4             {P1_0=0;P1_1=1;P1_2=1;P1_3=1;P1_4=1;P1_5=1;P1_6=1;P1_7=1;}
 227   4         if(i==51*LDiv1/1024)
 228   4             {P1_0=0;P1_1=1;P1_2=1;P1_3=1;P1_4=1;P1_5=1;P1_6=1;P1_7=1;}
 229   4         if(i==101*LDiv1/1024)
 230   4             {P1_0=0;P1_1=0;P1_2=0;P1_3=1;P1_4=1;P1_5=1;P1_6=1;P1_7=1;}
 231   4         if(i==151*LDiv1/1024)
 232   4             {P1_0=0;P1_1=0;P1_2=0;P1_3=0;P1_4=1;P1_5=1;P1_6=1;P1_7=1;}
 233   4         if(i==201*LDiv1/1024)
 234   4             {P1_0=0;P1_1=0;P1_2=0;P1_3=0;P1_4=0;P1_5=1;P1_6=1;P1_7=1;}
 235   4         if(i==251*LDiv1/1024)
 236   4             {P1_0=0;P1_1=0;P1_2=0;P1_3=0;P1_4=0;P1_5=0;P1_6=1;P1_7=1;}
 237   4         if(i==301*LDiv1/1024)
 238   4             {P1_0=0;P1_1=0;P1_2=0;P1_3=0;P1_4=0;P1_5=0;P1_6=1;P1_7=1;}
 239   4         if(i==351*LDiv1/1024)
 240   4             {P1_0=0;P1_1=0;P1_2=0;P1_3=0;P1_4=0;P1_5=0;P1_6=0;P1_7=1;}
 241   4         if(i==401*LDiv1/1024)
C51 COMPILER V7.50   BEEP                                                                  06/19/2008 11:23:16 PAGE 5   

 242   4             {P1_0=0;P1_1=0;P1_2=0;P1_3=0;P1_4=0;P1_5=0;P1_6=0;P1_7=0;}
 243   4      
 244   4         if(P3_4==0)
 245   4            for(i=300;i>0;i--) 
 246   4              for(j=300;j>0;j--);
 247   4                 if(P3_4==0)
 248   4                   EA=0;
 249   4         if(P3_5==0)
 250   4            for(i=300;i>0;i--) 
 251   4              for(j=300;j>0;j--);
 252   4                 if(P3_5==0)
 253   4                   EA=1;
 254   4      }
 255   3      

⌨️ 快捷键说明

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