电子琴论文
更新时间:2024-04-24 12:39:01 阅读量: 综合文库 文档下载
摘 要
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:单片机键盘扬声器电子琴
Abstract
Electronic organ is a modern electronic music technology and the product is a new type of keyboard instruments. It played an important role in modern music. SCM has powerful control functions and flexible programming characteristics. It has converged with modern people's lives, become an irreplaceable part. The main content is AT89S51 control of the core components, design of a electronic organ. SCM as a host to the core, with the keyboard, speaker and other core modules. In the main control module has 16 keys and a speaker. The system is steady, its simple hardware circuits, software functions, reliability of control system and high cost performance is its advantages. It also has certain practical and reference value.
Key words : SCM keyboard speaker electronic organ
目 录
1 引言. 1 2 原理图. 2
2.1 系统板硬件连线. 3 3 主要芯片简介. 4 3.1 AT89S51简介. 4 3.1.1 主要功能特性. 5 3.1.2 引脚功能. 5 3.2 LM386 6
3.2.1 LM386内部电路. 7 3.2.2 LM386的引脚图. 8 3.3 LED数码管. 9 4 模块原理. 11
4.1 4X4行列式键盘识别及显示. 11 4.1.1 系统板上硬件连线设计. 12 4.1.2 程序设计内容. 13
4.1.3 I/O并行口直接驱动LED显示. 13 4.1.4 键盘识别程序框图. 17 4.1.5 C语言源程序. 18 4.2 音乐产生的方法. 22 4.2.1 原理. 22 4.2.2 程序框图. 25
4.2.3 程序. 25 5 结束语. 31 致 谢. 32 参考文献. 33
1 引言
单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。它的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
2 原理图
图2-1 电子琴电路图
2.1 系统板硬件连线
系统板硬件连线如图2-1所示,发生模块,键盘模块,及LED显示模块连接如下 1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;
2.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
3.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,??,P0.7/AD7对应着h。
3 主要芯片简介
3.1 AT89S51简介
AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S51具有如下特点:40个引脚(引脚图如图3-1所示),4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
图3-1 管脚图
3.1.1 主要功能特性
· 兼容MCS-51指令系统 · 32个双向I/O口 · 2个16位可编程定时/计数器 · 全双工UART串行中断口线 · 2个外部中断源 · 中断唤醒省电模式
· 看门狗(WDT)电路 · 灵活的ISP字节和分页编程 · 4k可反复擦写ISP Flash ROM · 4.5-5.5V工作电压 · 时钟频率0-33MHz · 128x8bit内部RAM · 低功耗空闲和省电模式 · 3级加密位 · 软件设置空闲和省电功能 · 双数据寄存器指针
3.1.2 引脚功能
VCC(40):+5V; GND(20):接地;
P0口(39-32):P0口为8位漏极开路双向I/O口,每引脚可吸收8个TTL门电流; P1口(1-8):P1口是从内部提供上拉电阻器的8位双向I/O口,P1口缓冲器能接收和输出4个TTL门电流;
P2口(21-28):P2口为内部上拉电阻器的8位双向I/O口,P2口缓冲器可接收和输出4个TTL门电流;
P3口(10-17):P3口是8个带内部上拉电阻器的双向I/O口,可接收和输出4个TTL门电流,P3口也可作为AT89C51的特殊功能口;
RST(9):复位输入。当振荡器复位时,要保持RST引脚2个机器周期的高电平时间; ALE/PROG(30):当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节,在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输
出正脉冲信号,此频率为振荡器频率的1/6,它可用作对外部输出的脉冲或用于定时目的,要注意的是,每当访问外部数据存储器时,将跳过1个ALE脉冲;
PSEN(29):外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期2次PSEN有效,但在访问外部数据存储器时,这2次有效的PSEN信号将不出现; EA/VPP(31):当EA保持低电平时,外部程序存储器地址为(0000H-FFFFH)不管是否有内部程序存储器。FLASH编程期间,此引脚也用于施加12V编程电源(VPP); XTAL1(19):反向振荡器放大器的输入及内部时钟工作电路的输入; XTAL2(18):来自反向振荡器的输出;
3.2 LM386
LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。
3.2.1 LM386内部电路
图3-2 LM386内部电路原理图
LM386内部电路原理图如图3-2所示。与通用型集成运放相类似,它是一个三级放大电路。
第一级为差分放大电路,T1和T3、T2和T4分别构成复合管,作为差分放大电路的放大管;T5和T6组成镜像电流源作为T1和T2的有源负载;T3和T4信号从管的基极输入,从T2管的集电极输出,为双端输入单端输出差分电路。使用镜像电流源作为差分放大电路有源负载,可使单端输出电路的增益近似等于双端输出电容的增益。
第二级为共射放大电路,T7为放大管,恒流源作有源负载,以增大放大倍数。 第三级中的T8和T9管复合成PNP型管,与NPN型管T10构成准互补输出级。二极管D1和D2为输出级提供合适的偏置电压,可以消除交越失真。
引脚2为反相输入端,引脚3为同相输入端。电路由单电源供电,故为OTL电路。输出端(引脚5)应外接输出电容后再接负载。
电阻R7从输出端连接到T2的发射极,形成反馈通路,并与R5和R6构成反馈网络,从而引入了深度电压串联负反馈,使整个电路具有稳定的电压增益。
3.2.2 LM386的引脚图
图3-3 LM386的外形和引脚的排列
LM386的外形和引脚的排列如图3-3所示。引脚2为反相输入端,3为同相输入端;引脚5为输出端;引脚6和4分别为电源和地;引脚1和8为电压增益设定端;使用时在引脚7和地之间接旁路电容,通常取10μF。
查LM386的电源电压4-12V或5-18V(LM386N-4);静态消耗电流为4mA;电压增益为20-200dB;在1、8脚开路时,带宽为300KHz;输入阻抗为50K;音频功率0.5W。 尽管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,效果确实不错!
3.3 LED数码管
图3-4 7段数码管
数码管(如图3-4所示)使用条件: a、段及小数点上加限流电阻
b、使用电压:段:根据发光颜色决定;小数点:根据发光颜色决定
c、使用电流:静态:总电流 80mA(每段 10mA);动态:平均电流 4-5mA 峰值电流 100mA 上面这个只是七段数码管引脚图,其中共阳极数码管引脚图和共阴极的是一样的。 数码管使用注意事项说明:
(1)数码管表面不要用手触摸,不要用手去弄引角; (2)焊接温度:260度;焊接时间:5S (3)表面有保护膜的产品,可以在使用前撕下来。
4 模块原理
4.1 4X4行列式键盘识别及显示
组成键盘的按键有机械式、电容式、导电橡胶式、薄膜式多种,但不管什么形式,其作用都是一个使电路接通与断开的开关。目前微机系统中使用的键盘按其功能不同,通常可分为编码键盘和非编码键盘两种基本类型。
编码键盘:键盘本身带有实现接口主要功能所需的硬件电路。不仅能自动检测被按下的键,并完成去抖动、防串键等功能,而且能提供与被按键功能对应的键码(如ASCII码)送往CPU。所以,编码键盘接口简单、使用方便。但由于硬件电路较复杂,因而价格较贵。 非编码键盘:键盘只简单地提供按键开关的行列矩阵。有关按键的识别、键码的确定与输入、去抖动等功能均由软件完成。目前微机系统中,一般为了降低成本大多数采用非编码键盘。
键盘接口必须具有去抖动、防串键、按键识别和键码产生4个基本功能。
(1)去抖动:每个按键在按下或松开时,都会产生短时间的抖动。抖动的持续时间与键的质量相关,一般为5—20mm。所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。去抖问题可通过软件延时或硬件电路解决。
(2)防串键:防串键是为了解决多个键同时按下或者前一按键没有释放又有新的按键按下时产生的问题。常用的方法有双键锁定和N键轮回两种方法。双键锁定,是当有两个或两个以上的按键按下时,只把最后释放的键当作有效键并产生相应的键码。N键轮回,是当检测到有多个键被按下时,能根据发现它们的顺序依次产生相应键的键码。
(3)被按键识别:如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。常用的方法有行扫描法和线反转法两种。行扫描法的基本思想是,由程序对键盘逐行扫描,通过检测到的列输出状态来确定闭合键,为此,需要设置入口、输出口一个,该方法在微机系统中被广泛使用。线反转法的基本思想是通过行列颠倒两次扫描来识别闭合键,为此需要提供两个可编程的双向输入/输出端口。
(4)键码产生:为了从键的行列坐标编码得到反映键功能的键码,一般在内存区中建立一个键盘编码表,通过查表获得被按键的键码。
用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。
图4-1 键盘识别模块
4.1.1 系统板上硬件连线设计
键盘模块硬件连线如图4-1所示:
(1.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
(2.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,??,P0.7/AD7对应着h。
4.1.2 程序设计内容
(1. 4×4矩阵键盘识别处理
(2.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
4.1.3 I/O并行口直接驱动LED显示
LED显示模块如图4-2所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地。在数码管上循环显示0-9数字,时间间隔0.2秒。
图4-2 电路原理图 系统板上硬件连线:(如图4-2所示)
把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的a-h端口上;要求:P0.0/AD0与a相连,P0.1/AD1与b相连,P0.2/AD2与c相连,??,P0.7/AD7与h相连。 程序设计内容:
(1).LED数码显示原理:
七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。 LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码表(如表4-1所示) 表4-1 字形码表 “0” “1” “2” “3” “4” “5” “6” “7”
3FH 06H 5BH 4FH 66H 6DH 7DH 07H “8” “9” “A” “b” “C” “d” “E” “F” 7FH 6FH 77H 7CH 39H 5EH 79H 71H (2).由于显示的数字0-9的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。这样我们按着数字0-9的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLEDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。
程序框图:
程序框图如图4-3所示:
图4-3 数码显示程序框图
C语言源程序: #include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char dispcount;
void delay02s(void) {
unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); }
void main(void) {
while(1) {
for(dispcount=0;dispcount<10;dispcount++) {
P0=table[dispcount]; delay02s(); } } }
4.1.4 键盘识别程序框图
键盘识别程序框图如图4-4所示:
图4-4 键盘识别程序框图
4.1.5 C语言源程序
#include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; unsigned char temp;
unsigned char key; unsigned char i,j; void main(void) { while(1) { P3=0xff; P3_4=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) { temp=P3;
temp=temp & 0x0f; switch(temp) {
case 0x0e: key=7; break; case 0x0d: key=8; break; case 0x0b: key=9; break; case 0x07: key=10; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3;
temp=temp & 0x0f; }
} } P3=0xff; P3_5=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) { temp=P3;
temp=temp & 0x0f; switch(temp) {
case 0x0e: key=4; break; case 0x0d:
key=5; break; case 0x0b: key=6; break; case 0x07: key=11; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3;
temp=temp & 0x0f; } } } P3=0xff; P3_6=0;
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) { temp=P3;
temp=temp & 0x0f; switch(temp) {
case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b: key=3;
break; case 0x07: key=12; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3;
temp=temp & 0x0f; } } } P3=0xff; P3_7=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) { temp=P3;
temp=temp & 0x0f; switch(temp) {
case 0x0e: key=0; break; case 0x0d: key=13; break; case 0x0b: key=14; break; case 0x07: key=15; break;
} temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3;
temp=temp & 0x0f; } } } } }
4.2 音乐产生的方法
4.2.1 原理
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。就可在P1.0引脚上得到此频率的脉冲。
利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系式(如式4-1所示)是:
N=fi÷2÷fr 4-1
式中,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-2所示 表4-2 音符频率表 音符 低1 DO #1 DO# 低2 RE #2 RE# 低 3 M 低 4 FA # 4 FA# 频率(HZ) 简谱码(T值) 音符 262 277 294 311 330 349 370 63628 63731 63835 63928 64021 64103 64185 # 4 FA# 中 5 SO # 5 SO# 中 6 LA # 6 中 7 SI 高 1 DO 频率(HZ) 简谱码(T值) 740 784 831 880 932 988 1046 64860 64898 64934 64968 64994 65030 65058 低 5 SO # 5 SO# 低 6 LA # 6 低 7 SI 中 1 DO # 1 DO# 中 2 RE # 2 RE# 中 3 M 中 4 FA 392 415 440 466 494 523 554 587 622 659 698 64260 64331 64400 64463 64524 64580 64633 64684 64732 64777 64820 # 1 DO# 高 2 RE # 2 RE# 高 3 M 高 4 FA # 4 FA# 高 5 SO # 5 SO# 高 6 LA # 6 高 7 SI 1109 1175 1245 1318 1397 1480 1568 1661 1760 1865 1967 65085 65110 65134 65157 65178 65198 65217 65235 65252 65268 65283 我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据 低音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-3所示) 表4-3 曲调值表 曲调值 调4/4 调3/4 调2/4 DELAY 125ms 187ms 250ms 曲调值 调4/4 调3/4 调2/4 DELAY 62ms 94ms 125ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。 下面用AT89S51单片机产生“生日快乐”歌来说明单片机如何产生的。
在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍。
4.2.2 程序框图
音乐发声程序框图如图4-5所示:
图4-5 音乐发声程序框图
4.2.3 程序 #include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char temp; unsigned char key; unsigned char i,j; unsigned char STH0; unsigned char STL0;
unsigned int code tab[]={64021,64103,64260,64400, 64524,64580,64684,64777, 64820,64898,64968,65030, 65058,65110,65157,65178}; void main(void) {
TMOD=0x01; ET0=1; EA=1; while(1) {
P3=0xff; P3_4=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; switch(temp) {
case 0x0e: key=0; break; case 0x0d: key=1; break; case 0x0b: key=2; break; case 0x07: key=3; break; }
temp=P3; P1_0=~P1_0; P0=table[key];
STH0=tab[key]/256; STL0=tab[key]%6; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
TR0=0; } }
P3=0xff; P3_5=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; switch(temp) {
case 0x0e: key=4; break; case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=7; break; }
temp=P3; P1_0=~P1_0; P0=table[key];
STH0=tab[key]/256; STL0=tab[key]%6; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
TR0=0; } }
P3=0xff; P3_6=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; switch(temp) {
case 0x0e: key=8; break; case 0x0d: key=9; break; case 0x0b: key=10; break; case 0x07: key=11; break; }
temp=P3; P1_0=~P1_0; P0=table[key];
STH0=tab[key]/256; STL0=tab[key]%6; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
TR0=0; } }
P3=0xff; P3_7=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; switch(temp) {
case 0x0e: key=12; break; case 0x0d: key=13; break; case 0x0b: key=14; break; case 0x07: key=15; break; }
temp=P3; P1_0=~P1_0; P0=table[key];
STH0=tab[key]/256; STL0=tab[key]%6; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
TR0=0; } }
} }
void t0(void) interrupt 1 using 0 {
TH0=STH0; TL0=STL0; P1_0=~P1_0; }
5 结束语
将程序烧入芯片,调试成功后,可任意弹奏自己想要的旋律。本研究通过制作电子琴,将几个模块很好的融合起来,对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,于是我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可,然后我们利用功放电路来将音乐声音放大,同时通过显示模块来确知自己所弹的音符。 不足之处有:
1.可弹奏的音符数较少,只能在一定范围内满足用户需要。可通过改进键盘识别模块和发生模块来增加其复杂度。
2.音量不可调。可通过改进功放电路,即在lm386的1脚和8脚间增加一直外界电阻和电容,将3脚与地之间的电阻换为10k的变阻,即可调节其放大增益。
致 谢
这次毕业论文能够得以顺利完成,是所有曾经指导过我的老师,帮助过我的同学,一直支持着我的家人对我的教诲、帮助和鼓励的结果。我要在这里对他们表示深深的谢意! 首先,要特别感谢我的指导老师——陈荣老师。陈老师在我毕业论文的撰写过程中,给我提供了极大的帮助和指导。从开始选题到中期修正,再到最终定稿,陈老师给我提供了许多宝贵建议。老师渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,朴实无华、平易近人的人格魅力对我影响深远。不仅使我树立了远大的学术目标、掌握了基本的研究方法,还使我明白了许多待人接物与为人处世的道理。
其次,要感谢江城学院所有曾经给我们电信2200403班任课的老师,老师们教会我的不仅仅是专业知识,更多的是对待学习、对待生活的态度。
第三,感谢我的父母亲,你们是我力量的源泉,只要有你们,不管面对什么样的困难,我都不会害怕,谢谢你们对我的支持与鼓励!
再次,感谢我的室友及其他好友,因为有你们的帮助,我的论文得以顺利完成。感谢你们,大学四年给我了那么多的帮助与鼓励,在我不开心的时候,总能让我开心起来。不会忘记,大学四年里我们一起度过的欢乐时光,那些开心的日子,总是那么令人难以忘怀。 最后对老师,同学和家人再次致以我最衷心的感谢!教导过我的老师,你们的人格魅力永记我心间。身边的同学和朋友,有你们,我的大学才算完整。寝室的好友,你们的天赋犹如上天恩赐,有了你们我的生活更加精彩。感谢考研时的战友,那段光辉岁月不管成败,友情最可贵。
参考文献
[1] 康年光.电子技术基础(数字部分).高等教育出版社.2005.07 [2] 刘乐喜.微机计算机接口技术及应用.华中科技大学出版社.2005.08 [3] 谢嘉奎.电子线路(线性部分).高等教育出版社.2004.04 [4] 潭浩强.C语言程序设计.清华大学出版社.2005.07
[5] 李群芳,肖看.单片机原理、接口及应用—嵌入式系统技术基础.清华大学出版社.2005.03
[6] 冯博琴.微型计算机原理与接口技术.清华大学出版社.2004
[7] 长德,李华,李东.MCS51/98系列单片机原理与应用.机械工业出版社.1997 [8] 李群芳,张士军,黄建.单片微型计算机原理与接口技术.电子工业出版社.2002 [9] 石东海等.单片机数据通信技术从入门到精通.西安电子科技大学出版社.2002 [10] 谢自美等.电子线路设计、实验、测试(第二版).华中科技大学出版社.2000 [11] R.L.Geiger,P.E.Allen,N.R.Strader.VLSI.DLSI Design Techniques for Analog And Digital Ciruits.McGraw-Hill Inc.1990
[12] N.R.Mallik.Electronic Ciruits-Analysis Simulation and Design.Prentice Hall,1995.
参考文献
[1] 康年光.电子技术基础(数字部分).高等教育出版社.2005.07 [2] 刘乐喜.微机计算机接口技术及应用.华中科技大学出版社.2005.08 [3] 谢嘉奎.电子线路(线性部分).高等教育出版社.2004.04 [4] 潭浩强.C语言程序设计.清华大学出版社.2005.07
[5] 李群芳,肖看.单片机原理、接口及应用—嵌入式系统技术基础.清华大学出版社.2005.03
[6] 冯博琴.微型计算机原理与接口技术.清华大学出版社.2004
[7] 长德,李华,李东.MCS51/98系列单片机原理与应用.机械工业出版社.1997 [8] 李群芳,张士军,黄建.单片微型计算机原理与接口技术.电子工业出版社.2002 [9] 石东海等.单片机数据通信技术从入门到精通.西安电子科技大学出版社.2002 [10] 谢自美等.电子线路设计、实验、测试(第二版).华中科技大学出版社.2000 [11] R.L.Geiger,P.E.Allen,N.R.Strader.VLSI.DLSI Design Techniques for Analog And Digital Ciruits.McGraw-Hill Inc.1990
[12] N.R.Mallik.Electronic Ciruits-Analysis Simulation and Design.Prentice Hall,1995.
正在阅读:
电子琴论文04-24
古代关于礼的小故事11-20
考研英语口语复试:题型及注意事项盘点07-09
机智的保安作文400字06-23
CPA《经济法》考点解读第04章 合同法律制度0710-13
土壤铅污染及其治理措施05-08
说说我的心里话作文300字07-04
浅谈远程教育资源在教育实践中的作用08-21
祁东县太和堂至四明山旅游公路工程项目可行性研究报告05-27
日记200字06-23
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 电子琴
- 论文
- 部编版语文二年级下册复习教案
- 富豪的八字特征和八字详批案例
- 化疗药物所致恶心呕吐的防治进展
- 2006年(上)开放教育本科法学专业
- 09杠杆简单机械答案
- 苏教版二年级上册品德与社会教案
- Python语言程序设计(美-梁勇)第4章选择习题解答
- 中国银监会办公厅关于加强农村合作金融机构资金业务监管的通知分
- 温州市教育局
- GPS练习题二
- 2012年暑期社会实践表彰清单公示
- 机电类特种设备施工单位基本要求
- 三年级下册数学教案第6单元长方形和正方形面积的计算 - 苏教版(
- 行政许可自查报告
- 激发学生好奇心的策略
- 广东电网公司人员上岗考试复习题库
- 市场调查与预测实习报告
- 手术室题库
- 小学三四年级阅读短文练习集锦
- 关于公布2016年“我爱诵诗文”教师、学生中华经典诗文诵读比赛结