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

📄 player.lst

📁 利用51单片机演奏音乐。定时器控制歌曲的频率(音调)
💻 LST
字号:
C51 COMPILER V8.02   PLAYER                                                                09/20/2008 17:28:02 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE PLAYER
OBJECT MODULE PLACED IN player.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE player.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include <intrins.h>
   3          //本例采用89C52, 晶振为11.0592MHZ
   4          //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
   5          //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
   6          //所以拿出谱子, 试探编吧! 
   7          
   8          unsigned char n=0;  //n为节拍常数变量
   9          unsigned char code music_tab[] ={
  10          0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
  11          0x20, 0x40, 0x1C , 0x10,
  12          0x18, 0x10, 0x20 , 0x10,
  13          0x1C, 0x10, 0x18 , 0x40,
  14          0x1C, 0x20, 0x20 , 0x20,
  15          0x1C, 0x20, 0x18 , 0x20,
  16          0x20, 0x80, 0xFF , 0x20,
  17          
  18          0x1C, 0x10, 0x18 , 0x40,
  19          0x1C, 0x20, 0x20 , 0x20,
  20          0x1C, 0x20, 0x18 , 0x20,
  21          0x20, 0x80, 0xFF , 0x20,
  22          0x30, 0x1C, 0x10 , 0x18,
  23          0x20, 0x15, 0x20 , 0x1C,
  24          0x20, 0x20, 0x20 , 0x26,
  25          0x40, 0x20, 0x20 , 0x2B,
  26          0x20, 0x26, 0x20 , 0x20,
  27          0x20, 0x30, 0x80 , 0xFF,
  28          0x20, 0x20, 0x1C , 0x10,
  29          0x18, 0x10, 0x20 , 0x20,
  30          0x26, 0x20, 0x2B , 0x20,
  31          0x30, 0x20, 0x2B , 0x40,
  32          0x20, 0x20, 0x1C , 0x10,
  33          0x18, 0x10, 0x20 , 0x20,
  34          0x26, 0x20, 0x2B , 0x20,
  35          0x30, 0x20, 0x2B , 0x40,
  36          0x20, 0x30, 0x1C , 0x10,
  37          0x18, 0x20, 0x15 , 0x20,
  38          0x1C, 0x20, 0x20 , 0x20,
  39          0x26, 0x40, 0x20 , 0x20,
  40          0x2B, 0x20, 0x26 , 0x20,
  41          0x20, 0x20, 0x30 , 0x80,
  42          0x20, 0x30, 0x1C , 0x10,
  43          0x20, 0x10, 0x1C , 0x10,
  44          0x20, 0x20, 0x26 , 0x20,
  45          0x2B, 0x20, 0x30 , 0x20,
  46          0x2B, 0x40, 0x20 , 0x15,
  47          0x1F, 0x05, 0x20 , 0x10,
  48          0x1C, 0x10, 0x20 , 0x20,
  49          0x26, 0x20, 0x2B , 0x20,
  50          0x30, 0x20, 0x2B , 0x40,
  51          0x20, 0x30, 0x1C , 0x10,
  52          0x18, 0x20, 0x15 , 0x20,
  53          0x1C, 0x20, 0x20 , 0x20,
  54          0x26, 0x40, 0x20 , 0x20,
  55          0x2B, 0x20, 0x26 , 0x20,
C51 COMPILER V8.02   PLAYER                                                                09/20/2008 17:28:02 PAGE 2   

  56          0x20, 0x20, 0x30 , 0x30,
  57          0x20, 0x30, 0x1C , 0x10,
  58          0x18, 0x40, 0x1C , 0x20,
  59          0x20, 0x20, 0x26 , 0x40,
  60          0x13, 0x60, 0x18 , 0x20,
  61          0x15, 0x40, 0x13 , 0x40,
  62          0x18, 0x80, 0x00
  63          };
  64          
  65          void int0()  interrupt 1   //采用中断0 控制节拍
  66          {  TH0=0xd8;
  67   1         TL0=0xef;
  68   1         n--;
  69   1      }
  70          
  71          void delay (unsigned char m)   //控制频率延时
  72          { 
  73   1       unsigned i=3*m;
  74   1       while(--i);
  75   1      }
  76          
  77          void delayms(unsigned char a)  //豪秒延时子程序
  78          {
  79   1        while(--a);                  //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
  80   1      }
  81          
  82          void main()
  83          { unsigned char p,m;   //m为频率常数变量
  84   1        unsigned char i=0;
  85   1        TMOD&=0x0f;
  86   1        TMOD|=0x01;
  87   1        TH0=0xd8;TL0=0xef;
  88   1        IE=0x82;
  89   1      play:
  90   1         while(1)
  91   1          {
  92   2          a: p=music_tab[i];
  93   2             if(p==0x00)       { i=0, delayms(1000); goto play;}     //如果碰到结束符,延时1秒,回到开始再来一遍
  94   2             else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延时100ms,继续取下一音符
  95   2                  else         {m=music_tab[i++], n=music_tab[i++];}  //取频率常数 和 节拍常数
  96   2                   TR0=1;                                             //开定时器1
  97   2                 while(n!=0) P3_3=~P3_3,delay(m);                         //等待节拍完成, 通过P1口输出音频(可多

⌨️ 快捷键说明

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