基于单片机的电子琴设计Word文档下载推荐.docx
《基于单片机的电子琴设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子琴设计Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
单片机晶振频率为12MHZ时,乐曲中的音符、频率及定时常数之间的对应关系可制成表格。
本次设计中,定时常数是有16定时器T0根据不同的音符,装入不同的初值实现延时的,而延时常数是在自动播放音乐部分使用,控制不同音符的节拍,其延时常数是通过16位定时器T1实现的。
根据设计要求给出的各音符频率,我们只需要的各音符频率与计数值T的关系如表
(1)所示
表
(1):
C调各音符频率与计数值T的关系
音符
频率(Hz)
半周期(ms)
简谱码T值
定时值(H)
定时值(D)
1Do
262
1.90
F894H
62628
2Re
294
1.70
F95CH
63835
3Mi
330
1.51
FA1AH
64021
4Fa
349
1.43
FA6AH
64103
5So
392
1.28
FB00H
64260
6La
440
1.14
FB8CH
64400
7Si
494
1.01
FC0EH
64524
3.2键盘扫描原理
先将1×
8矩阵键盘的行(P2.0)和列(P1口)全部置为高电平,然后再逐行置为低电平,当有键按下时P1口的值会发生相应的改变,通过与给定数的比较,判定是否有键按下和是否键已松开。
并给定列号并保存,根据所给的列号的值,一方面通过P0口给LED送入确定好的段码数值,从而相对应地在LED上显示音符数字,另一方面从TABLE表中取出相应的值,给此时作为16位定时器的T0装入初值,不同的音符给T0装入的初值不同,即定时器的定时时间将不相同,将产生不同频率的音频脉冲,转换成声音播出的频率也将不同,从而实现7个不同的音符。
同时,通过示波器可查看P3.7的音频输出方波。
3.3硬件电路设计分析
因为AT89CXX系列与MCS-51系列单片机相比,有两大优势:
第一,片内程序存储器采用闪速存储器,使程序的写入更方便;
第二,提供了更小尺寸的芯片,使整个硬件电路的体积更小。
它以较小的体积、良好的性能价格比倍受青睐。
本次综合实验设计采用89C52单片机。
3.3.1按键模块的设计
如图
(2)所示为1×
8矩阵键盘模块,其行接P2.0口,其列逐一与P1口相接
图
(2)
因为不同的音符对应的频率是不同的,当按到不同的按键,发出的声音不一样,所以其产生的方波频率信号也会不一样,如下列7个小图①~⑦对应着7个不同音符的方波频率信号。
图①1Do图②2Re
图③3Mi图④4Fa
图⑤5So图⑥6La
图⑦7Si
3.3.2LED数码管显示模块的设计
如图(3)所示,为LED数码显示模块电路的设计部分
图(3)一位共阳数码管
本系统用单片机的P0口的P0.0~P0.6来控制LED显示器的数字显示。
当有7个音符按键1~7中有被按下,LED数码管将对应显示出该音符的数字,从而可以通过手动和眼看来确定所按的是哪个音符,应该发出哪个音符的声音。
而最后一个功能转换键一旦被按下,程序将会调用倒计3秒子程序,LED数码管将从3开始倒数到0,紧接着进入自动播放音乐子程序,播放程序中通过表格数据形式存放在ROM的音乐代码而形成的乐曲
3.3.3扬声器模块的设计
如图(4)所示为扬声器模块电路
图(4)扬声器模块电路
电磁式蜂鸣器由振荡器、电磁线圈、磁铁振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。
振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
本设计的蜂鸣器通过驱动电路与单片机的P3.7连接,单片机就可以通过P3.7的输出信号频率就行控制。
令外,通过示波器接到P3.7可方便我们观察波形。
3.3.4复位和晶振等其他附属部分的电路设计
如图(5)所示,为复位和晶振等其他附属部分的电路
图(5)复位和晶振等其他附属部分的电路
XTAL1、XTAL2分别是系统时钟信号fosc的输入和输出端。
晶振电路的设计可以两个电容与一个晶振即可,用来产生一个约等于12MHZ的稳定的频率。
复位是单片机的初始化操作,其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。
本系统采用上电与按键复位电路,为了防止干扰串扰复位端,所以再接一个去耦电容。
4实验数据
1、利用AT89C52的内部定时器T0使其工作在方式1的定时方式下,改变计数值TH0及TL0以产生不同频率的方法产生不同音符。
计数脉冲值与频率的关系式是:
N=fi÷
2÷
fr
式中,N是计数值,fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz),fr是想要产生的频率。
其计数初值T的求法如下:
T=65536-N=65536-fi÷
fr
实验中的K=65536,fi=1MHz,根据设计要求中给出的音阶频率表,可求出各自的计数初值。
T=65536-N=65536-fi÷
fr=65536-1000000÷
fr=65536-500000/fr
因此,可以通过计算求得各音阶的简谱码T值如下:
1Do的T=65536-500000/262.1=63628
2Re的T=65536-500000/293.7=63836
3Mi的T=65536-500000/329.6=64021
4Fa的T=65536-500000/349.2=64104
5So的T=65536-500000/392.0=64261
6La的T=65536-500000/440.0=64400
7Si的T=65536-500000/493.9=64524
相应求得在要发出不同音符时先给定时器T0装入的初值如下表:
音阶
频率(HZ)
261.1
293.7
329.6
349.2
392.0
440.0
493.9
初值
63628
63836
64
61
2、因为实验中用到的LED数码显示管是共阳极的,所以0~7八个数字的段码分别为:
数字
0
1
2
3
4
5
6
7
段码
40H
79H
24H
30H
19H
12H
02H
78H
5结束语
在这一周里,一有空余时间都把时间花在本次实验。
其过程很艰苦,有时候做到深夜,但收获是颇多。
一开始拿到题目,关于不同频率的音符,我就知道肯定需要用到定时中断来实现,可是自己学习的进度很慢,大多数时间都是自学。
不过后来用大量时间去细看每一章节,做起实验来就容易多了。
本次设计性实验让我无论是在硬件还是软件方面都有了很大的提高,同时也增强了自己的信心和对学习的兴趣。
这些也是老师严格要求我们做好每一个实验的好处。
参考文献
[1] 潘永雄.新编单片机原理与应用(第二版).西安电子科技大学出版社,2007
[2] 杨欣.51单片机应用从零开始:
清华大学出版社,2008
[3] 彭伟.单片机C语言程序设计实训100例——基于8051+proteus仿真.电子工业出版社,2010
附录1:
总体电路图
附录2:
程序流程图设计
附录3:
源程序代码
KEYBUFEQU30H
STH0EQU31H
STL0EQU32H
TEMPEQU33H
SPKEQUP3.7;
发声器所在端口
ORG0000H
LJMPSTART
ORG000BH
LJMPINT_T0;
定时器0放置弹奏乐曲程序
ORG001BH
LJMPTIME0
START:
MOVTMOD,#11H;
设置定时器的工作方式,定时器T0和T1都是方式1,作为16为定时计数器使用(定时方式)
SETBET0;
开各中断开关
SETBET1
SETBEA;
开放中断总允许和源允许
ACALLSAOMIAO;
进入手动弹奏程序
SJMPSTART
;
********手动弹奏程序********
SAOMIAO:
MOVP2,#0FFH;
手动弹奏程序
MOVP1,#0FFH;
先将键盘的行和列全部置为高电平,然后再逐行置为低电平
CLRP2.0
MOVA,P1
XRLA,0FFH
CJNEA,#00H,NEQ;
判断有没键按下
LJMPNOKEYS;
没有按键按下即跳转到NOKEYS
NEQ:
;
有按键按下即跳到NEQ
LCALLDELY10MS;
延时10ms
MOVA,P1;
消除扰动和干扰
XRLA,0FFH
CJNEA,#00H,NEQ1
LJMPNOKEYS
NEQ1:
判断是否按下#0键
CJNEA,#0FEH,NK1;
按下#0键即顺序执行程序,否则跳到NK1检查下一键位
MOVKEYBUF,#0;
保存列号#0
MOVP0,#79H;
让LED显示为1
LJMPDK1
NK1:
CJNEA,#0FDH,NK2;
判断是否按下#1键
MOVKEYBUF,#1;
保存列号#1
MOVP0,#24H;
让LED显示为2
NK2:
CJNEA,#0FBH,NK3;
判断是否按下#2键
MOVKEYBUF,#2;
保存列号#2
MOVP0,#30H;
让LED显示为3
NK3:
CJNEA,#0F7H,NK4;
判断是否按下#3键
MOVKEYBUF,#3;
保存列号#3
MOVP0,#19H;
让LED显示为4
NK4:
CJNEA,#0EFH,NK5;
判断是否按下#4键
MOVKEYBUF,#4;
保存列号#4
MOVP0,#12H;
让LED显示为5
NK5:
CJNEA,#0DFH,NK6;
判断是否按下#5键
MOVKEYBUF,#5;
保存列号#5
MOVP0,#02H;
让LED显示为6
LJMPDK1
NK6:
CJNEA,#0BFH,NK7;
判断是否按下#6键
MOVKEYBUF,#6;
保存列号#6
MOVP0,#78H;
让LED显示为7
NK7:
CJNEA,#7FH,NK8
NK8:
LJMPCHOICE
DK1:
MOVA,KEYBUF
MOVB,#2
MULAB;
对应读取表格TABLE1的数据
MOVTEMP,A
MOVDPTR,#TABLE1
MOVCA,@A+DPTR
MOVSTH0,A
MOVTH0,A
INCTEMP
MOVA,TEMP
MOVSTL0,A
MOVTL0,A
SETBTR0;
开启定时器T0,T0开始计数
DK1A:
XRLA,#0FFH
JNZDK1A
MOVA,P2
ANlA,#0f0H
MOVP2,A
CLRTR0
NOKEYS:
RET
*******功能转换程序********
CHOICE:
功能转换程序
MOVP1,#0FFH
CJNEA,#7FH,NEXT1111;
按下了P1.7键后,顺序执行,否则则跳转到NEXT1111
NEXT111:
MOVP2,#0FFH
JNZNEXT111;
如果A不为0,即按键有变化,继续循环
ACALLDISPLAY;
如果按键没变化,即调用DISPLAY
MOVSP,#60H
MOVDPTR,#TABLE
ACALLMUSIC
NEXT1111:
LJMPSAOMIAO
*******自动播放音乐程序********
MUSIC:
MOV21H,#00H
JNBACC.7,AA1
SETB21H.7
AA1:
XRLA,#0FFH
JNZAA1
JNB21H.7,NEXT1111
CLRA
MOVR1,A
INCDPTR
MOVR0,A
ORLA,R1
JZNEXT1
MOVA,R0
ANLA,R1
CJNEA,#0FFH,NEXT
SJMPMUSIC
NEXT:
MOVTH1,R1
MOVTL1,R0
SETBTR1
SJMPNEXT2
NEXT1:
CLRTR1
NEXT2:
MOVR2,A
LOOP1:
ACALLDELAY
DJNZR2,LOOP1
REP12:
TIME0:
CPLP3.7
RETI
DEL1S:
MOVR5,#30
D1:
MOVR6,#100
D2:
MOVR7,#80
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
DEL:
NOP
DEL3:
MOVR4,#02H
DEL4:
DJNZR4,DEL4
DJNZR3,DEL3
********延时10ms子程序******
DELY10MS:
MOVR6,#10
D3:
MOVR7,#248
DJNZR6,D3
*******T0中断服务子程序**********
INT_T0:
MOVTH0,STH0
MOVTL0,STL0
******倒计3秒进入自动播放音乐子程序********
DISPLAY:
MOVDPTR,#table0
MOVR0,#0
LOOP10:
MOVA,R0
MOVP0,A
LCALLDELAY0
INCR0
CJNER0,#4,LOOP10
*******数码显示DISPLAY9*********
DISPLAY9:
MOVDPTR,#table8;
数码管显示数字
LOOP15:
MOVP0,A;
送到P0口显示数字
CJNER0,#10,LOOP15
DELAY0:
MOVR7,#50
DELA:
DEL12:
MOVR5,#100
DJNZR5,$
DJNZR6,DEL12
DJNZR7,DELA
*******延时子程序DELAY********
DELAY:
MOVR7,#02
D5:
MOVR6,#187
D6:
MOVR5,#248
DJNZR6,D6
DJNZR7,D5
table0:
DB30h,24h,79h,40h;
倒计时3秒
table8:
DB10h,00h,78h,02h,12h,19h,30h,24h,79h,40h;
9,8,7,6,5,4,3,2,1,0
TABLE1:
DW62628,63835,64021,64103,64260,64400,64524;
定时器TO初值
TABLE:
DB0FDH,80H,03H,0FDH,80H,01H;
音乐代码
DB0FDH,0C6H,04H,0FDH,80H,04H
DB0FEH,2AH,04H,0FEH,02H,04H
DB00H,00H,04H
DB0FDH,80H,03H,0FDH,80H,01H
DB0FEH,5CH,04H,0FEH,2AH,04H
DB0FEH,0C0H,04H,0FEH,84H,04H
DB0FEH,2AH,04H,0FEH,02H,04H
DB0FDH,0C6H,04H
DB0FEH,98H,03H,0FEH,98H,01H
DB0FEH,84H,04H,0FEH,2AH,04H
DB0FEH,5CH,04H,0FEH,2AH,04H
DB0FFH,0FFH
END