×

利用C程序实现音乐点唱功能及几种案例分享

消耗积分:0 | 格式:rar | 大小:0.15 MB | 2017-09-06

分享资料个

利用C程序实现音乐点唱功能及几种案例分享

1、快乐点唱机实验

/* ch09-5-4.c_ 快乐点唱机实验 */
#include 
sbit  buzzer = P3^7;   // 声明输出端 
unsigned char  keys,i;   // 声明按钮及播放谱变量 
unsigned char  tone_H, tone_L; // 声明计时量变量 
void  beat_125(unsigned char); // 声明节拍函数 
unsigned char code song1[]={ 1, 1, 2, 1,  4, 3,  1, 1, 2, 1,  5, 4,
        1, 1, 8, 6,  4, 3, 2,  11, 11, 6, 4,  5, 4,  15 };
unsigned char code beat1[]={ 4, 4, 8, 8,  8, 16,  4, 4, 8, 8,  8, 16,
        4, 4, 8, 8,  8, 8, 8,  4, 4, 8, 8,  8, 16 };
unsigned char code song2[]={ 1, 1, 1,  3, 2, 1,  3, 3, 3,  5, 4, 3,  5, 4, 3,  2,
        2, 1, 0,  1, 2, 3,  4, 3, 2,  3, 4, 5,  5, 4, 3, 2,  1, 15};
unsigned char code beat2[]={ 4, 4, 4,  6, 2, 4,  4, 4, 4,  6, 2, 4,  4, 4, 4,  12 ,
          8, 2, 2,  4, 4, 4,  8, 2, 2,  4, 4, 4,  2, 2, 4, 4,  12 };
unsigned char code song3[]={ 8, 7, 6, 5, 5,  6, 8, 5,  6, 5, 3, 2, 5,  3, 12,
          8, 7, 6, 5, 5,  6, 8, 5,  6, 5, 3, 2, 5,  1, 12,
          2, 3, 2, 5,   6, 5, 6, 8,   9, 8, 7, 6, 9,  5, 12,
          6, 8, 5, 6,  3, 5, 6, 5, 3,  2, 3, 5, 3, 2,  1, 0,  15 };
unsigned char code beat3[]={ 8, 4, 4, 8, 8,  8, 8, 16,  8, 4, 4, 8, 8,  24, 8,
        8, 4, 4, 8, 8,  8, 8, 16,  8, 4, 4, 8, 8,  24, 8,
        8, 4, 4, 16,  8, 4, 4, 16,  8, 4, 4, 8, 8,  24, 8,
        8, 8, 8, 8,  8, 4, 4, 8, 8,  8, 4, 4, 8, 8,  24, 8 };
unsigned char code song4[]={ 2, 2, 3, 5,  6, 5, 6, 7,  9, 7, 7, 6, 5,  6,
        7, 9, 9, 7, 9,  5, 6, 6,  2, 7, 7, 6, 5,  5,
        6, 6, 7, 6, 5,  3, 2, 3, 5,  3, 5, 6, 7,  9,
        9, 9, 10, 9, 7,  7, 6, 5, 3,  2, 7, 7, 6, 5,  5,  15};
unsigned char code beat4[]={ 12, 4, 8, 8,  8, 4, 4, 16,  12, 4, 4, 4, 8,  32,
        12, 4, 8, 4, 4,  12, 4, 16,  12, 4, 8, 4, 4,  32, 
        12, 4, 8, 4, 4,  8, 4, 4, 16,  12, 8, 8, 8,  32, 
        12, 4, 8, 4, 4,  8, 4, 4, 16,  12, 4, 8, 4, 4,  32  };
unsigned int code tone[]={ 1012, 956, 852, 759, 716, 638,
       568, 506, 478, 426, 379,531, 10 };//音阶定义 
void play1(void);     // 声明play1函数 
void play2(void);     // 声明play2函数 
void play3(void);     // 声明play3函数 
void play4(void);     // 声明play4函数 
void beat_125(unsigned char); // 声明节拍函数 
//================================================
main()
{ buzzer=1;     // 蜂 器初始值 
 IE=0x82;      // 启用Timer 0
 TMOD=0x01;         // 设定MODE1   
 while (1)     // while循环 
 { P2=0xff;    // 将Port2规划为输入埠 
  keys=~P2;    // 读取按钮
  switch (keys)   // 判读 
  { case 0x01: play1(); break; // 按下S1,播放第一首歌 
   case 0x02: play2(); break; // 按下S2,播放第二首歌 
   case 0x04: play3(); break; // 按下S3,播放第三首歌 
   case 0x08: play4(); break; // 按下S4,播放第四首歌 
  }  buzzer=1;   // 蜂 器不动作 
 }       // while循环结束 
}        // 主程序结束 
//==第一首歌=================================
void play1(void)
{ i=0;
 while(song1[i]!=15)   // while循环开始 
 { tone_H=(65536-tone[song1[i]])/256;// 读取音阶计数量之高八位元 
  tone_L=(65536-tone[song1[i]])%256;// 读取音阶计数量之低八位元 
  TH0=tone_H;    // 填入音阶计数量之高八位元 
  TL0=tone_L;    // 填入音阶计数量之低八位元 
  TR0=1;     // 启动Timer 0
  beat_125(beat1[i]);  // 指定节拍 
  i++;     // 下一个音 
  TR0=0;     // 关闭Timer 0
 }       // 结束播放 
}     
//==第二首歌=================================
void play2(void)
{ i=0;
 while(song2[i]!=15)   // while循环开始 
 { tone_H=(65536-tone[song2[i]])/256;// 读取音阶计数量之高八位元 
  tone_L=(65536-tone[song2[i]])%256;// 读取音阶计数量之低八位元 
  TH0=tone_H;    // 填入音阶计数量之高八位元 
  TL0=tone_L;    // 填入音阶计数量之低八位元 
  TR0=1;     // 启动Timer 0
  beat_125(beat2[i]);  // 指定节拍 
  i++;     // 下一个音 
  TR0=0;     // 关闭Timer 0
 }    
}        // 结束播放 
//==第三首歌=================================
void play3(void)
{ i=0;
 while(song3[i]!=15)   // while循环开始 
 { tone_H=(65536-tone[song3[i]])/256;// 读取音阶计数量之高八位元 
  tone_L=(65536-tone[song3[i]])%256;// 读取音阶计数量之低八位元 
  TH0=tone_H;    // 填入音阶计数量之高八位元 
  TL0=tone_L;    // 填入音阶计数量之低八位元 
  TR0=1;     // 启动Timer 0
  beat_125(beat3[i]);  // 指定节拍 
  i++;     // 下一个音 
  TR0=0;     // 关闭Timer 0
 }    
}        // 结束播放 
//==第四首歌=================================
void play4(void)
{ i=0;
 while(song4[i]!=15)   // while循环开始 
 { tone_H=(65536-tone[song4[i]])/256;// 读取音阶计数量之高八位元 
  tone_L=(65536-tone[song4[i]])%256;// 读取音阶计数量之低八位元 
  TH0=tone_H;    // 填入音阶计数量之高八位元 
  TL0=tone_L;    // 填入音阶计数量之低八位元 
  TR0=1;     // 启动Timer 0
  beat_125(beat4[i]);  // 指定节拍 
  i++;     // 下一个音 
  TR0=0;     // 关闭Timer 0
 }    
}        // 结束播放 
//====Timer 0中断子程序==================
void tone_timer(void) interrupt 1 // Timer 0中断子程序开始 
{ TH0=tone_H;     // 填入计时量之高八位元 
 TL0=tone_L;     // 填入计时量之低八位元  
 buzzer=~buzzer;    // 蜂 器反相输出 
}        // 结束中断子程序 
//====节拍函数==================
void beat_125(unsigned char x) // 节拍函数开始 
{ unsigned char i,j,k;  // 声明变量 
 for (i=0;i   for (j=0;j<125;j++)  // j循环 
   for (k=0;k<120;k++);// k循环  
}        // 结束节拍函数
 

2、生日快乐歌实验

/* 生日快乐歌实验(ch09-5-3.c) */
#include
sbit  buzzer = P3^7;   // 声明输出端 
unsigned char  i=0;    // 声明变量 
unsigned char  tone_H, tone_L; // 声明计时量变量 
void  beat_125(unsigned char); // 声明节拍函数 
unsigned char code song[]={ 1, 1, 2, 1,  4, 3,  1, 1, 2, 1,  5, 4, 
       1, 1, 8, 6,  4, 3, 2,  11, 11, 6, 4,  5, 4,  15};//歌曲 
unsigned char code beat[]={ 4, 4, 8, 8,  8, 16,  4, 4, 8, 8,  8, 16, 
       4, 4, 8, 8,  8, 8, 8,  4, 4, 8, 8,  8, 16};  //节拍 
unsigned int code tone[]={ 1012, 956, 852, 759, 716, 638,      // 中音Si ̄So
       568, 506, 478, 426, 379, 536, 10 };    //音阶定义 
// ========主程式 ===============
main()
{ buzzer=1;   // 蜂鸣器初始值 
 IE=0x82;    // 启用Timer 0
 TMOD=0x01;       // 设定MODE1   
 while(song[i]!=15) // while循环开始 
 { TH0=tone_H=(65536-tone[song[i]])/256; //填入音阶计数量之高八位元 
  TL0= tone_L=(65536-tone[song[i]]) % 256;//填入音阶计数量之低八位元 
  TR0=1;   // 启动Timer 0
  beat_125(beat[i]); // 指定节拍 
  i++;   // 下一个音 
  TR0=0;   // 关闭T0停止播放 
  buzzer=1;  // 蜂鸣器不动作 
 }     // 结束播放 
}      // 主程式结束 
//====Timer 0中断副程式==================
void tone_timer(void) interrupt 1 // Timer 0中断副程式开始 
{ TH0=tone_H;   // 填入计时量之高八位元 
 TL0=tone_L;   // 填入计时量之低八位元 
 buzzer=~buzzer;  // 蜂 器反相输出 
}      // 结束中断副程式 
//====节拍函数==================
void beat_125(unsigned char x)  // 节拍函数开始 
{ unsigned char  i,j,k;   // 声明变量 
 for (i=0;i   for (j=0;j<125;j++)   // j循环 
   for (k=0;k<120;k++); // k循环 
}         // 结束节拍函数 
 
 
 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !