51单⽚机简易⾳乐盒(可切歌)
#include<reg52.h>
sbit beep = P1 ^5;
sbit k1 = P3 ^1;
sbit k2 = P3 ^0;
sbit k3 = P3 ^2;
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar th0_h, tl0_l, time;
uint key;
ulong i, j;//不能⽤char或int 因为j的值会很⼤
code uchar th0high_8[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,//低⾳1234567
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//⾼⾳ 234567
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF
桃花谣
};//28个频率的初始TH0值
code uchar tl0light_8[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,//低⾳1234567
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,//⾼⾳ 234567
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16
};//28个初始TL0的值
code uchar song_1[]=
{
0,2,2,1,2,1,5,2,2,5,2,1,5,2,2,5,2,1,5,2,2,3,2,1,3,2,2,3,2,1,3,2,2,3,2,1,4,2,2,5,2,1,2,2,3,1,2,3,
5,2,2,5,2,1,5,2,2,5,2,1,5,2,2,3,2,1,5,2,2,5,2,1,3,2,2,3,2,1,3,2,2,5,2,1,2,2,3,1,2,3,3,2,6,2,2,1,3,2,6,2,2,1,
3,2,3,5,2,3,5,2,6,5,2,1,2,2,6,1,2,1,2,2,6,1,2,1,5,2,2,1,2,3,1,2,2,7,1,3,
1,2,3,1,2,3,2,1,1,3,2,3,3,2,1,5,2,3,5,2,1,1,2,3,2,2,3,1,2,3,7,2,1,1,2,3,1,2,3,2,2,1,3,2,3,1,3,1,
7,2,3,7,2,1,1,2,3,1,2,1,2,2,3,2,2,1,1,2,3,7,2,1,1,2,3,1,2,2,1,2,3,1,2,1,3,2,3,3,2,1,3,2,3,3,2,1,2,2,3,2,2,1,1,2,3, 2,2,3,0,2,3,0,2,3,0,2,2,1,2,1,5,2,3,5,2,1,5,2,3,5,2,1,5,2,3,6,2,1,3,2,3,2,2,1,
3,2,3,3,2,3,3,2,2,1,3,3,7,2,2,5,2,3,5,2,1,5,2,3,7,2,1,3,2,3,2,2,1,3,2,3,2,2,1,2,2,3,2,2,1,1,2,3,7,1,3,
1,2,3,7,2,1,5,1,3,3,2,3,2,2,1,2,2,3,1,2,1,1,2,3,2,2,4,1,2,1,3,2,1,1,2,1,2,2,1,1,2,2,1,2,4,3,2,4,2,2,4,1,2,4
7,1,4,1,2,4,7,1,4,1,2,4,
艾玛沃特森街拍
};//《朗朗晴天》的⾳乐码
code uchar song_2[]=
{
5,2,2,6,2,2,5,2,2,4,2,2,3,2,2,2,2,2,1,2,6,5,1,6,//我和我的祖国
1,2,2,3,2,2,1,3,2,7,2,2,6,2,3,3,2,1,5,2,12,//⼀刻也不能分割
6,2,2,7,2,2,6,2,2,5,2,2,4,2,2,3,2,2,2,2,6,6,1,6,//⽆论我⾛到哪⾥
7,1,2,6,1,2,5,1,2,5,2,2,1,2,3,2,2,1,3,2,12,//都唱出⼀⾸赞歌
5,2,2,6,2,2,5,2,2,4,2,2,3,2,2,2,2,2,1,2,6,5,1,6,//我歌唱每⼀座⾼⼭
1,2,2,3,2,2,1,3,2,7,2,2,2,3,3,1,3,1,6,2,12,//我歌唱每⼀条河
1,3,2,7,2,2,6,2,2,5,2,6,//袅袅炊烟
6,2,2,5,2,2,4,2,2,3,2,6,//⼩⼩村落
7,1,4,6,1,2,5,1,4,2,2,2,1,2,12,//路上⼀道辙
8,2,2,2,3,2,3,3,2,2,3,2,8,2,2,6,2,2,7,2,2,6,2,3,3,2,1,5,2,12,//我最亲爱的祖国
code uchar song_3[]=
{1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,2,2,3,3,7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3,3,2,6,2,2,2,3,2,2,
往前一步是幸福 退后一步是孤独
4,2,4,1,3,3,7,2,1,7,2,1,1,3,2,5,2,4,4,2,3,3,2,2,4,2,1,4,2,4,1,3,3,7,2,1,7,2,1,6,2,1,5,2,5,1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,3,2,3,3,
7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3,3,2,6,2,2,2,3,2,2,4,2,4,5,2,3,4,2,2,4,2,2,5,2,2,3,2,3,5,2,3,1,3,3,3,3,3,
2,3,4,2,3,2,2,3,2,1,3,3,1,3,2,1,3,6,0,2,3,0,2,3,0,2,3,0,2,3,0,2,3,0,2,3,1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,3,2,3,3,
7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3,3,2,4,2,2,2,3,2,2,4,2,4,1,3,3,7,2,2,1,3,2,5,2,4,4,2,3,3,2,3,4,2,1,
4,2,4,1,3,3,7,2,2,7,2,2,6,2,2,5,2,5,1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,3,2,3,3,7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3, };//《lemon》的⾳乐码
void delay1(uint m)
{
while(m--);
}//⽤于识别按键的延时函数与前⾯的延时函数不同
uchar key_1()//返回值为0或1,⽤于后⾯的判断
{
key =0;
if(k1 ==0)//检测按键K1是否按下
{
delay1(1000);//消除抖动⼀般⼤约10ms
if(k1 ==0)//再次判断按键是否按下
{
key =1;
}
while(!k1);//检测按键是否松开
}
if(key ==1)
return1;
else return0;
}
uchar key_2()
{
key =0;
if(k2 ==0)//检测按键K1是否按下
{
delay1(1000);//消除抖动⼀般⼤约10ms
if(k2 ==0)//再次判断按键是否按下
{
key =1;
}
while(!k2);//检测按键是否松开
}
if(key ==1)
return1;
else return0;
}
uchar key_3()
{
key =0;
if(k3 ==0)//检测按键K1是否按下
{
delay1(1000);//消除抖动⼀般⼤约10ms
if(k3 ==0)//再次判断按键是否按下
{
key =1;
}
while(!k3);//检测按键是否松开
}
}
void t0int() interrupt 1//定时中断
{
TR0 =0;
beep =!beep;
TH0 = th0_h;
TL0 = tl0_l;
TR0 =1;
}
void delay(uchar t)//延时函数
{
uchar t1;
ulong t2;
for(t1 =0;t1 < t;t1++)
for(t2 =0;t2 <2765;t2++);//可以设置t2的数值,根据具体歌的简谱⼤调来选择 TR0 =0;//关闭T0
}
void sing()
{
TH0 = th0high_8;
TL0 = tl0light_8;
TR0 =1;
delay(time);
}
void play_1()
{
i =0;
time =1;
while(time)
{
a:
j = song_1[i]+7* song_1[i +1]-1;
th0_h = th0high_8[j];
tl0_l = tl0light_8[j];
time = song_1[i +2];
if(song_1[i]!=0)//休⽌符
{
sing();
i +=3;
}lotusflower
else
{
beep =1;
delay(time);
卡秋莎i +=3;
goto a;
}
if(key_3()==1||key_2()==1)
{
beep =1;
break;
}
}
}
time =1;
while(time)
{
a:
j = song_2[i]+7* song_2[i +1]-1;  th0_h = th0high_8[j];
tl0_l = tl0light_8[j];
time = song_2[i +2];
if(song_2[i]!=0)//休⽌符
{
sing();
i +=3;
}
else
{
beep =1;
谭杰希图片
delay(time);
i +=3;
goto a;
}
if(key_1()==1||key_3()==1)
{
beep =1;
break;
}
}
}
void play_3()
{
i =0;
time =1;
while(time)
{
a:
j = song_3[i]+7* song_3[i +1]-1;  th0_h = th0high_8[j];
tl0_l = tl0light_8[j];
time = song_3[i +2];
if(song_3[i]!=0)//休⽌符
{
sing();
i +=3;
}
else
{
beep =1;
delay(time);
i +=3;
goto a;
}
if(key_1()==1||key_2()==1)
{
beep =1;
}
void main(void)
{
TMOD =1;
ET0 =1;
EA =1;
while(1)
{
beep =1;
if(key_1())
{
play_1();
}
if(key_2())
{
play_2();
}
if(key_3())
{
play_3();
}
}
}
懒得打解释了,等有空再打上去
除了中间那⾸歌是完整的
其他两⾸歌我还没有编写完全,⼯作量太⼤了