/* ch09-5-5.c_ 快乐点唱机实验 */
#include <reg51.h>
#include "song.h"
sbit buzzer = P1^5; // 声明输出端
unsigned char keys,i; // 声明按钮及播放谱变量
unsigned char tone_H, tone_L; // 声明计时量变量
void beat_125(unsigned char); // 声明节拍函数
unsigned int code tone[]={ 1012, 956, 852, 759, 716, 638,
568, 506, 478, 426, 379, 536, 10 };// 音阶定义
void play(unsigned char *,unsigned char *); // 声明play函数
void beat_125(unsigned char); // 声明节拍函数
//================================================
main()
{ buzzer=1; // 蜂 器初始值
IE=0x82; // 启用Timer 0
TMOD=0x01; // 设定MODE1
while (1) // while循环
{ i=0; // 从第一个音开始演奏
P2=0xff; // 将Port2规划为输入埠
keys=~P2; // 读取按钮
switch (keys) // 判读
{ case 0x01: play(song1,beat1); break; // 按下S1,播放第一首歌
case 0x02: play(song2,beat2); break; // 按下S2,播放第二首歌
case 0x04: play(song3,beat3); break; // 按下S3,播放第三首歌
case 0x08: play(song4,beat4); break; // 按下S4,播放第四首歌
} buzzer=1; // 蜂 器不动作
} // while循环结束
} // 主程序结束
//==播放歌=================================
void play(unsigned char* song,unsigned char* beat )
{ i=0; // 从头开始
while(song[i]!=15) // while循环开始
{ tone_H=(65536-tone[song[i]])/256;// 读取音阶计数量之高八位元
tone_L=(65536-tone[song[i]])%256;// 读取音阶计数量之低八位元
TH0=tone_H; // 填入音阶计数量之高八位元
TL0=tone_L; // 填入音阶计数量之低八位元
TR0=1; // 启动Timer 0
beat_125(beat[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<x;i++) // i循环
for (j=0;j<125;j++) // j循环
for (k=0;k<120;k++);// k循环
} // 结束节拍函数