电子琴软件设计Word下载.docx

上传人:b****4 文档编号:6402347 上传时间:2023-05-06 格式:DOCX 页数:51 大小:305.90KB
下载 相关 举报
电子琴软件设计Word下载.docx_第1页
第1页 / 共51页
电子琴软件设计Word下载.docx_第2页
第2页 / 共51页
电子琴软件设计Word下载.docx_第3页
第3页 / 共51页
电子琴软件设计Word下载.docx_第4页
第4页 / 共51页
电子琴软件设计Word下载.docx_第5页
第5页 / 共51页
电子琴软件设计Word下载.docx_第6页
第6页 / 共51页
电子琴软件设计Word下载.docx_第7页
第7页 / 共51页
电子琴软件设计Word下载.docx_第8页
第8页 / 共51页
电子琴软件设计Word下载.docx_第9页
第9页 / 共51页
电子琴软件设计Word下载.docx_第10页
第10页 / 共51页
电子琴软件设计Word下载.docx_第11页
第11页 / 共51页
电子琴软件设计Word下载.docx_第12页
第12页 / 共51页
电子琴软件设计Word下载.docx_第13页
第13页 / 共51页
电子琴软件设计Word下载.docx_第14页
第14页 / 共51页
电子琴软件设计Word下载.docx_第15页
第15页 / 共51页
电子琴软件设计Word下载.docx_第16页
第16页 / 共51页
电子琴软件设计Word下载.docx_第17页
第17页 / 共51页
电子琴软件设计Word下载.docx_第18页
第18页 / 共51页
电子琴软件设计Word下载.docx_第19页
第19页 / 共51页
电子琴软件设计Word下载.docx_第20页
第20页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

电子琴软件设计Word下载.docx

《电子琴软件设计Word下载.docx》由会员分享,可在线阅读,更多相关《电子琴软件设计Word下载.docx(51页珍藏版)》请在冰点文库上搜索。

电子琴软件设计Word下载.docx

用户每按一琴键弹凑相应音符;

演凑:

按下某键后自动弹凑预存琴谱功能;

还可以附加变调、变速和记录创作等其它功能。

3.界面要美观。

3.撰写符合学校要求的课程设计说明书,内容包括:

摘要、目录、正文、参考文献、附录(程序清单)。

正文部分包括:

设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。

时间安排:

1.12月26日----12月27日查阅资料及方案设计

2.12月27日----12月30日编程

3.12月31日----1月1日调试程序

4.1月2日----1月3日撰写课程设计报告

5.1月4日上午准备答辩,下午正式答辩

指导教师签名:

年月日

系主任(或责任教师)签名:

摘要

本文主要介绍了现代微机原理与接口技术的应用——电子琴系统的设计与实现过程的设计。

电子琴是我们日常生活接触的比较多的电子器件,因此掌握他的基本原理对于我们专业技术的学习有很好的提升作用。

系统主要采用可编程的8255A和8253A芯片为主设计的电子琴。

设计重点在于产生特定频率的脉冲从而驱动蜂鸣器发出相应的声音。

本次设计输入部分是由8255A和8个常开型开关完成,发音部分由CUP通过对定时器8253的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值端口61H的最低位控制通道2门控的开断,以产生特殊的音响。

本文用到的是8253的方式3——方波发生器。

在编写汇编程序时,应用了宏定义可以避免过于频繁的调用中断显示字符串,通过子程序调用,可以有效的解决了跳转和转移过多的问题,再加上合理的DOS和BIOS功能调用以及各种指令的综合,最终作出了漂亮的电子琴界面,并实现了电子琴演奏高、中、低音以及播放预存乐曲的功能。

关键词:

电子琴82558253定时器DOS功能调用宏定义

1课程设计任务

使用汇编语言设计一个能够用键盘运行的电子琴,(实现一个以上功能):

(1)弹奏:

用户每按一个键盘琴键就弹奏相应的音符;

(2)演奏:

按下键盘上某一个指定的建后自动弹奏预存琴谱功能;

(3附加变调的功能

(4)界面要美观

2方案比较及论证

2.1方案的与比较

方案一、利用可编程定时/计数器接口芯片8253和可编程并行接口芯片8255A控制产生我们所需的频率。

8253可编程定时/计数器是Inter公司生产的通用外围芯片之一。

它有3个独立的十六位计数器,计数频率范围为0-8MHz。

它所有的计数方式和操作方式都通过编程控制。

系统中,8253的0通道输出线与8259的0中断请求线,作为实时钟中断信号。

1通道入口接1.8432MHz的信号源,输出接8251的收发时钟端,供串行通迅使用,这里的1计数器仅当作一个分频器使用。

2通道以排针形式引出,开放给用户使用。

因此我们可以使用8253的2计数器产生相应的频率脉冲信号,连接到蜂鸣器电路。

8255芯片连接按键,编写相应的按键查询程序,当查询到不同按键按下时,进入相应的子程序,控制计数器8253发出不同频率段的脉冲信号输出给蜂鸣器,从而产生相应的音符。

方案二、使用可编程并行接口芯片8255A为主体电路获得相应音频信号。

通过实验计算得计算机系统的程序执行时间长度,编写一定时长的延时函数。

便可在特定时长内改变8255某个输出口的电平状态,从而获得相应频率值的脉冲信号。

将并行接口芯片8255的B端口连接上按键,编写按键查询函数设定相应按键功能,当查询到按键时便可执行相应的发声程序,即弹奏相应音符。

2.2方案的确定论证

方案一需要使用8253和8255两款主体芯片,而方案二只需要一个8255就可以实现所有的电子琴功能,电路连接简单。

方案一由于使用计数器8253作为脉冲产生电路,其产生频率稳定,而且编写8253的程序也较为简单。

使用8255产生一定频率脉冲,需要我们精确计数软件执行时间,并编写相应的延时程序,从而得到我们所需要的频率脉冲输出。

编写程序较为复杂。

考虑到我们本次课程设计目的就是让我们加深对微机原理技术理解,并以此提高我们的编写汇编语言的能力,故本次设计采用方案一,即利用8255和8253两款主体芯片设计电子琴。

3硬件设计及说明

3.1系统总体硬件连接图

根据8255A芯片和8253A定时器的功能,我们所得的硬件连接图如下所示:

图3—1系统硬件连接图

我们将使用8255A芯片的A口与B口。

8255A芯片B端口定义为输出端口,产生我们所需要的音频脉冲输出。

在试验箱上电但未运行程序的情况下,8255A为未定义的状态。

实验得到若将PA0端口连接在扬声器电路输入端,扬声器连续发出声响。

说明此时,8255A芯片的初始态被蜂鸣器电路认为为高电平

定时器通道2工作在方式3,定时器输出一系列“1”和“0”间隔均匀的方波信号,经功率放大和滤波后驱动扬声器。

送到扬声器的信号还受到了从并行接口芯片8255B端口(端口地址为61H)B端口的最低位

控制通道2的门控开断以产生特殊的音频信号,它的

口与定时器的输出信号同时作为与门的输入端,输出端通过驱动发送至扬声器,由原理图可知,只有8255的B端口最低的两位同时为1时,扬声器才能发出声音,指令的反复执行可以控制音乐的时间。

8255A芯片A端口定义为输入端。

该端口连接8个按键,按键的一端连接在地上,另一端通过5.1KΩ电阻后连接在+5V电源上,并用插针引出,那么初始状态

按键输出为高电平,当按键按下后变为低电平。

3.2PC机接口电路工作原理

PC机扬声器电路以及相关接口电路如图2-1

图3-2PC机扬声器电路以及相关接口电路

电子琴的工作可以分为两部分

输入部分:

由8255芯片和8个常开型开关

发音部分:

定时器通道2工作在方式3,定时器输出一系列间隔均匀的方波信号,经功率放大和滤波后驱动扬声器。

3.3使用芯片介绍

3.3.18255的介绍

按功能可把8255分为三个逻辑电路部分即口电路、总线接口电路和控制逻辑电

路。

8255共有三个8位口.其中A口和B口是单纯的数据口.供数据I/O使用。

而C口则既可以作数据口.又可以作控制口使用.用于实现A口和B口的控制功能。

在使用8255A前,可用软件来定义端口的工作方式,选择所需要的功能。

掌握8255A编程是正确使用该芯片的前提,为此须先了解8255A的控制命令。

(1)8255A的方式控制字

这是一个8位的控制字,代表的信息非常丰富,上面提到8255A内部的3个端口位A、B两组,因此方式控制字也就相应地分成两个部分,分别控制A组和B组,其格式如下:

图3-38255A方式控制字

(2)系统中的8255芯片

8255的数据线片选信号线、地址线、读写控制线等分别与系统总线相连,其A、B、C三个端口以排针形式引出,供8255实验使用,其线路如图2所示,

图3-4系统中8255A连线图

本次课程设计实验室中使用的TDN86-88微机实验箱系统中的8255A芯片各个端口地址如表7所示。

表3-1系统中8255端口地址

信号线

寄存器

编址

I0Y3

A口

60H

B口

61H

C口

62H

控制寄存器

63H

3.3.28253的介绍

8253内部有三个计数器,分别成为计数器0、计数器1和计数器2,他们的机构完全相同。

每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。

每个计数器通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。

每个计数器内部有一个8位的控制寄存器,还有一个16位的计数初值寄存器CR、一个计数执行部件CE和一个输出锁存器OL。

(1)8253控制字

8253芯片是常用的可编程计数器.在微机中有着极其重要的作用。

常用于事件计数器、单稳态触发器、分频器、方波发生器、硬件触发的单脉冲发生器等。

计数器/定时器8253包括3个独立的16位计数器通道,而每个计数器都有6种工作方式,可以按二进制或十进制(BCD码)进行计数。

本文用到的是8253的方式3——方波发生器来实现了简易电子琴的设计。

图3—58253A控制字

(2)8253A工作方式3—方波发生器

 任一通道工作在方式3,只在计数值n为偶数,则可输出重复周期为n、占空比为1:

1的方波。

  进入工作方式3,OUTi输出低电平,装入计数值后,OUTi立即跳变为高电平。

如果当GATE为高电平,则立即开始减“1”计数,OUTi保持为高电平,若n为偶数,则当计数值减到n/2时,OUTi跳变为低电平,一直保持到计数值为“0”,系统才自动重新置入计数值n,实现循环计数。

这时OUTi端输出的周期为n×

CLKi周期,占空比为1:

1的方波序列;

若n为奇数,则OUTi端输出周期为n×

CLKi周期,占空比为((n+1)/2)/((n-1)/2)的近似方波序列。

  如果在操作过程中,GATE变为无效,则暂停减“1”计数过程,直到GATE再次有效,重新从初值n开始减“l”计数。

  如果要求改变输出方波的速率,则CPU可在任何时候重新装入新的计数初值n,并从下一个计数操作周期开始改变输出方波的速率。

4软件设计及说明

4.1程序流程图

程序流程图如下图所示:

图4-1程序流程图

4.2DOS功能介绍及其调用

系统功能调用是MS—DOS为程序员编写汇编语言源程序提供的一组子程序,包括设备管理、文件管理和目录管理等。

  DOS规定使用软中断指令INT21H作为进入各功能子程序的总入口,再为每个功能调用规定一个功能号,引用功能号即可进入相应的子程序入口。

DOS系统功能调用的使用方法归纳如下:

  

(1)传送入口参数到指定的寄存器中;

  

(2)把要调用功能的功能号送入AH寄存器中;

  (3)用INT21H指令转入子程序入口;

  (4)相应的子程序运行结束后,可以按照规定取得出口参数。

下面介绍一些DOS功能调用:

INT16H(键盘I/O中断)

1.功能号00H

功能:

从键盘读入ASCII字符,放在AL中

入口参数:

AH=00H

2.功能号01H

测试有无键被按下

AH=01H

INT10H(屏幕及显示器中断)

设置显示模式

入口参数:

AL=显示模式

2.功能号02H

功能:

用文本坐标下设置光标位置

AH􀉶

02H

BH􀉶

显示页码

DH􀉶

行(Y坐标)

DL􀉶

列(X坐标)

3.功能号09H

在当前光标处按指定属性显示字符

09H

AL􀉶

字符

BL􀉶

属性(文本模式)或颜色(图形模式)

CX􀉶

重复输出字符的次数

4.功能号0BH

设置调色板、背景色或边框

0BH

设置颜色:

.BH􀉶

00H􀉲

颜色

选择调色板:

01H􀉲

调色板(320×

200、4种颜色的图形模式)。

5.功能号0CH

写图形象素

0CH

象素值

BH页码

(CX、DX)􀉶

图形坐标列(X)、行(Y)

INT21H(DOS系统功能调用)

功能号4CH

退出系统,返回DOS

AH=4CH

4.3程序代码及注释

datasegment

;

------------------------------进度条字符-----------------------

st_loaddb10;

起始行

db4;

起始列

db0bh;

字体颜色

db‘*****************************'

db00

------------------------------字符定义-----------------------

start_coldb?

;

存储起始行

textdb14;

db2;

db0fh;

db'

AUTOMATION0902hereir'

0ffh,0ffh;

显示字

Happynewyear!

'

0ffh;

以0ffh来判断是否换行

[-1-2-3-4-5-6-7-]'

0ffh

H[qwertyu]p:

play'

M[asdfghj]enter:

stop'

L[zxcvbnm]Esc:

exit'

1/2:

speeddown/up'

------------------------------白色琴键坐标-------------------

st_lxdw50,61,72,83,94,105,116;

起点横坐标

dw127,138,149,160,171,182,193

dw204,215,226,237,248,259,270

st_ydw50;

起点纵坐标

ed_lxdw60,71,82,93,104,115,126;

终点横坐标

dw137,148,159,170,181,192,203

dw214,225,236,247,258,269,280

ed_ydw90;

终点纵坐标

------------------------------黑色琴键坐标--------------------------

bt_xdw57,68,90,101,112;

dw134,145,167,178,189

dw211,222,244,254,265

bt_ydw50;

bd_xdw64,75,97,108,119;

dw141,152,174,185,196

dw218,229,251,262,273

bd_ydw70;

------------------------------音乐频率值----------------------------

tunedw220,247,278,294,330,371,416;

低音

dw441,495,556,589,661,742,833;

中音

dw882,990,1112,1178,1322,1484,1655;

高音

soundcolordw0;

音色缓存56946.用于改变播放或弹奏时琴上音响和琴面上点阵的颜色

key_tunedw0;

按键状态缓存56946.用于判断是否有手动按键,1为有,0为无

keynumdw1;

按键编号缓存,用于提取对应的按键位置

delay_timedw7000;

延时缓存,用于播放时存入bx中来计数

------------自动演奏的歌曲频率和延时---------《新年好》

mus_freqdw441,441,441,330,556,556,556,441

dw441,556,661,661,589,556,495

dw495,556,589,589,556,495,556,441

dw441,556,495,330,416,495,441

dw-1;

以后以-1来判断是否结束

------------------声音节拍部分,32为一拍------------------------

mus_timedw4,4,8,8,4,4,8,8

dw4,4,8,8,4,4,16

dw4,4,8,8,4,4,8,8

dw4,4,8,8,4,4,32

dataends

************************代码段**************************

codesegment

assumeds:

data,cs:

code

-------------------------主程序-----------------------

---依次调用:

开场效果--初始化--键盘扫描--按键处理程序-------------

mainprocfar

start:

callshow_load;

调用进度条显示程序

---延时20*waitf----

pushbx

movbx,20

del:

callwaitf

decbx

jnzdel

popbx

------------重新开始-------

restart:

自动播放音乐时,按‘enter’键或音乐完全结束后会返回这里

callinit;

调用初始化程序

new_scan:

键盘扫描程序没有检测到功能键被按下时,会返回这里

callscan_key;

调用键盘扫描程序,扫描所按下的键

-----------按键处理-------

calldo_key

----重新扫描---

jmpnew_scan;

重新扫描有无键按下,直到按下esc键

mainendp

4.4编程过程中所遇到的问题

(1)电子琴的程序太过繁杂,要显示的字符串太多了,还要频繁中断调用显示程序,避免重复不断地写代码,提高程序的可读性,我想到了通过宏定义,宏定义方便传递参数,是程序看起来更具有可读性

(2)程序需要的寄存器太多了,系统内部的寄存器明显不够用,通过查资料我知道了可以用外部寄存器定义,定义是注意它的格式为:

变量名数据类型?

(3)在程序调试的过程中,遇到最大的问题就是,寄存器的值变幻无常,容易出错。

原因:

程序结构过于复杂,使用寄存器比较频繁,以及使用了BIOS中断程序,这样会导致其它与之相关寄存器的值的改变。

解决办法:

堆栈是保护环境的主要工具,一旦用错,后果将很严重,比如我们在调试程序的过程中,遇到过这样的问题,在一个函数的开始,我先用PUSH把所有寄存器入栈了在函数的执行中,我又把一个寄存器PUSH到栈中保存,却忘记了在执行POP指令之前把它恢复出来,这样就造成了所有的寄存器的值都的生了变化。

PUSH了一个变量之后在新的PUSH来临之前如果又有POP别的变量的语句,一定会出问题,解决的办法只有一个,就是把PUSH和POP对上号。

(4)有很多程序不会写,所以只有通过查资料,把不会写的程序好好理解一下,然后写上去。

5程序调试记录

(1)8255A芯片初始化,B口输出,工作方式0;

A口输入,工作方式0;

由于硬件电路中8255的B端口和8253连接一个与门后接到蜂鸣器,所以设置只有当8255最低的两位同时输出“1”,蜂鸣器才会响,所以一开始蜂鸣器是不响的。

(2)按键按下后开始连续发声,由于我们的程序设计的是使程序一直处于查询按键状态,所以到我们检测到按键松开后需要编写一段延时函数,那么在一瞬间的按键过程中蜂鸣器可以发出一定时长的声音。

采用循环函数来延时,延时时间的长短由循环次数来控制。

(3)跳转,转移指令跳出的范围太大,编译出现错误。

使用过程,也就是子程序设计,直接把一个要频繁要用到的函数打包成一个子过程,然后用CALL调用子过程就可以了,这样就可以避免使用过多的跳转和转移指令。

在本次程序设计过程中,在界面上电子琴和班级、等信息,并在屏幕下方显示键盘形状,当安不同的音阶时,相应的乐键会显示被按下。

当从键盘上敲击Q~U键时,音箱发出1~7的高音阶;

敲击A~J键时,音箱发出1~7的中音阶;

敲击Z~M键时,音箱发出1~7的低音阶,当敲击P键时,音箱会自动播放预存的音乐摇篮曲,当敲击1键时,演奏速度会加快,敲击运行程序所得到的截面图如下所示

图5-1界面载入中

图5-2电子琴单键按下

图5-3电子琴演奏预存歌曲界面

6课程设计收获及心得体会

这次的课程设计是我做的课程设计中最难的一个,开始拿到题目时候,我毫无头绪,不知道从哪里去着手,后来我静下心来经过慢慢的分析,到处查资料,基本确定了用8255A芯片和8个常用型开关作为电子琴设计的输入部分,然后利用cpu对8253A定时器编程,利用其I/O口接收一个控制声音的16进制的频率值,然后在发声环节通过其通道工作在方式2,输出均匀的方波,来控制其音调,送到扬声器发声,

基本确实了系统的大致设计方向之后,我开始考虑细节,将8255A芯片的A片作为输入端,B端口的低位作为输出口,连接到8253A的Gate门和输出口,以此来控制扬声器的发声,硬件电路确定之后,就是软件设计了,其核心就是汇编程序的编写。

编写程序时,我查了很多资料,编写过程中要显示很多的字符串,我就想到了用宏定义,传输参数方方便,在DOS调用那一块我也查了很多资料,查了许多中断程序,如键盘I/O中断,屏幕显示中断等等。

主程序编写中,先定义了电子琴界面的载入,显示以及琴键的坐标位置,确定了高,中,低音的音调和预存的音乐,代码段中都是一系列的宏调用和子程序的调用等。

难度高的就在于子程序的编写,在查了各方面的资料,终于完成了电子琴的程序,调试出了正确的结果。

在这个一周的微机原理和接口技术的课程设计。

我学到了很多,也在设计过程中碰到了很多的难题和障碍,开始时毫无头绪的焦躁让我更加无法下手,后来经过冷静下来,大脑才能理智地思考,然后慢慢找到突破口,这让我认识到我的一个缺点,遇到难题容易急躁,以后会慢慢改正。

在知识的积累上,我也学到了很多,以前只知道8255A芯片和8253A定时器的大致左右,根本不知道怎么去拓展,经过这次课程设计,我从结构上了解了这两块芯片,对芯片的应用也有了一些心得,程序的编写更是让我在平时上课没太弄懂的指令彻底弄明白了。

最后软件调试的时候出现了一些问题,因为程序过长,我很担心出了问题不太好找出来,经过调试,幸好都是一些小问题,都是由于粗心,程序输入错误,然后顺利地调试出来了正确的结果。

总之这次课程设计,从各方面来讲都是我收获最大的一次,不仅认识到自己在处理问题方面的缺点,也让我将理论知识与实际结合到一起,对知识理解得更加透彻,经过了这么长段程序的理解和编写,我的编程技术也有所提高。

要提高自己的编程能力,你必须亲自

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

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

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