单片机课程设计数字音乐盒设计.docx
- 文档编号:6185208
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:23
- 大小:349.40KB
单片机课程设计数字音乐盒设计.docx
《单片机课程设计数字音乐盒设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计数字音乐盒设计.docx(23页珍藏版)》请在冰豆网上搜索。
单片机课程设计数字音乐盒设计
机电工程系
课程设计报告
题目:
单片机课程设计-数字音乐盒设计
专业:
应用电子技术
班级:
10应用电子(4)班
学号:
**********
姓名:
指导老师:
答辩日期:
2012年9月
一、绪论
本设计是为了检测自己对单片机掌握情况,并且能以c语言写出程序并应用,设计是以AT89S51芯片的电路为基础,利用keil和proteus仿真软件,设计出一个多功能音乐盒。
音乐盒主要由四大模块构成,包括AT89S51芯片、8个按键、蜂鸣器、晶振复位电路。
有开机键、暂停键、播放键、上一曲、下一曲以及3个用来选择歌曲的键。
此外用户可以按照自己的喜好选择音乐并将其转化成机器码存入单片机的存储器中。
对于不同型号的单片机只需要相应的改变一下地址即可。
该软、硬件系统具有很好的通用性,很高的实际使用价值。
本报告写了音乐盒的原理,如何使用,述写了音调的产生和节拍的确定及音符编码。
包含主电路及其图和流程图以及我们此次的设计的心得体会。
关键字:
AT89S51;Keil;计时;音乐盒
二、对本课程设计的分析
芯片AT89S51的介绍
AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4kBytes ISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。
外形及引脚排列如图2.1所示
图2.1AT89S51
2.1工作原理
本程序是得用单片机的I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲。
下面我们来看下相关音乐是如何出来的:
1音调的产生
频率的高低决定了音调的高低。
音乐的十二平均率规定:
每两个八度音(如简谱中的中音1和高音1)之间的频率相差一倍。
在两个八度音之间又分为十二个半音。
另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音。
由此可以计算出简谱中从低音1到高音1之间每个音名对应的频率,所有不同频率的信号都是从同一个基准频率分频得到的。
1、要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
2、利用AT89s51的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。
此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。
3、例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每次技术956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi
2
Fr
N:
计算值;Fi:
内部计时一次为1us,故其频率为1MHz;
4、其计数值的求法如下:
初值T=65536-N=65536-Fi
2
Fr
例如:
设K=65536,F=1000000=Fi=1MHz,球低音DO(261Hz)。
中音DO(523Hz)。
高音的DO(1046Hz)的计算值
T=65536-N=65536-Fi
2
Fr=65536-1000000
2
Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
低音DO的T=65536-500000/523=64580
低音DO的T=65536-500000/1047=65059
1、C调各音符频率与计数值T的对照表如表4.1所示。
表2.3C调各音符频率与计数值T的对照表
低音
频率
N
参数
中音
频率
N
参数
高音
频率
N
参数
Do
262
1908
229
Do
523
956
115
Do
1046
57
57
Do#
277
1805
217
Do﹟
554
903
108
Do﹟
1109
54
54
Re3
294
1701
204
Re
587
852
102
Re
1175
51
51
Re﹟
311
1608
193
Re﹟
622
804
97
Re﹟
1245
48
48
Mi
330
1515
182
Mi
659
759
91
Mi
1318
45
45
Fa
349
1433
172
Fa
698
716
86
Fa
1397
43
43
Fa﹟
370
1351
162
Fa﹟
740
676
81
Fa﹟
1480
41
41
So
392
1276
153
So
784
638
77
So
1568
38
38
So﹟
415
1205
145
So﹟
831
602
72
So﹟
1661
36
36
La
440
1136
136
La
880
568
68
La
1760
34
34
La﹟
464
1078
129
La﹟
932
536
64
La﹟
1865
32
32
Si
494
1012
121
Si
988
506
61
Si
1976
30
30
2.节拍的确定
若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。
“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。
若1拍实0.5s,则1/4拍为0.125s。
至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。
音持续时间的长短即时值,一般用拍数表示。
休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。
了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。
对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。
因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
表2.41节拍与节拍码对照
节拍码
节拍数
节拍码
节拍数
1
1/4拍
1
1/8拍
2
2/4拍
2
1/4拍
3
3/4拍
3
3/8拍
4
1拍
4
2/1拍
5
1又1/4拍
5
5/8拍
6
1又1/2拍
6
3/4拍
8
2拍
8
1拍
A
2又1/2拍
A
1又1/4拍
C
3拍
C
1又1/2拍
F
3又3/4拍
每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表2.41为节拍码的对照。
如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。
假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推。
所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如图5.3为1/4和1/8节拍的时间设定。
表2.421/4和1/8节拍的时间设定
曲调值
DELAY
曲调值
DELAY
调4/4
125毫秒
调4/4
62毫秒
调3/4
187毫秒
调3/4
94毫秒
调2/4
250毫秒
调2/4
125毫秒
3.音符的编码
doremifasolasi分别编码为1~7,重音do编为8,重音re编为9,停顿编为0。
播放长度以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。
音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。
以0xff作为曲谱的结束标志。
举例1:
音调do,发音长度为两拍,即二分音符,将其编码为0x18
举例2:
音调re,发音长度为半拍,即八分音符,将其编码为0x22
歌曲播放的设计。
先将歌曲的简谱进行编码,储存在一个数据类型为unsignedchar的数组中。
程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,接着调用软件延时。
4.软硬件环境:
我用的单片机是at89s51机并且利用keil和proteus仿真软件,设计出一个多功能音乐盒,使用c语言写程序。
三、主要电路模块的实现方案比较及选择
3.1方案设计:
第一方案
此方案采用的是模拟电路,其中涉及有几部分:
1.基准频率产生器,产生基准频率,其值应根据音调发生器的频率要求决定。
电路可由晶振构成时钟脉冲振荡器。
2.音调发生器,音调发生器产生各个音区与音符所对应的频率;音符代码存储器,用来存储与乐曲的音符对应的数字代码及乐曲的数量。
3.通常先将乐曲进行编码,再将其代码存储在EPROM存储器。
4.节拍发生器与地址计数器,节拍发生器的振荡频率由乐曲演奏的速度所决 定。
演奏的速度越快,节拍发生器的速度越高。
5节拍分配器,将节拍分配好,产生驱动打击的节拍信号。
6.声音驱动电路,使乐曲的节拍和频率通过发音演奏出所想要的乐曲。
第二方案:
采用单片机来设计电路。
其中主要涉及以下几个部分:
1.AT89S51单片机,通过对其进行编程,利用其内部的定时器/计数器改变计数初值,可以实现不同的音调。
2.按键电路 有不同按键可以实现不同功能。
3.晶振复位电路 由石英晶体振荡器产生单片机工作时所必须的时钟信号。
振荡器采用12MHZ的晶振,使之机器周期Tcy=1us,方便发音程序的计算和编译。
4.蜂鸣器 通过相应程序可以驱动蜂鸣器使之发声。
3.2设计方案的确定:
经过查资料、构思和自己的设计,为保证电路基本功能实现,经过分析,从实现难度、性能、经济等方面综合就以上两种方案进行比较:
1.从实现音乐盒电路的硬件方面看,用单片机实现所用硬件电路比用模拟电路实现所用器件少,接线图简单,功耗较小,稳定性和抗干扰性及相对方案1好
2.用单片机实现音乐盒,通过编程就可实现音频和节拍,省去了节拍发生器和节拍分配器,实现音乐的产生较简单
3.AT89S51微处理器的性价比高,用它完全可以实现本设计当中要求的功能,且体积小,便于产品小型化,功耗小,工作电压范围宽。
4.用单片机设计的音乐盒音质较方案一好
5.用单片机设计的音乐盒电路可以加按键电路实现播放\暂停及选曲功能
综合以上因素,选择方案二比较可行。
四、系统电路图
4.1设计思路(仿真)
程序设计部分主要有:
简谱音调及节拍、计时、键盘扫描部分。
设计部分见下图3.11:
图3.11
利用keil和proteus仿真软件,在仿真部分可以看到分别有八个按键通过74ls21外部中断来控制歌曲切换及相应功能,及蜂鸣器放出程序中的音乐
4.2PCB电路图
上图包括最小51系统、8按键以及74ls48P.
4.3电路实物图
1开机2第一曲3下一曲4播放5第二曲
6第三曲7暂停8上一曲
“1”:
歌曲1,《世上只有妈妈好》
“2”:
歌曲2,《感恩的心》
“3”:
歌曲3,《千年之恋》(共有三首歌曲)
4.4实现系统功能
由图中的8个按键控制相应功能通过hd74ls08p控制外部中断,再由51机中的c语言程序控制输出实现相应功能。
五、系统的软件设计
由下面流程图我们看出,首先主程序开始先是初始化变量,然后按key1,判断是否按下,有的话则开机,默认播放第一首歌曲,这时我们可以按key2、key3、key4、key5、key6、key7、key8控制歌曲的切换、播放和暂停。
六、结论
设计是以AT89S51芯片的电路为基础,利用keil和proteus仿真软件,设计出一个多功能音乐盒。
并通过硬件实现在单片机上的音乐播放。
现在我们的音乐盒已经能够完成我们写的所有功能,并且有进一步的可拓展性,相信我经过这次的学习能更好的学好单片机。
在此间我发现有个非常好的方法,同时也是老师的提醒下,就是先写流程图,这样能使思路清晰,然后按流程图的步骤来,就不会出现混乱的情况了。
最后终于将程序完成了,并且能在仿真软件上调试成功,然后就是完成硬件。
现已全部可用(包括硬件及仿真)。
通过这次的单片机设计我发现要学好单片机还有很大的一大段距离,由于自己理念知识不扎实,能力有限,导致编程困难,最后在有资料和同学的帮助下才将程序较好的完成并且能用到实际中。
我觉得在此期间我学到是很多,没有扎实的基础是不行的,我们要在理念知识的指导下去实践,细心是非常重要的。
在程序中我们要注意指令的规范。
七、课程设计中所负责的内容
在本次设计过程中,我负责写驱动程序,并且负责查找相关的资料,以及画PCB、还有写报告。
程序已经写好能正常使用,出现的问题已经得到解决。
PCB已经画好,除了有部分跳线,一切正常。
八、课程设计过程中遇到的主要问题以及解决办法
1.问题:
歌曲在下一曲再下一曲后,无法由最后一曲返回到第一曲。
解决方法:
加一个if循环函数使其能够返回
2.问题:
按暂停键老是出现尾音。
解决方法:
每次判断完按键开关的位置后,都将总中断开关EA和定时器开关TR0关闭
3.问题:
硬件悍好发现不能用。
解决方法:
细心观察,发现电路出现粗心时悍错,认真悍好。
4问题:
发现程序一点也没有出错,但就是不能正常运行。
解决方法:
认真对照书上的程序,最后发现是指令书写不规范,最后将其改正。
九、心得体会
通过这次实验,我加深了对单片机的认识。
从硬件到软件,从设计到调试。
并深刻体会到了理论和实践有时并不是完全相同的,理论上可以解释,可以实现的东西,在实践中很有可能出现问题。
在以后的学习中,不能一味依赖课本,实验中遇到问题,要尝试多种思路。
在为期二周的课程设计当中感触最深的便是实践联系理论的重要性,当遇到实际问题时,只要认真思考。
就是思考,运用所学的知识,一步一步的去探索,是完全可以解决遇到的一般问题的。
本次实习使我们对电子元件及电路设计有一定的感性和理性认识;培养和锻炼我们的实际动手能力。
使我们的理论知识与实践充分地结合,作到不仅具有专业知识,而且还具有较强的实践动手能力,能分析问题和解决问题的高素质人才,为以后的顺利就业作好准备。
本次实习的对我们很重要,是我们应用电子技术专业学生实践中的重要环节。
在以前我们学的都是一些理论知识。
一周的的时间很短,但是我们学到的比我们在学校两年学的还要多,以前我们光只注意一些理论知识,并没有专门的练习我们的实际动手能力。
这次的实习使我意识到我的操作能力的不足,在理论上也有很多的缺陷。
附件:
/*C语言音乐盒源程序设计*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcount=0,count1=0;//count1歌曲标志
ucharkey,count2,h=1,i;
uchartemp;//temp歌调
//uchars1,s2,m1,m2;
ucharsecond,j=0;
voiddelay1(uintz);//延时1ms
sbitkey2=P3^2;//按key2可切换歌曲
sbitkey1=P3^3;
sbitfm=P3^7;//蜂鸣器连续的IO口
sbitrs=P2^2;
sbitrw=P2^1;
sbite=P2^0;
sbitbusy=P0^0;
sbitCS1=P2^4;
sbitCS2=P2^3;
/*于键消抖的延时函数*/
voiddelay5()
{uintt;
for(t=400;t>0;t--);
}
/*======音乐按键扫描函数=======*/
ucharkeyscan(void)//键盘扫描
{{unsignedcharkey_l,key;
key_l=P1&0x0f;
if(key_l!
=0x0f)//判断是否有按键按下
{delay5();//消抖
if(key_l!
=0x0f)//再次判断是否有按键按下
{
key_l=P1&0x0f;//扫描列得到列值
P1=0X7f;//01111111
if(P1!
=0x7f)key=P1;
P1=0Xbf;//10111111
if(P1!
=0xbf)key=P1;
P1=0Xdf;
if(P1!
=0xdf)key=P1;
P1=0Xef;
if(P1!
=0xef)key=P1;
P1=0x0f;
}delay1(1000);
}
switch(key)
{
case0xeb:
count1=1;i=0;TR1=1;break;
case0xd7:
count1=2;i=0;TR1=1;break;
case0xdb:
count1=3;i=0;TR1=1;break;
case0xe7:
count2=1;count1=1;delay1(100);TR1=1;break;//开机键ON/C
case0xed:
count2=2;h=0;delay1(100);TR1=1;ER0=0;EA=1;break;//暂停键=
case0xee:
count1=count1+1;i=0;delay1(100);TR1=1;
if(count1==4)count1=1;break;//下一曲+
case0xde:
count1=count1-1;i=0;delay1(100);TR1=1;
if(count1==0)count1=3;break;//上一曲-
case0xbe:
count2=5;h=1;TR0=1;break;TR1=1;//播放键
default:
break;
}
P1=0x0f;
}
}
//=======外部中断INT0==========//
voidZD()interrupt0
{
keyscan();
}
//===========显示延迟=======================//
delay2(inta)
{intb;
for(;a>0;a--)
for(b=0;b<255;b++);
}
check()//查忙
{e=1;
rw=1;
rs=0;
P0=0xff;
if(busy);
}
/*写指令程序*/
wc(unsignedchardat)
{check();
e=0;
rw=0;
rs=0;
P0=dat;
e=1;
e=0;
}
/*写数据程序*/
wd(unsignedchardat)
{check();
e=0;
rw=0;
rs=1;
P0=dat;
e=1;
e=0;
}
//------------------简谱音调对应的定时器初值--------//
//适合11.0592M的晶振
ucharcodecuzhi[]={
0xff,0xff,//占位停顿
0xFC,0x8E,//中音1-7
0xFC,0xED,
0xFD,0x43,
0xFD,0x6A,
0xFD,0xB3,
0xFD,0xF3,
0xFE,0x2D,
0xFE,0x47,//高音1-7
0xFE,0x76,
0xFE,0xA1,
0xFE,0xC7,
0xFE,0xD9,
0xFE,0xF9,
0xFF,0x16
};
/*函数声明*/
voiddelay1(uintz);//延时1mS
voiddelay(uintz);//延时165ms,即十六分音符
voidsong();
voidbeep();//蜂鸣器叫一声
/*初始化程序*/
voidinti()
{wc(0X3f);//显示开关关00111111
wc(0XC0);//修改显示起始行11000000
wc(0XB8);//修改页地址,x地址10111000
wc(0X40);//修改列地址,y地址01000000
}
uchartimeh,timel,i;
//---------------------------简谱---------------------------------------
//编程规则:
字节高位是简谱,低位是节拍持续时间,
//代表多少个十六分音符
//1-7代表中音,8-E代表高音,0代表停顿
//最后的0是结束标志
//=====================歌曲============//
ucharcodemamahao[]={//世上只有妈妈好
//世上只有妈妈好
0x68,0x52,0x34,0x54,0x84,0x62,0x52,0x68,
//世上只有妈妈好
0x34,0x52,0x62,0x54,0x34,0x12,0xc2,0x52,0x32,0x28,
//有妈的孩子像个宝
0x24,0x32,0x54,0x52,0x62,0x34,0x24,0x18,
//投进了妈妈的怀抱
0x54,0x32,0x22,0x12,0xc2,0x12,0xb8,0x04,0xff,
//幸福享不了
};
ucharcodeganen[]={//感恩的心
0x12,0x14,0x22,0x32,0x54,
//我来自偶然,
0x32,0x84,0x72,0x62,0x54,
//像一颗尘土,
0x02,0x62,0x62,0x52,0x54,0x12,0x22,0x32,0x28,
//有谁看出我的脆弱,
0x12,0x14,0x22,0x32,0x54,
//我来自何方,
0x32,0x84,0x92,0x82,0x54,
//我情归何处,
0x32,0x24,0x21,0x61,0x54,0x22,0x32,0x12,0x18,
//谁在下一刻呼唤我,
0x22,0x24,0x12,0x24,0x11,0x21,0x34,0x32,0x21,0x31,0x34,
//天地虽
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 数字 音乐盒 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)