简易音乐播放器设计
单片机实践含Protel课程综合设计说明书
一、设计目的:
单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。本设计就是应用单片机强大的控制功能制作的音乐播放器,该音乐播放器具有可播放多首音乐、通过按键来选择播放的音乐、选择音乐时显示音乐名称、可暂停等功能。
通过此次设计能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。
二、设计要求:
1、可播放多首音乐,且通过按键来选择播放的音乐;
2、选择音乐时,显示音乐名称;
3、可暂停;
4、可实现循环播放功能。
三、设计任务和内容:
利用单片机(AT89S51)、蜂鸣器、1602液晶等实现具有可播放多首音乐、可通过按键(上一首、下一首)来选择播放的音乐、选择音乐时(1602液晶)显示歌名、可暂停、可循环播放功能的一个音乐播放器。
四、系统框图和原理分析:
1602液晶显示歌名 蜂鸣器,播放音乐,
AT89S51
晶振复位设置模块,独
电路 电路 立按键,
- 1 -
单片机实践含Protel课程综合设计说明书
此音乐播放器由复位电路、时钟电路、独立按键、AT89S51单片机、蜂鸣器和1602液晶组成,设计课题的总
如上图所示。
硬件系统各模块功能介绍:
本设计的硬件系统主要采用以下基本模块来实现,单片机最小系统模块,输入模块,输出模块,电源模块。
1、单片机最小系统模块;包括AT89S51芯片一片,复位电路,晶振电路。本模块以AT89S51为系统控制核心,单片机系统复位由复位电路完成,单片机内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容,这样就构成了一个稳定的自激振荡器。硬件模块如图一所示:
U1VCC
140P1.0VCCP1.1239P1.1P0.0(AD0)P0338P1.2P0.1(AD1)P1S1C3437P1.3P0.2(AD2)P222u536P1.4P0.3(AD3)P3635P1.5(MOSI)P0.4(AD4)P4734P1.6(MISO)P0.5(AD5)P5R1833P1.7(SCK)P0.6(AD6)P6932200RSTP0.7(AD7)P71031R2P3.0(RXD)EA(VPP)1130200P3.1(TXD)ALE(PROG)P3.21229P3.2(INT0)PSENP3.31328P3.3(INT1)P2.7(A15)1427P3.4(T0)P2.6(A14)GNDC120p1526P3.5(T1)P2.5(A13)1625P3.6(WR)P2.4(A12)17242GNDP3.7(RO)P2.3(A11)18231XTAL2P2.2(A10)Y1922XTAL1P2.1(A9)20211GNDP2.0(A8)11.0592MHzC220p
AT89S51
GND
图一 单片机最小系统
2、输入模块:本模块共用到了三个按键,一个复位键,单片机运行期间,利用按键完成复位操作。其余两个按键的功能分别为,暂停/播放键控制音乐是播放还是暂停;下一首按键选择所播放的音乐。这些键分别与单片机的输入接口相连,属于独立按键,可以独立实现相应的音乐播放器的功能。硬件模块如图二所示:
- 2 -
单片机实践含Protel课程综合设计说明书
P3.3S2
P3.2S3
GND
图二 按键输入模块 3、输出模块:本设计在音乐播放器播放音乐时用1602液晶显示歌曲名称、歌曲播
放时间,用蜂鸣器作为声音输出装置,当按下播放键时,可以听到不同频率音符组成的
歌曲。硬件模块分别入图三、四所示:
图三 1602液晶显示模块
GND
LS1
SpeakerR3Q1P1.1
1K
VCC
图四 声音输出模块
- 3 -
单片机实践含Protel课程综合设计说明书
五、程序
图
开始
1、主程序流程图
系统初始化
调用判键子程序
Y N 执行其功能 暂停 下一首
Y
N 执行其功能
连接好电路,接通电源后,系统便开始执行主程序,首先进行系统初始化,然后开
暂停/播放键 按下时,始播放系统默认的第一首歌曲,同时调用判键子程序。当判断到
系统便执行其相应的功能(暂停当前音乐的播放,进入等待状态。/继续播放当前已暂停的音乐。)当判断到 下一首键 按下时,系统便执行其相应的功能(立即停止当前歌曲的播放,并进入下一首歌曲的播放。)如果没有键按下,系统便继续执行原程序,继续播放当前音乐并继续调用判键子程序。
- 4 -
单片机实践含Protel课程综合设计说明书
2、暂停/播放键程序流程图
开始
主程序
判键
N 暂停/播放键 是否按下,
Y
等待、停播
N Y 暂停/播放键 是否按下,
连接好电路,接通电源后,系统便开始执行主程序,首先进行系统初始化,然后开始播放系统默认的第一首歌曲,同时调用判键子程序。当第一次判断到 暂停/播放键 按下时,系统便暂停当前音乐的播放,进入等待状态;当 暂停/播放键 键没有按下时,系统便继续播放当前音乐并继续调用判键子程序。当再次判断到 暂停/播放键 按下时,系统便继续播放刚才停播的音乐。
- 5 -
单片机实践含Protel课程综合设计说明书
3、下一首键程序流程图
开始
主程序
判键
N 下一首键是 否按下,
Y
播放下一首歌 曲
连接好电路,接通电源后,系统便开始执行主程序,首先进行系统初始化,然后开
下一首键 按下时,始播放系统默认的第一首歌曲,同时调用判键子程序。当系统判断到
系统便停止当前音乐的播放,立即进入下一首歌曲的播放;当 下一首键 没有按下时,系统便继续播放当前音乐并继续调用判键子程序。
六、设计总结
这次单片机综合设计,我有很多
,有关于单片机方面的,也有关于人与人关系方面的。
通过本次综合设计,我深刻体会到单片机技术应用领域的广泛,不仅使我对学过的单片机知识有了很多的巩固,同时也对单片机这一门课程产生了更大的兴趣。同时自己也懂得了要想把这门功课学好,需要的不仅仅是书本上的知识,关键还要自己亲手实践锻炼自己的动手能力,只有在实践中经历一个从不知道到知道的过程,才能够学到更多东西。我认为,知识是课本理论与实践相结合的产物,我们只有把理论更好的运用到实践中,学到的才是真正的知识。
经过这两周,我知道了书本和实际操作还是有很大差距的,而且自己的动手能力还
- 6 -
单片机实践含Protel课程综合设计说明书
不是很强,而且这门学科对细心和耐心也有很高的要求,在这两周暴露出来很多自己的不足,所以以后我还要多加练习,多锻炼自己这方面的能力。
通过本次综合设计,我也感觉到了团队合作的重要性——“一个人的强大不是真正的强大,一个团队的强大才是真正的强大,依靠团队的力量是可以战胜一切困难的”。同时,在此感谢刘强老师、段纯爽老师对我们的辛勤指导。最后,也对给过我帮助的所有老师和同学再次
示衷心的感谢。
附录
参考文献
(1)周润景——基于PROTEUS的51单片机设计与仿真;
(2)ATMEL公司AT89S51单片机中文PDF
;
(3)1602液晶中文PDF资料;
(4)李群芳、张士军——单片微型计算机与接口技术(第三版);
(5)张富——C及C++程序设计(第三版).
附录1 ---电路图和PCB图
本设计电路原理图如下:
图五 原理图
- 7 -
单片机实践含Protel课程综合设计说明书
本设计PCB图如下:
11401212239233383443745536512663567734781328338921932910103112111130121212291312132814121427151526211616252211724211823 21
31922图六 PCB图 1220211
图七 PCB 3D效果图
- 8 -
单片机实践含Protel课程综合设计说明书
附录2 ---源程序(汇编或C语言)
#include
//添加头文件 0xC8,0xF3, //00294HZ ,4 //5 #define uchar unsigned char 0x73,0xF4, //00311HZ ,4# //6 #define uint unsigned int 0x1E,0xF5, //00330HZ ,5 //7 sbit BEEP=P1^1; //喇叭输出脚 0xB6,0xF5, //00349HZ ,5# //8 sbit rs=P2^1; 0x4C,0xF6, //00370HZ ,6 //9 sbit lcden=P2^0; 0xD7,0xF6, //00392HZ ,6# //10 uchar th0_f,tl0_f; //在中断中装载的 0x5A,0xF7, //00415HZ ,7 //11 T0的值高、低8位 0xD8,0xF7, //00440HZ 1 //12 uchar sec,min; 0x4D,0xF8, //00466HZ 1# //13 uchar flag=0,m,aa; 0xBD,0xF8, //00494HZ 2 //14 uchar code table[]=" Welcoom "; 0x24,0xF9, //00523HZ 2# //15 uchar code table0[]=" Music Player"; 0x87,0xF9, //00554HZ 3 //16 uchar code table1[]=" Bei Jing Huan"; 0xE4,0xF9, //00587HZ 4 //17 uchar code table2[]=" Ying Ni 00:00"; 0x3D,0xFA, //00622HZ 4# //18 uchar code table3[]=" Yin Xing De"; 0x90,0xFA, //00659HZ 5 //19 uchar code table4[]=" Chi Bang 00:00"; 0xDE,0xFA, //00698HZ 5# //20 uchar code table5[]=" Thanks Goodbye"; 0x29,0xFB, //00740HZ 6 //21 uchar code table6[]="Form Chen Fu lin "; 0x6F,0xFB, //00784HZ 6# //22 void write_smh(uchar add,uchar date); 0xB1,0xFB, //00831HZ 7 //23 void write_com(uchar com); 0xEF,0xFB, //00880HZ `1 //24 void write_date(uchar date); 0x2A,0xFC, //00932HZ `1# //25 void init(); 0x62,0xFC, //00988HZ `2 //26 void init0(); 0x95,0xFC, //01046HZ `2# //27 void init1(); 0xC7,0xFC, //01109HZ `3 //28 void init2(); 0xF6,0xFC, //01175HZ `4 //29 void init3(); 0x22,0xFD, //01244HZ `4# //30 /***************** 延时 1ms 0x4B,0xFD, //01318HZ `5 //31 *******************/ 0x73,0xFD, //01397HZ `5# //32 void delay_1ms(unsigned int t) 0x98,0xFD, //01480HZ `6 //33 { 0xBB,0xFD, //01568HZ `6# //34
unsigned char i,j; 0xDC,0xFD, //01661HZ `7 //35
for(t;t>0;t--) };
{
for(i=34;i>0;i--)
for(j=13;j>0;j--); uchar code music1[336] = { // 《北京欢
} 迎你》
} 16,16,19,19,16,16,14,14,16,16,14,14,16,1
6,16,36, //迎接另一个晨曦
//T0的值,及输出频率对照表 16,16,14,14,9,9,12,12,16,16,14,14,14,14,static code freq[36][2] = { 14,36, //带来全新空气
0xA9,0xEF, //00220HZ ,1 //0 14,14,12,12,9,9,12,12,14,14,16,16,19,19,
0x93,0xF0, //00233HZ ,1# //1 14,14, //气息改变情味不变
0x73,0xF1, //00247HZ ,2 //2 16,16,21,21,19,19,9,9,14,14,12,12,12,12,
0x49,0xF2, //00262HZ ,2# //3 12,36, //茶香飘满情谊
0x07,0xF3, //00277HZ ,3 //4
- 9 -
单片机实践含Protel课程综合设计说明书
16,16,19,19,16,16,14,14,16,16,14,14,16,14,12,12, //次都在徘徊
6,16,36, //我家大门常打开 12,12,12,12,12,12,9,9,8,8,8,36,9,9,12,12, 16,16,14,14,9,9,12,12,16,16,14,14,14,14,//孤单中坚强 每一
14,36, //开放怀抱等你 16,16,16,16,16,16,19,19,19,19,19,19,21,214,14,12,12,9,9,12,12,14,14,16,16,19,19,1,19,19, //次就算很受伤
14,14, //拥抱过就有了默契 19,19,16,16,14,14,12,12,14,14,14,36,21,2
1,19,19, //也不闪泪光 我知
16,16,21,21,19,19,9,9,14,14,12,12,12,12,
12,36, //你会爱上这里 16,16,16,16,16,16,19,19,19,19,19,19,21,214,14,12,12,9,9,12,12,14,14,16,16,19,19,1,19,19, //道我一直有双
14,14, //不管远近都是客人 16,16,14,14,12,12,14,14,9,9,9,36,8,8,9,9, 16,16,21,21,19,19,19,19,16,16,16,16,16,1//隐形的翅膀 带我
6,16,36, //请不用客气 12,12,12,12,12,12,16,16,14,14,14,14,16,114,14,16,16,14,14,12,12,19,19,21,21,14,14,14,14, //飞 飞过绝
4,14,36, //相约好了在一起 12,12,12,12,12,12,12,12,12,12,12,36,8,8,
9,9,16,16,14,14,14,14,12,12,12,12,12,12,12,12, //望 不去
12,36, //我们欢迎你 16,16,16,16,16,16,19,19,16,16,16,16,14,136,36,36,36,36,36,36,36,16,16,16,16,19,14,12,12, //想他们拥有
9,19,19, //北京 12,12,12,12,12,12,9,9,8,8,8,36,8,8,12,12, 24,24,19,19,21,21,21,21,36,36,21,21,19,1//美丽的太阳 我看
9,16,16, //欢迎你 为你开 16,16,16,16,16,16,19,19,19,19,19,19,21,216,16,19,19,19,19,19,19,19,19,19,36,16,11,19,19, //见每天的夕阳
6,19,19, //天辟地 流动 19,19,16,16,14,14,12,12,14,14,14,36,21,2
1,19,19, //也会有变化 我知
21,21,24,24,26,26,24,24,19,19,16,16,14,1
4,19,19, //中的魅力充满着朝 16,16,16,16,16,16,19,19,19,19,19,19,21,2
1,19,19, //道我一直有双
16,16,16,16,16,16,16,16,16,16,16,36,16,1
6,19,19, //气 北京 16,16,14,14,12,12,14,14,9,9,9,36,8,8,9,9,
//隐形的翅膀 带我
24,24,19,19,21,21,21,21,36,36,24,24,26,2
6,24,24, //欢迎你 在太阳 12,12,12,12,12,12,14,16,14,14,14,14,16,1
6,12,12, //飞 给我希
19,19,16,16,19,19,23,23,21,21,21,21,36,3
6,16,16, //下分享呼吸 在 12,12,12,12,12,12,12,12,12,12,12,36,16,1
6,19,19, //望 我终
14,14,16,16,19,19,28,28,26,26,26,26,26,2
6,23,23, //黄土地刷新成 24,24,24,24,24,36,24,24,24,24,24,24,21,224,24,24,24,24,24,24,24,24,24,24,24,24,21,19,19, //于看到所有
4,36,36, //绩
}; 21,21,24,24,16,16,14,14,12,12,12,36,12,1
uchar code music2[464] = { // 《隐形2,12,12, //梦想都开花 追逐
的翅膀》
36,36,36,36,36,36,36,36,36,36,36,36,8,8,12,12,24,24,24,24,21,21,19,19,16,16,14,112,12, //每一 4,12,12, //的年轻歌声多嘹
16,16,16,16,16,16,19,19,16,16,16,16,14,1
- 10 -
单片机实践含Protel课程综合设计说明书
14,14,14,14,14,14,14,14,14,14,14,36,16,1}
6,19,19, //亮 我终 void yanshi(uchar z)
{
24,24,24,24,24,36,24,24,24,24,24,24,21,2 uchar i,j; 1,19,19, //于翱翔用心 for(i=z;i>0;i--)
for(j=110;j>0;j--);//z=1的时候延时21,21,24,24,16,16,14,14,12,12,12,36,12,11ms
2,12,12, //凝望不害怕 哪里 }
12,12,24,24,24,24,21,21,19,19,16,16,14,1timer1() interrupt 3 4,12,12, //会有风就飞多远 {
TH1=(65536-46080)/256; 12,12,12,12,12,12,12,12,12,12,36,36,16,1 TL1=(65536-46080)%256; 6,19,19, //吧 隐形 m++;
if(m==20)
24,24,24,24,24,36,24,24,23,23,23,23,21,2 {
1,19,19, //的翅膀让梦 m=0;
sec++;
21,21,24,24,16,16,14,14,12,12,12,36,12,1 if(sec==60) 2,12,12, //恒久比天长 留一 {
sec=0;
12,12,24,24,24,24,21,21,19,19,16,16,14,1 min++;
4,14,14, //个愿望让自己 write_smh(11,min);
}
14,14,14,14,12,12,12,12,12,12,12,12,12,1 write_smh(14,sec); 2,12,36, //想象... ... }
};
}
//定时中断0,用于产生唱歌频率 void write_com(uchar com) timer0() interrupt 1 {
{ rs=0;
TL0=tl0_f; lcden=0;
TH0=th0_f; //调入预定时值 P0=com;
BEEP=~BEEP; //取反音乐输出IO yanshi(5);
} lcden=1;
yanshi(5);
int0() interrupt 0 lcden=0;
{ }
TR0=!TR0; void write_smh(uchar add,uchar date)
TR1=!TR1; {
flag=!flag; uchar shi,ge; } shi=date/10; int1() interrupt 2 ge=date%10; { write_com(0x80+0x40+add);
aa++; write_date(0x30+shi);
if(aa==3) write_date(0x30+ge);
aa=0; }
- 11 -
单片机实践含Protel课程综合设计说明书
void write_date(uchar date) for(num=0;num<16;num++) { {
rs=1; write_date(table2[num]);
lcden=0; yanshi(5);
P0=date; }
yanshi(5); }
lcden=1; void init2()
yanshi(5); {
lcden=0; uchar num;
} init();
void init() for(num=0;num<14;num++) { {
TH1=(65536-46080)/256; write_date(table3[num]);
TL1=(65536-46080)%256; yanshi(5);
lcden=0; }
write_com(0x38); write_com(0x80+0x40);
write_com(0x0c); for(num=0;num<16;num++)
write_com(0x06); {
write_com(0x01); write_date(table4[num]);
write_com(0x80); yanshi(5);
} }
void init0() }
{ void init3()
uchar num; {
init(); uchar num;
for(num=0;num<16;num++) init();
{ for(num=0;num<16;num++)
write_date(table[num]); {
yanshi(5); write_date(table5[num]);
} yanshi(5);
write_com(0x80+0x40); }
for(num=0;num<16;num++) write_com(0x80+0x40);
{ for(num=0;num<16;num++)
write_date(table0[num]); {
yanshi(5); write_date(table6[num]);
} yanshi(5);
} }
void init1() }
{
uchar num; //音阶声音自动输出试验
init(); void main(void) // 主程序
for(num=0;num<15;num++) {
{ uint i,j;
write_date(table1[num]); TMOD = 0x11; //使用定时器0的16
yanshi(5); 位工作模式
} TCON=0x55;
write_com(0x80+0x40); IE=0X8f;
- 12 -
单片机实践含Protel课程综合设计说明书
PX1=1;
while(1) init2();
{ TR0=1;
TR1=0; TR1=1;
init0(); sec=0;
delay_1ms(3000); for(i=0;i<464;i++) //播放音乐
{
init1(); if(aa==2)
TR0=1; i=463;
TR1=1; if(!flag)
sec=0; j=i;
delay_1ms(3000); if(flag)
for(i=0;i<336;i++) //播放音乐 i=j+1;
{ if(music2[i]==36&&!flag) //
if(aa==1) 空音
i=335; {
if(!flag) TR0 = 0;
j=i; delay_1ms(200);
if(flag) TR0 = 1;
i=j+1; }
if(music1[i]==36&&!flag) // else
空音 {
{ tl0_f=freq[music2[i]][0];
TR0 = 0; //置一个音符的值
delay_1ms(200);
TR0 = 1; th0_f=freq[music2[i]][1];
} delay_1ms(200);
else }
{ }
tl0_f=freq[music1[i]][0]; TR0=0;
//置一个音符的值 TR1=0;
delay_1ms(3000);
th0_f=freq[music1[i]][1];
delay_1ms(200); init3();
} delay_1ms(6000);
} }
TR0=0; }
TR1=0; delay_1ms(3000);
- 13 -