include
#define sound_amount 5 // 歌曲的数量
sbit pause=P2^5; // 播放 暂停
sbit speaker=P2^7; // 无源蜂鸣器
//
unsigned char timer0h,timer0l,time;//timer0h,timer0l 为定时器 T0的高低位初
值,time 为对应的节拍时间
unsigned char music_num,num; //music_num 为歌曲编号 ,music_num=0表示刚
开机时的状态 ,num 是查找歌曲数据表的地址
signed char fre; // 对应频率数据表的地址
bit play_enable; // 歌曲播放的使能标志位 , 用于播放 暂停
void delay(unsigned char t); // 延时子函数 , 控制发音的时间长度
void delayms(unsigned int t); // 普通延时子程序 , 可用于按键消抖
void song(void); // 演奏一个音符
void music_play(void); // 播放歌曲
//
// 每三个数字 , 代表一个音符
// 第一个数字是音符的数值 1234567之一( 第几个音 ), 代表哆来咪发 ...
// 第二个数字是 0123之一, 代表低音 中音 高音 超高音 ( 第几个八度 )
// 第三个数字是时间长度 , 以半拍为单位 , 乐曲数据表的结尾是三个 0
//
// 《祝你生日快乐》
unsigned char code song1[]={
5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4, 0,0,0};
- 29 -
// 《世上只有妈妈好》
unsigned char code song2[]={
6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1,
//6,2,3 代表 6, 中音,3 个半拍 ;
//5,2,1 代表 5, 中音,1 个半拍 ;
//3,2,2 代表 3, 中音,2 个半拍 ;
//5,2,2 代表 5, 中音,2 个半拍 ;
//1,3,2 代表 1, 高音,2 个半拍 ;
//...
5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1,
3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2, 5,2,1, 6,2,1, 3,2,2, 2,2,2,