单片机简易电子琴.docx
《单片机简易电子琴.docx》由会员分享,可在线阅读,更多相关《单片机简易电子琴.docx(26页珍藏版)》请在冰豆网上搜索。
单片机简易电子琴
《微机原理》课外设计制作
终期报告
题目(B1):
组号:
任课教师:
组长:
成员:
成员:
成员:
成员:
联系方式:
二零一四年五月十六日
一.实验目的
二.设计要求
三.实验方案
四.实验结果及分析
五.收获与体
六.会团队分工合作
七.附录代码
课外设计项目:
简易电子琴
一.实验目的
设计具有播放预设音乐、弹奏8个以上音阶、节拍/音量可以设定等功能的简易电子琴。
二.设计要求
1)按下播放按键,播放预设音乐。
2)按下演奏按键,发出1,2,3,4,5,6,7,1?
共8个音阶(C调)。
3)液晶屏显示当前的操作信息(如播放的乐曲名,弹奏的音符)。
4)演奏按键的发声时长和音量大小可调。
5)可以对演奏按键的发声做升调/降调处理。
三.实验方案
1.实验材料
实验材料:
1)单片机实验板2)小喇叭3)电阻、电容、三极管若干,使用元件:
AT89C51、LM324,喇叭,按键等。
2.原件介绍
1)AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2)LM324系列器件带有差动输入的四运算放大器。
与单电源应用场合的标准运算放大器相比,它们有一些显著优点。
该四放大器可以工作在低到3.0伏或者高到32伏的电源下,静态电流为MC1741的静态电流的五分之一。
共模输入范围包括负电源,因而消除了在许多应用场合中采用外部偏置元件的必要性。
每一组运算放大器可用图1所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“V+”、“V-”为正、负电源端,“Vo”为输出端。
两个信号输入端中,Vi-(-)为反相输入端,表示运放输出端Vo的信号与该输入端的相位相反;Vi+(+)为同相输入端,表示运放输出端Vo的信号与该输入端的相位相同。
LM324系列由四个独立的,高增益,内部频率补偿运算放大器,其中专为从单电源供电的电压范围经营。
从分裂电源的操作也有可能和低电源电流消耗是独立的电源电压的幅度。
应用领域包括传感器放大器,直流增益模块和所有传统的运算放大器可以更容易地在单电源系统中实现的电路。
例如,可直接操作的LM324系列,这是用来在数字系统中,轻松地将提供所需的接口电路,而无需额外的±15V电源标准的5V电源电压。
3.设计思路
设计并制作一个简易的电子琴可采用集成电路设计,基于AT89S52单片机设计一款简易的电子琴,采用4*4距阵键盘,有16个按钮矩阵,设计成16个音,可以实现音阶在低音4---高音5之间。
从而可以用来弹奏喜欢的乐曲。
由于一首音乐是由许多不同音阶组成,每个音阶对应不同的频率,这样我们可用不同频率组合,即可构成我们想要的音乐了,当然对单片机产生不同的频率非常方便,我们可用单片机的定时/计数器0来产生这样的方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系设定正确即可。
对于晶振频率为12MHz的单片机,其定时器的计数周期为1MHz,假如选择工作方式1,那T值便为T=216~5*105/相应的频率,那么根据不同的频率计算出应该赋给定时器的计数值。
建立这样一个数据表,然后采用查表程序即可。
而升降调的实现则可以通过频率范范和减半来实现。
音符
频率(Hz)
简谱码(T值)
中1DO
523
64580
中2RE
587
64684
中3MI
659
64777
中4FA
698
64820
中5SO
784
64898
中6LA
880
64968
中7SI
988
65030
a)LCD1602显示设计
工业字符型液晶,能够同时显示16x02即32个字符。
(16列2行)1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
如图,板载的变阻器W1可以用来调节1602显示屏的对比度。
本次采用的Mini80e升级版开发板在电路设计上,将显示屏的数据口放在P0上,RS、RW、E分别对应P2.4、P2.5、P2.6。
依据LCD1602的使用手册,可以对LCD1602发送指令和数据。
b)发声音调设计
音阶由不同频率的方波产生,音阶与频率的关系如表1所示。
要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用计时器计时此半周期时间,每当计时到后就将输出方波的I/0反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此频率的方波。
在ZKS-03实验仪上,产生方波的I/O脚选用P1.6,通过跳线选择器JP1将单片机的P1.6与扬声器的驱动电路相连。
这样P1.6输出不同频率的方波,扬声器便会发出不同的声音。
另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。
只要设定延时时间,就可求得节拍的时间。
延时作为基本延时时间,节拍值只能是它的整数倍。
每个音阶相应的定时器初值X可按下法计算:
当晶振fose=12MHz时,各音阶相应的定时器初值X如下表1
表1
总体框图如下:
c)发声时长设计
根据定时器工作的独立性特点,当定时器0控制发生频率时,可以在主程序中使用延时子程序控制发生时长,每次执行延时子程序前打开定时器0,延时结束后关闭定时器0。
根据试验,延时256*256个单片机周期的时间很短暂,故放弃采用定时器1而选用采用三层循环设计,使延时为256*256*n。
调节n即可调节发生时长。
d)发声音量设计
LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。
LM386的外形和引脚的排列如图所示。
引脚2为反相输入端,3为同相输入端;引脚5为输出端;引脚6和4分别为 电源和地;引脚1和8为电压增益设定端;使用时在引脚7和地之间接旁路电容,通常取10μF。
音量调节电路图:
四.实验结果及分析
经过大家坚持不懈的努力,简易电子琴的要求都被我们基本实现了,下面就是我们的实验结果。
按下演奏按键,发出1,2,3,4,5,6,7,1?
共8个音阶(C调)。
这里是1的音调。
音调为1,音长也为预设的1。
演奏按键的发声时长可调。
这里为音调3,音长由预设的1变为了2,加长音长。
可以对演奏按键的发声做升调/降调处理。
这里为音调4,可从图中看出4后面有一个“+”号,此为升调。
按下播放按键,播放预设音乐。
我们在这里预设的音乐为梁祝。
此外音调大小是有一个外围电路做的,在实验原理中可以看到。
五.收获与体会
由于本组完全由5个女生组合而成,所以要独立完成本课外设计项目对于我们组来说有很大的难度。
首先遇到的难题就是编写代码。
我们小组在编写代码这一环节上花费了极大的精力和时间。
编写完成的代码的最低要求是通过keil的编译。
且不说以我们自己的能力自己编写的程序很难通过编译,即使是代码经历千辛万苦编译成功,如果烧入单片机内不能实现功能,也是让人心力交瘁的。
通过本次实验也使我们对个个元器件有了进一步的了解,这是一次难得的实践机会。
还有你的方案设计是否能达到最佳的效果,通过仿真做一系列的了解。
所以在本次设计中遇到了许多问题,在调试阶段的时候,根据电路图把电路连接好以后,扬声器没有任何的反应。
经过一系列的检查才发现杜邦线的接线有问题,音频输出口P1.6插到了第六个角(实际上是P1.5)还在调试的最后阶段的种种问题,经过查阅资料才把简易电子琴顺利完成设计。
六.团队分工合作
潘黎:
查找资料、撰写终期报告
原媛:
编辑程序、修改及完善
黄静:
编辑程序、修改及完善
刘晓涵:
调试程序、测试功能
徐雅文:
查找资料、撰写中期报告
附录;代码部分
LCDRSEQUP2.4;定义管脚和接口
LCDRWEQUP2.5
EEQUP2.6
SPKEQUP1.6
LCDDATAEQUP0
KEYEQUP3
JIEPAIEQU24H;节拍
YINDIAOEQU25H;升降调
ORG00H
LJMPSTAR
ORG0BH;T0中断控制音调发声频率
LJMPTIME0
ORG1BH;T1中断控制音乐播放
LJMPTIME1
ORG30H
TIME0:
MOVTL0,R3
MOVTH0,R2
CPLSPK
RETI
TH01:
DB008H,007H,006H,006H,005H,004H,004H,004H
TL01:
DB028H,043H,079H,016H,070H,0D7H,04FH,011H
TIME1:
MOVTL1,20H
MOVTH1,21H
CPLSPK;由该口输出音频数据
;CLRP1.2
RETI
STAR:
MOVSP,#70H
MOVTMOD,#11H;定时器模式为1
MOVIE,#8AH
CLRTR0
MOVR3,#0FFH;LOW_8_BIT
MOVR2,#0FFH;HIGH_8_BIT
CLRYINDIAO.0;判断是否升降调位清零
MOVP2,0
MOVP0,0
MAIN:
LCALLPANDUAN;调用判断按键子程序
JZMAIN;都不按下返回继续判断
CJNEA,#9,M1;按键不等于9跳转
M1:
JNCM2;若按键为>=9中一个跳转到M2
DECA;按键为1到8执行单音播放
PUSHACC
MOVR5,A
LCALLPRINT;调用屏幕显示
POPACC
LCALLBF;调用单音播放
SJMPMAIN
M2:
CJNEA,#9,M3;按键大于9跳转
LCALLKEY9;调用播放键子程序
LCALLDELAY1
MOVLCDDATA,#01H;写指令01H,清屏
LCALLENABLE
LJMPMAIN
M3:
CJNEA,#10,M4;按键10控制加长节拍
INCJIEPAI
ANLJIEPAI,#07H
LJMPMAIN
M4:
CJNEA,#11,M5;按键11控制减短节拍
DECJIEPAI
ANLJIEPAI,#07H
LJMPMAIN
M5:
CJNEA,#14,M6
SETBYINDIAO.0;升降调执行
CLRYINDIAO.1;降调
LJMPMAIN
M6:
CJNEA,#15,M7
SETBYINDIAO.0;升降调执行
SETBYINDIAO.1;升调
LJMPMAIN
M7:
CJNEA,#13,M8;按键13复位
CLRYINDIAO.0;没有升降调
LJMPMAIN
M8:
LJMPMAIN
KEY9:
;播放已有音乐
LCALLDELAY1;调用延时
MOVLCDDATA,#01H;清屏及设置屏幕
LCALLENABLE
MOVLCDDATA,#38H
LCALLENABLE
MOVLCDDATA,#0CH
LCALLENABLE
MOVLCDDATA,#06H
LCALLENABLE
MOVLCDDATA,#80H;显示屏第一行起始地址
MOVR1,#16
LCALLENABLE
MOVDPTR,#GEMING1;显示歌名
LCALLDISP
MOVR1,#16
MOVLCDDATA,#0C0H;第二行起始地址
LCALLENABLE
MOVDPTR,#GEMING2
LCALLDISP
PUSHACC
MOV30H,#00H
JIXU3:
MOVA,30H
MOVDPTR,#QUMU1
MOVCA,@A+DPTR
MOVR2,A
JZEND0
ANLA,#0FH
MOVR5,A
MOVA,R2
SWAPA
ANLA,#0FH
JNZSONG
CLRTR1
JMPD1
SONG:
DECA
MOV22H,A
RLA
MOVDPTR,#QUMU0
MOVCA,@A+DPTR
MOVTH1,A
MOV21H,A
MOVA,22H
RLA
INCA
MOVCA,@A+DPTR
MOVTL1,A
MOV20H,A
SETBTR1
D1:
LCALLDELAY2
INC30H
JMPJIXU3
END0:
CLRTR1
POPACC
RET
DELAY1:
MOVR7,#1;延时子程序
S1:
MOVR6,#255
S2:
DJNZR6,S2
DJNZR7,S1
RET
DELAY2:
MOVR7,#02H
D2:
MOVR4,#255
D3:
MOVR3,#248
DJNZR3,$
DJNZR4,D3
DJNZR7,D2
DJNZR5,DELAY2
RET
PANDUAN:
MOVP3,#0FH
MOVA,P3
XRLA,#0FH
JNZJIXU1
RET
JIXU1:
;消除按键抖动
MOVR6,#255
HJ:
MOVR7,#255
DJNZR7,$
DJNZR6,HJ
MOVP3,#0FH
MOVA,P3
XRLA,#0FH
JNZJIXU2
RET
JIXU2:
MOVP3,#0FH
MOVA,P3
MOVP3,#0F0H
ORLA,P3
MOVB,0
CJNEA,#0FFH,K1;扫描按键
LJMPYY
K1:
INCB
CJNEA,#7EH,K2
LJMPYY
K2:
INCB
CJNEA,#0BEH,K3
LJMPYY
K3:
INCB
CJNEA,#0DEH,K4
LJMPYY
K4:
INCB
CJNEA,#0EEH,K5
LJMPYY
K5:
INCB
CJNEA,#7DH,K6
LJMPYY
K6:
INCB
CJNEA,#0BDH,K7
LJMPYY
K7:
INCB
CJNEA,#0DDH,K8
LJMPYY
K8:
INCB
CJNEA,#0EDH,K9
LJMPYY
K9:
INCB
CJNEA,#7BH,K10
LJMPYY
K10:
INCB
CJNEA,#0BBH,K11
LJMPYY
K11:
INCB
CJNEA,#0DBH,K12
LJMPYY
K12:
INCB
CJNEA,#0EBH,K13
LJMPYY
K13:
INCB
CJNEA,#77H,K14
LJMPYY
K14:
INCB
CJNEA,#0B7H,K15
LJMPYY
K15:
INCB
CJNEA,#0D7H,K16
LJMPYY
K16:
INCB
CJNEA,#0E7H,YY
YY:
MOVA,B;将按键数值放于A
RET
PRINT:
;显示屏显示按键及节拍音调
LCALLDELAY1;延时一段时间
MOVLCDDATA,#01H;写指令01H,清屏
LCALLENABLE
MOVLCDDATA,#38H;写指令38H,设定LCD为16*2显示,5*7点阵,8位数据接口
LCALLENABLE
MOVLCDDATA,#0CH;写指令0FH,显示ON,光标ON,闪烁ON
LCALLENABLE
MOVLCDDATA,#06H;写指令06H,光标输入方式增量移位
LCALLENABLE
MOVLCDDATA,#80H;第一行起始字符地址
MOVR1,#16
LCALLENABLE
MOVDPTR,#TITLEA;第一行显示字符表头地址
LCALLDISP;显示第一行数据
MOVLCDDATA,#0C0H
MOVR1,#16
LCALLENABLE
MOVDPTR,#TITLED
LCALLDISP
MOVR1,#5
MOVLCDDATA,#0C0H
LCALLENABLE
MOVDPTR,#TITLEB
LCALLDISP
MOVLCDDATA,#0C5H
LCALLENABLE
MOVA,#'1'
ADDA,R5
LCALLDISP1
MOVLCDDATA,#0C6H
LCALLENABLE
MOVA,#''
JNBYINDIAO.0,PING
JBYINDIAO.1,JIANG
MOVA,#'*';升调符号为*
SJMPPING
JIANG:
MOVA,#'_';降调符号为_
PING:
LCALLDISP1
MOVR1,#5
MOVLCDDATA,#0C8H;第二行起始字符地址
LCALLENABLE
MOVDPTR,#TITLEC;第二行显示字符表头地址
LCALLDISP
MOVLCDDATA,#0CDH
LCALLENABLE
MOVA,#'1'
ADDA,JIEPAI
LCALLDISP1
RET
ENABLE:
CLRLCDRS;写指令子程序
CLRLCDRW
CLRE
LCALLDELAY1
SETBE
RET
DISP:
MOVA,#00H;将ACC清零
MOVCA,@A+DPTR;查表取得要显示的数据
LCALLDISP1;写入一个数据
INCDPTR;数据表指针加1,准备取下一个数据
DJNZR1,DISP
RET
;-----------------
DISP1:
MOVLCDDATA,A
SETBLCDRS
CLRLCDRW
CLRE
MOVR7,#255
S3:
DJNZR7,S3
SETBE
RET
BF:
MOVR4,A
MOVDPTR,#TL01
MOVCA,@A+DPTR
MOVB,#02
JNBYINDIAO.0,TWO
JBYINDIAO.1,ONE
ZERO:
DIVAB;升调
SJMPTWO
ONE:
MULAB;降调
TWO:
CPLA
INCA
MOVR3,A
MOVA,R4
MOVDPTR,#TH01
MOVCA,@A+DPTR
MOVB,#02
JNBYINDIAO.0,TWO2
JBYINDIAO.1,ONE2
ZERO2:
DIVAB
SJMPTWO2
ONE2:
MULAB
TWO2:
CPLA
INCA
MOVR2,A
MOVA,R4
SETBTR0
LCALLDELAY
CLRTR0
RET
DELAY:
;控制节拍的延时
ANLJIEPAI,#07
XRLJIEPAI,#0FFH
XRLJIEPAI,#0FFH
INCJIEPAI
MOVR5,JIEPAI
DECJIEPAI
X3:
MOVR7,#255
X2:
MOVR6,#255
X1:
DJNZR6,X1
DJNZR7,X2
DJNZR5,X3
RET
;-----------------
TITLEA:
DB'DIANZIQINXITONG';显示的内容
TITLEB:
DB'DIAO:
'
TITLEC:
DB'Yinc:
'
TITLED:
DB''
QUMU0:
;音乐码表
DW64260,64400,64524,64580
DW64684,64777,64820,64898
DW64968,65030,65058,65110
DW65157,65178,65217
QUMU1:
DB51H,21H,41H,12H,83H,81H,61H,81H,58H,53H
DB61H,31H,22H,13H,21H,42H,52H,0E2H,42H,21H
DB11H,91H,41H,18H,63H,81H,32H,52H,21H,41H
DB16H,0E4H,11H,21H,31H,51H,26H,11H,21H,43H
DB51H,82H,62H,52H,61H,51H,42H,21H,11H,0E4H
DB44H,21H,41H,21H,11H,0E1H,11H,21H,41H,18H
DB61H,81H,51H,61H,51H,41H,32H,21H,41H,18H;音符通过定时器发声
DB00H
GEMING1:
DB'.Music.Playing.'
GEMING2:
DB'Liangzhu'
END