八音盒.docx
《八音盒.docx》由会员分享,可在线阅读,更多相关《八音盒.docx(18页珍藏版)》请在冰豆网上搜索。
八音盒
西安邮电学院
测控仪器课程设计报告书
题目:
八音盒设计
院部名称
:
自动化学院
学生姓名
:
专业名称
:
测控技术与仪器
班级
:
时间
:
2011年5月23日至6月4日
八音盒的设计
一、设计目的:
大学本科生动手能力的培养和提高时大学本科的一个重要内容。
本次课程的设计目的,是让我们通过课程设计建立起单片机应用系统的概念,根据系统设计要求,掌握初步的单片机系统设计方法,让学生的动手能力和对单片机系统从硬件系统和软件系统设计两个方面都得到实际的提高。
为今后的毕业设计打下良好的基础。
二、设计要求:
(1)课程设计的基本要求有:
在课程设计过程中,学会使用89S51单片机及相应绘图软件,根据设计要求设计,编程,运行,调试最后提供课程设计报告;
课程设计应由学生本人独立完成,严禁抄袭;
认真编写课程设计报告。
(2)八音盒的设计要求:
单片机八音盒的设计基本要求是设计一个八音盒,并且编写相应的软件,完成八音盒的任务,该控制任务应完成下列功能:
使用七段数码管显示目前演奏的歌曲编号;
用按键操作来选择演奏哪一首歌曲(建几首歌曲旋律,按下单键变可以演奏歌曲);
演奏时可以按键中断。
三、设计器材:
89C52单片机、74LS138地址译码器、开关、电阻、电容、晶振、二极管等
89C52单片机芯片简介
89C52单片机是把那些作为控制应用所必需的基本内容都集成在一个尺寸有限的集成电路芯片上。
如果按功能划分,它由如下功能部件组成,即微处理器、数据存储器、程序存储器、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器。
它们都是通过片内单一总线连接而成,其基本结构依旧是CPU加上外围芯片的传统结构模式。
但对各种功能部件的控制是采用特殊功能寄存器的集中控制方式。
1)微处理器
该单片机中有一个8位的微处理器,与通用的微处理器基本相同,同样包括了运算器和控制器两大部分,只是增加了面向控制的处理功能,不仅可处理数据,还可以进行位变量的处理。
2)数据存储器
片内为128个字节,片外最多可外扩至64k字节,用来存储程序在运行期间的工作变量、运算的中间结果、数据暂存和缓冲、标志位等,所以称为数据存储器。
3)程序存储器
由于受集成度限制,片内只读存储器一般容量较小,如果片内的只读存储器的容量不够,则需用扩展片外的只读存储器,片外最多可外扩至64k字节。
4)中断系统
具有5个中断源,2级中断优先权。
5)定时器/计数器
片内有2个16位的定时器/计数器,具有四种工作方式。
6)串行口
1个全双工的串行口,具有四种工作方式。
可用来进行串行通讯,扩展并行I/O口,甚至与多个单片机相连构成多机系统,从而使单片机的功能更强且应用更广。
7)P1口、P2口、P3口、P4口
为4个并行8位I/O口。
8)特殊功能寄存器
共有21个,用于对片内的各功能的部件进行管理、控制、监视。
实际上是一些控制寄存器和状态寄存器,是一个具有特殊功能的RAM区。
四、设计方案及分析
1、工作原理
声音是通过振动产生的,单片机对某一I/O引脚以一定的频率循环置1和清0,这一引脚便产生一定频率的方波,该方波通过放大作用后作用于扬声器便产生一定频率的声音。
若改变输出方波的频率,产生的声音也就改变了。
通过控制输出方波的时间长短,声音的长短也就得到控制。
因此,根据乐谱,单片机就额可以产生电子音乐。
音乐中最关键的两个要素是音符和节拍。
(1)、音符的原理
每个音符对应一特定的频率,同时为了编程方便,给每个音符设置简谱码,简谱码以十六进制数表示,以C调的低音和中音为例,各音符对应的频率和简谱码如下表
低音
1
2
3
4
5
6
7
频率
262
294
330
349
392
440
494
中音
1
2
3
4
5
6
7
频率
523
587
659
698
784
880
987
高音
1
2
3
4
5
6
7
频率
1046
1174
1318
1396
1567
1760
1975
音符的频率确定后,其倒数为周期,该周期可用单片机中的定时器实现。
在每个周期内,高、低电平的时间各占一半,因此,输出脚在每个方波周期内要动作两次,一次为低电平,一次为高电平。
(2)、节拍的实现
通过建立节拍码和节拍数的对应关系,然后在软件中利用延时便可实现相应的节拍。
节拍码用十六进制数表示,
1、系统组成
单片机控制的音乐发生器由硬件电路和软件两部分组成
(1)、硬件电路
时钟电路
89C52虽然有内部振荡电路,但要形成时钟,必须外部附加电路。
89C52单片机的时钟产生方法有两种:
内部时钟方式和外部时钟方式。
本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。
振荡晶体可在1.2MHZ到12MHZ之间选择。
电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,XTAL1、XTAL2可在5pF到30pF之间取值。
所以本设计中,振荡晶体选择12MHZ,电容选择30pF。
在设计印刷电路板时,晶体和电容应尽可能靠近单片机芯片安装,以减少寄生电容,更好的保证振荡器稳定和可靠地工作。
复位电路:
89C52的复位是由外部的复位电路来实现的。
复位引脚RST通过一个施密特触发器用来抑制噪声,在每个机器周期的S5P2,施密特触发器的输出电平由复位
电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种方式。
最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充电来实现的。
只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。
时钟频率用12MHZ时C取10uF,R取8.2KΩ。
除了上电复位外,有时还需要按键手动复位。
本设计就是用的按键手动复位。
按键手动复位有电平方式和脉冲方式两种。
其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。
实验电路仿真图:
(2)程序框图
源代码:
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
#include
sbitsc=P3^0;
sbitSPEAK=P3^7;
ucharcodefreq[36*2]={
0xA9,0xEF,//00220HZ,1//0
0x93,0xF0,//00233HZ,1#
0x73,0xF1,//00247HZ,2
0x49,0xF2,//00262HZ,2#
0x07,0xF3,//00277HZ,3
0xC8,0xF3,//00294HZ,4
0x73,0xF4,//00311HZ,4#
0x1E,0xF5,//00330HZ,5
0xB6,0xF5,//00349HZ,5#
0x4C,0xF6,//00370HZ,6
0xD7,0xF6,//00392HZ,6#
0x5A,0xF7,//00415HZ,7
0xD8,0xF7,//00440HZ1//12
0x4D,0xF8,//00466HZ1#//13
0xBD,0xF8,//00494HZ2//14
0x24,0xF9,//00523HZ2#//15
0x87,0xF9,//00554HZ3//16
0xE4,0xF9,//00587HZ4//17
0x3D,0xFA,//00622HZ4#//18
0x90,0xFA,//00659HZ5//19
0xDE,0xFA,//00698HZ5#//20
0x29,0xFB,//00740HZ6//21
0x6F,0xFB,//00784HZ6#//22
0xB1,0xFB,//00831HZ7//23
0xEF,0xFB,//00880HZ`1
0x2A,0xFC,//00932HZ`1#
0x62,0xFC,//00988HZ`2
0x95,0xFC,//01046HZ`2#
0xC7,0xFC,//01109HZ`3
0xF6,0xFC,//01175HZ`4
0x22,0xFD,//01244HZ`4#
0x4B,0xFD,//01318HZ`5
0x73,0xFD,//01397HZ`5#
0x98,0xFD,//01480HZ`6
0xBB,0xFD,//01568HZ`6#
0xDC,0xFD,//01661HZ`7//35
};
//茉莉花
ucharcodesong1[]={"33_5_6_`1_`1_6_|55_6_5-|33_5_6_`1_`1_6_|55_6_5-|"};
//世上只有妈妈好
ucharcodesong2[]={"6.5_35|`16_5_6-|35_6_53_2_|1_,6_5_3_2-|"};
//小毛驴
ucharcodesong3[]={"1_1_1_3_|5_5_5_5_|6_6_6_`1|5-|"
"4_4_4_6_|3_3_3_3_|2_2_2_2_"};
//小星星
ucharcodesong4[]={"1155|665-|4433|221-|"
"5544|332-|5544|332-|"
};
//春天在哪里
ucharcodesong5[]={"3_3_3_1_|,5,5_|3_3_3_1_|3-|5_5_3_1_|,"};
//两只老虎
ucharcodesong6[]={"1231|1231|345-|345-|"
"5_6_5_4_31|5_6_5_4_31|"};
//就是爱你
ucharcodesong7[]={"3_2_3_4_5,7_1_|1`1_7_75_6_|66_5"};
//一分钱
ucharcodesong8[]={"5`1|6_`1_5|3_5_2_3_|5|3_5_6_"};
//乐谱方式输入的音乐播放
intjianhao;
ucharth0_f;//在中断中装载的T0的值高8位
uchartl0_f;
uchardiaodata[30];//音调缓冲
ucharjiedata[30];//音长缓冲
voidplay(uchar*songdata);
voidliangdeng(int);
voidDelay_xMs(uint);
voidchangedata(uchar*song,uchar*diao,uchar*je)
{
uchari2,i1,jj=0;
chargaodi;//高低+/-12音阶
ucharbanyin;//有没有半个升音阶
ucharyinchang;//音长
uchar*t,*p,*q;
ucharcodejie7[8]={0,12,14,16,17,19,21,23};//C调的7个值
t=song;
p=diao;
q=je;
*p=*t;
for(i2=0,i1=0;;)
{
gaodi=0;//高低=0
banyin=0;//半音=0
yinchang=4;//音长1拍
if((*(t+i2)=='|')||(*(t+i2)==''))
{i2++;}//拍子间隔和一个空格过滤
switch(*(t+i2))
{
case',':
gaodi=-12;i2++;break;//低音
case'`':
gaodi=12;i2++;break;//高音
default:
break;
}
if(*(t+i2)=='\0')//遇到0结束
{
*(p+i1)=0;//加入结束标志0
*(q+i1)=0;
return;
}
jj=*(t+i2)-0x30;
i2++;//取出基准音
jj=jie7[jj]+gaodi;//加上高低音
lp:
switch(*(t+i2))
{
case'#':
i2++;jj++;//有半音j加一个音阶
case'-':
yinchang+=4;i2++;gotolp;//有一个音节加长
case'_':
yinchang/=2;i2++;gotolp;//有一个音节缩短
case'.':
yinchang=yinchang+yinchang/2;i2++;gotolp;//有一个加半拍
default:
break;
}
*(p+i1)=jj;//记录音符
*(q+i1)=yinchang;//记录音长
i1++;
}
}
voidtime0()interrupt1
{
TL0=tl0_f;TH0=th0_f;//调入预定时值
SPEAK=~SPEAK;//取反音乐输出
}
voidplay(uchar*songdata)
{
uchari,c,j=0;
uintn;
changedata(songdata,diaodata,jiedata);//解释音乐符号串
for(i=0;diaodata[i]!
=0;i++)//逐个符号演奏
{
tl0_f=freq[diaodata[i]*2];//取出对应的定时值送给T0
th0_f=freq[diaodata[i]*2+1];
TR0=1;
for(c=0;c{
for(n=0;n<29500;n++);//29500
}
TR0=0;
for(n=0;n<460;n++);//音符间延时
}
TR0=0;
SPEAK=0;
}
voidchaxunjian()
{
switch(P1)
{
case0xfe:
jianhao=0;liangdeng(jianhao);play(song1);break;
case0xfd:
jianhao=1;liangdeng(jianhao);play(song2);break;
case0xfb:
jianhao=2;liangdeng(jianhao);play(song3);break;
case0xf7:
jianhao=3;liangdeng(jianhao);play(song4);break;
case0xef:
jianhao=4;liangdeng(jianhao);play(song5);break;
case0xdf:
jianhao=5;liangdeng(jianhao);play(song6);break;
case0xbf:
jianhao=6;liangdeng(jianhao);play(song7);break;
case0x7f:
jianhao=7;liangdeng(jianhao);play(song8);break;
default:
break;
}
}
voidk_judge()
{
while(P1==0xff)
Delay_xMs(50);
}
voidTime0_Init()
{
TMOD=0x01;
TR0=0;
ET0=1;
EA=1;
SPEAK=0;
}
/*-------------------------------------------------
功能:
延时子程序
-------------------------------------------------*/
voidDelay_xMs(unsignedintx)
{
unsignedinti,j;
for(i=0;i{
for(j=0;j<3;j++)
;
}
}
/*-------------------------------------------------
功能:
亮灯
-------------------------------------------------*/
voidliangdeng(inti)
{
P0=i;
sc=1;
}
/*-------------------------------------------------
功能:
主程序
-------------------------------------------------*/
voidmain()
{
sc=0;
while
(1)
{sc=0;
Time0_Init();//定时器0中断初始化aotiao
k_judge();
chaxunjian();
}
}
五、问题分析与解决方法
在设计电路图时,我组成员一起合作,讨论,没有遇到多大问题。
设计程序时,第一次设计的程序在下载到单片机中运行的时候只有一对噪音,经过多次调试没有结果,最后换了个音乐的播放程序,实现了音乐播放。
在硬件仿真时,起初把程序下载到单片机中时,实物没有任何反应。
我用万用表测每个拐角电压,最后发现有四五个该焊接的地方没有焊接上,当把这些焊接上时,蜂鸣器放出了期盼许久的音乐。
六、设计结果
七、设计心得
通过为期两周的课程设计实习,我学习到了很多的东西。
在此期间,我初步掌握了单片机的应用,不像以前只局限于课本,没有实物,只是一味的靠自己的想象来勾画。
通过此次学习,让我对单片机有了更深入的了解,对我学习好与单片机有关的知识有了很大的帮助。
还用通过此次实习,我对用C对单片机编程有了一定的了解,以前学的C只是会编几个电脑上运行的程序,不知道如何应运于实践。
现在知道了怎么去编一个有实用价值的程序。
学了很多课本知识,却没有应运于实践,等于白学。
此次实习,给了我们一次理论联系实践的机会,让我们更好掌握好课本知识。
通过这两个周的实习,让我加深了对单片机的了解,同时对于焊接技术我也有了相应的提高。
在这两个周的时间内,我们小组三个人相互合作来完成课题,由于我们做的比较顺利,第一个周就把作品做出来了,并实现了相应的功能。
这两个周让我学到了很多东西,首先是对相应的仿真软件的使用,让我意识到了仿真的重要性;其次是在焊板子的时候我有一些失误,导致最终的成品在外形上不是很美观。
相信这次实习会在我就业的时候有很大的帮助,也相信通过这次实习,让我的动手能力有了很大的提高。
通过本次课程设计实践,不仅可以巩固了以前所学过单片机及模拟电路的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,进而才能提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到诸多问题。
1程序方面由于事先没有充分了解音乐播放模块原理。
音乐源代码播放不能实现有规律变化,均是杂音。
后来了解完音调音阶等乐理基础后,改进了播放模块程序才顺利完成正常播放音乐的功能。
2硬件电路方面由于程序中将P1口定义为输出端口而物理上p1管脚不能实现高低电平输出驱动138芯片。
后来通过增加排阻提升输出电平使得问题得以解决
3由于程序调试与硬件电路设计没有充分结合考虑,使得一些原本可在物理上简化的问题复杂化了。
只得在硬件电路与程序间来回改动,降低了效率浪费了很多时间。
简而言之基于单片机的系统规划与设计必须充分考虑硬件与软件的高效结合。
单独抛弃某一者从单一方面考虑是不能有效快速解决问题