ImageVerifierCode 换一换
格式:DOCX , 页数:44 ,大小:331.32KB ,
资源ID:9145386      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-9145386.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(微机原理课程设计电子琴设计.docx)为本站会员(b****8)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

微机原理课程设计电子琴设计.docx

1、微机原理课程设计电子琴设计广州大学松田学院课 程 设 计 说 明 书题 目 姓 名 专 业 班 级 系 (部) 指导老师 二零一四年十二月三十日摘 要本文通过8255和8253来实现电子琴模拟,主要可以分成两部分,分别为输入部分和发音部分。输入部分主要是由8255和8个常开型开关来完成。发音部分由CUP通过对定时器8253的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。本文用到的是8253的方式3方波发生器。在程序设计中,为了避免过于频繁的调用中断显示字符串,应用了宏定义;还通过子程序调用,有效的解决了跳转和转移过

2、多的问题;再加上合理的DOS和BIOS功能调用,以及各种指令的综合,最终作出了漂亮的电子琴界面,并实现了电子琴演奏高、中、低音,以及播放预存乐曲的功能。关键词:电子琴 8253定时器 8255 DOS调用 宏定义 1 设计任务及要求初始条件:用汇编语言设计一个电子琴,在屏幕上显示出来,界面要美观,功能上模拟现实电子琴功能。要求完成的主要任务:1实现弹奏功或演奏。其中弹奏:用户每按一琴键弹奏相应音符;演奏:按下某键后自动弹奏预存琴谱功能;还可以附加变调2界面要美观。2 工作原理PC机扬声器电路以及相关接口电路如图2-1。图2-1 PC机扬声器电路及相关接口电路通过8255和8253来实现电子琴模

3、拟,主要可以分成两部分,分别为输入部分和发音部分。输入部分:主要是由8255和8个常开型开关来完成。 发音部分:CUP通过对定时器的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。 当通道2用于发声时,采用的是方式3,在方式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。从定时器输出的方波信号,经功率放大和滤波后驱动扬声器。送到扬声器的信号还受到了从并行接口芯片8255(端口地址为61H)来的双重控制,端口61H的最低位控制通道2的门控开断,以产生特殊的音频信号,端口61H的PB

4、1位和定时器的输出信号同时作为与门的输入,PB0和PB1位可由程序决定为0还是为1。显然只有PB0和PB1都是1时,才能使扬声器发出声音。控制音长的时间可以简单地通过反复执行指令来得到。2.1 8253简介8253芯片是常用的可编程计数器,在微机中有着极其重要的作用。常用于事件计数器,单稳态触发器,分频器,方波发生器,硬件触发的单脉冲发生器等。计数器/定时器8253包括3个独立的16位计数器通道,而每个计数器都有6种工作方式,可以按二进制或十进制(BCD码)进行计数。本文用到的是8253的方式3方波发生器来实现了简易电子琴的设计。8253的方式控制字如图2-2所示。图2-2 8253的方式控制

5、字8253的工作方式3方波发生器:它的特点是:(1)输出为周期性的方波。若计数值为N,则输出方波的周期是N个CLK脉冲的宽度。(2)写入控制字后,输出将变为高电平,当写入计数初值后,就开始计数,输出仍为高电平;当计数到初值的一半时,输出变为低电平,直至计数到0,输出又变为高电平,重新开始计数。(3)若计数值为偶数,则输出对称方波;如果计数值为奇数,则前(N+1)/2个CLK脉冲期间输出为高电平,后(N-1)/2个CLK脉冲期间输出为低电平。(4)GATE信号能使计数过程重新开始,GATE=1允许计数,GATE=0禁止计数。停止后OUT将立即变高电平,当GATE再次变高以后,计数器将自动装入计数

6、初值,重新开始计数。2.2 8255简介按功能可把8255分为三个逻辑电路部分,即:口电路、总线接口电路和控制逻辑电路。8255共有三个8位口,其中A口和B口是单纯的数据口,供数据I/O使用。而C口则既可以作数据口,又可以作控制口使用,用于实现A口和B口的控制功能。8255A的方式控制字如图2-3所示。图2-3 8255A的方式控制字3设计思路3.1 程序功能描述程序开始,显示电子琴界面和提示信息,对缓存区初始化。按键扫描,接着调用发音子程序把al送缓存区,发出与按键相对应频率的声音,从而实现计算机钢琴功能:键盘按键“q、w、e、r、t、y、u”实现音调的高音输入;键盘按键“a、s、d、f、g

7、、h、j”实现音调的中音输入;键盘按键“z、x、c、v、b、n、m”实现音调的低音输入。不停地对Esc键进行扫描,当Esc键按下时,就退出程序;当按下p时,播放预存音乐;当检测到Enter键时,退出到计算机钢琴演奏状态。3.2 程序流程图程序流程图如图3-1所示。图3-1 程序流程图3.3 DOS/BIOS功能调用DOS操作系统为程序设计者提供了可以直接调用的软中断处理程序,每一个中断处理程序完成一个特定的功能操作。依据编程需要选择适当的处理程序,编程者不需再重新编写程序,而是使用INT n软中断指令。每执行一种不同类型码n的软中断指令,就执行一个中断处理程序,其主要功能如下: (1)磁盘的读

8、/写控制。 (2)内存管理、文件操作和目录管理。 (3)基本输入/输出(对键盘、打印机和显示器等)控制,另外还有日期、时间管理等。BIOS是固化在只读存储器ROM中的一系列输入/输出服务程序,它存放于内存的高地址区域内,除负责处理系统中的全部内部中断外,还提供对主要I/O接口的控制功能,如键盘、显示器、磁盘、打印、日期与时间等。BIOS采用模块化结构,每个功能模块的入口地址都存于中断向量表中。对这些中断调用是通过软中断指令INT n来实现的,中断指令中的操作数n即为中断类型码。 BIOS的调用方法与DOS系统功能调用方法类似: (1)置功能号于AH中。 (2)置入口参数。 (3)执行INT n

9、 。 (4)分析出口参数及状态。下面介绍程序中将要用到的一下DOS/BIOS功能调用:3.3.1 INT 16H(键盘I/O中断)1. 功能号:00H功能:从键盘读入ASCII字符,放在AL中入口参数:AH=00H2. 功能号:01H功能:测试有无键被按下入口参数:AH=01H3.3.2 INT 10H(屏幕及显示器中断)1. 功能号:00H功能:设置显示模式入口参数:AH=00H AL=显示模式2. 功能号:02H 功能:用文本坐标下设置光标位置 入口参数: AH02H BH显示页码 DH行(Y坐标) DL列(X坐标) 3. 功能号:09H 功能:在当前光标处按指定属性显示字符 入口参数:A

10、H09H AL字符 BH显示页码 BL属性(文本模式)或颜色(图形模式) CX重复输出字符的次数 4. 功能号:0BH 功能:设置调色板、背景色或边框 入口参数:AH0BH设置颜色:BH00H,BL颜色选择调色板:BH01H,BL调色板(320200、4种颜色的图形模式) 。5. 功能号:0CH 功能:写图形象素 入口参数:AH0CH AL象素值 BH页码 (CX、DX)图形坐标列(X)、行(Y) 3.3.3 INT 21H(DOS系统功能调用)功能号:4CH功能:退出系统,返回DOS入口参数:AH=4CH4 方案比较及论证在程序设计的过程中,遇到了很多问题,总结起来有以下几点:问题1:要显示

11、的字符串过多,但又不想重复写代码原因:过于频繁的调用中断显示字符串,导致程序过于庞大和复杂,可读性差。解决办法:解决这种问题的最好方法是直接把显示部分写成子过程,但是子过程在递参数的时候不方便,所以就用宏定义,宏定义可以很方便的传递参数,不仅使得程序美观好看,而且可读性好,程序代码紧凑。问题2:寄存器不够用原因:使用了太多的寄存器,AX、BX、CX、DX。解决办法:使用外部变量定义,定义外部变量的方法为:变量名 数据类型 ?问题3:跳转,转移指令跳出的范围太大,编译出现错误原因:程序结构过于复杂,庞大。解决办法:使用过程,也就是子程序设计,直接把一个要频繁要用到的函数打包成一个子过程,然后用C

12、ALL调用子过程就可以了,这样就可以避免使用跳转和转移指令了。5 程序源代码及注释主程序如下(宏定义及子程序见附录):data segment;-进度条字符-st_load db 10 ;起始行 db 4 ;起始列 db 0bh ;字体颜色 db IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII db 00;-字符定义-start_col db ? ;存储起始行text db 14 ;起始行 db 2 ;起始列 db 0fh ;字体颜色 db piano - AUTOMATION 0808 _,0ffh,0ffh ;显示字 db HAVE A GOOD TIME!,0ffh

13、;以0ffh来判断是否换行 db -1-2-3-4-5-6-7-,0ffh db H q w e r t y u p: play,0ffh db M a s d f g h j enter: stop,0ffh db L z x c v b n m Esc: exit,0ffh db 1/2: speed down/up,0ffh db 00;-白色琴键坐标-st_lx dw 50,61,72,83,94,105,116 ;起点横坐标 dw 127,138,149,160,171,182,193 dw 204,215,226,237,248,259,270st_y dw 50 ;起点纵坐标ed

14、_lx dw 60,71,82,93,104,115,126 ;终点横坐标 dw 137,148,159,170,181,192,203 dw 214,225,236,247,258,269,280ed_y dw 90 ;终点纵坐标;-黑色琴键坐标-bt_x dw 57,68,90,101,112 ;起点横坐标 dw 134,145,167,178,189 dw 211,222,244,254,265bt_y dw 50 ;起点纵坐标bd_x dw 64,75,97,108,119 ;终点横坐标 dw 141,152,174,185,196 dw 218,229,251,262,273bd_y

15、 dw 70 ;终点纵坐标;-音乐频率值-tune dw 220,247,278,294,330,371,416 ;低音 dw 441,495,556,589,661,742,833 ;中音 dw 882,990,1112,1178,1322,1484,1655 ;高音 soundcolor dw 0 ;音色缓存,用于改变播放或弹奏时琴上音响和琴面上点阵的颜色 key_tune dw 0 ;按键状态缓存,用于判断是否有手动按键,1为有,0为无keynum dw 1 ;按键编号缓存,用于提取对应的按键位置 delay_time dw 7000 ;延时缓存,用于播放时存入bx中来计数;-自动演奏的

16、歌曲频率和延时-卡农轻快改编版-mus_freq dw 1112,990,882,833,742,661,742,833 ;声音频率部分 dw 882,833,742,661,589,556,589,495 dw 882,833,882,441,416,661,556,589,441,882,833,742,833,1113,1322,1484 dw 1178,1112,990,1178,1178,1112,882,833,742,661,589,556,495,589,556,495 dw 441,495,556,589,661,495,661,589,556,742,661,589,661

17、,589,556,495 dw 441,371,742,833,882,833,742,661,589,556,495,742,661,742,661,589 dw 556,1112,990,882,990,882,1112,990,1178 dw 1322,1112,1178,1322,1112,1178,1322,661,742,833,882,990,1112,1178 dw 1112,882,990,1112,556,589,661,742,661,589,661,556,589,661 dw 589,742,661,589,556,495,556,495,441,495,556,58

18、9,661,742 dw 589,742,661,742,833,882,661,742,833,882,990,1112,1178,1322 dw 1112,882,990,1112,990,882,990,833,882,990,1112,990,882,833 dw 882,742,833,882,441,495,556,589,556,495,556,882,833,882 dw 742,882,833,742,661,589,661,589,556,589,661,742,833,882 dw 742,882,833,882,833,742,833,882,990,882,833,8

19、82,742,883 dw 1112,556,589,556,495,990,1112,990,882,556,441,742,661,330,294,330 dw 371,742,833,742,833,330,294,330,371,742,661,742,833,833,742,833 dw 441,882,990,880,833,416,441,416,371,742,661,742,833,416,556,495 dw 441,882,990,1178,1112,556,661,1112,882,1178,1112,1178,990,661,589,661 dw 556,882,83

20、3,882,556,661,661,742,883,661 dw 556,882,1112,1178,882,1112,1112,990,882,833 dw 742,742,661,742,833,882,1112,990,882,1178 dw 1322,1178,1112,990,1112,990,882,833,882,833,742,661,742,661,589,556 dw 589,589,495,441 dw 441 dw -1 ;以后以-1来判断是否结束;-声音节拍部分,32为一拍-mus_time dw 16 dup(32),64 dup(8) dw 16,16,32,32

21、,32,16,16,16,16 dw 8 dup(8,4,4,8,4,4,8 dup(4) dw 64 dup(8) dw 6 dup(8,4,4,8,8) dw 20 dup(8),32 data ends;*代码段*code segment assume ds:data,cs:code;-主程序-;-依次调用:开场效果-初始化-键盘扫描-按键处理程序-main proc farstart: call show_load ;调用进度条显示程序;-延时20*waitf- push bx mov bx,20del: call waitf dec bx jnz del pop bx;-重新开始-

22、restart: ;自动播放音乐时,按enter键或音乐完全结束后会返回这里 call init ;调用初始化程序new_scan: ;键盘扫描程序没有检测到功能键被按下时,会返回这里 call scan_key ;调用键盘扫描程序,扫描所按下的键;-按键处理- call do_key;-重新扫描- jmp new_scan ;重新扫描有无键按下,直到按下esc键main endp6 运行结果分析电子琴界面如图6-1所示。图6-1 电子琴界面电子琴播放预存音乐时的界面如图6-2所示。相比初始界面,播放预存音乐时,右上角的第一个灯变绿了,上面和左右两边的点开始闪烁,且每播放一个音符,界面下方就多

23、了一个符号。图6-2 电子琴播放预存音乐的界面7 调试过程记录在程序调试的过程中,遇到最大的问题就是,寄存器的值变幻无常,容易出错。原因:程序结构过于复杂,使用寄存器比较频繁,以及使用了BIOS中断程序,这样会导致其它与之相关寄存器的值的改变。解决办法:堆栈是保护环境的主要工具,一旦用错,后果将很严重,比如我们在调试程序的过程中,遇到过这样的问题:在一个函数的开始,我先用PUSH把所有寄存器入栈了,在函数的执行中,我又把一个寄存器PUSH到栈中保存,却忘记了在执行POP指令之前把它恢复出来!这样就造成了所有的寄存器的值都的生了变化。PUSH了一个变量之后在新的PUSH来临之前如果又有POP别的

24、变量的语句,一定会出问题!解决的办法只有一个,把PUSH和POP对上号。8 课程设计小结在本次设计中,可以说是一次成功的经验。在学完了微型原理与接口技术这门课的基础上来搞做这个设计,使我对这门课的理论知识的理解有很大程度上的加强。微机原理这门课程本身是一门实验性和工程性很强的专业技术课,因此不仅要重视理论教学,更应注意实践技能的培养和训练。课程设计是这门课程的一个重要环节,通过课程设计,巩固、加深和拓宽了学习的理解,使自己的分析、设计和调试8086微机系统的能力得到了进一步的提高。通过整整一个星期的摸索和编程,查资料,终于把程序完成了,和小组的成员一起讨论问题,分析问题,发现问题,解决问题,也

25、收获了不少,我们的编程技术都有所提高,我们的体会就是:要提高自己的编程能力,你必须亲自去体验、去设计、编辑、编译、调试、运行。每一个程序员都是在失败、尝试、失败、尝试与收获中成长起来的。在设计过程中,对不同方案的构思、分析、比较到最后的定案,这些工作,培养了我们的分析问题,解决问题和创新的能力。在方案确定后,在软件编程方面,对编写的程序经上机实践和调试,对存在的问题进行反复修改,使其达到了最优方案。这样的编程机会在平时是很少有的,所以,在编程方面我们得到了很多的锻炼,使自己更加熟悉了汇编语言,了解了编程思想,为以后的学习以及工作打下了扎实的基础。我认为,在这次的课程设计中,不但做出了一个符合要

26、求的电子琴,而且为自己积累了一笔有用的财富。参考文献1 龚尚福.微机原理与接口技术.西安电子科技大学出版社,2003.82 李芷.微机原理与接口技术.电子工业出版社,2002 3 钱晓捷.汇编语言程序设计(第二版).电子工业出版社,20034 宋杰等微机原理与接口技术课程设计北京:机械工业出版社,20055 杨立,邓振杰,荆淑霞等微型计算机原理与接口技术(第二版)北京:中国铁道出版社,20066 小捷. 汇编语言程序设计. 第2版. 西安:西安电子科技大学出版社,2003附录;*矩形绘制宏*draw macro start_x,start_y,end_x,end_y,color local d

27、raw_next;local :避免宏重复调用时,标号的重复;功能:画填充的矩形;使用条件:start_x end_x ,start_y end_y push ax ;堆栈 push bx push cx push dx mov ah,0ch ;12号功能,写像素 mov al,color ;取颜色值 mov bh,0 ;页号0 mov cx,start_x ;列起始点 mov dx,start_y ;行起始点draw_next: int 10h ;画点 inc cx ;画横线 cmp cx,end_x ;比较行是否画完 jne draw_next ;画另一行 mov cx, start_x

28、;另一行的起始点 inc dx ;下一行 cmp dx,end_y ;比较列是否画完 jne draw_next ;未完继续画 pop dx ;出栈 pop cx pop bx pop ax endm;*矩形点阵绘制宏*draw_point macro start_x,start_y,end_x,end_y,color local draw_next;local :避免宏重复调用时,标号的重复;功能:画矩形点阵;使用条件:start_x end_x ,start_y end_y push ax push bx push cx push dx mov ah,0ch ;12号功能,写像素 mov al,color ;设置颜色 mov bh,0 ;页号0 mov cx,start_x ;列起始点 mov dx,start_y ;行起始点draw_next:

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2