标题:
单片机按键切换下一首歌
[打印本页]
作者:
会飞的鱼1710
时间:
2018-10-13 19:01
标题:
单片机按键切换下一首歌
#include "at89x51.h"
#define uchar unsigned char
#define uint unsinged int
sbit speaker=P1^5;//蜂鸣器。按键默认的是P3.2脚(外部中断0)
uchar t0h,t0l,time,flag;
//--------------------------------------
//单片机晶振采用12MHz
// 频率-半周期数据表 高八位 本软件共保存了四个八度的28个频率数据
uchar code FREQH[]={0x01, //0的时候没有音符
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}; //超高音 1234567
//-----------------------------------------
// 频率-半周期数据表 低八位
uchar code FREQL[]={0x01, //0的时候没有音符
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}; //超高音 1234567
//--------------------------------------
//一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以1/4拍为单位)。
//6,2,6 分别代表:6,中音,6个1/4拍;
//5,2,2 分别代表:5,中音,2个1/4拍;
//3,2,4 分别代表:3,中音,4个1/4拍;
//5,2,4 分别代表:5,中音,4个1/4拍;
//1,3,4 分别代表:1,高音,4个1/4拍;
//低音为1,中音为2,高音为3,超高音为4;
//////////////////////////////////////////////////////////
/********************世上只有妈妈好*********************/
uchar code sszymmh[]={
6,2,6,5,2,2,3,2,4,5,2,4,
1,3,4,6,2,2,5,2,2,6,2,8,
3,2,4,5,2,2,6,2,2,5,2,4,
3,2,4,1,2,2,6,1,2,5,2,2,
3,2,2,2,2,8,2,2,6,3,2,2,
5,2,4,5,2,2,6,2,2,3,2,4,
2,2,4,1,2,8,5,2,6,3,2,2,
2,2,2,1,2,2,6,1,2,1,2,2,
5,1,16,0,0,0};
/**********************两只耗子**********************/
uchar code TwoMouse[]={
3,2,2,6,2,2,7,2,2,5,2,2,
3,2,2,6,2,2,7,2,2,5,2,2,
7,2,2,1,3,2,2,3,4,
7,2,2,1,3,2,2,3,4,
2,3,1,3,3,1,2,3,1,1,3,1,7,2,2,5,2,2,
2,3,1,3,3,1,2,3,1,1,3,1,7,2,2,5,2,2,
6,2,2,2,2,2,5,2,4,6,2,2,2,2,2,5,2,4,
0,0,0};
/***********************两只蝴蝶**********************/
uchar code TwoButterfly[]={
3,2,2,2,2,2,3,2,6,3,2,2,3,2,2,2,2,2,
1,2,6,6,1,2,1,2,2,2,2,4,2,2,2,3,2,2,
2,2,2,1,2,2,6,1,2,1,2,2,5,1,12,3,2,2,
2,2,2,3,2,8,3,2,2,2,2,2,3,2,2,3,2,2,
1,2,12,6,1,2,1,2,2,2,2,4,2,2,2,3,2,2,
2,2,2,1,2,2,6,1,2,1,2,2,2,2,12,3,2,2,
2,2,2,3,2,8,3,2,2,2,2,2,3,2,2,2,2,2,
1,2,12,6,1,2,1,2,2,2,2,4,2,2,2,3,2,2,
2,2,2,1,2,2,6,1,2,1,2,2,5,2,12,3,2,2,
5,2,2,5,2,8,5,2,2,5,2,2,6,2,2,5,2,2,
3,2,12,2,2,2,3,2,2,2,2,4,2,2,2,3,2,2,
2,2,2,1,2,2,6,1,2,6,1,1,1,2,1,1,2,1,
1,2,1,1,2,12,0,0,4,5,2,2,5,2,2,6,2,2,
1,3,2,7,2,2,7,2,2,6,2,2,3,2,2,2,2,2,
2,2,2,3,2,2,3,2,8,3,2,2,3,2,2,
5,2,2,6,2,4,6,2,6,6,1,2,3,2,2,2,2,2,
2,2,12,3,2,2,5,2,2,5,2,2,3,2,2,5,2,4,
1,3,4,7,2,2,6,2,2,7,2,2,3,2,4,
6,2,2,6,2,2,7,2,2,6,2,2,5,2,2,
3,2,2,2,2,4,3,2,2,2,2,2,3,2,2,5,2,6,
5,2,2,5,2,2,6,2,2,6,2,2,5,2,2,
3,2,2,2,2,4,5,1,2,5,1,2,6,1,2,1,2,12,
0,0,0};
/*****************happy birthday***********************/
uchar code Birthday[]={
5,1,2,5,1,2,6,1,4,5,1,4,1,2,4,7,1,8,
5,1,2,5,1,2,6,1,4,5,1,4,2,2,4,1,2,8,
5,1,2,5,1,2,5,2,4,3,2,4,1,2,4,7,1,4,
6,1,4,4,2,2,4,2,2,3,2,4,1,2,4,2,2,4,
1,2,4,0,0,0};
//-----------------------------------------------------
void delay(uchar t) //延时程序,控制发音的时间长度120ms(1/4拍)
{
uchar a,b,c;
while(t--) //四重循环,共延时t个1/4拍
{
for(c=193;c>0;c--)
for(b=114;b>0;b--)
for(a=1;a>0;a--);
}
//延时期间,可进入T0中断去发音
TR0=0; //关闭T0,停止发音
}
//--------------------------------------
void singachar() //演奏一个音符
{
TR0=0;
TH0=t0h; //控制音调
TL0=t0l;
TR0=1; //启动T0,由T0输出方波去发音
delay(time); //控制时间长度即 节拍
}
//--------------------------------------
//**************演奏一首歌***********************************//
void song()
{
uchar k,i,*str;
i=0;
time=1;
while(time)
{
switch(flag)
{
case 1:str=sszymmh;break;
case 2:str=TwoButterfly;break;
case 3:str=Birthday;break;
case 4:str=TwoMouse;break;
}
k=str[i]+7*(str[i+1]);//第i个是音符,第i+1个是第几个八度
t0h=FREQH[k];//从数据表中读出频率数值
t0l=FREQL[k];//实际上,是定时的时间长度
time=str[i+2];//读出时间长度数值节拍时间
i+=3;
singachar();
}
}
//-----------------------------------------------------
void t0int() interrupt 1 //T0中断程序,控制发音的音调
{
TR0=0; //先关闭T0
speaker=~speaker; //输出方波,发音
TH0=t0h; //下次的中断时间,这个时间,控制音调高低
TL0=t0l;
TR0=1; //启动T0
}
//-----------------------------------------------------
void int0() interrupt 0 //T0中断程序,控制发音的音调
{
delay(1);
if(INT0==0)
{
flag++; //先关闭T0
if(flag>=5)
flag=0;
}
while(INT0==0);
}
//--------------------------------------
void main(void)
{
TMOD=0x01; //置T0定时工作方式1
IT0=1;
EX0=1; //外部中断0
ET0=1; //开T0中断
EA=1; //开CPU中断
while(1)
{
song();
delay(2);
/* song(sszymmh);
delay(20);
song(TwoButterfly);
delay(20);
song(Birthday);
delay(20);*/
}
//发出一个音符
}
复制代码
作者:
快乐眼泪
时间:
2018-10-13 19:31
努力学习!一定要看懂程序!楼主真厉害
作者:
chaopping
时间:
2018-10-14 19:50
说好的按键切换歌曲 按键呢
作者:
会飞的鱼1710
时间:
2018-10-16 20:57
P32呀,INT0默认的
作者:
jll586
时间:
2018-10-16 21:19
有个电路图就更好了
作者:
会飞的鱼1710
时间:
2018-10-26 09:36
jll586 发表于 2018-10-16 21:19
有个电路图就更好了
就一个按键和一个蜂鸣器呀
作者:
zjchen
时间:
2019-3-25 16:31
楼主幸苦了!
作者:
真想当个散人
时间:
2019-3-25 19:51
看着很厉害 还要查乐谱 需要花时间
作者:
whille
时间:
2020-6-22 14:44
chaopping 发表于 2018-10-14 19:50
说好的按键切换歌曲 按键呢
采用外部中断的方式切换歌曲,外部中断就是按键
作者:
2847194402
时间:
2020-12-24 16:25
怎么用手机蓝牙实现音乐播放啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1