单片机八音盒设计知识讲解.docx

上传人:b****4 文档编号:11791698 上传时间:2023-04-01 格式:DOCX 页数:19 大小:83.05KB
下载 相关 举报
单片机八音盒设计知识讲解.docx_第1页
第1页 / 共19页
单片机八音盒设计知识讲解.docx_第2页
第2页 / 共19页
单片机八音盒设计知识讲解.docx_第3页
第3页 / 共19页
单片机八音盒设计知识讲解.docx_第4页
第4页 / 共19页
单片机八音盒设计知识讲解.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

单片机八音盒设计知识讲解.docx

《单片机八音盒设计知识讲解.docx》由会员分享,可在线阅读,更多相关《单片机八音盒设计知识讲解.docx(19页珍藏版)》请在冰豆网上搜索。

单片机八音盒设计知识讲解.docx

单片机八音盒设计知识讲解

 

单片机八音盒设计

 

黑龙江工业学院

单片机综合实训报告

 

院系:

电气与信息工程系

专业班级:

电气工程及自动化本(三)

姓名:

陈强

学号:

04991303037

指导教师:

魏喜雯

报告成绩:

 

1、设计目的

(1)加强对单片机和汇编语言的认识,充分掌握和理解设计各部分的工作原理、设计过程、芯片选择、模块化编程等多项知识。

(2)用单片机模拟实现具体应用,使个人设计系统能够真正使用。

(3)把原理和实践相结合,充分发挥个人和团体的合作能力,并在实践中得到锻炼。

(4)提高利用已学知识分析和解决问题的能力。

(5)利用AT89C51单片机结合内部定时器设计一个八音盒,按下单键可以演奏预先设置的歌曲旋律。

2、设计任务要求

本设计利用AT89C51单片机结合内部定时器设计一个八音盒,按下单键可以演奏预先设置的歌曲旋律。

本设计可以学习AT89C51定时器程设计,按键扫描及歌曲旋律简单直觉式输入法的设计方法。

其基本功能为:

(1)使用数码显示管来显示目前演奏的歌曲编号;

(2)具有8个按键操作来选择演奏哪一首歌曲;

(3)内建8首歌曲旋律,按下单键可以演奏歌曲。

3、设计方案选取与论证

(1)选用Keil软件和Protues软件,选用AT89C51单片机,它有4kB内部ROM,2个定时/计数器,5个中断源。

(2)通过中断实现歌曲的播放和暂停。

(3)通过定时实现LED闪烁和音乐频率的变化。

(4)通过按键实现歌曲的选择。

3.1八音盒的发音原理

一段音乐需要的是两个元素,一个是音调,另一个是音符。

首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。

对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的音调随声强增加而下降,高频纯音的音调却随强度增加而上升。

另外,音符的频率有所不同。

基于上面的内容,这样就对发音的原理有了一些初步的了解。

音符的发音主要靠不同的音频脉冲。

利用单片机的内部定时器/计数器0,使其工作在模式1,定时中断,然后控制P3.7引脚的输出音乐。

只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

3.2音符频率的产生

3.2.1音符及定时器初始值:

例如:

中音1(do)的音频=523HZ,周期T=1/523s=1912

定时器/计数器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)/初值(

音符

频率(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音符编码表

音符

音符编码

音符

音符编码

不发音

0

低5SO

1

低6LA

2

低7SI

3

中1DO

4

中2RE

5

中3M

6

中4FA

7

中5SO

8

中6LA

9

中7SI

A

高1DO

B

高2RE

C

高3M

D

高4FA

E

高5SO

F

高6LA

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

1/4

6

6/4

1

1/8

6

6/8

2

2/4

8

8/4

2

2/8

8

8/8

3

3/4

A

10/4

3

3/8

A

10/8

4

4/4

C

12/4

4

4/8

C

12/8

5

5/4

F

15/4

5

5/8

表2-4乐谱节拍编程时的时间延时表

乐谱节拍

1/4拍的延时时间

乐谱节拍

1/8拍的延时时间

4/4

125ms

4/4

62ms

3/4

187ms

3/4

94ms

2/4

250ms

2/4

125ms

音符编码和节拍编码完成后,在编程时,每个音符占一个字节,高四位是音符编码,低四位是节拍编码。

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

#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;

case'`':

gaodi=12;i++;//高音

break;

}

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;

case'-':

//有一个音节加长

yinchang+=4;

i++;

gotoyinc;

case'_':

//有一个音节缩短

yinchang/=2;

i++;

gotoyinc;

case'.':

//有一个加半拍

yinchang=yinchang+yinchang/2;

i++;

gotoyinc;

}

*(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

{

for(n=0;n<29500;n++);//29500

if(P1!

=0xff)//((!

K1)||(!

K2)||(!

K3)||(!

K4))//发现按键,立即退出播放

{

TR0=0;

return;

}

}

TR0=0;

for(n=0;n<460;n++);//音符间延时

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-|"

"1155|665-|4433|221-|"

};

//春天在哪里

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);

SPEAK=0;

break;//1

case0xfb:

while(P1==0xfb)

{

;

}

P0=SEG[3];

play(mamahao);

SPEAK=0;

break;//2

case0xf7:

while(P1==0xf7)

{

;

}

P0=SEG[4];

play(xiaomaolv);

SPEAK=0;

break;//3

case0xef:

while(P1==0xfe)

{

;

}

P0=SEG[5];

play(laohu);

SPEAK=0;

break;//4

case0xdf:

while(P1==0xdf)

{

;

}

P0=SEG[6];

play(huanle);

SPEAK=0;

break;//5

case0xbf:

while(P1==0xbf)

{

;

}

P0=SEG[7];

play(chuntian);

SPEAK=0;

break;//6

case0x7f:

while(P1==0x7f)

{

;

}

P0=SEG[8];

play(zhaopeng);

SPEAK=0;

break;//7

default:

break;

}

TR0=0;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 环境科学食品科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1