数字音乐盒设计报告.docx
- 文档编号:9964042
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:22
- 大小:373.71KB
数字音乐盒设计报告.docx
《数字音乐盒设计报告.docx》由会员分享,可在线阅读,更多相关《数字音乐盒设计报告.docx(22页珍藏版)》请在冰点文库上搜索。
数字音乐盒设计报告
一、设计题目:
数字音乐盒
二、设计任务和要求:
1、利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(最少储存三首乐曲,每首不少于30秒)。
2、采用LCD显示信息。
3、开机时有英文欢迎提示字符,播放时显示歌曲序号(或名称)。
4、可通过功能键选择乐曲,暂停,播放。
5、选作内容:
显示乐曲播放时间或剩余时间。
6、本设计中用89C51单片机,4*4键盘,蜂鸣器,16*2LCD,七段显示数码管LED。
三、原理电路和程序设计:
1、方案比较:
方案1:
用四个按键控制音乐的播放。
3个按键选择3首不同的音乐播放,另一个按键控制音乐的停止。
按下播放键,用一点简单的控制之后,才开始播放音乐。
比如,用定时器控制,亮灯倒计时10秒然后触发音乐播放。
方案2:
用4*4小键盘来实现音乐的选择播放,1~A按键控制播放10首音乐,C~F按键分别实现欢迎页面、上一首、下一首、停止播放。
为方便以后扩展,选择方案2。
2、电路工作原理:
本设计中用到了89C51单片机,4*4键盘,蜂鸣器,16*2LCD,七段显示数码管LED。
当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。
同时启动定时器T1,显示乐曲播放的时间,并驱动LCD,显示歌曲号及播放时间。
也可在LED显示歌曲号。
(1) 硬件电路中用P1.0~P1.7控制按键,其中P1.0~P1.3扫描行,P1.4~P1.7扫描列。
(2) 用P0.0~P0.7,P2.0~P2.7控制LED,其中P0.0~P0.7控制七段码a,b,c,d,e,f,g,用P2.0~P2.7为数码管位选信号。
(3) 用,P2.0~P2.2作为LCD的RS,R/W,E的控制信号。
用P0.0~P0.7作为LCD的D0~D7的控制信号。
(4) 用P3.7口控制蜂鸣器。
(5) 电路为12MHZ晶振频率工作,起振电路中C1,C2均为30pf。
3、电路原理图:
4、软件实现方法:
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
发音部分代码在程序中实现,靠单片机的一个管脚输出,考虑到声音可能不够大所以我们加入了功放电路,利用LM386来对声音信号进行放大。
音频输出信号由ADUOUT引出,信号可经功放电路LM386输出到扬声器或耳机。
电路如下图所示:
流程图如下:
5、源程序设计:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
voiddelay(ucharn);
ucharkeyscan();
voidmusic(ucharcode*song);
voidsound_delay(ucharn);
sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚
sbitsound=P3^6;
uintcounter=0;
ucharkey,time,temp;
ucharcodestring[]={"Welcom!
"};
ucharcodestring1[]={"Selectsong..."};
ucharcodestring2[]={"No.1"};
ucharcodestring3[]={"No.2"};
ucharcodestring4[]={"No.3"};
ucharcodestring5[]={"Time:
"};
ucharcodestring6[]={"RemainingTime:
"};
ucharcodestring7[]={"Pause"};
ucharcodestring8[]={"Play"};
ucharcodedigit[10]={"0123456789"};
ucharcodesong1[]=
{
0x60,0x32,0x55,0x32,0x4c,0x32,0x60,0x32,
0x60,0x32,0x55,0x32,0x4c,0x32,0x60,0x32,
0x4c,0x32,0x48,0x32,0x40,0x32,0x40,0x32,
0x4c,0x32,0x48,0x32,0x40,0x32,0x40,0x32,
0x40,0x19,0x40,0x0d,0x39,0x0d,0x40,0x19,0x40,0x0d,0x48,0x0d,0x4c,0x32,0x60,0x32,0x40,0x19,0x40,0x0d,0x39,0x0d,0x40,0x19,0x40,0x0d,0x48,0x0d,0x4c,0x32,0x60,0x32,
0x60,0x32,0x40,0x32,0x60,0x32,0x60,0x32,
0x60,0x32,0x40,0x32,0x60,0x32,0x60,0x32,0x60,0x32,0x55,0x32,0x4c,0x32,0x60,0x32,
0x60,0x32,0x55,0x32,0x4c,0x32,0x60,0x32,
0x4c,0x32,0x48,0x32,0x40,0x32,0x40,0x32,
0x4c,0x32,0x48,0x32,0x40,0x32,0x40,0x32,
0x40,0x19,0x40,0x0d,0x39,0x0d,0x40,0x19,0x40,0x0d,0x48,0x0d,0x4c,0x32,0x60,0x32,
0x40,0x19,0x40,0x0d,0x39,0x0d,0x40,0x19,0x40,0x0d,0x48,0x0d,0x4c,0x32,0x60,0x32,
0x60,0x32,0x40,0x32,0x60,0x32,0x60,0x32,
0x60,0x32,0x40,0x32,0x60,0x32,0x60,0x32,0x00
};//彩云追月
ucharcodesong2[]=
{
0x40,0x19,0x40,0x19,0x40,0x19,0x4c,0x19,0x4c,0x19,0x48,0x19,0x4c,0x19,
0x40,0x19,0x40,0x19,0x40,0x19,0x4c,0x19,0x4c,0x19,0x48,0x19,0x4c,0x19,
0x40,0x19,0x40,0x19,0x40,0x19,0x4c,0x19,0x40,0x19,0x39,0x19,0x33,0x19,0x30,0x19,
0x30,0x19,0x33,0x19,0x33,0x19,
0x30,0x32,0x30,0x32,0x30,0x32,0x39,0x19,0x40,0x19,
0x39,0x19,0x40,0x19,0x4c,0x32,0x4c,0x32,
0x39,0x32,0x39,0x32,0x39,0x32,0x40,0x19,0x4c,0x19,
0x40,0x19,0x4c,0x19,0x55,0x32,0x55,0x32,
0x30,0x32,0x30,0x32,0x30,0x32,0x39,0x19,0x40,0x19,
0x39,0x19,0x40,0x19,0x4c,0x32,0x4c,0x32,
0x55,0x32,0x39,0x19,0x4c,0x19,0x4c,0x32,0x4c,0x19,0x40,0x19,
0x39,0x32,0x39,0x19,0x39,0x32,0x24,0x00,0x40,0x19,0x40,0x19,0x40,0x19,0x4c,0x19,0x4c,0x19,0x48,0x19,0x4c,0x19,
0x40,0x19,0x40,0x19,0x40,0x19,0x4c,0x19,0x4c,0x19,0x48,0x19,0x4c,0x19,
0x40,0x19,0x40,0x19,0x40,0x19,0x4c,0x19,0x40,0x19,0x39,0x19,0x33,0x19,0x30,0x19,
0x30,0x19,0x33,0x19,0x33,0x19,
0x30,0x32,0x30,0x32,0x30,0x32,0x39,0x19,0x40,0x19,
0x39,0x19,0x40,0x19,0x4c,0x32,0x4c,0x32,
0x39,0x32,0x39,0x32,0x39,0x32,0x40,0x19,0x4c,0x19,
0x40,0x19,0x4c,0x19,0x55,0x32,0x55,0x32,
0x30,0x32,0x30,0x32,0x30,0x32,0x39,0x19,0x40,0x19,
0x39,0x19,0x40,0x19,0x4c,0x32,0x4c,0x32,
0x55,0x32,0x39,0x19,0x4c,0x19,0x4c,0x32,0x4c,0x19,0x40,0x19,
0x39,0x32,0x39,0x19,0x39,0x32,0x24,0x00,0x00
};//祝你平安
ucharcodesong3[]=
{
0x72,0x19,0x4c,0x19,0x4c,0x19,0x4c,0x19,0x4c,0x19,0x4c,0x32,0x55,0x19,
0x60,0x19,0x55,0x19,0x60,0x19,0x65,0x19,0x72,0x32,0x72,0x32,
0x39,0x19,0x39,0x19,0x39,0x19,0x39,0x19,0x39,0x32,0x39,0x32,0x40,0x19,
0x97,0x19,0x40,0x19,0x40,0x19,0x48,0x19,0x4c,0x32,0x4c,0x32,
0x4c,0x19,0x39,0x19,0x39,0x19,0x40,0x19,0x4c,0x32,0x4c,0x32,0x55,0x19,
0x60,0x19,0x55,0x19,0x60,0x19,0x65,0x19,0x72,0x32,0x97,0x19,
0x97,0x19,0x60,0x19,0x60,0x19,0x65,0x19,0x72,0x32,0x72,0x32,0x4c,0x19,
0x55,0x19,0x60,0x19,0x65,0x19,0x7f,0x19,0x39,0x32,0x39,0x32,0x72,0x19,0x4c,0x19,0x4c,0x19,0x4c,0x19,0x4c,0x19,0x4c,0x32,0x55,0x19,
0x60,0x19,0x55,0x19,0x60,0x19,0x65,0x19,0x72,0x32,0x72,0x32,
0x39,0x19,0x39,0x19,0x39,0x19,0x39,0x19,0x39,0x32,0x39,0x32,0x40,0x19,
0x97,0x19,0x40,0x19,0x40,0x19,0x48,0x19,0x4c,0x32,0x4c,0x32,
0x4c,0x19,0x39,0x19,0x39,0x19,0x40,0x19,0x4c,0x32,0x4c,0x32,0x55,0x19,
0x60,0x19,0x55,0x19,0x60,0x19,0x65,0x19,0x72,0x32,0x97,0x19,
0x97,0x19,0x60,0x19,0x60,0x19,0x65,0x19,0x72,0x32,0x72,0x32,0x4c,0x19,
0x55,0x19,0x60,0x19,0x65,0x19,0x7f,0x19,0x39,0x32,0x39,0x32,0x00
};//兰花草
bitBusyTest(void)
{
bitresult;
RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;//E=1,才允许读写
_nop_();//空操作
result=BF;//将忙碌标志电平赋给result
E=0;
returnresult;
}
voidWrite_com(unsignedchardictate)
{
while(BusyTest()==1);//如果忙就等待
RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0;//E置低电平(写指令时,
//就是让E从0到1发生正跳变,所以应先置"0"
_nop_();//空操作两个机器周期,给硬件反应时间
P0=dictate;//将数据送入P0口,即写入指令或地址
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
voidWriteAddress(unsignedcharx)
{
Write_com(x|0x80);//显示位置的确定方法规定为"80H+地址码x"
}
voidWriteData(unsignedchary)
{
while(BusyTest()==1);
RS=1;//RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0;//E置低电平(写指令时,,
//就是让E从0到1发生正跳变,所以应先置"0"
P0=y;//将数据送入P0口,即将数据写入液晶模块
_nop_();
E=1;//E置高电平
_nop_();
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
voidLcdInt(void)
{
Write_com(0x38);//3次写设置模式
Write_com(0x0c);
Write_com(0x06);//显示模式设置:
光标右移,字符不移
Write_com(0x01);//清屏幕指令,将以前的显示内容清除
WriteAddress(0x00);
}
voiddisplay(ucharx)
{
ucharshi,ge;
shi=x/10;ge=x%10;
Write_com(0x80+11);
WriteData(digit[shi]);WriteData(digit[ge]);
}
voidmain()
{
uchari;
time=0;temp=0;
LcdInt();
delay(30);
//IP=0X08;
while
(1)
{
WriteAddress(0x04);
while(string[i]!
='\0')
{
WriteData(string[i]);
i++;
delay(10);
}
i=0;
WriteAddress(0x40+1);
while(string1[i]!
='\0')
{
WriteData(string1[i]);
i++;
delay(10);
}
i=0;
keyscan();
if(key==1)
{
Write_com(0x01);
WriteAddress(0x00);
while(string2[i]!
='\0')
{
WriteData(string2[i]);
i++;
delay(10);
}
i=0;
WriteAddress(0x06);
while(string5[i]!
='\0')
{
WriteData(string5[i]);
i++;
delay(10);
}
i=0;display(time);
//Write_com(0x80+11);
music(song2);
Write_com(0x01);
break;
}
elseif(key==2)
{
Write_com(0x01);
WriteAddress(0x00);
while(string3[i]!
='\0')
{
WriteData(string3[i]);
i++;
delay(10);
}
i=0;
WriteAddress(0x06);
while(string5[i]!
='\0')
{
WriteData(string5[i]);
i++;
delay(10);
}
i=0;display(time);
//Write_com(0x80+11);
music(song1);
Write_com(0x01);
break;
}
elseif(key==3)
{
Write_com(0x01);
WriteAddress(0x00);
while(string4[i]!
='\0')
{
WriteData(string4[i]);
i++;
delay(10);
}
i=0;
WriteAddress(0x06);
while(string5[i]!
='\0')
{
WriteData(string5[i]);
i++;
delay(10);
}
i=0;display(time);
//Write_com(0x80+11);
music(song3);
Write_com(0x01);
break;
}
}
}
voiddelay(ucharn)
{
uchari;
while(n--)
for(i=0;i<125;i++);//延时1毫秒
}
voidsound_delay(ucharn)
{
uchari;
while(n--)
{
for(i=0;i<2;i++);
}
}
voidtimer0(void)interrupt1using3
{
counter=counter+1;//节拍次数计数
TH0=(65536-10010)/256;//0xd8;//定义单位节拍的延时大小
TL0=(65536-10010)%256;//0xef;
}
voidtimer1(void)interrupt3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
temp++;
if(temp==19)
{temp=0;time++;}
display(time);
}
voidmusic(ucharcode*song)
{
//uinttemp;
ucharcode*ptr;
//uchari;
ucharsound_signal;//定义音符大小
ucharsound_pace;//定义节拍大小
TMOD=0x11;
TH0=0xff;
TL0=0xff;
EA=1;
ET0=1;
ET1=1;
ptr=song;
while
(1)
{
while(*ptr!
=0x00)
{
if(*ptr==0xFF)//如果是休止符,延时100ms,并终止本次循环,进入下一个循环
{
TR0=0;
delay(100);
continue;
}
sound_signal=*ptr++;//从表中取得音符大小
sound_pace=*ptr++;//从表中取得节拍大小
TR0=1;
TR1=1;
while(counter!
=sound_pace)//当节拍数未达到时候,继续循环,产生该音调的声音
{
keyscan();
if(key==4)
{
TR0=0;TR1=0;
/*WriteAddress(0x08);
while(string7[i]!
='\0')
{
WriteData(string7[i]);
i++;
delay(10);
}
i=0;*/
while
(1)
{
keyscan();
if(key==5)
{
/*WriteAddress(0x08);
while(string8[i]!
='\0')
{
WriteData(string8[i]);
i++;
delay(10);
}
i=0;*/
TR0=1;TR1=1;
break;}
}
}
/*if(temp==100)
{
temp=0;
time++;
display(time);
}*/
sound=~sound;
sound_delay(sound_signal);
}
counter=0;//节拍计数器置0,进入下一个音调
TR0=0;TR1=0;
}
while
(1);
delay(10);//歌曲演唱完毕后,延时一段时间
break;
}
}
ucharkeyscan()
{
uchartemp;
P1=0xff;//先向P1口写1;端口读状态
P1=0xf0;
temp=P1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 音乐盒 设计 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)