您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 微机原理课程设计――电子琴
目录概述…………………………………………………………1一设计内容与要求………………………………………1二设计思想………………………………………………1三设计所用芯片及工作原理……………………………2四系统连线图……………………………………………2五连线图说明……………………………………………3六程序流程图……………………………………………3七程序源代码……………………………………………5八设计过程中遇到的问题及解决方法……………………11九设计心得………………………………………………111电子琴概述《汇编语言与微机原理》是计算机各专业一门重要的基础课,是必修的核心课程之一,对于训练学生掌握程序设计技术,熟悉上机操作和程序调试技术都有重要作用。因此该课程在整个教学计划中占有重要地位。本课程的目的和要求是:1、应使学生掌握8086/8088宏汇编语言程序设计的基本方法和技巧,能够运用8086/8088宏汇编语言编写应用程序。提高学生分析问题、解决问题的能力以及实际动手能力。2、应使学生基本掌握汇编语言程序设计的基本理论,方法和技巧,正确地使用结构化、模块程序设计技术。注意培养学生良好的程序设计风格。3、应使学生比较熟练地使用调试工具DEBUG调试8086/8088汇编语言程序。注意提高学生的调试能力。4、注意与前后相关课程的关系。使学生对前导课程有进一步的理解,同时为学习后继课程打好基础。一、设计内容与要求编写一实现电子琴的程序,并实现若干扩展功能。基本功能:用8257键盘输入对应的七个音阶,通过实验箱的喇叭发出声音,并通过七段数码管显示输入音阶;扩展功能:1、录音:记录所弹奏曲目2、放录音:任意时刻重放最新记录曲目3、在程序中可预设一曲目,按一键实现播放该曲目。4、在播放录制曲目或预设曲目时,按8279键盘上任意键可以暂停播放,再按一次从暂停处继续播放。5、程序运行时有友好的用户介面二、设计思想在本次课程设计中,根据复杂程序设计思想——模块化程序设计,分析和确定程序总体设计目标:电子琴基本功能及部分扩展功能后,将总体目标划分为若干模块。程序设计的思路按以下顺序进行:1、分析与确定程序总体设计目标2、将总体目标划分为若干模块3、定义每个模块的具体任务,明确它与其他模块间的通信方式4、编写源程序,进行调试,包括:A)简单电子琴主程序结合实验指导书的两程序,将其分为5个子程序,实现简单的播放和显示音阶的功能。B)录音子程序实现记录弹奏曲目并播放的功能。首先由9触发,将输入的音阶存入缓存区song中,输入的同时可以发声和显示。当再次按9时录制完成。C)放音子程序本子程序实现放音功能。首先从8279键盘读出键码,判断,如果键码不是1-8即回到程序开始,如果是,即求出相应的时间常数的序号,取60次32个正弦波数据,播放32个数据,组成一个正弦波。播放60次后,从PORT1中取出值到AL,和1相与,判断是否有按键,如果有就进入死循环,直到下次按键为止。2D)放歌子程序调用放音子程序。E)暂停子程序在乐曲播放过程中,每调用一次MUSIC,就从PORT1中取出AL,检测AL个数,即每次发音后按键盘的次数。当检测到AL为1时,即按了一次任意就使程序进入一个死循环,不发音,到此实现了暂停,然后再次按动任意键时,AL就为2,不为1,所以程序跳出死循环,继续从断开处调用乐曲,继续播放。G)源程序整体程序开始,显示提示信息,对缓存区、8279初始化。接着调用发音子程序,键盘子程序,在把AL送缓存区,实现发音和显示。接着对9键、0键、f键、r键进行逐个判断,当9按下时,调用录音子程序。当按下0时,播放录制的曲目。当按下f键时,播放程序中预设的曲目。当检测到r时,退出到DOS状态。当每一个都检测不到时,退回到调用发音子程序,继续发音显示。从而实现有扩展功能的电子琴。5、模块连接,形成完整的程序三、设计所用芯片工作原理(1)对于一个特定的D/A转换接口电路,CPU执行一条输出指令将数据送入D/A,即可在其输出端得到一定的电压输出。给D/A转换器输入按正弦规律变化的数据,在其输出端即可产生正弦波。对于音乐,每个音阶都有确定的频率。各音阶标称频率值:(2)产生一个正弦波的数据可取32个(小于亦可),不同频率的区别,可通过调节向D/A转换器输出数据的时间间隔,例如:发1频率为261。1HZ,周期为1/261.1=3.83ms,输出数据的时间间隔为3.83ms/32=0.12ms.定时时间可以由8253配合8255来实现。按下某键后发音时间的长短可以由发出的正弦波的个数多少来控制。本程序中设置默认长度为60个正弦波。四、系统连线图(1)8253和8255连接如下3五、连线图说明计时器8253使用8279芯片的键盘控制器,8279键盘在一个扩充板上,用一根20芯扁平电缆与实验台上扩展插头J7相连。并行控制器8255六、程序流程图(1)主程序流程图开始显示缓存区,初始化8279初始化调用发音子程序调用键盘子程序键盘码送缓存区是否9键是否0键是否S键是否R键录音子程序放录音子程序放歌子程序返回DOSYNNNYYYN4(2)发音子程序流程图(3)键盘显示子程序流程图(4)显示子程序流程图5(5)录音子程序流程图(6)放录音子程序流程图七、程序源代码STACK1SEGMENTPARASTACK'STACK'DB50DUP(0)STACK1ENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AXMOVDX,OFFSETMSGMOVAH,9INT21H;显示提示信息CLIMOVAX,DATAMOVDS,AXMOVSEC1,0MOVSEC2,0MOVMIN1,0MOVMIN2,0MOVHOUR1,0MOVHOUR2,0;显示缓存区初始化入口调用键盘子程序键盘码存缓存区调用发音子程序调用显示子程序把键盘码输入song,incal是否9键返回显示提示信息NY入口显示提示信息键盘码存缓存区调用显示子程序调用发音子程序al是否9返回YN6MOVAX,DATAMOVDS,AXMOVAX,CSMOVDS,AXMOVDX,PORT1MOVAL,0D3H;11010011清除命令特征位OUTDX,AL;8279CLEARMOVAL,2AH;0010101042分频,内部使用1MHZ/42的频率OUTDX,AL;8279CLOCKMOVAL,40HOUTDX,AL;READFIFORAMCOMMANDMOVAL,00H;8个字符显示,左入口。编码扫描键盘,双键锁定。OUTDX,AL;KEYBORDDISPLYMODEMOVAL,80H;写入的存储单元地址为0000OUTDX,AL;WRITERAMCOMMANDCALLMUSIC;发音CALLKEYBORD;CALLKEYBORDANDDISPLYNEXT2:MOVHOUR2,ALMOVHOUR1,ALMOVMIN2,ALMOVMIN1,ALMOVSEC2,ALMOVSEC1,AL;键盘码存入显示缓冲区CMPAL,9HJZRECMPAL,0HJZOUTPUTCMPAL,15JZFUCMPAL,13H;'R'COMMANDJNZLP1MOVAX,4C00H;QUITTODOSINT21HLP1:JMPKEY1RE:CALLRE0;录音JMPLP1OUTPUT:CALLOUTPUT0;放录音JMPLP1FU:CALLOUTPUT1JMPLP1MAINENDPRE0PROCNEAR;录音子程序MOVDX,OFFSETMSGPLAY7MOVAH,9INT21H;显示录音提示信息LEASI,SONGCALLKEYBORDMOVHOUR2,ALMOVHOUR1,ALMOVMIN2,ALMOVMIN1,ALMOVSEC2,ALMOVSEC1,AL;键盘码存入显示缓冲区CALLMUSICCALLDISPMOV[SI],AHCMPAH,9JZQRE0INCSIJMPRMOVDX,OFFSETMSGENDMOVAH,9INT21H;显示录音提示信息RETRE0ENDPOUTPUT0PROCNEAR;放录音子程序MOVDX,OFFSETMSGPLAY1MOVAH,9INT21H;显示PLAY提示信息LEASI,SONGMOVAL,[SI]CMPAL,9JZQRE1MOVHOUR2,ALMOVHOUR1,ALMOVMIN2,ALMOVMIN1,ALMOVSEC2,ALMOVSEC1,AL;键盘码存入显示缓冲区CALLDISPMOVAL,AHCALLMUSICINCSIJMPOUMOVDX,OFFSETMSGEND1MOVAH,9INT21H;显示PLAYEND提示信息8RETOUTPUT0ENDPOUTPUT1PROCNEAR;放歌子程序MOVDX,OFFSETMSGPLAY1MOVAH,9INT21H;显示PLAY提示信息LEASI,SONG1MOVAL,[SI]CMPAL,-1JZQRE2MOVHOUR2,ALMOVHOUR1,ALMOVMIN2,ALMOVMIN1,ALMOVSEC2,ALMOVSEC1,AL;键盘码存入显示缓冲区CALLDISPMOVAL,AHCALLMUSICINCSIJMPOU1MOVDX,OFFSETMSGEND1MOVAH,9INT21H;显示PLAYEND提示信息RETOUTPUT1ENDPKEYBORDPROCNEAR;键盘子程序MOVDX,PORT1MOVAL,0D1HOUTDX,AL;CLEARDISPLAYCALLDISPMOVDX,PORT1INAL,DX;读状态ANDAL,07H;判断是否有按键JZWREPKEYN:;下一次的按键MOVDX,PORT0INAL,DX;读数据MOVBL,ALANDAL,07HANDBL,38HMOVCL,03SHRBL,CLCMPBL,00H9JNZLINE1ADDAL,08HJMPQUIT1CMPBL,01HJNZLINE2JMPQUIT1ADDAL,10HRETKEYBORDENDPDISPPROCNEAR;显示子程序PUSHSIPUSHCXPUSHDXMOVAX,DATAMOVDS,AXMOVDX,PORT1MOVAL,90HOUTDX,AL;写地址为0000的显示缓存区命令,每次写入后地址自动加1MOVSI,OFFSETSEC1MOVCX,0001MOVBX,OFFSETLEDCLDLODSBMOVAH,ALXLAT;键盘码转显示码MOVDX,PORT0OUTDX,AL;显示LOOPDISP1POPDXPOPCXPOPSIDISPENDPMUSICPROCNEAR;发音子程序PUSHSICMPAL,1JLQUITCMPAL,8JGQUIT;若不在'1'-'8'之间转QUIT,不发音MOVNUM,AL;求出相应的时间常数的序号MOVCX,60;取60次32个正弦波数据MOVSI,0MOVAL,DATA1[SI];取正弦波数据MOVDX,IO0832AOUTDX,AL;放音10CALLDELAY;调延时子程序INCSICMPSI,32;是否取完32个数据JLLLL;若没有,则继续LOOPDDD;总循环次数60是否完,没有,则继续MOVDX,PORT1;扫描实现任意键暂停INAL,DX;读状态ANDAL,01H;判断是否有按键JNZFFF;;按键延时JMPQUITFFF:MOVCX,60JMPDPOPSIRETMUSICENDPDELAYPROCNEAR;延时子程序CCC:MOVBX,OFFSETTIMEMOVDX,IO8253B;置8253通道0为方式0工作MOVAL,10HOUTDX,ALMOVDX,IO8255B;设8255A口输入MOVAL,9BHOUTDX,ALMOVAL,NUM;取相应的时间常数XLATMOVDX,IO8253AOUTDX,AL;向8253通道0输出KKK:MOVDX,IO8255AINAL,DX;从8255A口读一字节TESTAL,01;判PA0口是否为1JZKKK;若不为1,则
本文标题:微机原理课程设计――电子琴
链接地址:https://www.777doc.com/doc-3380118 .html