单片机八音盒设计Word格式.docx
- 文档编号:19254149
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:16
- 大小:83.12KB
单片机八音盒设计Word格式.docx
《单片机八音盒设计Word格式.docx》由会员分享,可在线阅读,更多相关《单片机八音盒设计Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
。
定时器/计数器0的定时时间为:
T/2=1912/2
=956
定时器956
的计数值=定时时间/机器周期=956
/1
=956(时钟频率=12MHZ)。
装入T0计数器初值为65536-956=64580。
将64580装入T0寄存器中,启动T0工作后,每计数956次时将产生溢出中断,进入中断服务时,每次对P3.0引脚的输出值进行取反,就可得到中音DO(523HZ)的音符音频。
将51单片机内部定时器工作在计数器模式1下,改变计数初值TH0,TL0以产生不同的频率。
下表2-1是C调各音符频率与计数初值T的对照表:
表2-1C调各音符频率与计数初值T的对照表
音符
频率(Hz)/初值(
)
低1DO
262/63627
中1DO
523/64580
高1DO
1042/65056
低2RE
294/63835
中2RE
589/64687
高2RE
1245/65134
低3M
330/64021
中3M
661/64780
高3M
1318/65157
低4FA
350/64107
中4FA
700/64822
高4FA
1397/65178
低5SO
393/64264
中5SO
786/64900
高5SO
1568/65217
低6LA
441/64402
中6LA
882/64969
高6LA
1760/65252
低7SI
495/64526
中7SI
990/65031
高7SI
1967/65282
3.2.2音符、音符编码及定时器初始值:
为了产生音符,必须求出音符低音5—高音5的计数初值。
例如C调的低1DO的THTL=65536-50000/262=63627,中音DO的THTL=65536-500000/523=64580,高音DO的THTL=65536-500000/1042=65056。
为了方便写谱,对其进行简单的编码,在编程时,根据音符编码查找对应的计数初值。
比如说音乐是C调的,那么出现低音的5SO,直接将代码写为1;
出现低音6LA,直接写一个2的代码;
出现低音7SI,直接写一个3代码。
表2-2音符编码表
音符编码
不发音
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
G
3.2.3节拍频率的产生、节拍的产生与编码:
音乐中的节拍用延时时间产生。
例如,1拍=0.4s,1/4拍=0.1s,以此类推。
假设1/4拍执行一次延时程序,则1/2拍就执行两次延时程序,所以只要求出1/4拍的延时时间,其余节拍就是它的倍数。
为了方便,将节拍数也进行了编码,并且计算了乐谱节拍编程时的延时时间,如表2-3和表2-4所示。
表2-3节拍数编码表
按1/4拍为一个延时时间的节拍编码与节拍对应的表
按1/8拍为一个延时时间的节拍编码与节拍对应的表
节拍编码
节拍
1/4
6/4
1/8
6/8
2/4
8/4
2/8
8/8
3/4
10/4
3/8
10/8
4/4
12/4
4/8
12/8
5/4
15/4
5/8
表2-4乐谱节拍编程时的时间延时表
乐谱节拍
1/4拍的延时时间
1/8拍的延时时间
125ms
62ms
187ms
94ms
250ms
音符编码和节拍编码完成后,在编程时,每个音符占一个字节,高四位是音符编码,低四位是节拍编码。
4、硬件电路设计
4.1总体设计框图
本设计中用到了AT89C51单片机,8个开关,扬声器,数码管等硬件电路常用元器件。
4.2晶振与复位电路
晶振电路为系统提供基本的时钟频率信号,它结合单片机内部电路产生所需的时钟频率。
复位电路由单片机XTAL1、XTAL2引脚外接晶振(12MHz)及起振电容C1、C2(均为30pf)组成。
当复位按钮按下时,内存和相关的寄存器,计数器,计时器所具有状态表示的器件全部被复位,回到初始状态。
(如下图所示)
4.3按键输入电路
按键输入电路由8个开关组成,P1口作为输入控制按键。
4.4输出显示电路
用P0.0~P0.7作为数码管的D0~D7的控制信号。
由于P0口作为输出,应加上拉电阻。
用P2.0口控制发光二极管以及扬声器。
5、仿真过程及仿真结果
6、心得体会
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
对于我们这些工科学生来说,这是一次考验。
怎么才能找到课堂所学与实际应用的最佳结合点?
怎样让自己的业余更接近专业?
怎样让自己的计划更具有序性,而不会忙无一用?
这都是我们所要考虑和努力的。
这次课程设计我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。
这次课程设计通过自己的努力,同学的帮助,还有老师的辛勤指导下,最终顺利完成。
7、程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
sbitSPEAK=P2^0;
//接蜂鸣器管脚
ucharth0_f;
uchartl0_f;
ucharcodeSEG[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
ucharcodejie8[8]={12,14,16,17,19,21,23,24};
/************************中断函数*******************************************/
timer0()interrupt1
{
TL0=tl0_f;
TH0=th0_f;
SPEAK=~SPEAK;
//取反音乐输出IO
}
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
};
changedata(uchar*song,uchar*diao,uchar*jie)
uchari,i1,j;
chargaodi;
//高低+/-12音阶
ucharbanyin;
//有没有半个升音阶
ucharyinchang;
//音长
ucharcodejie7[8]={0,12,14,16,17,19,21,23};
//C调的7个值
*diao=*song;
for(i=0,i1=0;
;
{
gaodi=0;
//高低=0
banyin=0;
//半音=0
yinchang=4;
//音长1拍
if((*(song+i)=='
|'
)||(*(song+i)=='
'
))i++;
//拍子间隔和一个空格过滤
switch(*(song+i))
{
case'
'
:
gaodi=-12;
i++;
//低音
break;
`'
gaodi=12;
//高音
}
if(*(song+i)==0)//遇到0结束
{
*(diao+i1)=0;
//加入结束标志0
*(jie+i1)=0;
return;
j=*(song+i)-0x30;
i++;
//取出基准音
j=jie7[j]+gaodi;
//加上高低音
yinc:
switch(*(song+i))
{
case'
#'
//有半音j加一个音阶
i++;
j++;
gotoyinc;
-'
//有一个音节加长
yinchang+=4;
_'
//有一个音节缩短
yinchang/=2;
.'
//有一个加半拍
yinchang=yinchang+yinchang/2;
}
*(diao+i1)=j;
//记录音符
*(jie+i1)=yinchang;
//记录音长
i1++;
}
voidplay(uchar*songdata)
uchari,c,j=0;
uintn;
uchardiaodata[48];
//音调缓冲
ucharjiedata[48];
//音长缓冲
changedata(songdata,diaodata,jiedata);
//解释音乐符号串
TR0=1;
while(P1=0xff)
for(i=0;
diaodata[i]!
=0;
i++)//逐个符号演奏
tl0_f=freq[diaodata[i]*2];
//取出对应的定时值送给T0
th0_f=freq[diaodata[i]*2+1];
for(c=0;
c<
jiedata[i];
c++)//按照音长延时
for(n=0;
n<
29500;
n++);
//29500
if(P1!
=0xff)//((!
K1)||(!
K2)||(!
K3)||(!
K4))//发现按键,立即退出播放
TR0=0;
return;
}
TR0=0;
for(n=0;
460;
//音符间延时
TR0=1;
TR0=0;
//茉莉花
ucharcodemolihua[]={"
33_5_6_`1_`1_6_|55_6_5-|33_5_6_`1_`1_6_|55_6_5-|"
"
5553_5_|665-|32_3_53_2_|11_2_1|"
//"
3_2_1_3_2.3_|56_`1_5-|23_5_2_3_1_,6_|,5-,61|"
2.3_1_2-1_,6_|,5--"
//世上只有妈妈好
ucharcodemamahao[]={
"
6.5_35|`16_5_6-|35_6_53_2_|1_,6_5_3_2-|"
2.3_55_6_|321-|5.3_2_1_,6_1_|,5--"
};
//小毛驴
ucharcodexiaomaolv[]={"
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_|5-"
//我是一只菠萝
ucharcodeboluo[]={
"
1-|2_4_3_2_55|5_6_3_4_22|2_4_3_2_1_`1_7_6_|5_4_2_3_11|"
2_4_3_2_55|5_6_3_4_22|2_4_3_2_1_5_2_3_|1---|"
//小星星
ucharcodexiaoxingxing[]={
1155|665-|4433|221-|"
5544|332-|5544|332-|"
//春天在哪里
ucharcodechuntian[]={"
3_3_3_1_|,5,5_|3_3_3_1_|3-|5_5_3_1_|,5_,5_,5|,6_,7_1_3_|2-|"
3_3_3_1_|,5,5_|3_3_3_1_|3-|5_6_5_6_|5_4_3_1_|,5_3_|2_1_"
//两只老虎
ucharcodelaohu[]={"
1231|1231|345-|345-|"
5_6_5_4_31|5_6_5_4_31|"
151-|151-"
//就是爱你
ucharcodejiushiaini[]={"
3_2_3_4_5,7_1_|1`1_7_75_6_|66_5_5_3_2_1_3_|4_,6_,7_1_32|"
3_2_3_4_5,7_1_|1`1_7_7_`3_|3-6_|5_4_.4_5_5-|4_,6_,7_1_32._1_|"
//黑白配
ucharcodeheibai[]={"
32345-|1,7123-|3,5,611-|"
//找朋友
ucharcodezhaopeng[]={"
5_6_5_6_|5_6_5|5_`1_7_6_|5_6_5"
//数鸭子
ucharcodeshuya[]={"
313_3_1|3_3_5_6_5-|6_6_5_5_4_4_4|2_3_2_1_2"
//欢乐颂
ucharcodehuanle[]={"
3345|5432|1123|322-|3345|5432|1123|211-|"
//一分钱
ucharcodeyifen[]={"
5`1|6_`1_5|3_5_2_3_|5|3_5_6_`1_|5_6_5_3_|5_13_2"
//乐谱方式输入的音乐播放
/*******************************主函数****************************************/
voidmain(void)
P1=0xff;
P0=SEG[0];
TMOD=0x01;
//使用定时器0的16位工作模式
TR0=0;
ET0=1;
EA=1;
while
(1)
switch(P1)
case0xfe:
while(P1==0xfe)
{
;
}
P0=SEG[1];
play(molihua);
SPEAK=0;
break;
//0按下相应的键显示相对应的码值
case0xfd:
while(P1==0xfd)
P0=SEG[2];
play(yifen);
//1
case0xfb:
while(P1==0xfb)
P0=SEG[3];
play(mamahao);
//2
case0xf7:
while(P1==0xf7)
P0=SEG[4];
play(xiaomaolv);
//3
case0xef:
while(P1==0xfe)
P0=SEG[5];
play(laohu);
//4
case0xdf:
while(P1==0xdf)
P0=SEG[6];
play(huanle);
//5
case0xbf:
while(P1==0xbf)
P0=SEG[7];
play(chuntian);
//6
case0x7f:
while(P1==0x7f)
P0=SEG[8];
play(zhaopeng);
//7
default:
TR0=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 八音盒 设计