当前位置:文档之家› (完整版)基于51单片机的简易电子琴设计

(完整版)基于51单片机的简易电子琴设计

(完整版)基于51单片机的简易电子琴设计
(完整版)基于51单片机的简易电子琴设计

基于51单片机的简易电子琴设计

一.问题提出

为什么选择简易电子琴设计?

1.对于音乐的兴趣

我们对音乐都有着浓厚的兴趣,喜欢听钢琴曲,如理查德·克莱德曼演奏的《思乡曲》《星空》《秋日的私语》等,音乐在我们的生活中扮演着很重要的角色。有人曾说,喜欢音乐的人不会向恶。以前不以为然,可是随着这些年来慢慢喜欢上阴郁,听了越来越多的钢琴曲之后,觉得这句话非常有道理。音乐是用艺术家用音符记录世界,传达情感的一种艺术形式,音乐里有一种和谐之美,听音乐可以让人心情舒畅,与外界和谐统一。音乐现在已经成为我生活中很重要的一部分,我们每周都会抽些时间去欣赏世界名曲,作为对精神的洗礼。2.对于电子琴的好奇

好奇是人的天性,人类对于自然的认识,对于科学的探索,无不始于好奇。

我们对电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器、自动放音功能等等也很好奇,想通过学习单片机这个机会,深入了解电子琴的功能实现原理。

3.对于51单片机强大功能的信赖

51单片机有基本特性:

(1)面向控制的8位CPU和指令系统

(2)4K字节的程序存储器(ROM或EPROM)

(3)128字节的数据存储器

(4)可编程的并行I/O口P0~P3,有32位双向输入/输出线

(5)一个全双工串行口

(6)两个16位定时器/计数器

(7)五个中断源,两个优先级的中断结构

(8)一个片内时钟振荡器和时钟电路

(9)可以寻址64K字节的程序存储器和64K字节的外部数据存储器51单片机功能强大,性能日趋完善,在工业测控、智能仪器仪表、机电一体化产品、家电领域中应用广泛,因此基于51单片机设计简易的电子琴可行性非常大。

二.功能需求

1.能够实现基本的琴键功能

即每按下一个琴键,单片机能够检测到键盘的按键,并根据按键的位置,通过程序来控制,使蜂鸣器发出不同频率(音调)的声音,声音延迟一段时间,等到按键放开后,声音停止。然后再继续扫描,看是否有键按下,如此循环下去,即可实现基本的琴键功能。

2.能够实现调节电子琴音色的功能

在键盘上设置功能键,通过按键来选择不同的音色。当选通后,按下琴键,蜂鸣器就一直发出此种音色的声音。直到下一次再次按下音色选择功能键,才会改变音色。系统共设置五种音色:长笛音,钢琴音,小号音,小提琴音,短笛音,默认状态为钢琴音。

3.能够实现通过按键自动播放歌曲的功能

在键盘上设置几个功能键,按下之后会根据功能键跳转到自动播放歌曲的程序,来播放相应的歌曲。播放歌曲的默认音色为钢琴音,若希望调整音色,只需在自动播放歌曲之前,按下相应的音色选择功能键即可实现。

三.总体方案

1.电子琴原理

在介绍总体方案之前,先简单介绍一下电子琴的发生原理以及如何改变音色的基本原理:声音的频谱范围约在几十到几千赫兹, 若能利用程序来控制单片机某个口线不断输出“高”“低”电平, 则在该口线上就能产生一定频率的方波, 将该方波接上喇叭就能发出一定频率的声音, 若再利用程序控制“高”“低”电平的持续时间, 就能改变输出波形的频率从而改变音调。乐曲中, 每一音符对应着确定的频率, 下表给出各音符频率。如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样, 那么将此口线接上喇叭就可以发出此音符的声音。本系统就是根据此原理设计, 对于单片机来说要产生一定频率的方波大致是先将某口线输出高电平然后延时一段时间再输出低电平, 如此循环的输出就会产生一定频率的方波, 通过改变延时的时间就可以改变输出方波的频率。单片机内部有两个位的定时计数器T1和T0, 单片机的定时计数器实际上是个计数装置它既可以对单片机的内部晶振驱动时钟计数也可以对外部输入的脉冲计数, 对内部晶振计数时称为定时器, 对外部时钟计数时称为计数器。当对单片机的内部晶振驱动时钟计数时,每个机器周期定时计数器的计数值就

加, 当计数值达到计数最大值时计数完毕并通知单片机的尸比对外部输入的时钟信号计数时, 外部时钟的每个时钟上升沿定时计数器的计数值就加, 当计数值达到计数最大值时计数完毕并通知单片机的尸。因此, 如果知道单片机的机器周期或者外部输入时钟信号的周期单片机就可以根据定时器的计数值计算出定时的时间。用此方法定时十分准确, 想得到多大的延时时间就可以给定时器赋一定的计数初值, 定时器从预先设置的计数初值开始不断增当增加到计数最大值时计数完毕, 调整计数初值的大小就可以调整定时器定时的时间, 从而达到准确的延时。在本设计中我们使用的外部时钟信号的晶振频率为12MHz,而采用的计数方式为方式1,所以计数器的初始值可以由如下公式求得。

T=65536-1000000/2/f

f为对应音调的频率;

通过以上方法,可求出各音调对应的频率,如下表

2. 外观设计

2.硬件部分总体方案

51单片机P0口通过8155扩展,连接4*8的矩阵键盘,作为琴键键盘和相应的功能控制键;并P2口一起,与EPROM连接;P0口则接通不通音色的滤波电路,通过程序控制P0口,选通不通的琴声音色滤波电路,使电子琴发出不同音色的声音。

3.软件部分总体方案

(1)键盘扫描程序:

检测是否有键按下,有键按下则记录按下键的键值,并跳转至功能转移程序;无键按下,则返回键盘扫描程序继续检测

(2)功能转移程序:

对检测到得按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音

色调节功能和自动播放乐曲功能

(3)琴键处理程序:

根据检测到得按键值,查询音律表,给计时器赋值,使发出相应频率的声音

(4)音色调节程序:

检测到键盘按下的是音色调节功能键后执行该程序,改变P0端口的值,选通相应的音色滤波电路,达到调节音色的目的

(5)自动播放歌曲程序:

检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放好的歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有键按下

四.硬件详细设计

总电路图

8155扩展

外部EPROM扩展电路

键盘电路

长笛滤波电路

钢琴滤波电路

小号滤波电路

小提琴滤波电路

短笛滤波电路四.软件框图

总程序简易流程图

键盘扫描程序流程图

弹奏程序流程图

音色调整子程序

自动播放歌曲程序流程图

六.软件清单

ORG 0200H

MOV P1, #02H ; 初始化P1口,使得电子琴默认为钢琴声KEYPRO: ;键盘扫描程序

ACALL KEXAM ; 检查是否有键按下

JZ KEYPRO ;若无键按下,则转KEYPRO,继续等待并检查ACALL D10ms ;若有键按下,则延时10ms,进行曲抖动处理ACALL KEXAM ;再次检查是否有键按下

JZ KEYPRO ;若无键按下,则转KEYPRO

KEY1:

MOV R2,#OFEH ;输出使第X0行为低电平模型数值

MOV R3,#OFFH ;列值寄存器预置初值

MOV R4,#OOH ;行值寄存器清零

KEY2:

MOV DPTR,#0303H ;送8155PC口地址

MOV A,R2 ;扫描第一行

MOVX @DPTR,A

MOV DPTR,#0301H ;送8155PA口地址

MOVX A,@DPTR ;读列数据值

CPL A

ANL A,#OFFH

JNZ KEY3 ;有键按下,请求转值

MOV A,R4 ;无键按下,行值寄存器加8

ADD A,#08H

MOV R4,A

MOV A,R2 ;求下一行为低电平模型数值

RL A

MOV R2,A

JB ACC.4,KEY2 ;判断各行是否完全扫描完,若未完,则继续扫描下一行AJMP KEYPRO ;若全部扫描完毕,则等待下一次按键

KEY3:

CPL A ;恢复列模型

KEY4:

INC R3

RRC A ;求列值

JC KEY4

KEY5:

ACALL D10ms

ACALL KEXAM

JNZ KEY5 ;若有键按下,则转KEY5,等待键释放

MOV A,R4 ;计算键值

ADD A,R3

MOV BUFF,A

AJMP KEYADR ;转查找功能键入口地址子程序

D10ms: ;延时10ms的子程序

MOV R5,#14H

DL: MOV R6,DL0

DL0: DJNZ R6,DL0

DJNZ R5,DL

RET

BUFF EQU 30H

KEXAM:

MOV DPTR,#0303H ;送端口C地址

MOV A,#00H ;输出使所有的行均为低电平模型数值MOVX @DPTR,A

MOV @DPTR,#0301H

MOVX A,@DPTR

CPL A

ANL A,#0FFH

RET

ORG 8000H ; 跳转功能程序

KEYADR:

MOV A, BUFF ; 取出键值

CJNE A, #17H, KYARD1

AJMP PLAY ; 等于17H,转琴键处理

KEYRD1:

JC PLAY ; 小于17H,转琴键处理

KEYTBL:

MOV DPTR, # JMPTBL ;送功能键地址表指针

CLR C ;清进位位

SUBB A , #10H

RL A

JMP @A+DPTR ;转相应的功能键处理程序

BUFF EQU 30H

JMPTBL:

AJMP SONG1 ; 跳转至化蝶

AJMP SONG2 ;跳转至童年

AJMP SONG3 ;跳转至龙的传人

AJMP FLUTE ;调节成长笛音色状态

AJMP PIANO ;调节成钢琴音色状态

AJMP TRUMPET ;调节成小号音色状态

AJMP VIOLIN ;调节成小提琴音色状态

AJMP PICCOLO ;调节成短笛音色状态

SONG1:

MOV DPTR, #BUTTERFLY ;赋梁祝谱初值

ACALL SUB_SONG ;调用播放歌曲子程序

AJMP KEYPRO ;返回至键盘扫描程序

SONG2:

MOV DPTR, #YOUTH ;赋童年谱值

ACALL SUB_SONG ;调用播放歌曲子程序

AJMP KEYPRO ;返回至键盘扫描程序

SONG3:

MOV DPTR, #MULTIPLY_OF_THE_DRAGON ;赋龙的传人谱初值ACALL SUB_SONG

AJMP KEYPRO

FLUTE:

MOV P1, #01H ;使长笛滤波电路选通

AJMP KEYPRO ;跳转回键盘扫描程序

PIANO:

MOV P1, #02H ;使钢琴琴滤波电路选通

AJMP KEYPRO ;跳转回键盘扫描程序TRUMPET:

MOV P1, #04H ;使小号滤波电路选通

AJMP KEYPRO ;跳转回键盘扫描电路VIOLIN:

MOV P1, #08H ;使小提琴滤波电路选通

AJMP KEYPRO ;跳转回键盘扫描电路PICCOLO:

MOV P1, #10H ;使短笛滤波电路选通通AJMP KEYPRO ;跳转回键盘扫描电路PLAY: ; 弹琴子程序

ORG 0F00H ;子程序入口地址

SJMP MAIN

ORG 0F1BH ;设置中断入口地址

LJMP TINT1

MAIN:

MOV TMOD, #10H ; 计时器控制字T1方式计时SETB EA ;开中断总开关

SETB ET1 ; 允许T1中断

SETB TR1 ;定时开始

MOV DPTR, #TABLE1 ;查询音律表

PUSH ACC

MOVC A, @A+DPTR

MOV TH1,A ;音律表查询值高八位赋值POP ACC

INC A

MOVC A, @A+DPTR

MOV TL1,A ;音律表查询值低八位赋值ACALL DLAY

AJMP KEYPRO ;跳转回键盘扫描程序

TINT1:

JB P1.0, FLUTE_ON ;判断是否跳到长笛音色档JB P1.1, PIANO_ON ;判断是否调到钢琴音色档

JB P1.2, TRUMPET_ON ;判断是否调到小号音色档JB P1.3, VIOLIN_ON ;判断是否跳到小提琴音色档JB P1.4, PICCOLO_ON ;判断是否跳到短笛音色档FLUTE_ON: ;若是长笛音色档,则控制P1.0口电压变化CPL P1.0

POP DPH

POP DPL

PUSH DPL

PUSH DPH

RETI

PIANO_ON: ;若是钢琴琴音色档,则控制P1.1口电压变化

CPL P1.1

POP DPH

POP DPL

PUSH DPL

PUSH DPH

RETI

TRUMPET_ON: ;若是小号音色档,则控制P1.2口电压变化CPL P1.2

POP DPH

POP DPL

PUSH DPL

PUSH DPH

RETI

VIOLIN_ON: ;若是小提琴音色档,则控制P1.2口电压变化CPL P1.3

POP DPH

POP DPL

PUSH DPL

PUSH DPH

RETI

PICCOLO_ON: ;若是短笛音色档,则控制P1.2口电压变化CPL P1.4

POP DPH

POP DPL

PUSH DPL

PUSH DPH

RETI

DLAY: MOV R2, #0F0H ;延时程序

DL2: MOV R3,#0F0H

DL1: NOP

NOP

DJNZ R3, DL1

DJNZ R2, DL2

RET

TABLE1:;音律表

DW 0F88BH ;-1

DW 0F95BH ;-2

DW 0FA14H ;-3

DW 0FA67H ;-4

DW 0FB07H ;-5

相关主题
文本预览
相关文档 最新文档