基于单片机的电子琴课程设计.docx

上传人:b****1 文档编号:1691969 上传时间:2023-05-01 格式:DOCX 页数:18 大小:216.35KB
下载 相关 举报
基于单片机的电子琴课程设计.docx_第1页
第1页 / 共18页
基于单片机的电子琴课程设计.docx_第2页
第2页 / 共18页
基于单片机的电子琴课程设计.docx_第3页
第3页 / 共18页
基于单片机的电子琴课程设计.docx_第4页
第4页 / 共18页
基于单片机的电子琴课程设计.docx_第5页
第5页 / 共18页
基于单片机的电子琴课程设计.docx_第6页
第6页 / 共18页
基于单片机的电子琴课程设计.docx_第7页
第7页 / 共18页
基于单片机的电子琴课程设计.docx_第8页
第8页 / 共18页
基于单片机的电子琴课程设计.docx_第9页
第9页 / 共18页
基于单片机的电子琴课程设计.docx_第10页
第10页 / 共18页
基于单片机的电子琴课程设计.docx_第11页
第11页 / 共18页
基于单片机的电子琴课程设计.docx_第12页
第12页 / 共18页
基于单片机的电子琴课程设计.docx_第13页
第13页 / 共18页
基于单片机的电子琴课程设计.docx_第14页
第14页 / 共18页
基于单片机的电子琴课程设计.docx_第15页
第15页 / 共18页
基于单片机的电子琴课程设计.docx_第16页
第16页 / 共18页
基于单片机的电子琴课程设计.docx_第17页
第17页 / 共18页
基于单片机的电子琴课程设计.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的电子琴课程设计.docx

《基于单片机的电子琴课程设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子琴课程设计.docx(18页珍藏版)》请在冰点文库上搜索。

基于单片机的电子琴课程设计.docx

基于单片机的电子琴课程设计

本科课程设计

 

课程名称:

单片机原理与接口技术

设计项目:

简易电子琴设计

实验地点:

跨越机房

专业班级:

通信0901学号:

******

同组人:

李刚瑛梁邦爽

*******

2012年05月26日

一、设计目的

本设计以AT89C51单片机为核心,采用常用电子器件设计。

要求最少8个按键,每个按键对应一种音调,按下按键发声,松开按键后声音延迟一段时间后停止,即带余音的电子琴,延时时间可以设置,要求最少8个不同音调,可以采用标准的音调设计。

本次课程设计主要研究基于AT89C51单片机的简易电子琴设计

二、设计器材

AT89C51,蜂鸣器,PNP型三极管,晶振,独立按键

三、总体设计方案

1.设计思路

此次设计硬件电路分四大模块较为简单,主要由独立按键、单片机AT89C51、音频功放及扬声器构成。

以AT89C51为主控器件,对其进行编译,达到我们的设计要求。

对于软件部分下面有详细介绍。

2.电路总设计框图如图1:

图1电路总设计框图

3.音频放大电路

在一定频率范围内,具有固定频率的振动就能产生音乐,但是单片机产生的音频脉冲直接驱动扬声器并不能产生所要实现的音乐,因为他没有足够的驱动能力,需要音频功率放大电路。

这里选用PNP型三极管来驱动蜂鸣器,是音响效果更为理想,音频功放电路接口如图2所示:

图2音频放大电路

4.音乐播放电路

对于播放一首固定音乐,不仅要知道音符也要知道节拍,对应节拍延时时间设定表,对单片机进行编程就可以实现功能。

放歌产生电路如图3,其中单片机的P3.0口控制音乐开始播放控制端口,P3.2口是控制音乐停止播放的控制端口,当小按键S10按下时P3.0口获得低电平,音乐开始重复播放,当小按键S9按下时,P3.2口获得低电平,经过单片机的处理,音乐停止播放,单片机回到最初工作状态。

而P2口的每个端口都连接一个按键,分别控制1,2,3,4,5,6,7,˙1八个不同的音符。

图3音乐播放电图

 

5.总体电路图如下图:

 

图4总体电路图

四、设计原理分析

1.产生声音的方法:

只要让扬声器通过产生大小变化的电流(脉动电流或交流),就能使扬声器发出声音,因此若以程序不断的输出1—0—1—0—1……就可以令扬声器发出声音,由于MCS—51系列的输出端口输出电流不够大,所以必须加上晶体管把电流放大后再驱动扬声器,如图2所示。

图6则是产生声音的基本流程图,只要改变半周期t的时间,即可改变输出频率。

图6产生声音的基本流程图

2.决定程序中参数的方法:

C调各音阶的参数及代码如表1所示,根据此表中的频率可计算出程序中所需的延时参数,现在以中音DO说明如下:

表1C调各音阶的参数及代码

音阶

DO

RE

MI

FA

SO

LA

SI

音符

高音1

高音2

高音3

高音4

高音5

高音6

高音7

频率/HZ

522

587

659

700

780

880

988

延时参数

63

56

50

47

42

37

33

音长参数

65

73

82

88

98

110

124

音阶代码

21

22

23

24

25

26

27

音符

中音1

中音2

中音3

中音4

中音5

中音6

中音7

频率/HZ

262

294

330

349

392

440

494

延时参数

126

113

100

95

85

75

67

音长参数

33

37

41

44

49

55

62

音阶代码

11

12

13

14

15

16

17

音符

低音1

低音2

低音3

低音4

低音5

低音6

低音7

频率/HZ

131

147

165

175

196

220

247

延时参数

254

226

201

190

170

150

134

音长参数

16

18

21

22

25

28

31

音阶代码

01

02

03

04

05

06

07

特殊功能

休止符

重复演奏

停止演奏

简谱

0

音阶代码

00

40

255

(1)DO的频率为262HZ,所以

周期T=1/f=1/262s=3816μs

半周期t=T/2=1908μs

(2)若以程序:

MOVR6,#DATA;1周

ACALLDELAY;2周

共需耗时3个机器周期,即耗时1μs×3=3μs

DELAY:

MOVB,R6;2周

需耗时2个机器周期,即耗时1μs×2=2μs

DL:

MOVR7,#6;1周

DJNZR7,$;2周

DJNZR6,DL;2周

此循环部分,每执行一次共需耗时15个机器周期,即耗时1μs×15=15μs

MOVR6,B;2周

RET;2周

共需耗时4机器周期,即耗时1μs×4=4μs

来达成延时t的目的,则因t=1908μs,且

MOVR6,#DATA

ACALLDELAY

MOVB,R6

MOVR6,B

RET

这5个指令共耗时9μs,所以在DELAY子程序中,循环的部分只能是:

1908μs-9μs=1899μs

(3)循环的部分每执行一次耗时15μs,故要延时1899μs需要执行126次,即R6=126

就可产生所需DO音调。

其他音调所需的R6值,算法相同。

(4)实际上,做电子琴时,程序必须不断地判断是哪一个键被按下,所以程序中还有其他的指令在消耗时间。

因此实际采用的R6的值应该比上述计算值少一点点,音阶才会正确。

但是要把R6的值计算很准确,实在很费时间,况且判断按键的状态所耗时间与周期T比起来实在微不足道,所以在设计程序时只采用上述计算方法计算R6的值即可,程序在判断是哪个键被按下所耗费的时间可忽略不计。

3.音乐产生的原理:

由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的延时时间产生这样的方波频率信号。

除了音符以外,节拍也是音乐的关键组成部分,节拍实际上就是音持续时间的长短,在单片机系统中可以用延时时间的长短来实现,如果1/4拍的延时时间是0.4秒,则1拍的延时时间就是1.6秒,只要知道1/4拍的延时时间,其余的

 

节拍就是它的倍数。

如果单片机要自己播放音乐,那么就必须在程序中考虑到节拍的设置。

为了编写计算机乐谱的方便,所以我们自己定义了音阶代码,例如用01代表低音DO,用11代表中音DO,用21代表高音DO,如表1所列。

另外,我们用40代表重复演奏,用255代表停止演奏。

在程序中编写计算机乐谱时,就是用这些音阶代码来代替各音阶。

音阶代码可岁曲子的节奏快慢有自己决定,例如1拍定位04(就是音长的4倍),半拍就是02,2拍就是08,以此类推。

各音拍的音拍代码如表2所列。

 

表2各音拍的音拍代码

音拍

1/4拍

1/2拍

3/4拍

1拍

11/4拍

11/2拍

13/4拍

2拍

音拍代码

01

02

03

04

05

06

07

08

音拍

21/4拍

21/2拍

23/4拍

3拍

31/4拍

31/2拍

33/4拍

4拍

音拍代码

09

10

11

12

13

14

15

16

音拍

41/4拍

41/2拍

43/4拍

5拍

51/4拍

51/2拍

53/4拍

6拍

音拍代码

17

18

19

20

21

22

23

24

 

把乐谱改编为程序中的计算机乐谱时,必须按照“音阶代码在前,音拍代码在后”的规则排列,乐谱结束时,必须以40(表示重复演奏)或255(表示只演奏一遍就停止)作结尾。

 

4.程序流程图:

5.程序:

ORG0000H

MOVP2,#B

MOVP3,#B

TEST:

JNBP2.0,DO1;P2.0=0吗?

JNBP2.1,RE1;P2.1=0吗?

JNBP2.2,MI1;P2.2=0吗?

JNBP2.3,FA1;P2.3=0吗?

JNBP2.4,SO1;P2.4=0吗?

JNBP2.5,LA1;P2.5=0吗?

JNBP2.6,SI1;P2.6=0吗?

JNBP2.7,DOH1;P2.7=0吗?

JNBP3.0,START;P3.0=0吗?

AJMPTEST

DO1:

MOVR6,#126

AJMPOUTPUT1

RE1:

MOVR6,#113

AJMPOUTPUT1

MI1:

MOVR6,#100

AJMPOUTPUT1

FA1:

MOVR6,#95

AJMPOUTPUT1

SO1:

MOVR6,#85

AJMPOUTPUT1

LA1:

MOVR6,#75

AJMPOUTPUT1

SI1:

MOVR6,#67

AJMPOUTPUT1

DOH1:

MOVR6,#63

AJMPOUTPUT1

OUTPUT1:

CLRP3.7;令扬声器通电

ACALLDELAY;延时半周期t

SETBP3.7;令扬声器断电

ACALLDELAY;延时半周期t

AJMPTEST;重新测试按键

START:

MOVDPTR,#MUSIC;DPTR指向乐谱的开头

CONT:

CLRA;读取乐谱内的音阶代码

MOVCA,@A+DPTR;A=音阶代码

CJNEA,#40,CHK;若音阶代码为40

AJMPSTART;则从头开始演奏

STOP:

MOVA,#255;若音阶代码为255

AJMPTEST;则停止演奏

CHK:

PUSHACC;保存A的内容

INCDPTR

CLRA;读取乐谱内的音拍代码

MOVCA,@A+DPTR

MOVR4,A;R4=音拍代码

POPACC;取回A的内容

CHK1:

CJNEA,#01,CHK2;若音阶代码为01,

ACALLDOL;则产生低音DO的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK2:

CJNEA,#02,CHK3;若音阶代码为02,

ACALLREL;则产生低音RE的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK3:

CJNEA,#03,CHK4;若音阶代码为03,

ACALLMIL;则产生低音MI的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK4:

CJNEA,#04,CHK5;若音阶代码为04,

ACALLFAL;则产生低音FA的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK5:

CJNEA,#05,CHK6;若音阶代码为05,

ACALLSOL;则产生低音SO的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK6:

CJNEA,#06,CHK7;若音阶代码为06,

ACALLLAL;则产生低音LA的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK7:

CJNEA,#07,CHK11;若音阶代码为07,

ACALLSIL;则产生低音SI的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK11:

CJNEA,#11,CHK12;若音阶代码为11,

ACALLDO;则产生中音DO的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK12:

CJNEA,#12,CHK13;若音阶代码为12,

ACALLRE;则产生中音RE的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK13:

CJNEA,#13,CHK14;若音阶代码为13,

ACALLMI;则产生中音MI的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK14:

CJNEA,#14,CHK15;若音阶代码为14,

ACALLFA;则产生中音FA的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK15:

CJNEA,#15,CHK16;若音阶代码为15,

ACALLSO;则产生中音SO的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK16:

CJNEA,#16,CHK17;若音阶代码为16,

ACALLLA;则产生中音LA的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK17:

CJNEA,#17,CHK21;若音阶代码为17,

ACALLSI;则产生中音SI的声音

JNBP3.2,STOP;若P3.2=0,则停止演奏

CHK21:

CJNEA,#21,CHK22;若音阶代码为21,

ACALLDOH;则产生高音DO的声音

CHK22:

CJNEA,#22,CHK23;若音阶代码为22,

ACALLREH;则产生高音RE的声音

CHK23:

CJNEA,#23,CHK24;若音阶代码为23,

ACALLMIH;则产生高音MI的声音

CHK24:

CJNEA,#24,CHK25;若音阶代码为24,

ACALLFAH;则产生高音FA的声音

CHK25:

CJNEA,#25,CHK26;若音阶代码为25,

ACALLSOH;则产生高音SO的声音

CHK26:

CJNEA,#26,CHK27;若音阶代码为26,

ACALLLAH;则产生高音LA的声音

CHK27:

CJNEA,#27,CHK0;若音阶代码为27,

ACALLSIH;则产生高音SI的声音

CHK0:

CJNEA,#00,CONT2;若音阶代码为00,

ACALLNON;则不发出声音

CONT2:

INCDPTR;继续读取乐谱

AJMPCONT

DOL:

MOVR6,#254;R6=延时参数

MOVR5,#16;R5=音长参数

AJMPOUTPUT;设定低音DO的相对参数

REL:

MOVR6,#226;设定低音RE的相应参数

MOVR5,#18

AJMPOUTPUT

MIL:

MOVR6,#201;设定低音MI的相应参数

MOVR5,#21

AJMPOUTPUT

FAL:

MOVR6,#190;设定低音FA的相对参数

MOVR5,#22

AJMPOUTPUT

SOL:

MOVR6,#170;设定低音SO的相应参数

MOVR5,#25

AJMPOUTPUT

LAL:

MOVR6,#150;设定低音LA的相应参数

MOVR5,#28

AJMPOUTPUT

SIL:

MOVR6,#134;设定低音SI的相应参数

MOVR5,#31

AJMPOUTPUT

DO:

MOVR6,#126;设定中音DO的相对参数

MOVR5,#33

AJMPOUTPUT

RE:

MOVR6,#113;设定中音RE的相对参数

MOVR5,#37

AJMPOUTPUT

MI:

MOVR6,#100;设定中音MI的相对参数

MOVR5,#41

AJMPOUTPUT

FA:

MOVR6,#95;设定中音FA的相对参数

MOVR5,#44

AJMPOUTPUT

SO:

MOVR6,#85;设定中音SO的相对参数

MOVR5,#49

AJMPOUTPUT

LA:

MOVR6,#75;设定中音LA的相对参数

MOVR5,#55

AJMPOUTPUT

SI:

MOVR6,#67;设定中音SI的相对参数

MOVR5,#62

AJMPOUTPUT

DOH:

MOVR6,#63;设定高音DO的相应参数

MOVR5,#65

AJMPOUTPUT

REH:

MOVR6,#56;设定高音RE的相应参数

MOVR5,#73

AJMPOUTPUT

MIH:

MOVR6,#50;设定高音MI的相应参数

MOVR5,#82

AJMPOUTPUT

FAH:

MOVR6,#47;设定高音FA的相应参数

MOVR5,#88

AJMPOUTPUT

SOH:

MOVR6,#42;设定高音SO的相应参数

MOVR5,#98

AJMPOUTPUT

LAH:

MOVR6,#37;设定高音LA的相应参数

MOVR5,#110

AJMPOUTPUT

SIH:

MOVR6,#33;设定高音SI的相应参数

MOVR5,#124

AJMPOUTPUT

NON:

MOVR6,#33;设定休止符相应参数

MOVR5,#124

AJMPOUTPUT

OUTPUT:

MOVACC,R5;保存R5的内容

LOOP:

CJNEA,#00,SOUND;若音阶代码为00,则不让扬声器通电

LJMPMUTE

SOUND:

CLRP3.7;令扬声器通电

MUTE:

ACALLDELAY;延时半周期

SETBP3.7;令扬声器断电

ACALLDELAY;延时半周期

DJNZR5,LOOP;输出一个音长,共R5周的方波

MOVR5,ACC;取回R5的内容

DJNZR4,OUTPUT;一共输出R4个音长

REST:

MOVR6,#170;静音

MOVR5,#20

WAIT:

ACALLDELAY

DJNZR5,WAIT

DELAY:

MOVB,R6;延时半周期t=15μs×R6+9μs

DL:

MOVR7,#6

DJNZR7,$

DJNZR6,DL

MOVR6,B

RET

MUSIC:

DB11,04,11,04,11,04

DB13,06,12,02,11,04

DB13,04,13,04,13,04

DB15,06,14,02,13,04

DB15,04,14,04,13,04

DB12,08,00,04

DB12,08,11,02,07,02

DB11,04,12,04,13,04

DB14,08,13,02,12,02

DB13,04,14,04,15,04

DB15,02,14,02,13,04,12,04

DB11,08,00,04

DB40;重复演奏

END

五、心得与体会

这次设计从软件方面来讲不是很难,程序相对长一点,但都是书本上所学的知识,主要是中端及其服务程序的编写。

在protues上仿真,则起到很好的效果,因为元器件都是理想状态的,但做出实物来却没有那么简单啦。

经过多次调试、修改才得以出结果。

经过本次课程设计,我们比较好的把理论知识与实践相结合,而我们在也本次设计中收获不少。

最重要的是在实践中理解了书本上的知识,明白了学以致用的真谛,明白做好一件事单靠自己是不够的,集体团队精神也非常重要。

也明白老师为什么要求我们做好这个课程的原因。

他是为了教会我们如何运用所学的知识去解决实际问题,提高我们的动手能力。

设计过程中,首先,对于汇编语言多了一层了解,其次,还有硬件的接线,还有8051芯片的引脚方面,都让我们收获不少。

加强了自身的动手能力。

六、参考文献

1.单片机原理与接口技术(第二版)李晓林、牛昱光、闫高伟主编,电子工业出版社。

 

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

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2