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

📄 电子琴.lst

📁 这是用51单片机编写的电子密码锁
💻 LST
字号:
C51 COMPILER V8.02   电子琴                                                                04/03/2008 15:17:39 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE 电子琴
OBJECT MODULE PLACED IN 电子琴.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE 电子琴.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>     //包括一个52标准内核的头文件
   2          
   3          #define uchar unsigned char //定义一下方便使用
   4          #define uint  unsigned int
   5          #define ulong unsigned long
   6          
   7          
   8          char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
   9          
  10          sbit BEEP=P1^7; //喇叭输出脚
  11          sbit P10=P1^0;
  12          sbit K1= P3^2;     
  13          sbit K2= P3^5;  
  14          sbit K3= P2^4;     
  15          sbit K4= P2^5;
  16          
  17          uchar th0_f; //在中断中装载的T0的值高8位
  18          uchar tl0_f; //在中断中装载的T0的值低8位
  19          
  20          //T0的值,及输出频率对照表
  21          uchar code freq[36*2]={
  22                  0xA9,0xEF,//00220HZ ,1   //0
  23                  0x93,0xF0,//00233HZ ,1#
  24                  0x73,0xF1,//00247HZ ,2
  25                  0x49,0xF2,//00262HZ ,2#
  26                  0x07,0xF3,//00277HZ ,3
  27                  0xC8,0xF3,//00294HZ ,4
  28                  0x73,0xF4,//00311HZ ,4#
  29                  0x1E,0xF5,//00330HZ ,5 
  30                  0xB6,0xF5,//00349HZ ,5#
  31                  0x4C,0xF6,//00370HZ ,6
  32                  0xD7,0xF6,//00392HZ ,6#
  33                  0x5A,0xF7,//00415HZ ,7    
  34                  0xD8,0xF7,//00440HZ 1     //12
  35                  0x4D,0xF8,//00466HZ 1#    //13
  36                  0xBD,0xF8,//00494HZ 2     //14
  37                  0x24,0xF9,//00523HZ 2#    //15
  38                  0x87,0xF9,//00554HZ 3     //16
  39                  0xE4,0xF9,//00587HZ 4     //17
  40                  0x3D,0xFA,//00622HZ 4#    //18
  41                  0x90,0xFA,//00659HZ 5     //19
  42                  0xDE,0xFA,//00698HZ 5#    //20
  43                  0x29,0xFB,//00740HZ 6     //21
  44                  0x6F,0xFB,//00784HZ 6#    //22
  45                  0xB1,0xFB,//00831HZ 7     //23
  46                  0xEF,0xFB,//00880HZ `1
  47                  0x2A,0xFC,//00932HZ `1#
  48                  0x62,0xFC,//00988HZ `2
  49                  0x95,0xFC,//01046HZ `2#
  50                  0xC7,0xFC,//01109HZ `3
  51                  0xF6,0xFC,//01175HZ `4
  52                  0x22,0xFD,//01244HZ  `4#
  53                  0x4B,0xFD,//01318HZ `5
  54                  0x73,0xFD,//01397HZ `5#
  55                  0x98,0xFD,//01480HZ `6
C51 COMPILER V8.02   电子琴                                                                04/03/2008 15:17:39 PAGE 2   

  56                  0xBB,0xFD,//01568HZ `6#
  57                  0xDC,0xFD,//01661HZ `7     //35
  58          };
  59          
  60          //定时中断0,用于产生唱歌频率
  61          timer0() interrupt 1 
  62          {
  63   1          TL0=tl0_f;TH0=th0_f;  //调入预定时值
  64   1          BEEP=~BEEP;           //取反音乐输出IO
  65   1      }
  66          
  67          //******************************
  68          //音乐符号串解释函数
  69          //入口:要解释的音乐符号串,输出的音调串,输出的时长串
  70          changedata(uchar *song,uchar *diao,uchar *jie)
  71          {
  72   1          uchar i,i1,j;
  73   1          char gaodi; //高低+/-12音阶
  74   1          uchar banyin;//有没有半个升音阶
  75   1          uchar yinchang;//音长
  76   1          uchar code jie7[8]={0,12,14,16,17,19,21,23}; //C调的7个值
  77   1      
  78   1          *diao=*song;
  79   1          for(i=0,i1=0;;)
  80   1          {
  81   2              gaodi=0; //高低=0
  82   2              banyin=0;//半音=0
  83   2              yinchang=4;//音长1拍
  84   2              if((*(song+i)=='|') || (*(song+i)==' ')) i++; 
  85   2                      //拍子间隔和一个空格过滤
  86   2      
  87   2              switch(*(song+i)) 
  88   2              {    
  89   3                  case ',': gaodi=-12;i++;//低音
  90   3                  break;
  91   3          
  92   3                  case '`': gaodi=12;i++; //高音
  93   3                  break;
  94   3              }
  95   2      
  96   2              if(*(song+i)==0)  //遇到0结束
  97   2              {
  98   3                  *(diao+i1)=0; //加入结束标志0
  99   3                  *(jie+i1)=0;
 100   3                  return;
 101   3              }
 102   2      
 103   2              j=*(song+i)-0x30; i++; //取出基准音
 104   2              j=jie7[j]+gaodi; //加上高低音
 105   2                                                      
 106   2      
 107   2      yinc:   switch(*(song+i)) 
 108   2              {    
 109   3                  case '#': //有半音j加一个音阶 
 110   3                      i++;j++;
 111   3                                      goto yinc; 
 112   3                  
 113   3      
 114   3                  case '-': //有一个音节加长
 115   3                      yinchang+=4;
 116   3                      i++; 
 117   3                      goto yinc;
C51 COMPILER V8.02   电子琴                                                                04/03/2008 15:17:39 PAGE 3   

 118   3      
 119   3                  case '_': //有一个音节缩短
 120   3                      yinchang/=2;
 121   3                      i++; 
 122   3                                      goto yinc;
 123   3                  
 124   3                  
 125   3                  case '.': //有一个加半拍
 126   3                      yinchang=yinchang+yinchang/2;
 127   3                                      i++;
 128   3                                      goto yinc;
 129   3                  
 130   3              }
 131   2      
 132   2              *(diao+i1)=j; //记录音符
 133   2              *(jie+i1)=yinchang; //记录音长
 134   2              i1++;    
 135   2          }
 136   1      }
 137          //******************************************
 138          //奏乐函数
 139          //入口:要演奏的音乐符号串
 140          void play(uchar *songdata)
 141          {
 142   1          uchar i,c,j=0;
 143   1          uint  n;
 144   1          uchar xdata diaodata[112]; //音调缓冲
 145   1          uchar xdata jiedata[112];  //音长缓冲
 146   1      
 147   1          changedata(songdata,diaodata,jiedata); //解释音乐符号串
 148   1          TR0=1;
 149   1          for(i=0;diaodata[i]!=0;i++)  //逐个符号演奏
 150   1          {
 151   2              tl0_f=freq[diaodata[i]*2]; //取出对应的定时值送给T0
 152   2              th0_f=freq[diaodata[i]*2+1];
 153   2              for(c=0;c<jiedata[i];c++) //按照音长延时
 154   2                      {
 155   3                  for(n=0;n<32000;n++);
 156   3                              if((!K1)||(!K2)||(!K3)||(!K4))//发现按键,立即退出播放
 157   3                              {       
 158   4                                      TR0=0;
 159   4                                      return; 
 160   4                              }
 161   3                      }
 162   2              TR0=0;
 163   2              for(n=0;n<500;n++);    //音符间延时
 164   2                      
 165   2              TR0=1;
 166   2          }
 167   1          TR0=0;
 168   1      }
 169          
 170          //仙剑
 171          uchar code xianjian[]={
 172          "|3_3_3_2_3-|2_3_2_2_,6,6_,7_|12_1_,7,6_,5_|,6---|"
 173          "3_3_3_2_3.6_|5_6_5_5_22_3_|45_4_32_1_|3.--3_|"
 174          "67_6_55_3_|5--3_5_|26_5_32_3_|3---|"
 175          "26_6_6-|16_6_66_7_|`17_6_76_7_|3.--3_|"
 176          "67_6_55_3_|5--3_5_|67_6_76_7_|3---|"
 177          "26_6_6-|16_6_66_7_|`17_6_7.5_|6---|"
 178          };
 179          uchar code song3[]={
C51 COMPILER V8.02   电子琴                                                                04/03/2008 15:17:39 PAGE 4   

 180          "5-5_3_2_1_|3---|6-6_4_2_1_"
 181          ",7--,5_|1.3_5.1_|,7.3_5 5_|"
 182          "6.7_`1.6_|6_5_5-3_2_|1.1_13_2_|"
 183          "1.1_12_3_|2.1_,62_3_|2-- ,5_|"
 184          "1.3_5.1_|,7.3_55_|6.7_`1.6_|"
 185          "6_5_5-3_2_|1.1_13_2_|1.1_12_3_"
 186          "2.,6_,71_2_|1--"
 187          };
 188          //世上只有妈妈好
 189          uchar code mamahao[]={
 190          "6.5_35|`16_5_6-|35_6_53_2_|1_,6_5_3_2-|"
 191          "2.3_55_6_|321-|5.3_2_1_,6_1_|,5--"
 192          };
 193          
 194          //三个按键选择三首不同的音乐播放,一个键停止播放
 195          void main(void) // 主程序
 196          {
 197   1              TMOD = 0x01;  //使用定时器0的16位工作模式
 198   1              TR0 = 0;
 199   1              ET0 = 1;          //定时器0中断
 200   1      
 201   1              EA = 1;   //打开总中断
 202   1      
 203   1              while(1)
 204   1              {
 205   2                      if(!K1) 
 206   2                      {
 207   3                              while(!K1);
 208   3                                              play(xianjian);   //播放音乐
 209   3                      }
 210   2                      if(!K2) 
 211   2                      {
 212   3                              while(!K2);
 213   3                                              play(song3);      //播放音乐
 214   3                      }
 215   2                      if(!K3) 
 216   2                      {
 217   3                              while(!K3);
 218   3                                              play(mamahao);    //播放音乐
 219   3                      }
 220   2              }
 221   1      }
 222          
 223          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    474    ----
   CONSTANT SIZE    =    578    ----
   XDATA SIZE       =   ----     224
   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 + -