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的高位定时器的值

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()

{

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;

}

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值