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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于51单片机的简易电子琴设计一、设计任务及要求1、在该简易电子琴设计中,设置8个按键,8个按键可以发出do、re、mi、fa、sol、la、si、Do8个音阶。2、设计三个拨码开关,三个拨码开关可以调节高音、中音、低音三个音调。3、画出电路的总体方框图和电路原理图。二、设计原理音乐由许多不同的音阶组成的,而每个音阶对应着不同的频率,这样,我们就可以利用不同的频率组合,构成我们想要的音乐。简易电子琴是摁下拨码开关时,单片机AT89C51会发出声音,声音从P1.0端口经过LM386,经过放大以后传入喇叭。声音主要是经过单片机4×4矩阵键盘的按键产生,这里只用到8个按键来产生高中低的8个音阶,来产生doremifasollasiDo。下面是计数初值:音符频率HZ半周期us初值码音符频率HZ半周期us初值码低1DO262190863628#4FA#74067664860#1DO#277180563731中5SO78463864898低2RE294170063835#5SO#83160264934#2RE#311160863928中6LA88056864968低3MI330151664021#6LA#93253664994低4FA349143364103中7SI98850665030#4FA#370135064185高1DO104647865058低5SO392127664260#DO#110945165085#5SO#415120564331高2RE117542665110低6LA440113664400#2RE124540265134#6LA#466107264463高3MI131837265157低7SI494101264524高4FA139735865178中1DO523095664580#4FA#148033865198#1DO#554090364633高5SO156831965217中2RE578084264684#5SO#166129265235#2RE#622080464732高6LA176028465252中3MI659075964777#6LA#186526865268中4FA698071664820高7SI197625365283三、设计方案本次设计的电子琴主要是利用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,#10D1:MOVR7,#248DJNZR7,$DJNZR6,D1RET4、拨码开关模块设计8个音阶的选择开关接在了P3口,三个拨码开关可以连在P2口的P2.0、P2.1、P2.2上,在内存区中建立三个表,分别存储低音、中音和高音的频率值。当三个拨码开关中某一个按下,就通过软件选择相应的音量。键按下前沿抖动后沿抖动闭合稳定5、扬声器模块设计(1)一般单片机的I/O口输出电压是在0~5V,NPN三极管的发射极接地时,基极不能直接接受5V电压,所以用电阻R1来限流。一般取4.7~10K。(2)三极管工作在开关状态,即截止-饱和两个状态。用PWM输出时能听到声音,是因为变化的脉宽信号已经被平滑成了我们人耳能听见的音频信号(包络线)。“当IO口为高电平时三极管导通,此时基极的电位与集电极的电位又是相等的”,这里你忽略了电阻R1的作用。基极的电位最高是0.7V,而集电极的电位能低至饱和压降(0.1V左右),符合三极管饱和时“两个正偏”的状态。四、程序框图VccP1.0接地P2.0P2.1P2.2五、电子琴汇编源程序KEYBUFEQU30H;用于储存键值STH0EQU31H;储存高八位初值STL0EQU32H;储存低八位初值TEMPEQU33H;储存中间量开始行列式键盘按键按下成功否?识别按键功能根据按键功能,装入音符T值到T0中启动T0工作行列式键盘按键释放成功否?停止T0工作T0初始化并开中断允放T0中断音调选择开关按下否?T0中断入口重装TH0,TL0初值P1.0取反中断返回ORG00HLJMPMAINORG0BH;定时器T0中断入口地址LJMPINT_T0MAIN:;主函数入口MOVTMOD,#01h;定时器T0初始化,采用方式1SETBEA;总中断允许SETBET0;定时器T0溢出中断允许TEXT:;音调控制按键检测程序入口MOVA,P2CJNEA,#0FEH,TEXT1;检测P2.0口低音控制按键是否按下MOVDPTR,#TABLE1;低音表首地址LJMPWAIT;若音调控制按键按下,调至音阶按键检测程序TEXT1:CJNEA,#0FDH,TEXT2;检测P2.1口中音控制按键是否按下MOVDPTR,#TABLE2;中音表首地址LJMPWAITTEXT2:CJNEA,#0FBH,TEXT3;检测P2.2口高音控制按键是否按下MOVDPTR,#TABLE3;高音表首地址LJMPWAITTEXT3:LJMPTEXT;若都没有按下则继续检测音调控制按键WAIT:;音阶按键检测程序入口MOVP3,#0FFHCLRP3.4;检测第一列两个按键MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY1LCALLDELAY10MS;软件延时消抖MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY1;确定是否有按键按下MOVA,P3ANLA,#0FHCJNEA,#0EH,NK1MOVKEYBUF,#0;赋予键值LJMPDK;调至按键处理程序NK1:CJNEA,#0DH,NK2MOVKEYBUF,#1LJMPDKNK2:NOPNOKEY1:;检测第二列两个按键MOVP3,#0FFHCLRP3.5MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY2LCALLDELAY10MS;软件延时消抖MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY2;确定是否有按键按下MOVA,P3ANLA,#0FHCJNEA,#0EH,NK3MOVKEYBUF,#2;赋予键值LJMPDK;调至按键处理程序NK3:CJNEA,#0DH,NK4MOVKEYBUF,#3LJMPDKNK4:NOPNOKEY2:;检测第三列两个按键MOVP3,#0FFHCLRP3.6MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY3LCALLDELAY10MS;软件延时消抖MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY3;确定是否有按键按下MOVA,P3ANLA,#0FHCJNEA,#0EH,NK5MOVKEYBUF,#4;赋予键值LJMPDK;调至按键处理程序NK5:CJNEA,#0DH,NK6MOVKEYBUF,#5LJMPDKNK6:NOPNOKEY3:;检测第四列两个按键MOVP3,#0FFHCLRP3.7MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY4LCALLDELAY10MS;软件延时消抖MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY4;确定是否有按键按下MOVA,P3ANLA,#0FHCJNEA,#0EH,NK7MOVKEYBUF,#6LJMPDK;调至按键处理程序NK7:CJNEA,#0DH,NK8MOVKEYBUF,#7LJMPDKNK8:NOPNOKYE4:LJMPTEXT;若没有检测到音阶按键按下调至音调控制检测程序入口DK:;键值处理程序入口MOVA,KEYBUFMOVB,#2MULABMOVTEMP,AMOVCA,@A+DPTR;根据获得的表首地址及ACC的值读表MOVSTH0,A;存储定时器高八位初值MOVTH0,A;赋予定时器高八位初值INCTEMP;TEMP加1为了读取低八位初值MOVA,TEMPMOVCA,@A+DPTR;读取低八位初值MOVSTL0,A;存储定时器低八位初值MOVTL0,A;赋予定时器低八位初值SETBTR0;开启定时器T0中断允许DKA:;检测音阶按键是否释放程序入口MOVA,P3ANLA,#0FHXRLA,#0FHJNZDKA;确定按键是否释放,若没有,继续检测LCALLDELAY100MS;音阶声音延时LCALLDELAY100MSLCALLDELAY100MSLCALLDELAY100MSCLRTR0;关闭T0溢出中断允许NOKEY4:LJMPTEXT;重新检测DELAY10MS:;延时10ms程序MOVR6,#10D1:MOVR7,#248DJNZR7,$DJNZR6,D1RETDELAY100MS:;延时100ms程序MOVR5,#0DDHDL0:MOVR4,#0CFHDJNZR4,$DJNZR5,DL0RETINT_T0:;定时器T0中断入口程序MOVTH0,STH0;装入定时器高八位初值MOVTL0,STL0;装入定时器低八位初值CPLP1.0;P1.0口电平翻转,产生一定频率的方波RETI;中断返回TABLE1:DW63628,63835,64021,64103;低音调表值DW64260,64400,64524,64580TABLE2:DW64580,64684,64777,64820;中音调表值DW64898,64968,65030,65058TABLE3:DW65058,65110,65157,65178;高音调表值DW65217,65252,65283,65312END;结束六、Proteus仿真原理图根据电路原理图,在Proreus中绘制仿真电路图,如下图所示:仿真测试时可选择低、中、高音按键中的一个,然后点击do、re、mi、fa、sol、la、SI、DO可以听到八个音阶的声音,并可清晰地感觉到频率变化。

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功