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

📄 playmusic.lst

📁 单片机实现在的电子琴
💻 LST
字号:
C51 COMPILER V8.05a   PLAYMUSIC                                                            11/30/2008 13:26:22 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE PLAYMUSIC
OBJECT MODULE PLACED IN PlayMusic.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PlayMusic.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //************************************************************
   2          //Copyright(C)2008,桂林电子科技大学电子工程学院科技协会
   3          //                       “梦想起航”活动例程 电子琴
   4          //************************************************************
   5          
   6          //*************** 程序流程图********************
   7          //
   8          //                       按键按下
   9          //                               |
  10          //                      持续一定时间
  11          //      -------------|---------------
  12          //  |                    |                              |
  13          //获取频率值  定时器打开        产生高低电平
  14          //  |                    |                              |
  15          //      -------------|---------------
  16          //               |
  17          //                方波驱动蜂鸣器发声
  18          //                               |
  19          //                               |
  20          //                    按键释放
  21          //                               |
  22          //                       定时器关闭
  23          //                               |
  24          //                      蜂鸣器停止发声
  25          //
  26          //***********************************************
  27          #include <reg51.h>
  28          #include"key_4x3.h"      //自己使用的键盘扫描程序所在的头文件
  29          
  30          #define uchar unsigned char
  31          #define uint  unsigned int
  32          
  33          #define LIGHT P1
  34          sbit BUZZER = P0^0;
  35          
  36          /*
  37          //基本频率表              // 1      2      3      4          5      6      7
  38          uint code FreqTab_1[]={  64580, 64684, 64777, 64820, 64898, 64968, 65030,   //中  
  39                                   65058, 65110, 65157, 65178, 65217, 65252, 65283 }; //高 
  40          */
  41          //FreqTab_1 和FreqTab_2 的关系: 65536 - FreqTab_2[i] = FreqTab_1[i]
  42                                                  //   1     2    3    4    5    6        7
  43          uint code FreqTab_2[]={  0, 956,842, 759, 716, 635, 568, 506,   //中  
  44                                   478, 426, 372, 358, 319, 284, 253 }; //高 
  45          
  46          uchar keynum;  //按键序号
  47          
  48          //用于获取音调频率。★注意数据类型的取值范围,是否满足要求
  49          uchar TONE_TH0;   //定时器高8位
  50          uchar TONE_TL0;   //定时器低8位
  51          //*******************************************
  52          //函数名:ToneCreate
  53          //函数功能:获取新的频率值
  54          //*******************************************
  55          void ToneCreate(void)
C51 COMPILER V8.05a   PLAYMUSIC                                                            11/30/2008 13:26:22 PAGE 2   

  56          {                 
  57   1      /*      
  58   1          TONE_TH0 = FreqTab_1[keynum] / 256;  //取音频高8位
  59   1              TONE_TL0 = FreqTab_1[keynum] % 256;  //取音频低8位
  60   1      */
  61   1          TONE_TH0 = (65536 - FreqTab_2[keynum]) / 256;  //取音频高8位
  62   1              TONE_TL0 = (65536 - FreqTab_2[keynum]) % 256;  //取音频低8位 
  63   1              TR0 = 1;     
  64   1      }
  65          //*******************************************
  66          //函数名:Initi
  67          //函数功能:初始化,使蜂鸣器和LED不工作
  68          //*******************************************
  69          void Initi(void)
  70          {
  71   1          BUZZER = 0;    //蜂鸣器不响
  72   1              TR0    = 0;        //定时器停止计时
  73   1              LIGHT  = 0xff; //LED不亮
  74   1      }
  75          //*******************************************
  76          //测试函数
  77          void main(void)
  78          {
  79   1              
  80   1              TMOD = 0x01;  //定时器0,16位工作方式 
  81   1              TH0  = (65536 - 2000) / 256;  //给定时器高8位装入初值,这个地方的初值关系不太重要
  82   1          TL0  = (65536 - 2000) % 256;  //给定时器低8位装入初值       
  83   1              ET0  = 1;     //打开定时器0中断
  84   1              EA   = 1;     //打开总中断      [两者都打开才行]         
  85   1              TR0  = 1;         //启动定时器
  86   1        
  87   1         while(1)
  88   1         {              
  89   2                   keynum = KEY_num(0); //KEY_num(0)返回键盘值,和自己使用的键盘对应
  90   2                       switch(keynum)    //键盘扫描后返回按键序号 [1~12]
  91   2                      {
  92   3                          case 1:  ToneCreate();  LIGHT = 0xfe;    break;   // 按键1     
  93   3                              case 2:  ToneCreate();  LIGHT = 0xfe<<1; break;   // 按键2 
  94   3                              case 3:  ToneCreate();  LIGHT = 0xfe<<2; break;   // 按键3 
  95   3                              case 4:  ToneCreate();  LIGHT = 0xfe<<3; break;   //              
  96   3                              case 5:  ToneCreate();  LIGHT = 0xfe<<4; break;   //             
  97   3                              case 6:  ToneCreate();  LIGHT = 0xfe<<5; break;   //              
  98   3                              case 7:  ToneCreate();  LIGHT = 0xfe<<6; break;   //              
  99   3                              case 8:  ToneCreate();  LIGHT = 0xfe<<7; break;   // 按键8 
 100   3                              case 9:
 101   3                              case 10:
 102   3                              case 11:
 103   3                              case 12: ToneCreate();  LIGHT = 0x00;    break;  
 104   3                      //      case 0:ToneCreate();LIGHT = 0xf0;break;  
 105   3                              default: Initi();                        break;  //没有按键按下,TR0=0,不响
 106   3                      }      
 107   2          }
 108   1      }
 109          //*******************************************
 110          //函数名:TONE
 111          //函数功能:中断函数,重新装入初值,产生我们需要的频率方波
 112          //*******************************************
 113          void TONE(void) interrupt 1 using 0
 114          {
 115   1          BUZZER = ~BUZZER;   //取反,高低电平周期转换
 116   1          TH0 = TONE_TH0;      //重新置初值
 117   1          TL0 = TONE_TL0;   
C51 COMPILER V8.05a   PLAYMUSIC                                                            11/30/2008 13:26:22 PAGE 3   

 118   1      }                  


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    269    ----
   CONSTANT SIZE    =     30    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3    ----
   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 + -