资源描述
个人收集整理 勿做商业用途
课 程 设 计
课程名称
微型计算机课程设计
题目名称
简易电子琴课程设计报告
专业班级
11电子信息科学与技术3班
学生姓名
吴 俊
学 号
51102023001
指导教师
谢春祥
目 录
第1节 引 言………………………………………………………………………4
1.1 单片机发音概述…………………………………………………………4
1.1。1 音调………………………………………………………………… 4
1。1。2 节拍……………………………………………………………………7
1。1。3单片机演奏音乐的方法………………………………………………8
1。2本次设计的任务和主要内容………………………………………………8
第2节 系统的主要硬件电路的设计………………………………………………9
2.1 单片机控制系统原理……………………………………………………9
2.1.1 芯片的选用 …………………………………………………………9
2.1.2 简易电子琴的组成框图 ……………………………………………10
2.2 单片机主机系统电路 ……………………………………………………11
2.2.1 时钟频率 ……………………………………………………………11
2.2.2 晶振电路 ……………………………………………………………11
2.2.3 键盘扫描 ……………………………………………………………12
2.2.4 发音电路 ……………………………………………………………14
2.2.5 供电及复位电路 ……………………………………………………14
第3节 系统的软件设计 …………………………………………………………16
程序 …………………………………………………………………16
第4节 结束语 …………………………………………………………………28
参考文献 …………………………………………………………………………39
基于AT89C51单片机的简易电子琴
第1节 引 言
随着生活水平的提高,在放松自己的同时又能提高各个方面的能力.学习和欣赏音乐可以在使人们得到放松的同时,提高人们的精神品质和个人素养。当代,爱好音乐的年轻人越来越多,有不少人自己练习弹奏乐器,作为业余爱好和一种放松的手段,鉴于一些乐器学习难度大需要太多的学习时间,且其价格又太过于高昂,使得一部分有这种想法的人不得不放弃这种想法。而一些简易的电子乐器价格相对便宜,学习上手快,价格相对便宜,一般人容易负担的起,能够满足一般爱好者的需求。故简易电子乐器的研制具有一定的社会意义。本次课程设计主要研究基于AT89C52单片机的16键简易电子琴的设计.
1.1 单片机发音概述
由于单片机的强大功能,除了在测试控制领域中有着广泛的应用外,还有一些而有趣的应用。比如,使用单片机可以驱动蜂鸣器或者扬声器发出声音,还可以控制其发出不同的声调,从而连接起来构成一个曲子。
目前,市场上有很多种音乐模块或者音乐芯片,可以直接产生各种曲子.但是,这种模块价格比较昂贵,电路结构比较复杂。如果系统中仅需要产生简单的音符或者简短的曲子,可以使用单片机配合简单的扬声器而产生需要的音乐效果.
一般说来,单片机不像其他专业乐器那样能奏出多种音色的声音,即不包含相应幅度的谐波频率.单片机演奏的音乐基本都是单音频率。因此单片机演奏音乐比较简单,只需要清楚“音调"和“节拍”。
音调表示一个音符唱多高的频率
节拍表示一个音符唱多长的时间
1.1.1音调
音调是音乐学中的名词,与平时所说的音高十分相似。在音乐中常把中音C上方的A音定为标准音高,其频率为 f = 440Hz,其余音均与其进行比较。 和为两个音符,如果两个音符的频率相差一倍时,即时,则称比高一个倍频程。
在音乐中音符1(do)与音符ⅰ之间正好相差一个倍频程,在音乐学中称它相差一个八度音。在一个八度音里,有12个半音。以1——ⅰ八音区为例。12个半音是:1—-#1,
#1--2,2——#2,#2—3,3—4,4--#4,#4-5,5-—#5,#5—6,6-—#6,#6—7,7—-ⅰ。由于人耳的听觉效果,这12个音节的分度基本上是以对数关系来划分的。只要知道了这12个音符的音高,也就是其基本的音乐的频率,就可以根据音符之间的倍频程关系得到其他音符基本的音调频率。
知道了一个音符的频率后,便可以让单片机发出相应的频率的振荡信号,从而产生相应的音符声音。常采用的方法是通过单片机的定时器进行定时中断,在中断服务子程序中
将单片机上外界扬声器的I/O口来回置高电平或置低电平,从而让扬声器发出声音。为了让单片机发出不同频率音符的声音,只需将定时器预置不同的定时值来实现。
以标准音高A为例:
标准音高A的频率 f=440Hz,其对应的周期为:
(1—1)
因此需要在单片机I/O口输出周期为 T=2272us的方波脉冲,如图1—1所示
图1-1单片机控制音调示意图
由上图可知: 单片机输出高电平和低电平信号均为:
(1-2)
也就是说,单片机上定时器的中断触发时间为1136us。如果单片机采用定时器工作方式1,它以振荡器的十二分频信号为计数脉冲。设外接晶振的振荡器频率为f0,则定时器的预置初值由下式来确定:
(1—3)
式中,Count = =65536, 为定时器待确定的计数初值。因此定时器的高低计数器的初值为:
(1—4)
(1—5)
如果单片机外接12MHz的晶振,则,将t=1136us和代入上面两式,即可求得标准音高A在单片机定时器工作方式1下的定时器高低计数器的初值为:
(1-6)
(1-7)
根据上面的求法,我们可以求出其他音调相应的计数器的预置初值。
在单片机晶振频率,定时器在工作方式1下定时器计数初值见表1-1
表1-1晶振频率定时器在工作方式1下定时器计数初值表
音符
频率/Hz
计数初值
音符
频率/Hz
计数初值
低1 DO
262
63628
# 4 FA #
740
64860
#1 DO#
277
63731
中 5 SO
784
64898
低2 RE
294
63835
# 5 SO#
831
64934
#1 RE#
311
63928
中 6 LA
880
64968
低 3 MI
330
64021
# 6 LA#
932
64994
低 4 FA
349
64013
中 7 SI
988
95030
#4 FA#
370
64185
高 1 DO
1046
65058
低5 SO
392
64260
# 1 DO#
1109
65085
#5 SO
415
64331
高2RE
1175
65110
低 6 LA
440
64400
#2 RE#
1245
65134
#6 LA#
466
64463
高 3 MI
1318
65157
低7 SI
494
64524
高 4 FA
1397
65178
中 1 DO
523
64580
# 4 FA#
1480
65198
# 1 DO#
554
64633
高 5 SO
1568
65217
中 2 RE
587
64684
# 5 SO#
1661
65235
#2 RE#
622
64732
高 6 LA
1760
65252
中 3 MI
659
64777
# 6 LA#
1865
65268
中 4 FA
698
64820
高 7 SI
1967
65283
1。1.2节拍
在一张完整乐谱开头,都有如1=C、1=G……等等的标识。这里1=C,1=G标识乐谱的曲调,简单的说就是跟音调有关系;这里的、用来表示节拍。对于音符的节拍,以为例。它表示乐谱中以四分音符为节拍,每一小节有三拍.1= G的节拍示意图,见图1-2
在图中,总共有三拍:1、2为一拍,3、4、5为一拍,6为一拍.从时长角度看,1、2的时长为四分音的一半,即为八分音符长;3、4的时长为八分音符的一半,即为十六分音符长;5的时长为四分音符的一半,即为八分音符长;6的时长为四分音符长。
1=G
图1—2节拍示意图
对于一拍的发音时间,如果乐曲没有特殊说明,一般说来,一拍的时长大约为400~450ms
.如果这里规定一拍的时长为400ms,那么以四分音符为节拍时,四分音符的时长为400ms,
八分音符的时长为200ms,十六分音符的时长为100ms。
从而,在单片机上可采用循环延时的办法来实现控制一个音符唱多长时间。首先要编写一个精确的基本时长的延时程序,比如说以八分音符的时长为基本延时时间,那么对于一个音符,如果它是四分音符,只需调用四次延时程序,如果它是二分音符,则只需调用八次延时程序,以此类推。
1。1。3单片机电子琴演奏音乐的方法
步骤一:将乐谱中的每个音符的音调及节拍变换成相应的音调参数和节拍数。
步骤二:将这些参数做成数据表格,存放在存储器中.
步骤三:通过按键调用程序取出一个音符的相关参数,播放该音符。
步骤四:播放完该音符后,等待下一次按键调用程序去取出下一次的音符的相关参数,再播放音符.
对于演奏乐曲,一般将休止符的音调参数设置为FFH,节拍参数设置为00H。
1。2本设计任务和主要内容
本次课程设计主要研究基于AT89C51单片机的8
键简易电子琴的设计。具体要求实现以下功能:
① 按下音符键可以发出相应的音符
② 按下音乐播放键可以自动播放预先存在内存中的曲子
第2节 系统主要硬件电路设计
2.1 单片机控制系统原理
2.1。1芯片选用
在本次课程设计中我采用Atmel公司的AT89C51单片机.AT89C51是美国Atmel公司生产的低电压、高性能CMOS 8位单片机,片内含8KB的可反复檫写的程序存储器和12B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS—51指令系统,片内配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C52单片机可灵活应用于各种控制领域.AT89C52单片机属于AT89C51单片机的增强型,与Intel公司的80C52在引脚排列、硬件组成、工作特点和指令系统等方面兼容。AT89C52引脚图见图2-1.
图2—1 AT89C51引脚图
其主要功能特性:
· 兼容MCS51指令系统
· 8k可反复擦写(〉1000次)Flash ROM
· 32个双向I/O口
· 256x8bit内部RAM
· 3个16位可编程定时/计数器中断
· 时钟频率0-24MHz
· 2个串行中断
· 可编程UART串行通道
· 2个外部中断源
· 共6个中断源
· 2个读写中断口线
· 3级加密位
· 低功耗空闲和掉电模式
· 软件设置睡眠和唤醒功能
2。1.2 简易电子琴的组成框图
发音电路
AT89C51
独立键盘和发生电路
LED灯
路
供电及复位电路
晶振电路
图2-2 电子琴系统原理框图
2.2单片机主机系统电路
2.2.1时钟频率
单片机必须在时钟的驱动下才能工作。在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。外部振荡源电路一般选用石英晶体振荡器,此电路在加电大约延迟10mS后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。电路中两个电容C1,C2,作用有两个:一是帮助振荡器起振;二是对振荡器的频率进行微调.C1,C2的典型值为30PF。
单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。起大小是时钟信号频率的倒数,常用fosc表示。如时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12µs.
2.2。2 晶振电路
AT89C51单片机的定时控制功能是用时钟电路和振荡器完成的,而根据硬件电路的不同,连接方式分为内部时钟方式和外部时钟方式。本设计中采用内部时钟方式。
单片机内部有一个反相放大器XTAL1、XTAL2分别为反相放大器的输入端和输出端,外接定时反馈元件组成振荡器(内部时钟方式),产生时钟送至单片机内部各元件。时钟频率越高,单片机控制器的控制节拍就越快,运算速度也就越快.
一般来说单片机内部有一个带反馈的线性反相放大器,外界晶振(或接陶瓷振荡器)和电容就可组成振荡器,如图2-4所示.加电以后延时一段时间(约10ms)振荡器产生时钟,不受软件控制,图中X1为晶振,震荡产生的时钟频率主要由Y1确定。
电容C1,C2的作用有两个:一是帮助振荡器起振,二是对振荡器的频率起微调作用,典型值为30pF。
图2—4 晶振电路
2。2.3键盘扫描
在单片机应用中键盘用得最多的形式是独立键盘及矩阵键盘,如图2—5,图2-6所示。
图2—5 独立键盘
它们各有自己的特点,其中独立键盘硬件电路简单,而且在程序设计上也不复杂,一般用在对硬件电路要求不高的简单电路中;矩阵键盘与独立键盘有很大区别,首先在硬件电路上它要比独立键盘复杂得多,而且在程序算法上比它要烦琐,但它在节省端口资源上有优势得多,因此它更适合于多按键电路。
本次课程设计,我采用矩阵式键盘电路,这样可以大大的节省单片机I/O的开销。键盘电路见图2—7:
图2—7 键盘电路
在按键过程中常产生“毛刺”
现象,如图2—8所示,要消除“毛刺"现象,这里采用最常用的方法,即延时重复扫描法,延时法的原理为:因为“毛刺”脉冲一般持续时间短,约为几ms,而我们按键的时间一般远远大于这个时间,所以当单片机检测到有按键动静后,再延时一段时间(10ms~20ms)后再判断此电平是否保持原状态,如果是则为有效按键,否则无效。
图2-8 “毛刺”现象
2.2。4 发音电路
电子琴发音电路见图2-9。
图2-9 电子琴发音电路
2。2。5 供电及复位电路
电子琴的供电电路和复位电路见图2—10。
图2-10 电子琴供电及复位电路
2。2。6电子琴总体电路
第3节 系统的软件设计
3.1 主程序
3。1.1主程序的流程图
主程序的程序流程图见图3—1.
按键是否按下
开始
去抖动,
延时10ms
扫描按键位置
做一次按键处理,播放相应的音符或音乐
按键是否按下
图3—1程序流程图
3。1.2 程序
#include<reg51。h>
#define LED P1
#define SW_Port P2
sbit buzzer=P3^7;
unsigned char keys;
unsigned char code tone[]={ 115,102,91,86,77,68,61,57};
void sound(unsigned char);
void delay8us(unsigned char);
main()
{ while(1)
{ LED=SW_Port=0xff;
keys=~SW_Port;
switch(keys)
{ case 0x01:sound(0);break;
case 0x02:sound(1);break;
case 0x04:sound(2);break;
case 0x08:sound(3);break;
case 0x10:sound(4);break;
case 0x20:sound(5);break;
case 0x40:sound(6);break;
case 0x80:sound(7);break;
}
}
}
void sound(unsigned char x)
{ unsigned char i ;
LED=SW_Port;
for(i=0;i〈60;i++)
{ buzzer=0;delay8us(tone[x]);
buzzer=1;delay8us(tone[x]);}
LED=0xff;
}
void delay8us(unsigned char x)
{ unsigned char i,j;
for(i=0;i〈x;i++)
for(j=0;j<1;j++);
}
结 束 语
单片机作为一门软硬件相结合的学科,让许多像我这样的非电子专业的学生头疼不已。起初,我也属于一个比较“怕硬"的计算机学生,由于大一大二的数电模电没学好,所以一提到硬件方面的东西,我就觉得头疼。最初听余老师讲的单片机的课的时候,属于余老师每问必倒的学生之一。因此,最初对于这门课并没有多少兴趣.最初从指令系统,寻址方式,到单片机的内部资源,一点概念都没有。虽然每次课都看着大屏幕,听着老师讲课,但还是觉得整门课听的比较吃力。我觉得单片机作为微型计算机的一种,必然和计算机有一定的共性。后来有一段时间,我在课余的时间去旁听了几堂韩建民老师的《计算机组成原理》,对计算机的指令系统和寻址方式有了点认识,再回过头来看单片机的指令系统的时候觉得慢慢的有头绪了,不再像原先那样摸不着头脑。实验课做实验的时候也不再像之前那样呆在实验室不知道该干什么.当我第一次在试验仪上成功的调试出三角波的程序,看到示波器上的三角波图形,突然觉得单片机也是蛮有意思的,那种感觉就像第一次用C—FREE第一次在计算机上编写出第一个“Hello world”程序一样。之后也就开始慢慢加紧补前面落下的知识。到要做课程设计的时候,发现依然学到用时方恨少,到图书馆里借书,上网查资料,费了不少劲才完成这次课程设计,虽然做的蛮吃力的,但通过这次课程设计我比较好的对指令系统,内部资源和人机交互的知识大体复习了一遍,发现了不少缺漏,很好的补缺补漏了一遍.因为平时时间没合理的安排和利用,课程设计到了最后这一周才完成,可能有不少缺漏或者错误,希望老师加以批评指正.在此,我要对要求我们做这次课程设计的余老师致以衷心的感谢,因为余老师给了我一次难得的锻炼的机会。最后,我还要感谢韩建民老师和电子071的张琦同学,他们曾多次不厌其烦地为我解答了不少疑惑,使我在对指令系统的理解上少走了不少弯路。 文档为个人收集整理,来源于网络
参考文献
[1]张鑫,华臻,陈书谦.单片机原理与应用.(M).电子工业出版社,2009,6
[2]肖婧。单片入门与趣味实验设计(M)。北京航空航天大学出版社,2008,4
[3]陈明荧.8051单片机课程设计实训教材(M).清华大学出版社,2004,3
[4]赵建领。51系列单片机开发宝典(M)。电子工业出版社,2007,4
[5]求是科技.8051系列单片机C程序设计完全手册(M).人民邮电出版社,2006,4
[6]楼然苗,李光飞.51系列单片机设计实例(M) .北京航空航天大学出版社,2003,3
[7]百度百科。音符(Online) 。 http://baike.baidu。com/view/373613.htm?fr=ala0_1_1
展开阅读全文