微机原理课程设计电子琴.docx
《微机原理课程设计电子琴.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计电子琴.docx(22页珍藏版)》请在冰点文库上搜索。
微机原理课程设计电子琴
》
概述…………………………………………………………1
一 设计内容与要求………………………………………1
二 设计思想………………………………………………1
三 设计所用芯片及工作原理……………………………2
四 系统连线图……………………………………………2
五 连线图说明……………………………………………3
六 程序流程图……………………………………………3
]
七 程序源代码……………………………………………5
八 设计过程中遇到的问题及解决方法……………………11
九 设计心得………………………………………………11
—
电子琴
概述
《汇编语言与微机原理》是计算机各专业一门重要的基础课,是必修的核心课程之一,对于训练学生掌握程序设计技术,熟悉上机操作和程序调试技术都有重要作用。
因此该课程在整个教学计划中占有重要地位。
本课程的目的和要求是:
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相与,判断是否有按键,如果有就进入死循环,直到下次按键为止。
D)放歌子程序
调用放音子程序。
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/=,输出数据的时间间隔为32=.定时时间可以由8253配合8255来实现。
按下某键后发音时间的长短可以由发出的正弦波的个数多少来控制。
本程序中设置默认长度为60个正弦波。
五、系统连线图
(1)8253和8255连接如下
;
五、连线图说明
计时器8253
使用8279芯片的键盘控制器,8279键盘在一个扩充板上,用一根20芯扁平电缆与实验台上扩展插头J7相连。
并行控制器8255
六、程序流程图
(1)主程序流程图
(2)发音子程序流程图
[
(3)键盘显示子程序流程图(4)显示子程序流程图
(5)录音子程序流程图(6)放录音子程序流程图
七、程序源代码
STACK1SEGMENTPARASTACK'STACK'
、
DB50DUP(0)
STACK1ENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMSG
*
MOVAH,9
INT21H;显示提示信息
CLI
MOVAX,DATA
MOVDS,AX
MOVSEC1,0
MOVSEC2,0
MOVMIN1,0
—
MOVMIN2,0
MOVHOUR1,0
MOVHOUR2,0;显示缓存区初始化
MOVAX,DATA
MOVDS,AX
MOVAX,CS
MOVDS,AX
MOVDX,PORT1
)
MOVAL,0D3H;清除命令特征位
OUTDX,AL;8279CLEAR
MOVAL,2AH;0010101042分频,内部使用1MHZ/42的频率
OUTDX,AL;8279CLOCK
MOVAL,40H
OUTDX,AL;READFIFORAMCOMMAND
MOVAL,00H;8个字符显示,左入口。
编码扫描键盘,双键锁定。
OUTDX,AL;KEYBORDDISPLYMODE
—
MOVAL,80H;写入的存储单元地址为0000
OUTDX,AL;WRITERAMCOMMAND
CALLMUSIC;发音
CALLKEYBORD;CALLKEYBORDANDDISPLY
NEXT2:
MOVHOUR2,AL
MOVHOUR1,AL
MOVMIN2,AL
!
MOVMIN1,AL
MOVSEC2,AL
MOVSEC1,AL;键盘码存入显示缓冲区
CMPAL,9H
JZRE
CMPAL,0H
JZOUTPUT
CMPAL,15
JZFU
CMPAL,13H;'R'COMMAND
JNZLP1
MOVAX,4C00H;QUITTODOS
INT21H
LP1:
JMPKEY1
RE:
CALLRE0;录音
JMPLP1
!
OUTPUT:
CALLOUTPUT0;放录音
JMPLP1
FU:
CALLOUTPUT1
JMPLP1
MAINENDP
RE0PROCNEAR;录音子程序
MOVDX,OFFSETMSGPLAY
MOVAH,9
INT21H;显示录音提示信息
LEASI,SONG
CALLKEYBORD
MOVHOUR2,AL
MOVHOUR1,AL
MOVMIN2,AL
MOVMIN1,AL
MOVSEC2,AL
—
MOVSEC1,AL;键盘码存入显示缓冲区
CALLMUSIC
CALLDISP
MOV[SI],AH
CMPAH,9
JZQRE0
INCSI
JMPR
*
MOVDX,OFFSETMSGEND
MOVAH,9
INT21H;显示录音提示信息
RET
RE0ENDP
OUTPUT0PROCNEAR;放录音子程序
MOVDX,OFFSETMSGPLAY1
MOVAH,9
*
INT21H;显示PLAY提示信息
LEASI,SONG
MOVAL,[SI]
CMPAL,9
JZQRE1
MOVHOUR2,AL
MOVHOUR1,AL
MOVMIN2,AL
¥
MOVMIN1,AL
MOVSEC2,AL
MOVSEC1,AL;键盘码存入显示缓冲区
CALLDISP
MOVAL,AH
CALLMUSIC
INCSI
JMPOU
】
MOVDX,OFFSETMSGEND1
MOVAH,9
INT21H;显示PLAYEND提示信息
RET
OUTPUT0ENDP
OUTPUT1PROCNEAR;放歌子程序
MOVDX,OFFSETMSGPLAY1
MOVAH,9
—
INT21H;显示PLAY提示信息
LEASI,SONG1
MOVAL,[SI]
CMPAL,-1
JZQRE2
MOVHOUR2,AL
MOVHOUR1,AL
MOVMIN2,AL
…
MOVMIN1,AL
MOVSEC2,AL
MOVSEC1,AL;键盘码存入显示缓冲区
CALLDISP
MOVAL,AH
CALLMUSIC
INCSI
JMPOU1
!
MOVDX,OFFSETMSGEND1
MOVAH,9
INT21H;显示PLAYEND提示信息
RET
OUTPUT1ENDP
KEYBORDPROCNEAR;键盘子程序
MOVDX,PORT1
MOVAL,0D1H
|
OUTDX,AL;CLEARDISPLAY
CALLDISP
MOVDX,PORT1
INAL,DX;读状态
ANDAL,07H;判断是否有按键
JZWREP
KEYN:
;下一次的按键
MOVDX,PORT0
*
INAL,DX;读数据
MOVBL,AL
ANDAL,07H
ANDBL,38H
MOVCL,03
SHRBL,CL
CMPBL,00H
JNZLINE1
。
ADDAL,08H
JMPQUIT1
CMPBL,01H
JNZLINE2
JMPQUIT1
ADDAL,10H
RET
KEYBORDENDP
—
DISPPROCNEAR;显示子程序
PUSHSI
PUSHCX
PUSHDX
MOVAX,DATA
MOVDS,AX
MOVDX,PORT1
MOVAL,90H
|
OUTDX,AL;写地址为0000的显示缓存区命令,每次写入后地址自动加1
MOVSI,OFFSETSEC1
MOVCX,0001
MOVBX,OFFSETLED
CLD
LODSB
MOVAH,AL
XLAT;键盘码转显示码
,
MOVDX,PORT0
OUTDX,AL;显示
LOOPDISP1
POPDX
POPCX
POPSI
DISPENDP
MUSICPROCNEAR;发音子程序
|
PUSHSI
CMPAL,1
JLQUIT
CMPAL,8
JGQUIT;若不在'1'-'8'之间转QUIT,不发音
MOVNUM,AL;求出相应的时间常数的序号
MOVCX,60;取60次32个正弦波数据
MOVSI,0
@
MOVAL,DATA1[SI];取正弦波数据
MOVDX,IO0832A
OUTDX,AL;放音
CALLDELAY;调延时子程序
INCSI
CMPSI,32;是否取完32个数据
JLLLL;若没有,则继续
LOOPDDD;总循环次数60是否完,没有,则继续
;
MOVDX,PORT1;扫描实现任意键暂停
INAL,DX;读状态
ANDAL,01H;判断是否有按键
JNZFFF;;按键延时
JMPQUIT
FFF:
MOVCX,60
JMPD
POPSI
RET
MUSICENDP
DELAYPROCNEAR;延时子程序
CCC:
MOVBX,OFFSETTIME
MOVDX,IO8253B;置8253通道0为方式0工作
MOVAL,10H
OUTDX,AL
MOVDX,IO8255B;设8255A口输入
MOVAL,9BH
OUTDX,AL
MOVAL,NUM;取相应的时间常数
XLAT
MOVDX,IO8253A
OUTDX,AL;向8253通道0输出
KKK:
MOVDX,IO8255A
INAL,DX;从8255A口读一字节
TESTAL,01;判PA0口是否为1
JZKKK;若不为1,则转KKK
RET;子程序返回
DELAYENDP
CODEENDS
ENDSTART
八、设计过程中遇到的问题及解决方法
1.主程序简单电子琴功能
主程序要求完成的功能有:
电子琴简单功能实现以及利用由8279芯片控制的小键盘(含数码管、键盘阵列)实现控制电子琴。
主程序由电子琴实验和键盘控制实验的两个程序有机组成,两个程序简单拼凑在一齐是不能实现的。
经过实际调试和修改,将原电子琴程序改为2个子程序:
music(实现播放音阶)和delay(实现播放音阶时延时);将原键盘控制程序改为1个主程序:
key1、keybord(键盘扫描及输入)和disp(显示)。
各个子程序通过寄存器al通信,al存有当前输入的键盘码,同时为music、disp两子程序服务。
调试后,主程序能实现课程设计要求的功能,并且界面清晰、操作容易。
2.源程序整体功能
将各子程序调试完成后,进行最后的源程序整体功能调试。
调试过程中我们注意到:
a.程序模块化(功能分为若干子程序)能使源程序清晰,调试简单,因此在调试中我们还将源程序进一步模块化。
b.注意子程序之间的通信方式,这里基本用到的是寄存器al(内含键盘码),所以对al的使用应十分谨慎。
c.调用子程序前,使用push/pop保护了一些子程序会用到的主程序同时会用到的寄存器,保证调用之后主程序的顺利执行。
在调试过程中出现的一些小问题,我们都根据以上3点总结出的经验作为原则进行调试,调试过程十分顺利。
最后根据电子琴的实际用途加上了一些必要清晰的提示性语句,使界面更加友好。
九、设计心得
经过这个课程设计,虽然时间比较短,完成任务的效果不是很理想,但是既然自己尝试
过,就肯定学到了不少东西。
经过短短一周的课程设计,我认识到,课程设计能真正让人学到实际应用的东西的一门课程。
首先,要实现题目要求的功能并有所创新,我们必须全心地投入其中,养成一种敢于钻研敢于创新的习惯。
在把课程要求实现到实际中来的过程中,首先必须清楚明白地了解几个参考程序的每一行的意思,这就需要敢于静心钻研。
其次,通过课程设计,让我更深入的了解了各种芯片的用法和程序的完成过程,调试方法及技巧。
为了的初始化,存取缓存,扫描键盘,读取键码以及键码和显示码之间的转换,查找了不少8279芯片的资料,了解了键盘为了实现基本功能,了解了电子琴的不同音阶放音功能的实现,长短音的实现,更深入了解了8253计时器的使用方法。
检查程序过程中,在充分思考的基础上多次实验是检查改正程序的良方。
在设计扩展功能的过程中,大胆想像并且用多种思路来求解实现目标是必备的武器。