基于AT89C52单片机的简易电子琴设计报告Word文档下载推荐.docx
《基于AT89C52单片机的简易电子琴设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于AT89C52单片机的简易电子琴设计报告Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
故简易电子乐器的研制具有一定的社会意义。
本次课程设计主要研究基于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
计数初值
低1DO
262
63628
#4FA#
740
64860
#1DO#
277
63731
中5SO
784
64898
低2RE
294
63835
#5SO#
831
64934
#1RE#
311
63928
中6LA
880
64968
低3MI
330
64021
#6LA#
932
64994
低4FA
349
64013
中7SI
988
95030
#4FA#
370
64185
高1DO
1046
65058
低5SO
392
64260
#1DO#
1109
65085
#5SO
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
#6LA#
466
64463
高3MI
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
#4FA#
1480
65198
#1DO#
554
64633
高5SO
1568
65217
中2RE
587
64684
1661
65235
622
64732
高6LA
1760
65252
中3MI
659
64777
1865
65268
中4FA
698
64820
高7SI
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-2节拍示意图
对于一拍的发音时间,如果乐曲没有特殊说明,一般说来,一拍的时长大约为400~450ms
。
如果这里规定一拍的时长为400ms,那么以四分音符为节拍时,四分音符的时长为400ms,
八分音符的时长为200ms,十六分音符的时长为100ms。
从而,在单片机上可采用循环延时的办法来实现控制一个音符唱多长时间。
首先要编写一个精确的基本时长的延时程序,比如说以八分音符的时长为基本延时时间,那么对于一个音符,如果它是四分音符,只需调用四次延时程序,如果它是二分音符,则只需调用八次延时程序,以此类推。
1.1.3单片机电子琴演奏音乐的方法
步骤一:
将乐谱中的每个音符的音调与节拍变换成相应的音调参数和节拍数。
步骤二:
将这些参数做成数据表格,存放在存储器中。
步骤三:
通过按键调用程序取出一个音符的相关参数,播放该音符。
步骤四:
播放完该音符后,等待下一次按键调用程序去取出下一次的音符的相关参数,再播放音符。
对于演奏乐曲,一般将休止符的音调参数设置为FFH,节拍参数设置为00H。
1.2本设计任务和主要容
具体要现以下功能:
1按下音符键可以发出相应的音符
2按下音乐播放键可以自动播放预先存在存中的曲子
第2节系统主要硬件电路设计
2.1单片机控制系统原理
2.1.1芯片选用
在本次课程设计中我采用Atmel公司的AT89C52单片机。
AT89C52是美国Atmel公司生产的低电压、高性能CMOS8位单片机,片含8KB的可反复檫写的程序存储器和12B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C52单片机可灵活应用于各种控制领域。
AT89C52单片机属于AT89C51单片机的增强型,与Intel公司的80C52在引脚排列、硬件组成、工作特点和指令系统等方面兼容。
AT89C52引脚图见图2-1.
图2-1AT89C52引脚图
其主要功能特性:
·
兼容MCS51指令系统
8k可反复擦写(>
1000次)FlashROM
32个双向I/O口
·
256x8bit部RAM
3个16位可编程定时/计数器中断
时钟频率0-24MHz
2个串行中断
可编程UART串行通道
2个外部中断源
共6个中断源
2个读写中断口线
3级加密位
低功耗空闲和掉电模式
软件设置睡眠和唤醒功能
2.1.2简易电子琴的组成框图
图2-2电子琴系统原理框图
2.1.3简易电子琴的proteus总体仿真图
电子琴的proteus总体仿真图见图2-3。
按下MUSICKEY键,系统自动播放预存在存中的曲子,按下RESKEY键,系统复位,停止播放。
按下矩阵键盘中的任意键,扬声器发出相应的音符。
图2-3简易电子琴的proteus总体仿真图
2.2单片机主机系统电路
2.2.1时钟频率
单片机必须在时钟的驱动下才能工作。
在单片机部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机部的各个单元,决定单片机的工作速度。
外部振荡源电路一般选用石英晶体振荡器,此电路在加电大约延迟10mS后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。
电路中两个电容C1,C2,作用有两个:
一是帮助振荡器起振;
二是对振荡器的频率进行微调。
C1,C2的典型值为30PF。
单片机在工作时,由部振荡器产生或由外直接输入的送至部控制逻辑单元的时钟信号的周期称为时钟周期。
起大小是时钟信号频率的倒数,常用fosc表示。
如时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12µ
s。
2.2.2晶振电路
AT89C52单片机的定时控制功能是用时钟电路和振荡器完成的,而根据硬件电路的不同,连接方式分为部时钟方式和外部时钟方式。
本设计中采用部时钟方式。
单片机部有一个反相放大器XTAL1、XTAL2分别为反相放大器的输入端和输出端,外接定时反馈元件组成振荡器(部时钟方式),产生时钟送至单片机部各元件。
时钟频率越高,单片机控制器的控制节拍就越快,运算速度也就越快。
一般来说单片机部有一个带反馈的线性反相放大器,外界晶振(或接瓷振荡器)和电容就可组成振荡器,如图2-4所示。
加电以后延时一段时间(约10ms)振荡器产生时钟,不受软件控制,图中X1为晶振,震荡产生的时钟频率主要由Y1确定。
电容C1,C2的作用有两个:
一是帮助振荡器起振,二是对振荡器的频率起微调作用,典型值为30pF。
图2-4晶振电路
2.2.3键盘扫描
在单片机应用中键盘用得最多的形式是独立键盘与矩阵键盘,如图2-5,图2-6所示。
图2-5独立键盘
图2-6矩阵键盘
它们各有自己的特点,其中独立键盘硬件电路简单,而且在程序设计上也不复杂,一般用在对硬件电路要求不高的简单电路中;
矩阵键盘与独立键盘有很大区别,首先在硬件电路上它要比独立键盘复杂得多,而且在程序算法上比它要烦琐,但它在节省端口资源上有优势得多,因此它更适合于多按键电路。
本次课程设计,我采用矩阵式键盘电路,这样可以大大的节省单片机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电子琴供电与复位电路
第3节系统的软件设计
3.1主程序
3.1.1主程序的流程图
主程序的程序流程图见图3-1.
图3-1程序流程图
3.1.2主程序
KEYBUFEQU30H
STH0EQU31H
STL0EQU32H
TEMPEQU33H
SPKEQUP1.6;
蜂鸣器所在端口
ORG0000H
LJMPSTART
ORG0BH
LJMPINT_T0;
转定时器T0中断服务程序
START:
MOVTMOD,#01H;
选择定时器T0工作于方式1
SETBET0;
允许T0溢出中断
SETBEA
WAIT:
MOVP2,#0FFH
CLRP2.4;
从第四行开始扫描
MOVA,P2
ANLA,#0FH;
屏蔽高四位,高四位为行,低四位为列
XRLA,#0FH
JZNOKEY1;
判断是否有键按下,没有就跳转
LCALLDELY10MS
MOVA,P2;
消除抖动和干扰
ANLA,#0FH
JZNOKEY1
确定有键按下以后的处理
CJNEA,#0EH,NK1;
是否为第四行第一列的键被按下
MOVKEYBUF,#0;
保存列号
LJMPDK1
NK1:
CJNEA,#0DH,NK2
MOVKEYBUF,#1
NK2:
CJNEA,#0BH,NK3
MOVKEYBUF,#2
NK3:
CJNEA,#07H,NK4
MOVKEYBUF,#3
NK4:
NOP
DK1:
;
第四行的处理
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,A+DPTR
MOVP0,A
MOVB,#2;
Table1以字保存,所以散转
MULAB
MOVTEMP,A
MOVDPTR,#TABLE1
MOVSTH0,A;
送入高字节
MOVTH0,A
INCTEMP
MOVA,TEMP
MOVSTL0,A;
送入低字节
MOVTL0,A
SETBTR0
DK1A:
MOVA,P2;
判断按键是否松开
JNZDK1A
CLRTR0
NOKEY1:
CLRP2.5
JZNOKEY2
CJNEA,#0EH,NK5
MOVKEYBUF,#4
LJMPDK2
NK5:
CJNEA,#0DH,NK6
MOVKEYBUF,#5
NK6:
CJNEA,#0BH,NK7
MOVKEYBUF,#6
NK7:
CJNEA,#07H,NK8
MOVKEYBUF,#7
NK8:
DK2:
MOVB,#2
MOVSTH0,A
MOVSTL0,A
DK2A:
MOVA,P2
JNZDK2A
NOKEY2:
CLRP2.6
JZNOKEY3
CJNEA,#0EH,NK9
MOVKEYBUF,#8
LJMPDK3
NK9:
CJNEA,#0DH,NK10
MOVKEYBUF,#9
NK10:
CJNEA,#0BH,NK11
MOVKEYBUF,#10
NK11:
CJNEA,#07H,NK12
MOVKEYBUF,#11
NK12:
DK3:
DK3A:
MOVA,P2
JNZDK3A
NOKEY3:
CLRP2.7
JZNOKEY4
CJNEA,#0EH,NK13
MOVKEYBUF,#12
LJMPDK4
NK13:
CJNEA,#0DH,NK14
MOVKEYBUF,#13
NK14:
CJNEA,#0BH,NK15
MOVKEYBUF,#14
NK15:
CJNEA,#07H,NK16
MOVKEYBUF,#15
NK16:
DK4:
MOVA,