八音盒文档格式.docx
- 文档编号:22535215
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:18
- 大小:1.86MB
八音盒文档格式.docx
《八音盒文档格式.docx》由会员分享,可在线阅读,更多相关《八音盒文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
由于受集成度限制,片内只读存储器一般容量较小,如果片内的只读存储器的容量不够,则需用扩展片外的只读存储器,片外最多可外扩至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
中音
523
587
659
698
784
880
987
高音
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<
reg51.h>
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;
//低音
`'
gaodi=12;
break;
//高音
default:
}
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'
#'
jj++;
//有半音j加一个音阶
-'
yinchang+=4;
gotolp;
//有一个音节加长
_'
yinchang/=2;
//有一个音节缩短
.'
yinchang=yinchang+yinchang/2;
//有一个加半拍
default:
}
*(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<
jiedata[i];
c++)//按照音长延时
for(n=0;
n<
29500;
n++);
//29500
TR0=0;
for(n=0;
460;
//音符间延时
TR0=0;
SPEAK=0;
voidchaxunjian()
switch(P1)
case0xfe:
jianhao=0;
liangdeng(jianhao);
play(song1);
case0xfd:
jianhao=1;
play(song2);
case0xfb:
jianhao=2;
play(song3);
case0xf7:
jianhao=3;
play(song4);
case0xef:
jianhao=4;
play(song5);
case0xdf:
jianhao=5;
play(song6);
case0xbf:
jianhao=6;
play(song7);
case0x7f:
jianhao=7;
play(song8);
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<
x;
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由于程序调试与硬件电路设计没有充分结合考虑,使得一些原本可在物理上简化的问题复杂化了。
只得在硬件电路与程序间来回改动,降低了效率浪费了很多时间。
简而言之基于单片机的系统规划与设计必须充分考虑硬件与软件的高效结合。
单独抛弃某一者从单一方面考虑是不能有效快速解决问题
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 八音盒