基于51单片机的简易电子琴设计.docx
《基于51单片机的简易电子琴设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的简易电子琴设计.docx(13页珍藏版)》请在冰豆网上搜索。
基于51单片机的简易电子琴设计
基于51单片机的简易电子琴设计
一、设计任务及要求
1、在该简易电子琴设计中,设置8个按键,8个按键可以发出do、re、mi、fa、sol、la、si、Do8个音阶。
2、设计三个拨码开关,三个拨码开关可以调节高音、中音、低音三个音调。
3、画出电路的总体方框图和电路原理图。
二、设计原理
音乐由许多不同的音阶组成的,而每个音阶对应着不同的频率,这样,我们就可以利用不同的频率组合,构成我们想要的音乐。
简易电子琴是摁下拨码开关时,单片机AT89C51会发出声音,声音从端口经过LM386,经过放大以后传入喇叭。
声音主要是经过单片机4×4矩阵键盘的按键产生,这里只用到8个按键来产生高中低的8个音阶,来产生doremifasollasiDo。
下面是计数初值:
音符
频率HZ
半周期us
初值码
音符
频率HZ
半周期us
初值码
低1DO
262
1908
63628
#4FA#
740
676
64860
#1DO#
277
1805
63731
中5SO
784
638
64898
低2RE
294
1700
63835
#5SO#
831
602
64934
#2RE#
311
1608
63928
中6LA
880
568
64968
低3MI
330
1516
64021
#6LA#
932
536
64994
低4FA
349
1433
64103
中7SI
988
506
65030
#4FA#
370
1350
64185
高1DO
1046
478
65058
低5SO
392
1276
64260
#DO#
1109
451
65085
#5SO#
415
1205
64331
高2RE
1175
426
65110
低6LA
440
1136
64400
#2RE
1245
402
65134
#6LA#
466
1072
64463
高3MI
1318
372
65157
低7SI
494
1012
64524
高4FA
1397
358
65178
中1DO
523
0956
64580
#4FA#
1480
338
65198
#1DO#
554
0903
64633
高5SO
1568
319
65217
中2RE
578
0842
64684
#5SO#
1661
292
65235
#2RE#
622
0804
64732
高6LA
1760
284
65252
中3MI
659
0759
64777
#6LA#
1865
268
65268
中4FA
698
0716
64820
高7SI
1976
253
65283
三、设计方案
本次设计的电子琴主要是利用AT89C51单片机为核心控制元件,同时还包括键盘、拨码开关和扬声器等控制模块,由键盘选择八个音阶。
1、电路原理图的总体设计
总体电路需要c51单片机一片,音乐按键及喇叭等外围电路,要进行音调控制和音频放大,设计好的电路图如下图所示:
2、键盘控制模块的设计
矩阵按键部分由8个轻触按键按照2行4列排列,连接到P3端口。
将行线所接的单片机的I/O口作为输出端,而列线所接的I/O,则作为输入。
行线输出是低电平,有健按下,则输入线就会被拉低,这样,通过读输入线的状态就可得知是否有键按下。
3、键盘消抖
当用手按下一个键时,如图所示,往往按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也回会出现类似的情况。
这就是抖动。
抖动的持续时间随键盘材料和操作员而异,不过通常总是不大于10ms。
用软件方法可以很容易地解决抖动问题,这就是通过延迟10ms来等待抖动消失,此后再读入键盘码。
一个单片机工作于12M晶振,它的时钟周期是1/12(微秒)。
它的一个机器周期是12*(1/12)也就是1微秒。
MCS-51单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完成得比较慢,得要2个机器周期,还有两条指令要4个机器周期才行。
DJNZ指令是双周期指令,所以延时10MS的指令如下:
DELAY10MS:
;延时10ms程序
MOVR6,#10
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
4、拨码开关模块设计
8个音阶的选择开关接在了P3口,三个拨码开关可以连在P2口的、、上,在内存区中建立三个表,分别存储低音、中音和高音的频率值。
当三个拨码开关中某一个按下,就通过软件选择相应的音量。
5、扬声器模块设计
(1)一般单片机的I/O口输出电压是在0~5V,NPN三极管的发射极接地时,基极不能直接接受5V电压,所以用电阻R1来限流。
一般取~10K。
(2)三极管工作在开关状态,即截止-饱和两个状态。
用PWM输出时能听到声音,是因为变化的脉宽信号已经被平滑成了我们人耳能听见的音频信号(包络线)。
“当IO口为高电平时三极管导通,此时基极的电位与集电极的电位又是相等的”,这里你忽略了电阻R1的作用。
基极的电位最高是,而集电极的电位能低至饱和压降(左右),符合三极管饱和时“两个正偏”的状态。
四、程序框图
五、电子琴汇编源程序
KEYBUFEQU30H;用于储存键值
STH0EQU31H;储存高八位初值
STL0EQU32H;储存低八位初值
TEMPEQU33H;储存中间量
ORG00H
LJMPMAIN
ORG0BH;定时器T0中断入口地址
LJMPINT_T0
MAIN:
;主函数入口
MOVTMOD,#01h;定时器T0初始化,采用方式1
SETBEA;总中断允许
SETBET0;定时器T0溢出中断允许
TEXT:
;音调控制按键检测程序入口
MOVA,P2
CJNEA,#0FEH,TEXT1;检测口低音控制按键是否按下
MOVDPTR,#TABLE1;低音表首地址
LJMPWAIT;若音调控制按键按下,调至音阶按键检测程序
TEXT1:
CJNEA,#0FDH,TEXT2;检测口中音控制按键是否按下
MOVDPTR,#TABLE2;中音表首地址
LJMPWAIT
TEXT2:
CJNEA,#0FBH,TEXT3;检测口高音控制按键是否按下
MOVDPTR,#TABLE3;高音表首地址
LJMPWAIT
TEXT3:
LJMPTEXT;若都没有按下则继续检测音调控制按键
WAIT:
;音阶按键检测程序入口
MOVP3,#0FFH
CLR;检测第一列两个按键
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY1
LCALLDELAY10MS;软件延时消抖
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY1;确定是否有按键按下
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK1
MOVKEYBUF,#0;赋予键值
LJMPDK;调至按键处理程序
NK1:
CJNEA,#0DH,NK2
MOVKEYBUF,#1
LJMPDK
NK2:
NOP
NOKEY1:
;检测第二列两个按键
MOVP3,#0FFH
CLR
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY2
LCALLDELAY10MS;软件延时消抖
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY2;确定是否有按键按下
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK3
MOVKEYBUF,#2;赋予键值
LJMPDK;调至按键处理程序
NK3:
CJNEA,#0DH,NK4
MOVKEYBUF,#3
LJMPDK
NK4:
NOP
NOKEY2:
;检测第三列两个按键
MOVP3,#0FFH
CLR
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY3
LCALLDELAY10MS;软件延时消抖
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY3;确定是否有按键按下
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK5
MOVKEYBUF,#4;赋予键值
LJMPDK;调至按键处理程序
NK5:
CJNEA,#0DH,NK6
MOVKEYBUF,#5
LJMPDK
NK6:
NOP
NOKEY3:
;检测第四列两个按键
MOVP3,#0FFH
CLR
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY4
LCALLDELAY10MS;软件延时消抖
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY4;确定是否有按键按下
MOVA,P3
ANLA,#0FH
CJNEA,#0EH,NK7
MOVKEYBUF,#6
LJMPDK;调至按键处理程序
NK7:
CJNEA,#0DH,NK8
MOVKEYBUF,#7
LJMPDK
NK8:
NOP
NOKYE4:
LJMPTEXT;若没有检测到音阶按键按下调至音调控制检测程序入口
DK:
;键值处理程序入口
MOVA,KEYBUF
MOVB,#2
MULAB
MOVTEMP,A
MOVCA,@A+DPTR;根据获得的表首地址及ACC的值读表
MOVSTH0,A;存储定时器高八位初值
MOVTH0,A;赋予定时器高八位初值
INCTEMP;TEMP加1为了读取低八位初值
MOVA,TEMP
MOVCA,@A+DPTR;读取低八位初值
MOVSTL0,A;存储定时器低八位初值
MOVTL0,A;赋予定时器低八位初值
SETBTR0;开启定时器T0中断允许
DKA:
;检测音阶按键是否释放程序入口
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JNZDKA;确定按键是否释放,若没有,继续检测
LCALLDELAY100MS;音阶声音延时
LCALLDELAY100MS
LCALLDELAY100MS
LCALLDELAY100MS
CLRTR0;关闭T0溢出中断允许
NOKEY4:
LJMPTEXT;重新检测
DELAY10MS:
;延时10ms程序
MOVR6,#10
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
DELAY100MS:
;延时100ms程序
MOVR5,#0DDH
DL0:
MOVR4,#0CFH
DJNZR4,$
DJNZR5,DL0
RET
INT_T0:
;定时器T0中断入口程序
MOVTH0,STH0;装入定时器高八位初值
MOVTL0,STL0;装入定时器低八位初值
CPL;口电平翻转,产生一定频率的方波
RETI;中断返回
TABLE1:
DW63628,63835,64021,64103;低音调表值
DW64260,64400,64524,64580
TABLE2:
DW64580,64684,64777,64820;中音调表值
DW64898,64968,65030,65058
TABLE3:
DW65058,65110,65157,65178;高音调表值
DW65217,65252,65283,65312
END;结束
六、Proteus仿真原理图
根据电路原理图,在Proreus中绘制仿真电路图,如下图所示:
仿真测试时可选择低、中、高音按键中的一个,然后点击do、re、mi、fa、sol、la、SI、DO可以听到八个音阶的声音,并可清晰地感觉到频率变化。
七、实验总结