仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【V02】
1.? 简介
? 本文提出了一种基于51单片机的简易音乐盒设计。以AT89C51单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有3个按键,利用单片机的定时/计数器T0来产生这样的方波频率信号,只要把一首歌曲的音阶对应频率关系编写正确就可以达到想要的曲目。
2.? 主要功能
a.利用蜂鸣器作为发声部件,设置3个按键,实现8首歌曲的播放。
b.通过独立按键实现播放/暂停、切换歌曲。
3.? 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
void KEY()
{
if(!pause) //暂停键处理
{
delayms(5);
if(!pause)
{
TR0=0;
speaker=1;
if(music_num==0) //music_num=0只有在刚开机,且未按下暂停键时存在,表示刚开机时的状态,按下后从第一首开始播放
{
music_num=1; //歌曲序号置1
num=0; //从头播放
play_enable=1; //允许播放
}
else
{
play_enable=~play_enable;
speaker=1;
}
while(!pause) //若按着暂停键不放手时的处理
{
if(play_enable==0){} //如果是暂停,则显示时间不变//(暂停时play_enable==0)
}
}//暂停键处理结束
}//while结束
if((!play_up)&&(music_num!=0)) //上一首按键
{
delayms(5);
if((!play_up)&&(music_num!=0))
{
TR0=0;
speaker=1;
music_num-=1;//歌曲编号减一
if(music_num<=0)
music_num=8;
num=0; //从头开始播放
/* if(music_num==(sound_amount+1))
music_num=1; */
delayms(500);//歌曲切换时延时0.5S
}
}
if((!play_down)&&(music_num!=0))
{
delayms(5);
if((!play_down)&&(music_num!=0))
{
TR0=0;
speaker=1;
music_num+=1;//歌曲编号加一
if(music_num>=9)
music_num=1;
num=0; //从头开始播放
/* if(music_num==0)
music_num=sound_amount; */
delayms(500);//歌曲切换时延时0.5S
}
}
}
void main(void)
{
TMOD=0x11; //T0 T1 均在工作方式1
ET0=1; //T0开中断
EA=1; //CPU开中断
while(1)
{
music_play(); //根据当前状态播放相应歌曲的某个音符
KEY();
}
}
void delayms(unsigned int t) //MS延时子程序
{
unsigned int i,j;
for(i=0;i<t;i++)
{
for(j=0;j<123;j++)
;
}
}
void delay(unsigned char t) //延时子函数,控制发音的时间长度,每个节拍0.4S
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<t;t1++) //嵌套循环, 共延时t个半拍
{
for(t2=0;t2<6500;t2++) //延时期间, 可进入T0中断去发音
{
KEY();
}
}
TR0=0; //关闭T0, 停止发音
}
void timer0(void) interrupt 1 //T0中断程序,控制发音的音调
{
speaker=!speaker;//输出方波, 发音
TH0=timer0h; //下次的中断时间,这个时间控制音调高低
TL0=timer0l;
}
void song(void) //演奏一个音符
{
TH0=timer0h; //控制音调
TL0=timer0l;
TR0=1; //启动T0, 由T0输出方波发音
delay(time); //每个音符的演奏时间
}
////////////////////////////////////////////////////////////////////////////////////
void music_play(void)//播放相应歌曲的某个音符
{
if((music_num==1)&&(play_enable==1))
{
fre=song1[num]+7*song1[num+1]-1;//第i个是音符,第i+1个是第几个八度
timer0h=FREQH[fre]; //从数据表中读出频率数值,实际上是定时的时间长度
timer0l=FREQL[fre];
time=song1[num+2]; //读出时间长度数值
num+=3;
if(fre<0) //判断歌曲的结束位,结束后转到下一首
{
num=0; //下一首从头播放
music_num=2;
}
song(); //发出一个音符
}
////////////////////////////////////////////////////////////////////////////////////
if((music_num==2)&&(play_enable==1))
{
fre=song2[num]+7*song2[num+1]-1;
timer0h=FREQH[fre];
timer0l=FREQL[fre];
time=song2[num+2];
num+=3;
if(fre<0)
{
num=0;
music_num=3;
}
song();
}
4.? 仿真proteus8.6
? 本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
初始界面:
5.? 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6.? 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
7.? 资料获取链接
百度网盘下载链接:【V02】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集
2215