. .. . .
timeh=quzi[tem]; //把音符相应的计时器重装载值赋
予timeh和timel timel=quzi[tem+1]; jindu++; TH0=timeh;
TL0=timel; m=music3[jindu];
jindu++;
}
TR0=1; delay(m*200);
TR0=0; }
}
}
/********************** 函数名称:void init_sys()
功能描述:系统初始化,功能是配置IO口 入口参数:无 出口参数:无 备注:
***********************/ void init_sys() { P0M0=0xff; P0M1=0x00;
P2M0=0x08; .
//把timeh和timel赋予计时器
//取得节拍
//开定时器1 //等待节拍完成, 通过P3^4口输出音频 //关定时器1
.. . .
. .. . .
P2M1=0x00; P3M0=0x10; P3M1=0x00; P4M0=0x00; P4M1=0x00; P5M0=0x00; P5M1=0x00;
}
/********************** 函数名称:void init()
功能描述:定时器和外部中断的初始化 入口参数:无 出口参数:无 备注:
***********************/ void init()
{ TMOD=0x01; TH0=0xD8; TL0=0xEF; IE=0x87; //IP=0x02; IP=0x01; TR0=0;
}
/********************** 函数名称:Exint0
功能描述:Key1对应的外部中断0的中断响应函数 ***********************/
. .. . .
. .. . .
void Exint0() interrupt 0 {
if(Key1==0) { delay(10);
//延时消抖
if(Key1==0)
zanting=~zanting; //zanting==1 暂停播放
} }
void main() { init_sys(); init(); P0=0x00; vibrate=1; flag=0;
//播放标志位清零
while(1) { playmusic();
}
}
/**********************
函数名称:void tim1() interrupt 1
功能描述:定时器0中断处理,重新装值,并把beep值取反,产生方波 入口参数:无 出口参数:无 备注:
***********************/ void tim1() interrupt 1 //计时器控制频率
{
. .. . .
. .. . .
TH0=timeh; TL0=timel;
if(zanting==1)
beep=0; else {
beep=~beep; if(vibrate==0)
{ }
} }
jindu=0; gequ++; if(gequ==3) gequ=0;
//歌曲的进度清零,从头开始演唱
五、设计结果
单片机上电后,初始现象为自动播放第一首歌,敲击板子使其振动,切换播放第二首歌,
同理再次振动播放第三首歌,再次振动重新从头播放,按K1键停止播放。
六、操作说明
K1键用于暂停和播放歌曲,敲击板子用于切换歌曲。
七、心得体会
本来这个可振动感应的电子音乐是没有代码的,但是结合之前提供的消抖技术,还有延时技术,以及本来提供的振动感应的代码,就可以做出这个程序。但是由于之前的可切换电子音乐也没有代码,所以在实现的过程中有在网上搜素过相关资料,才最终实现了功能。
. .. . .