电子琴软件设计.docx
《电子琴软件设计.docx》由会员分享,可在线阅读,更多相关《电子琴软件设计.docx(51页珍藏版)》请在冰豆网上搜索。
电子琴软件设计
学号:
0120911360214
课程设计
题目
电子琴软件设计
学院
自动化学院
专业
自动化
班级
自动化0902班
姓名
何润
指导教师
徐小强
2012
年
1
月
10
日
课程设计任务书
学生姓名:
何润专业班级:
自动化0902
指导教师:
徐小强工作单位:
自动化学院
题目:
电子琴软件设计
初始条件:
用汇编语言设计一个电子琴,在屏幕上显示出来,界面要美观,功能上模拟现实电子琴功能。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.实现弹凑功或演凑。
其中弹凑:
用户每按一琴键弹凑相应音符;演凑:
按下某键后自动弹凑预存琴谱功能;还可以附加变调、变速和记录创作等其它功能。
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,定时器输出一系列间隔均匀的方波信号,经功率放大和滤波后驱动扬声器。
送到扬声器的信号还受到了从并行接口芯片8255B端口(端口地址为61H)B端口的最低位
控制通道2的门控开断以产生特殊的音频信号,它的
口与定时器的输出信号同时作为与门的输入端,输出端通过驱动发送至扬声器,由原理图可知,只有8255的B端口最低的两位同时为1时,扬声器才能发出声音,指令的反复执行可以控制音乐的时间。
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(屏幕及显示器中断)
1.功能号00H
功能:
设置显示模式
入口参数:
AH=00H
AL=显示模式
2.功能号02H
功能:
用文本坐标下设置光标位置
入口参数:
AH02H
BH显示页码
DH行(Y坐标)
DL列(X坐标)
3.功能号09H
功能:
在当前光标处按指定属性显示字符
入口参数:
AH09H
AL字符
BH显示页码
BL属性(文本模式)或颜色(图形模式)
CX重复输出字符的次数
4.功能号0BH
功能:
设置调色板、背景色或边框
入口参数:
AH0BH
设置颜色:
.BH00HBL颜色
选择调色板:
BH01HBL调色板(320×200、4种颜色的图形模式)。
5.功能号0CH
功能:
写图形象素
入口参数:
AH0CH
AL象素值
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;显示字
db'Happynewyear!
',0ffh;以0ffh来判断是否换行
db'[-1-2-3-4-5-6-7-]',0ffh
db'H[qwertyu]p:
play',0ffh
db'M[asdfghj]enter:
stop',0ffh
db'L[zxcvbnm]Esc:
exit',0ffh
db'1/2:
speeddown/up',0ffh
db00
;------------------------------白色琴键坐标-------------------
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定时器的大致左右,根本不知道怎么去拓展,经过这次课程设计,我从结构上了解了这两块芯片,对芯片的应用也有了一些心得,程序的编写更是让我在平时上课没太弄懂的指令彻底弄明白了。
最后软件调试的时候出现了一些问题,因为程序过长,我很担心出了问题不太好找出来,经过调试,幸好都是一些小问题,都是由于粗心,程序输入错误,然后顺利地调试出来了正确的结果。
总之这次课程设计,从各方面来讲都是我收获最大的一次,不仅认识到自己在处理问题方面的缺点,也让我将理论知识与实际结合到一起,对知识理解得更加透彻,经过了这么长段程序的理解和编写,我的编程技术也有所提高。
要提高自己的编程能力,你必须亲自