51单⽚机蜂鸣器演奏《⼩苹果》C语⾔程序,51单⽚机蜂鸣器播放⼩星星两只⽼虎欢乐颂源程序...
#include
/*反复输出1~7七个⾳阶*/
typedef unsigned int u16;
typedef unsigned char u8;
sbit beep=P1^5;
sbit led=P2^0;
/*C调⾳符对应的hz:1:523 1#:553 2:586 2#:621 3:658 4:697
4#:739 5:783 5#:830 6:879 6#:931 7:987
(以下1.表⽰1为低⾳)
1.:262 1.#:277
2.:294 2.#:311
3.:330
4.:349
4.#:370
5.:392 5.#:415
6.:440 6.#:466
7.:494
(以下.1表⽰⾼⾳)
.1:1046 .1#:1109 .2:1175 .2#:1245 .3:1318 .4:1397
.4#:1480 .5:1568 .5#:1661 .6:1760 .6#:1865 .7:1976
根据T=1/f,单⽚机通过对beep的IO⼝反复跳转电平从⽽输出相应的频率
输出的每⼀个脉冲的⾼电平和低电平时间都为T的⼀半
C调⾳符对应的⼩时间为:1:956;  2:853; 3:760; 4:717; 5:639; 6:569; 7:507;
低⾳5对应装⼊定时器的⼗六进制为FB04
谢楠资料关于节拍:设四分⾳符⼀拍等于400ms;则⼋分⾳符⼀拍等于200ms;⼗六分⾳符⼀拍等于100ms;
⾼位定时器的值:1 2 0xfc 3 4 5 6 0xfd 70xfe
低位定时器的值:1 0x44 2 0xab 3 0x08 4 0x33 5 0x81 6 0xc7 7 0x05;
(2)表⽰半拍 3.表⽰1拍半 2-表⽰2拍
欢乐颂简谱如下: 3 3 4 5 |5 4 3 2 | 1 1 2 3| 3. (2) 2-|
3 3
4
5 |5 4 3 2 | 1 1 2 3| 2. (1) 1-|
2 2
3 1 |2(3)(4)3 1| 2(3)(4)3 2|
1 2 5(di) 3|3 4 5 5 4 3 2 1 1 2 3 2 1 1|
int code happysongth[]={
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfc,0xfc,0xfc,0xfc,0xfd,0xfd,0xfc,0xfc,
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfc,0xfc,0xfc,0xfc,0xfd,0xfc,0xfc,0xfc,
0xfc,0xfc,0xfd,0xfc,0xfc,0xfd,0xfd,0xfd,0xfc,0xfc,0xfd,0xfd,0xfd,0xfc,0xfc,
0xfc,0xfb,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfc,0xfc,0xfc,0xfc,0xfd,0xfc,
0xfc,0xfc
};
int code happysongtl[]={
0x08,0x08,0x33,0x81,0x81,0x33,0x08,0xab,0x44,0x44,0xab,0x08,0x08,0xab,0xab,
0x08,0x08,0x33,0x81,0x81,0x33,0x08,0xab,0x44,0x44,0xab,0x08,0xab,0x44,0x44,
0xab,0xab,0x08,0x44,0xab,0x08,0x33,0x08,0x44,0xab,0x08,0x33,0x08,0xab,0x44,
0xab,0x04,0x08,0x08,0x33,0x81,0x81,0x33,0x08,0xab,0x44,0x44,0xab,0x08,0xab,
0x44,0x44
};
int code tonetime[]={
400,400,400,400,400,400,400,400,400,400,400,400,600,200,800,400,400,400,400,
400,400,400,400,400,400,400,400,600,200,800,400,400,400,400,400,200,200,400,
400,400,200,200,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,
400,400,400,
400,400
};
*/
int tho[]={0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,//1234567的⾼位定时器的值avril lavigne 专辑
0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,//低⾳1234567的⾼位定时器的值
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe //⾼⾳1234567的⾼位定时器的值
};
int tlo[]={
0x44,0xab,0x08,0x33,0x81,0xc7,0x05,//1234567的⾼位定时器的值
0x8c, 0x5b,0x15,0x67,0x04,0x90,0x0c,//低⾳1234567的低位定时器的值
0x22,0x56,0x85,0x9a,0xc1,0xd3,0xe4 //⾼⾳1234567的低位定时器的值
};
int tontime[]={200,400,600,800,1000,1200,1400,1600};
//tontime函数的值代表四分之⼀拍,半拍,1拍,1拍半,2拍,2拍半,3拍,3拍半,4拍
/*以下是欢乐颂的简谱数据表,通过改变这两个数组以及k的值可以播放不同的歌曲,其中5+6中的5表⽰低⾳5如果需要其他的低⾳只需要将5改为其他低⾳⾳符即可*/
int code gladsong[]={
3,3,4,5,5,4,3,2,1,1,2,3,3,2,2,3,3,4,5,5,4,3,2,1,1,2,3,2,1,1,
2,2,3,1,2,3,4,3,1,2,3,4,3,2,1,2,5+6,3,3,4,5,5,4,3,2,1,1,2,3,2,
1,1
};//这个代表歌曲的简谱
float code timenum[]={
1,1,1,1,1,1,1,1,1,1,1,1,1.5,0.5,2,1,1,1,1,1,1,1,1,1,1,1,1,1.5,0.5,2,东方爱婴歌曲
1,1,1,1,1,0.5,0.5,1,1,1,0.5,0.5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1
};//这个代表每⼀个⾳符的节拍。以4/4拍为例,1代表1拍,1.5代表1拍半,0.5代表半拍,2代表2拍。//twotiger和tigernum两个数组是两只⽼虎的简谱数据表
int code twotiger[]={1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,2,5+6,1,2,5+6,1};
int code tigernum[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.5,0.5,0.5,0.5,1,1,0.5,0.5,0.5,0.5,1,1,
1,1,1,1,1,1};
仝卓怼姚晨
//smallstar和starnum是⼩星星的简谱数据表
int code smallstar[]={1,1,5,5,6,6,5,4,4,3,3,2,2,1,5,5,4,4,3,3,2,
5,5,4,4,3,3,2,1,1,5,5,6,6,5,4,4,3,3,2,2,1};
int code starnum[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int code happybirthday[]={5+6,5+6,6+6,5+6,1,7+6,5+6,5+6,6+6,5+6,
2,1,5+6,5+6,5,3,1,7+6,6+6,4,4,3,1,2,1};
int code birthdaynum[]={0.5,0.5,1,1,1,1,0.5,0.5,1,1,1,1,1,1,1,1,1,1,1,1.5,0.5,1,1,1,1};
static u8 k=0;
static int HT,LT;//⾼低位定时器的值
void Time0_init()
{
TMOD|=0X01;
TR0=1;
TH0=HT;
TL0=LT;
ET0=1;
EA=1;
}
void delay(u16 ms){u16 b;for(ms;ms>0;ms--)for(b=120;b>0;b--);}
void main()
{
东风破mv下载Time0_init();
while(1)
{
HT=tho[gladsong[k-1]];
LT=tlo[gladsong[k-1]];
k++;  if(k>61)k=0;
delay(tontime[(int)timenum[k]*2]);
//将这个注释掉可以播放欢乐颂
/*HT=tho[twotiger[k]];
LT=tlo[twotiger[k]];
k++;  if(k>31)k=0;
delay(tontime[(int)tigernum[k]*2]);
*///将这个注释掉可以播放两只⽼虎。
/* HT=tho[smallstar[k]];
刘欢神曲
LT=tlo[smallstar[k]];
k++;  if(k>41)k=0;
delay(tontime[(int)starnum[k]*2]);
*/ //将这个注释掉可以播放⼩星星。
/* HT=tho[happybirthday[k]];
LT=tlo[happybirthday[k]];
k++;  if(k>24)k=0;
delay(tontime[(int)birthdaynum[k]*2]); *///将这个注释掉就可以播放⽣⽇快快乐歌if(k%4==0)delay(200);
TR0=0;
delay(100);TR0=1;
}
}
void intf() interrupt 1
{
TH0=HT;
TL0=LT;
beep=~beep;
}