基于单片机的带音乐播放的电子琴设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课题名称、主要内容和基本要求:
进度安排:
指导教师签名:
评阅教师签名:
毕业设计(论文)成绩:
答辩委员会主任签名:
摘要
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。

它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。

本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。

以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有10个按键和扬声器。

本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。

众所周知,由于一首音乐是由许多不同的音阶组合而成的,而每个音阶则对应着不同的频率,因此我们可以利用不同的频率来进行音阶的组合,即可产生美妙的音乐了。

对于单片机来说,产生不同的频率非常方便,只要算出某一音频的周期,然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后,就将输出脉冲的I/O反相,然后重复计时,此半周期再对I/O反相,即可在I/O脚上得到此频率的脉冲。

因此我们可以利用单片机的定时器,使其工作在计数器模式MODE1下,改变计数值TH0及TL0来产生不同频率的信号。

从而产生不同的音符[1]。

关键词:音阶,频率,单片机
Abstract
Electronic organ is a modern electronic music technology and the product is a ne w type of keyboard instruments. It played an important role in modern music. SCM ha s powerful control functions and flexible programming characteristics. It has converge d with modern people's lives, become an irreplaceable part. The main content is AT89 S51 control of the core components, design of a electronic organ. SCM as a host to th e core, with the keyboard, speaker and other core modules. In the main control modul e has 16 keys and a speaker. The system is steady, its simple hardware circuits, softwa re functions, reliability of control system and high cost performance is its advantages. It also has certain practical and reference value.
Well-known, the music is made up by many different scales, and each scale corresponds to different frequency, so we can use different frequency to make combination of scales, and then produce wonderful music.
As for single-chip microcomputer, it is very convenient to produce different frequency, we just calculate an audio cycle, then this cycle divided by 2, namely half cycle time, using timer to time the half cycle time.
Whenever timing, it will output pulse I/O reverse phase, and repeat the timing, the half cycle again to the I/O reversed-phase, then can get this frequency pulse from the I/O feet. So we can use microcontroller timer to make it work in the counter mode and generate different frequency signal. Thus produce different notes. Keywords: scales,frequency, single-chip microcomputer
目录
第一章绪论 (1)
1.1电子琴的特点及研究意义 (1)
1.2系统介绍 (1)
第二章方案论证 (2)
2.1单片机选择 (2)
2.2键盘选择 (2)
2.3功放电路选择 (3)
第三章系统设计 (4)
3.1单片机的介绍 (4)
3.1.1单片机AT89S52基本知识 (4)
3.1.2单片机AT89S52产品特点 (4)
3.1.3单片机AT89S52的使用 (5)
3.1.4单片机AT89S52的特性 (6)
3.1.5AT89S52引脚功能与封装 (7)
3.2LED数码管 (9)
3.2.1LED数码管主要技术参数 (9)
3.2.2LED数码管的引脚说明 (10)
3.2.3数码管编码说明 (11)
3.3LM386 (12)
3.3.1LM386简介 (12)
3.3.2LM386特性 (12)
3.3.3LM386应用特点 (12)
3.3.4LM386引脚图 (12)
3.3.5LM386注意事项 (12)
第四章硬件设计 (13)
4.1总体电路设计 (13)
4.2单片机最小系统电路 (14)
4.3LM386功放电路 (14)
4.4数码管显示电路 (15)
4.5按键电路 (16)
4.6按键指示灯电路 (17)
4.7音乐产生方法 (17)
第五章软件设计 (19)
5.1程序流程图 (19)
5.2S1-S8按键识别程序 (20)
5.3S9键识别电路程序 (21)
5.4音乐产生程序 (22)
第六章调试过程 (26)
6.1数码管显示乱码 (26)
6.3按键处理问题 (26)
结论 (26)
参考文献 (27)
谢辞 (28)
附录 (29)
附录一程序源代码 (29)
附录二电路图 (41)
第一章绪论
1.1电子琴特点及研究意义
本论文设计的为电子琴,电子琴又称作电子键盘,属于电子乐器(区别于电声乐器),发音音量可以自由调节。

音域较宽,和声丰富,甚至可以演奏出一个管弦乐队的效果,表现力极其丰富。

它还可模仿多种音色,甚至可以奏出常规乐器所无法发出的声音(如合唱声,风雨声,宇宙声等)。

另外,电子琴在独奏时,还可随意配上类似打击乐音响的节拍伴奏,适合于演奏节奏性较强的现代音乐。

另外,电子琴还安装有效果器,如混响、回声、延音,震音轮和调制轮等多项功能装置,表达各种情绪时运用自如。

本论文设计的电子琴虽是简易电子琴,功能和真正电子琴有不小差距,但本论文设计的电子琴是很多高档电子琴的基础,对进一步研究电子琴有很大的促进作用。

本设计易懂、简练,所用器件常见,上网查询资料方便,电路模块具有通用性,非常适合广大电子爱好者制作。

1.2 系统简介
本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。

利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。

并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。

一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。

第二章方案论证
2.1单片机的选择
1、方案一:用AT89C51作为核心控制元件。

但AT89C51不具备ISP功能,因此ATMEL公司已经停产,在市面上已经不常见了,况且其ROM只有4K,在系统将来升级方面没有潜力。

2、方案二:用AT89S52作为核心控制元件。

AT89S52由于其性价比高,完全满足本作品智能化的需求,他的内部程序存储空间达到8K,使软件设计有足够的内部使用空间并且方便日后系统升级,使用方便,抗干扰性能提高。

综上各优缺点,本设计选择了AT89S52作为本设计的核心控制元件。

2.2 键盘选择
1、方案一:独立式键盘。

此种键盘电路配置灵活,结构和编程都简单,通过查询即可识别出每只按键的状态来。

但每个按键接单片机的一条I/O线,占用单片机I/O口资源多,浪费资源。

多在单片机所需按键较少,I/O口资源充足时使用。

其原理图如下:
图2-1独立式键盘
2、方案二:矩阵式键盘。

矩阵键盘电路占用I/O口较少,节约资源,编程麻烦,但有现有的程序块。

多用在使用按键较多的电路中。

其原理图如下:
图2-2矩阵式键盘
由于本电子琴设计只需要发生8个音阶,只需要8个键盘识别,占用单片机I/O口资源比较少,而且本设计中I/O口资源充足,足以满足键盘占用I/O口数据线的需求。

综合上述两种键盘识别电路的优缺点,本设计最终选用了独立式键盘识别电路。

2.3 功放电路的选择
1、方案一:三极管放大。

需要元器件很少,只需要一个电阻和一个三极管放大管,成本很低。

但是容易受干扰,噪声大,信号失真大。

其原理图如下:
图2-3 三极管放大原理
2、方案二:LM386功率放大电路。

芯片集成度高,外部电路焊接简单,电压放大倍数可调,有去耦滤波和阻抗校正网络,可以防止电路自激振荡,信号失真度小,噪声小,抗干扰能力强,而且可以调节音量。

电路较三极管电路复杂,
成本较三极管电路高。

其原理图如下:
图2-4 LM386功率放大电路
由于本设计需要演奏和播放音乐,需要高清晰高保真地还原出原来的音乐信号,所以选择了LM386功放电路。

第三章系统设计
3.1单片机的介绍
单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。

INTEL的MCS-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。

为了设计此系统,采用了MCS-51兼容单片机AT89S52单片机作为控制芯片。

3.1.1 单片机AT89S52基本知识
AT89S52是一个低功耗,高性能CMOS 8位单片机,片内含8k BytesISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准 MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash 存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。

AT89S52具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes 的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。

3.1.2 单片机AT89S52产品特点
AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断
结构,全双工串行口,片内晶振及时钟电路。

另外,AT89S52可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

内部数据存储器的高128个单元是为专用寄存器提供的,因此该区也称作特殊功能寄存器(SFR),它们主要用于存放控制命令、状态或数据。

除去程序计数器PC外,还有21个特殊功能寄存器,其地址空间为80H~FFH。

这21个寄存器中有11个特殊功能寄存器具有位寻址能力,它们的字节地址刚好能被8整除。

下面将对部分专用寄存器作简要介绍。

3.1.3 单片机AT89S52的使用
AT89S52单片机是一种低功耗高性能的CMOS8位微控制器,内置8KB可在线编程闪存。

该器件采用Atmel公司的高密度非易失性存储技术生产,其指令与工业标准的80C51指令集兼容。

片内程序存储器允许重复在线编程,允许程序存储器在系统内通过SPI串行口改写或用同用的非易失性存储器改写。

通过把通用的8位CPU与可在线下载的Flash集成在一个芯片上,AT89S52便成为一个高效的微型计算机。

它的应用范围广,可用于解决复杂的控制问题,且成本较低。

其结构框图如图3-1所示。

图3-1 AT89S52结构框图
3.1.4 单片机AT89S52的特性
AT89S52的主要特性如下:
兼容MCS51产品
8K字节可擦写1000次的在线可编程ISP 闪存
4.0V到
5.5V的工作电源范围
全静态工作:0Hz ~ 24MHz
3级程序存储器加密
256字节内部RAM
32条可编程I/O线
3个16位定时器/计数器
8个中断源
UART串行通道
低功耗空闲方式和掉电方式
通过中断终止掉电方式
看门狗定时器
双数据指针
灵活的在线编程(字节和页模式)
3.1.5 AT89S52引脚功能与封装
图3-2是AT89S52引脚图。

图3-2AT89S52引脚图
按照功能,AT89S52的引脚可分为主电源、外接晶体振荡或振荡器、多功能I/O口、控制和复位等。

1.多功能I/O口
AT89S52共有四个8位的并行I/O口:P0、P1、P2、P3端口,对应的引脚分别是P0.0 ~ P0.7,P1.0 ~ P1.7,P2.0 ~ P2.7,P3.0 ~ P3.7,共32根I/O 线。

每根线可以单独用作输入或输出。

①P0端口,该口是一个8位漏极开路的双向I/O口。

在作为输出口时,每根引脚可以带动8个TTL输入负载。

当把“1”写入P0时,则它的引脚可用作高阻抗输入。

当对外部程序或数据存储器进行存取时,P0可用作多路复用的低字节地址/数据总线,在该模式,P0口拥有内部上拉电阻。

在对Flash存储器进行编程时,P0用于接收代码字节;在校验时,则输出代码字节;此时需要外加上拉电阻。

②P1端口,该口是带有内部上拉电阻的8位双向I/O端口,P1口的输出缓
冲器可驱动(吸收或输出电流方式)4个TTL输入。

对端口写“1”时,通过内部的上拉电阻把端口拉到高电位,此时可用作输入口。

P1口作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。

在对Flash编程和程序校验时,P1口接收低8位地址。

另外,P1.0与P1.1可以配置成定时/计数器2的外部计数输入端(P1.0/T2)与定时/计数器2的触发输入端(P1.0/T2EX),如表2.1所示。

表3.1 P1口管脚复用功能
③ P2端口,该口是带有内部上拉电阻的8位双向I/O端口,P2口的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。

对端口写“1”时,通过内部的上拉电阻把端口拉到高电位,此时可用作输入口。

P2口作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。

在访问外部程序存储器或16位的外部数据存储器时,P2口送出高8位地址,在访问8位地址的外部数据存储器时,P2口引脚上的内容(就是专用寄存器(SFR)区中P2寄存器的内容),在整个访问期间不会改变。

在对Flash编程和程序校验期间,P2口也接收高位地址或一些控制信号。

④ P3端口,该口是带有内部上拉电阻的8位双向I/O端口,P3口的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。

对端口写“1”时,通过内部的上拉电阻把端口拉到高电位,此时可用作输入口。

P3口作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。

在AT89S52中,同样P3口还用于一些复用功能,如表2.2所列。

在对Flash 编程和程序校验期间,P3口还接收一些控制信号。

表3.2P3端口引脚与复用功能表
2.RST 复位输入端。

在振荡器运行时,在此脚上出现两个机器周期的高电平将使其单片机复位。

看门狗定时器(Watchdog)溢出后,该引脚会保持98个振荡周期的高电平。

在SFR AUXR(地址8EH)寄存器中的DISRTO位可以用于屏
蔽这种功能。

DISRTO位的默认状态,是复位高电平输出功能使能。

3.ALE/PROG 地址锁存允许信号。

在存取外部存储器时,这个输出信号用于锁存低字节地址。

在对Flash存储器编程时,这条引脚用于输入编程脉冲PROG。

一般情况下,ALE是振荡器频率的6分频信号,可用于外部定时或时钟。

但是,在对外部数据存储器每次存取中,会跳过一个ALE脉冲。

在需要时,可以把地址8EH中的SFR寄存器的0位置为“1”,从而屏蔽ALE的工作;而只有在MOVX或MOVC指令执行时ALE才被激活。

在单片机处于外部执行方式时,对ALE屏蔽位置“1”并不起作用。

4.PSEN 程序存储器允许信号。

它用于读外部程序存储器。

当AT89S52在执行来自外部存储器的指令时,每一个机器周期PSEN被激活2次。

在对外部数据存储器的每次存取中,PSEN的2次激活会被跳过。

5.EA/Vpp 外部存取允许信号。

为了确保单片机从地址为0000H~FFFFH 的外部程序存储器中读取代码,故要把EA接到GND端,即地端。

但是,如果锁定位1被编程,则EA在复位时被锁存。

当执行内部程序时,EA应接到Vcc。

在对Flash存储器编程时,这条引脚接收12V编程电压Vpp。

6.XTAL1 振荡器的反相放大器输入,内部时钟工作电路的输入。

7.XTAL2 振荡器的反相放大器输出。

3.2 LED数码管
3.2.1LED数码管主要技术参数
图3-3 数码管
数码管使用条件:
a、段及小数点上加限流电阻
b、使用电压:段:根据发光颜色决定;小数点:根据发光颜色决定
c、使用电流:静态:总电流 80mA(每段 10mA);动态:平均电流 4-5mA 峰值电流 100mA
上面这个只是七段数码管引脚图,其中共阳极数码管引脚图和共阴极的是一样的,4位数码管引脚图数码管使用注意事项说明:
(1)数码管表面不要用手触摸,不要用手去弄引角;
(2)焊接温度:260度;焊接时间:5S
(3)表面有保护膜的产品,可以在使用前撕下来。

3.2.2 LED数码管的引脚说明
这类数码管可以分为共阳极与共阴极两种,共阳极就是把所有LED的阳极连接到共同接点com,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点com,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),如下图所示。

图中的8个LED分别与上面那个图中的A~DP各段相对应,通过控制各个LED的亮灭来显示数字。

图3-4 共阳数码管内部结构
图2-5 共阴数码管内部结构
对于单个数码管来说,从它的正面看进去,左下角那个脚为1脚,以逆时针
方向依次为1`10脚,左上角那个脚便是10脚了,上面两个图中的数字分别与这10个管脚一一对应。

注意,3脚和8脚是连通的,这两个都是公共脚。

还有一种比较常用的是四位数码管,内部的4个数码管共用a~dp这8根数
据线,为人们的使用提供了方便,因为里面有4个数码管,所以它有4个公共端,加上a~dp,共有12个引脚,下面便是一个共阴的四位数码管的内部结构图(共
阳的与之相反)。

引脚排列依然是从左下角的那个脚(1脚)开始,以逆时针方
向依次为1~12脚,下图中的数字与之一一对应。

图3-6 4位共阳数码管内部结构
3.2.3 数码管编码说明
数码管编码说明,如3.3表所示:
表3.3 控制命令表
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
g f a b dp c d e
0 0 0 1 0 1 0 0 0 88H
1 1 1 1 0 1 0 1 1 EBH
2 0 0 1 1 0 0 1 0 4CH
3 1 0 1 0 0 0 1 0 49H
4 1 1 1 0 0 0 0 1 2BH
5 1 0 1 0 0 1 0 0 19H
6 0 0 1 0 0 1 0 0 18H
7 1 1 1 0 1 0 1 0 CBH
8 0 0 1 0 0 0 0 0 08H
9 1 0 1 0 0 0 0 0 09H
3.3 LM386
3.3.1 LM386简介
LM386是一种音频集成功放,具有自身功耗低、更新内链增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点的功率放大器,广泛应用于录音机和收音机之中。

3.3.2 LM386特性
静态功耗低,约为4mA,可用于电池供电;
工作电压范围宽,4-12Vor5-18V;
外围元件少;
电压增益可调,20-200;
低失真度;
3.3.3应用特点
LM386是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。

为使外围元件最少,电压增益内置为20。

但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至200。

输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,使得LM386特别适用于电池供电的场合。

3.3.4 LM386引脚图
LM386的外形和引脚的排列如右图所示。

引脚2为反相输入端,3为同相输入端;引脚5为输出端;引脚6和4分别为电源和地;引脚1和8为电压增益设定端;使用时在引脚7和地之间接旁路电容,通常取10μF。

3.3.5 LM386注意事项
1、通过接在1脚、8脚间的电容(1脚接电容+极)来改变增益,断开时增益为20dB。

因此用不到大的增益,电容就不要接了,不光省了成本,还会带来好处--噪音减少,何乐而不为?
2、PCB设计时,所有外围元件尽可能靠近LM386;地线尽可能粗一些;输入音频信号通路尽可能平行走线,输出亦如此。

这是死理,不用多说了吧。

3、选好调节音量的电位器。

质量太差的不要,否则受害的是耳朵;阻值不要太大,10K最合适,太大也会影响音质。

4、尽可能采用双音频输入/输出。

好处是:“+”、“-”输出端可以很好地抵消共模信号,故能有效抑制共模噪声。

5、第7脚(BYPASS)的旁路电容不可少!实际应用时,BYPASS端必须外接一个电解电容到地,起滤除噪声的作用。

工作稳定后,该管脚电压值约等于电源电压的一半。

增大这个电容的容值,减缓直流基准电压的上升、下降速度,有效抑制噪声。

在器件上电、掉电时的噪声就是由该偏置电压的瞬间跳变所致,这个电容可千万别省啊!
6、减少输出耦合电容。

此电容的作用有二:隔直 + 耦合。

隔断直流电压,直流电压过大有可能会损坏喇叭线圈;耦合音频的交流信号。

它与扬声器负载构成了一阶高通滤波器。

减小该电容值,可使噪声能量冲击的幅度变小、宽度变窄;太低还会使截止频率(fc=1/(2π*RL*Cout))提高。

分别测试,发现10uF/4.7uF 最为合适,这是我的经验值。

7、电源的处理,也很关键。

如果系统中有多组电源,由于电压不同、负载不同以及并联的去耦电容不同,每组电源的上升、下降时间必有差异。

非常可行的方法:将上电、掉电时间短的电源放到+12V处,选择上升相对较慢的电源作为LM386的Vs,但不要低于4V,效果确实不错!
第四章硬件设计
4.1总体电路设计
图4-1 总体设计电路框图
本设计以AT89S52单片机为核心控制元件,利用单片机内部定时器产生音频脉冲,经LM386功率放大电路放大音频信号后送到扬声器输出,通过独立式按键识别输入,可以演奏8个不同的音符,并且单片机内置了6首不同的歌曲,通过播放和停止按键可以进行音乐的循环顺序播放和停止,同时对应的LED灯点亮,数码管显示相应的音阶。

4.2单片机最小系统电路
图4-2 单片机最小系统
(1)单片机9脚接复位电路,可按复位按钮S1给单片机复位。

(2)晶振采用11.0592MHZ。

(3)由于单片机只访问片内Flash ROM并执行内部程序存储器中的指令,因此单片机的31脚接高电平VCC。

4.3 LM386功放电路
图4-3 LM386功放电路
电路中可以通过电位器R30调整输入信号(音乐信号)的大小, LM386的1脚和8脚所接电容、电阻用于调节电路的闭环电压增益(即调节音量的大小)。

R 值越小,电压增益越大。

输出端5脚所接10欧电阻和0.1uf电容组成阻抗校正网络,抵消负载中的感抗分量,防止电路自激,有时也可以省去不用。

4.4数码管显示电路
图4-4 数码管显示电路
数码管为共阳管,故数码管的3脚和8脚接VCC,单片机输出低电平点亮数码管,200欧电阻R19到R26为限流电阻。

4.5按键电路
图4-5按键电路
按按键S1-S8,喇叭依次发出1、2、3、4、5、6、7、8等七个音符,按S9喇叭按顺序播放单片机内置的6首音乐,按S10停止播放。

4.6 按键指示灯电路
图4-6 按键指示灯电路
按S1-S8按键,对应着点亮D1-D8彩灯。

4.7 音乐产生的方法
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。

若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。

利用定时器计时半周期时间,每当计时终止后就将P0.2反相,然后重复计时再反相。

就可在P0.2引脚上得到此频率的脉冲。

利用AT89S52的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。

计数脉冲值与频率的关系式(如式4-7所示)是:
N=fi÷2÷fr 4-7 式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。

其计数初值T的求法如下:
T=65536-N=65536-fi÷2÷fr
例如:设K=65536,fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。

T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1046=65059
单片机12MHZ晶振,高中低音符与计数T0相关的计数值如表4-8
我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据低音0-19之间,中音在20-39之间,高音在40-59之间
TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0
DW 0,63731,63928,0,64185,64331,64463,0,0,0
DW 0,64580,64684,64777,64820,64898,64968,65030,0,0
DW 0,64633,64732,0,64860,64934,64994,0,0,0
DW 0,65058,65110,65157,65178,65217,65252,65283,0,0
DW 0,65085,65134,0,65198,65235,65268,0,0,0
DW 0
音乐的音拍,一个节拍为单位(C调)(如表4-9所示)
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。

第五章软件设计
5.1 程序流程图
图5-1 软件流程图
5.2 S1-S8按键识别程序
if(key1==0)
{
Delay(100);
do{}while(key1==0);
key=1;
led=0xfe;
InitialSound();
Play(Music_1,0,3,360); }
if(key2==0)
{
Delay(100);
do{}while(key2==0);
key=2;
led=0xfd;
InitialSound();
Play(Music_2,0,3,360); }
if(key3==0)
{
Delay(100);
do{}while(key3==0);
key=3;
led=0x7f;
InitialSound();
Play(Music_3,0,3,360); }
if(key4==0)
{
Delay(100);
do{}while(key4==0);
key=4;
led=0xbf;
InitialSound();
Play(Music_4,0,3,360); }
if(key5==0)
{
Delay(100);
do{}while(key5==0);
key=5;
led=0xdf;
InitialSound();
Play(Music_5,0,3,360);
}
if(key6==0)
{
Delay(100);
do{}while(key6==0);
key=6;
led=0xef;
InitialSound();
Play(Music_6,0,3,360);
}
if(key7==0)
{
Delay(100);
do{}while(key7==0);
key=7;
led=0xf7;
InitialSound();
Play(Music_7,0,3,360);
}
if(key8==0)
{
Delay(100);
do{}while(key8==0);
key=8;
led=0xfb;
InitialSound();
Play(Music_8,0,3,360);
}
5.3 S9键识别程序
While(1)
{
if(key9==0)
{
Delay(10000);
if(key9==0)
{
count=count+1;
break;
}
}
}
InitialSound();
while(1)
{
if(count==1)
{
Play(Music_Same,0,3,360); //播放第一首歌
Delay1ms();
break;
}
else if(count==2)
{
Play(Music_Girl,0,3,360); //播放第二首歌
Delay1ms();
break;
}
else if(count==3)
{
Play(Music_Jingle,0,3,360); //播放第三首歌
Delay1ms();
break;
}
else if(count==4)
{
Play(Music_Two,0,3,360); //播放第四首歌
Delay1ms();
break;
}
else if(count==5)
{
Play(Music_Liangzhu,0,3,360); //播放第五首歌 Delay1ms();
break;
}
else if(count==6)
{
Play(Music_Yesterday,0,3,360); //播放第六首歌 Delay1ms();
count=0;
break;
}
}
5.4 音频产生程序
#ifndef __SOUNDPLAY_H_REVISION_FIRST__
#define __SOUNDPLAY_H_REVISION_FIRST__
//******************************************************************* *******
#define SYSTEM_OSC 12000000 //定义晶振频率12000000HZ
#define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔
sbit BeepIO = P0^2; //定义输出管脚
unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 };
//1~7在频率表中的位置
unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };
unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存
//******************************************************************* *******
void InitialSound(void)
{
BeepIO = 0;
Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值(10ms的初装值)
Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 计算TH1应装入的初值
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TMOD = 0x11;
ET0 = 1;
ET1 = 0;
TR0 = 0;
TR1 = 0;
EA = 1;
}
void BeepTimer0(void) interrupt 1 //音符发生中断
{
BeepIO = !BeepIO;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0;
}
//******************************************************************* *******。

相关文档
最新文档