实验五 电子琴模拟实验.doc
上传人:qw****27 上传时间:2024-09-11 格式:DOC 页数:7 大小:82KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

实验五 电子琴模拟实验.doc

实验五电子琴模拟实验.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验五电子琴模拟实验一、实验目的1.了解单片机系统发声原理;2.进一步熟悉定时器编程方法;3.进一步熟悉键盘扫描电路工作原理及编程方法。二、实验说明1.利用定时器,可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调。2.定时器按所设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平.由于定时参数不同,就发出了不同频率的脉冲.本实验中当有键按下,会发出连续脉冲,直到按键松开,才停止发音。发完后继续检测键盘,如果按键还在按下状态,继续发音。各音阶标称频率值:音阶1234567频率(Hz)261.1293.7329.6349.2392.0440.0493.9三、实验内容及步骤利用实验仪上提供的键盘,使数字键1、2、3、4、5、6、7作为电子琴按键,按下即发出相应的音调。用P3.0口发出音频脉冲,驱动喇叭。1.单片机最小应用系统的P1口接查询式键盘,单片机P2.0口接音频驱动电路。2.用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。3.打开KeiluVision2仿真软件,首先建立本实验的项目文件,接着添加“TH15_电子琴.ASM”源程序,进行编译,直到编译无误。4.进行软件设置,选择硬件仿真,选择串行口,设置波特率为38400。5.打开模块电源和总电源,点击开始调试按钮,点击RUN按钮运行程序。按查询式键盘的1~7键,扬声器发出高低不同的声音。四、流程图及源程序五、思考题1.请思考实验是怎样在硬件与软件上实现发声的?2.本程序中断子程序的调用是怎样进行的?六、电路图;电子琴-----------连续型查询式键盘modeequ082hPORTAequ7CFFhCTLequ7FFFh;P1键盘读入口查询式Pulseequ55h;脉冲PulseCNTequ50h;脉冲计数ToneHighequ51h;高音调ToneLowequ52h;低音调Toneequ53h;音调KeyBufequ54hSpeakerBITP3.0ORG0000HLJMPSTARTORG000BHLJMPTimer0IntORG0100HStart:movsp,#70hmovTMOD,#01;TimermovIE,#82h;EA=1,IT0=1movTone,#0MLoop:callTestKeyjzMLoopcallGetKeymovb,ajzMLoop;=0,<1anla,#8jnzMLoop;>8decbmova,brla;a=a*2movb,amovdptr,#ToneTablemovca,@a+dptrmovToneHigh,amovTH0,amova,bincamovca,@a+dptrmovToneLow,amovTL0,aSETBTR0MOVP1,#0FFHWAIT:MOVA,P1CJNEA,#0FFH,WAITMOVR6,#10ACALLDELAYCLRTR0LJMPMLOOPTimer0Int:;定时中断pushPSWclrTR0movTH0,ToneHighmovTL0,ToneLowsetbTR0movC,PulseMOVSpeaker,CcplPulsepopPSWretiToneTable:DW64578,64686,64778,64821DW64898,64968,65029TestKey:MOVP1,#0FFHMOVA,P1CPLA;读入键状态retKeyTable:DB0FEH,0FDH,0FBH,0F7HDB0EFH,0DFH,0BFH,07FH;键码定义GETKEY:MOVR6,#10ACALLDELAYMOVA,P1CJNEA,#0FFH,K01;确有键按下LJMPMLOOPK01:MOVR3,#8;8个键MOVR2,#0;键码MOVB,A;暂存键值MOVDPTR,#KeyTableK02:MOVA,R2MOVCA,@A+DPTR;从键值表中取键值CJNEA,B,K04;键值比较MOVA,R2;得键码INCARETK04:INCR2;不相等,到继续访问键值表DJNZR3,K02MOVA,#0FFH;键值不在键值中,即多键同时按下LJMPMLOOPDelay:;延时子程序movr7,#0DelayLoop:djnzr7,DelayLoopdjnzr6,DelayretEND