1、 武汉理工大学微机原理及接口技术课程设计 目录1 课程设计任务32 方案比较及论证42.1 方案的与比较42.2 方案的确定论证43 硬件设计及说明53.1 系统总体硬件连接图53.2 PC机接口电路工作原理63.3 使用芯片介绍73.3.1 8255的介绍73.3.2 8253的介绍84 软件设计及说明104.1 程序流程图104.2 DOS功能介绍及其调用104.3 程序代码及注释124.4 编程过程中所遇到的问题155 程序调试记录166 课程设计收获及心得体会19参考文献21附录程序22本科生课程设计成绩评定表40 课程设计任务书 题 目: 电子琴软件设计初始条件:用汇编语言设计一个电
2、子琴,在屏幕上显示出来,界面要美观,功能上模拟现实电子琴功能。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1实现弹凑功或演凑。其中弹凑:用户每按一琴键弹凑相应音符;演凑:按下某键后自动弹凑预存琴谱功能;还可以附加变调、变速和记录创作等其它功能。3界面要美观。3撰写符合学校要求的课程设计说明书,内容包括:摘要、目录、正文、参考文献、附录(程序清单)。正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。时间安排:1. 12月26日-12月27日 查阅资料及方案设计2.
3、 12月27日-12月30日 编程3. 12月31日-1月1日 调试程序4. 1月2日 -1月3日 撰写课程设计报告5. 1月4日 上午准备答辩,下午正式答辩指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日 电子琴软件设计摘要 本文主要介绍了现代微机原理与接口技术的应用电子琴系统的设计与实现过程的设计。电子琴是我们日常生活接触的比较多的电子器件,因此掌握他的基本原理对于我们专业技术的学习有很好的提升作用。系统主要采用可编程的8255A和8253A芯片为主设计的电子琴。设计重点在于产生特定频率的脉冲从而驱动蜂鸣器发出相应的声音。本次设计输入部分是由8255A和8个常开型开关完成,
4、发音部分由CUP 通过对定时器8253 的通道2 进行编程,使其I/O 寄存器接收一个控制声音频率的16 位计数值端口61H 的最低位控制通道2 门控的开断,以产生特殊的音响。本文用到的是8253 的方式3方波发生器。 在编写汇编程序时,应用了宏定义可以避免过于频繁的调用中断显示字符串,通过子程序调用,可以有效的解决了跳转和转移过多的问题,再加上合理的DOS 和BIOS 功能调用以及各种指令的综合,最终作出了漂亮的电子琴界面,并实现了电子琴演奏高、中、低音以及播放预存乐曲的功能。关键词:电子琴 8255 8253定时器 DOS功能调用 宏定义 1 课程设计任务使用汇编语言设计一个能够用键盘运行
5、的电子琴,(实现一个以上功能): (1)弹奏:用户每按一个键盘琴键就弹奏相应的音符; (2)演奏:按下键盘上某一个指定的建后自动弹奏预存琴谱功能; (3 附加变调的功能 (4)界面要美观2 方案比较及论证2.1 方案的与比较方案一、利用可编程定时/计数器接口芯片8253和可编程并行接口芯片8255A控制产生我们所需的频率。8253可编程定时/计数器是Inter公司生产的通用外围芯片之一。它有3个独立的十六位计数器,计数频率范围为0-8MHz。它所有的计数方式和操作方式都通过编程控制。系统中,8253的0通道输出线与8259的0中断请求线,作为实时钟中断信号。1通道入口接1.8432MHz的信号
6、源,输出接8251的收发时钟端,供串行通迅使用,这里的1计数器仅当作一个分频器使用。2通道以排针形式引出,开放给用户使用。因此我们可以使用8253的2计数器产生相应的频率脉冲信号,连接到蜂鸣器电路。8255芯片连接按键,编写相应的按键查询程序,当查询到不同按键按下时,进入相应的子程序,控制计数器8253发出不同频率段的脉冲信号输出给蜂鸣器,从而产生相应的音符。方案二、使用可编程并行接口芯片8255A为主体电路获得相应音频信号。通过实验计算得计算机系统的程序执行时间长度,编写一定时长的延时函数。便可在特定时长内改变8255某个输出口的电平状态,从而获得相应频率值的脉冲信号。将并行接口芯片8255
7、的B端口连接上按键,编写按键查询函数设定相应按键功能,当查询到按键时便可执行相应的发声程序,即弹奏相应音符。2.2 方案的确定论证方案一需要使用8253和8255两款主体芯片,而方案二只需要一个8255就可以实现所有的电子琴功能,电路连接简单。方案一由于使用计数器8253作为脉冲产生电路,其产生频率稳定,而且编写8253的程序也较为简单。使用8255产生一定频率脉冲,需要我们精确计数软件执行时间,并编写相应的延时程序,从而得到我们所需要的频率脉冲输出。编写程序较为复杂。考虑到我们本次课程设计目的就是让我们加深对微机原理技术理解,并以此提高我们的编写汇编语言的能力,故本次设计采用方案一,即利用8
8、255和8253两款主体芯片设计电子琴。3 硬件设计及说明3.1 系统总体硬件连接图根据8255A芯片和8253A定时器的功能,我们所得的硬件连接图如下所示: 图31 系统硬件连接图我们将使用8255A芯片的A口与B口。8255A芯片B端口定义为输出端口,产生我们所需要的音频脉冲输出。在试验箱上电但未运行程序的情况下,8255A为未定义的状态。实验得到若将PA0端口连接在扬声器电路输入端,扬声器连续发出声响。说明此时,8255A芯片的初始态被蜂鸣器电路认为为高电平定时器通道2工作在方式3,定时器输出一系列“1”和“0”间隔均匀的方波信号,经功率放大和滤波后驱动扬声器。送到扬声器的信号还受到了从
9、并行接口芯片8255B端口(端口地址为61H)B端口的最低位控制通道2 的门控开断以产生特殊的音频信号,它的口与定时器的输出信号同时作为与门的输入端,输出端通过驱动发送至扬声器,由原理图可知,只有8255的B端口最低的两位同时为1时,扬声器才能发出声音,指令的反复执行可以控制音乐的时间。8255A芯片A端口定义为输入端。该端口连接8个按键,按键的一端连接在地上,另一端通过5.1K电阻后连接在+5V电源上,并用插针引出,那么初始状态按键输出为高电平,当按键按下后变为低电平。3.2 PC机接口电路工作原理PC机扬声器电路以及相关接口电路如图2-1 图3-2 PC机扬声器电路以及相关接口电路 电子琴
10、的工作可以分为两部分输入部分:由8255芯片和8个常开型开关发音部分:定时器通道2工作在方式3,定时器输出一系列间隔均匀的方波信号,经功率放大和滤波后驱动扬声器。送到扬声器的信号还受到了从并行接口芯片8255B端口(端口地址为61H)B端口的最低位控制通道2 的门控开断以产生特殊的音频信号,它的口与定时器的输出信号同时作为与门的输入端,输出端通过驱动发送至扬声器,由原理图可知,只有8255的B端口最低的两位同时为1时,扬声器才能发出声音,指令的反复执行可以控制音乐的时间。3.3 使用芯片介绍 3.3.1 8255的介绍按功能可把8255 分为三个逻辑电路部分即口电路、总线接口电路和控制逻辑电路
11、。8255共有三个8位口.其中A口和B口是单纯的数据口.供数据I/O 使用。而C 口则既可以作数据口.又可以作控制口使用.用于实现A口和B口的控制功能。在使用8255A前,可用软件来定义端口的工作方式,选择所需要的功能。掌握8255A编程是正确使用该芯片的前提,为此须先了解8255A的控制命令。(1)8255A的方式控制字这是一个8位的控制字,代表的信息非常丰富,上面提到8255A内部的3个端口位A、B两组,因此方式控制字也就相应地分成两个部分,分别控制A组和B组,其格式如下: 图3-3 8255A方式控制字(2)系统中的8255芯片 8255的数据线片选信号线、地址线、读写控制线等分别与系统
12、总线相连,其A、B、C三个端口以排针形式引出,供8255实验使用,其线路如图2所示, 图3-4 系统中8255A连线图 本次课程设计实验室中使用的TDN 86-88微机实验箱系统中的8255A芯片各个端口地址如表7所示。表3-1 系统中8255端口地址信 号 线寄 存 器编 址I0Y3A口60HB口61HC口62H控制寄存器63H3.3.2 8253的介绍 8253内部有三个计数器,分别成为计数器0、计数器1和计数器2,他们的机构完全相同。每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。每个计数器通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入
13、端GATE,另一个为输出端OUT。每个计数器内部有一个8位的控制寄存器,还有一个16位的计数初值寄存器CR、一个计数执行部件CE和一个输出锁存器OL。 (1)8253控制字8253 芯片是常用的可编程计数器.在微机中有着极其重要的作用。常用于事件计数器、单稳态触发器、分频器、方波发生器、硬件触发的单脉冲发生器等。计数器/定时器8253包括3个独立的16位计数器通道,而每个计数器都有6种工作方式,可以按二进制或十进制(BCD 码)进行计数。本文用到的是8253 的方式3方波发生器来实现了简易电子琴的设计。 图35 8253A控制字(2)8253A工作方式3方波发生器 任一通道工作在方式3, 只在
14、计数值n为偶数,则可输出重复周期为n、占空比为1:1的方波。进入工作方式3,OUTi输出低电平, 装入计数值后,OUTi立即跳变为高电平。如果当GATE为高电平, 则立即开始减“1”计数,OUTi保持为高电平,若n为偶数,则当计数值减到n/2时,OUTi跳变为低电平,一直保持到计数值为“0”,系统才自动重新置入计数值n,实现循环计数。这时OUTi端输出的周期为nCLKi周期,占空比为1:1的方波序列; 若n为奇数, 则OUTi端输出周期为nCLKi周期,占空比为(n+1)/2)/(n-1)/2)的近似方波序列。如果在操作过程中, GATE变为无效,则暂停减“1”计数过程,直到GATE再次有效,
15、重新从初值n开始减“l”计数。如果要求改变输出方波的速率, 则CPU可在任何时候重新装入新的计数初值n,并从下一个计数操作周期开始改变输出方波的速率。 4 软件设计及说明4.1 程序流程图程序流程图如下图所示: 图4-1 程序流程图4.2 DOS功能介绍及其调用系统功能调用是MSDOS为程序员编写汇编语言源程序提供的一组子程序,包括设备管理、文件管理和目录管理等。DOS规定使用软中断指令INT 21H作为进入各功能子程序的总入口,再为每个功能调用规定一个功能号,引用功能号即可进入相应的子程序入口。DOS系统功能调用的使用方法归纳如下:(1) 传送入口参数到指定的寄存器中;(2) 把要调用功能的
16、功能号送入AH寄存器中;(3) 用INT 21H指令转入子程序入口;(4) 相应的子程序运行结束后,可以按照规定取得出口参数。下面介绍一些DOS功能调用:INT 16H(键盘I/O 中断)1. 功能号 00H功能:从键盘读入ASCII 字符,放在AL 中入口参数:AH=00H2. 功能号 01H功能:测试有无键被按下入口参数:AH=01HINT 10H(屏幕及显示器中断)1. 功能号 00H功能:设置显示模式入口参数:AH=00HAL=显示模式2. 功能号 02H功能:用文本坐标下设置光标位置入口参数:AH02HBH显示页码DH行(Y
17、 坐标)DL列(X 坐标)3. 功能号 09H功能:在当前光标处按指定属性显示字符入口参数:AH09HAL字符BH显示页码BL属性(文本模式)或颜色(图形模式)CX重复输出字符的次数4. 功能号 0BH功能:设置调色板、背景色或边框入口参数:AH0BH设置颜色:.BH00HBL颜色选择调色板:BH01HBL调色板(320200、4 种颜色
18、的图形模式) 。5. 功能号 0CH功能:写图形象素入口参数:AH0CHAL象素值BH页码(CX、DX)图形坐标列(X)、行(Y)INT 21H(DOS 系统功能调用)功能号 4CH功能:退出系统,返回DOS入口参数:AH=4CH4.3 程序代码及注释data segment;-进度条字符-st_load db 10 ;起始行db 4 ;起始列db 0bh ;字体颜色db *db 00;-字符定义-start_col db ? ;存储起始行text db 14 ;起始行db 2 ;起始列db 0fh ;字体颜色db AUTOMATIO
19、N 0902 hereir,0ffh,0ffh ;显示字db Happy new year!,0ffh ;以0ffh来判断是否换行db -1-2-3-4-5-6-7-,0ffhdb H q w e r t y u p: play,0ffhdb M a s d f g h j enter: stop,0ffhdb L z x c v b n m Esc: exit,0ffhdb 1/2: speed down/up,0ffhdb 00;-白色琴键坐标-st_lx dw 50,61,72,83,94,105,116 ;起点横坐标dw 127,138,149,160,171,182,193dw 20
20、4,215,226,237,248,259,270st_y dw 50 ;起点纵坐标ed_lx dw 60,71,82,93,104,115,126 ;终点横坐标dw 137,148,159,170,181,192,203dw 214,225,236,247,258,269,280ed_y dw 90 ;终点纵坐标;-黑色琴键坐标-bt_x dw 57,68,90,101,112 ;起点横坐标dw 134,145,167,178,189dw 211,222,244,254,265bt_y dw 50 ;起点纵坐标bd_x dw 64,75,97,108,119 ;终点横坐标dw 141,152
21、,174,185,196dw 218,229,251,262,273bd_y 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 ;音色缓存56946 .用于改变播放或弹奏时琴上音响和琴面上点阵的颜色key_tune dw 0 ;按键状态缓存56946 .用于判断是否有手动按键,1为有,0为无keynum dw 1 ;按键编号缓存,用于提取对应的按键位置
22、delay_time dw 7000 ;延时缓存,用于播放时存入bx中来计数;-自动演奏的歌曲频率和延时-新年好mus_freq dw 441,441,441,330,556,556,556,441 dw 441,556,661,661,589,556,495 dw 495,556,589,589,556,495,556,441 dw 441,556,495,330,416,495,441 dw -1 ;以后以-1来判断是否结束;-声音节拍部分,32为一拍-mus_time dw 4,4,8,8,4,4,8,8dw 4,4,8,8,4,4,16dw 4,4,8,8,4,4,8,8dw 4,4,
23、8,8,4,4,32data ends ;*代码段*code segmentassume ds:data,cs:code;-主程序-;-依次调用:开场效果-初始化-键盘扫描-按键处理程序-main proc farstart:call show_load ;调用进度条显示程序 ;-延时20*waitf-push bxmov bx,20del:call waitfdec bxjnz delpop bx;-重新开始-restart: ;自动播放音乐时,按enter键或音乐完全结束后会返回这里call init ;调用初始化程序new_scan: ;键盘扫描程序没有检测到功能键被按下时,会返回这里c
24、all scan_key ;调用键盘扫描程序,扫描所按下的键;-按键处理-call do_key;-重新扫描-jmp new_scan ;重新扫描有无键按下,直到按下esc键main endp 4.4 编程过程中所遇到的问题(1) 电子琴的程序太过繁杂,要显示的字符串太多了,还要频繁中断调用显示程序,避免重复不断地写代码,提高程序的可读性,我想到了通过宏定义,宏定义方便传递参数,是程序看起来更具有可读性(2) 程序需要的寄存器太多了,系统内部的寄存器明显不够用,通过查资料我知道了可以用外部寄存器定义,定义是注意它的格式为:变量名 数据类型 ?(3)在程序调试的过程中,遇到最大的问题就是,寄存器
25、的值变幻无常,容易出错。原因:程序结构过于复杂,使用寄存器比较频繁,以及使用了BIOS 中断程序,这样会导致其它与之相关寄存器的值的改变。解决办法:堆栈是保护环境的主要工具,一旦用错,后果将很严重,比如我们在调试程序的过程中,遇到过这样的问题,在一个函数的开始,我先用PUSH 把所有寄存器入栈了在函数的执行中,我又把一个寄存器PUSH 到栈中保存,却忘记了在执行POP 指令之前把它恢复出来,这样就造成了所有的寄存器的值都的生了变化。PUSH 了一个变量之后在新的PUSH 来临之前如果又有POP 别的变量的语句,一定会出问题,解决的办法只有一个,就是把PUSH 和POP 对上号。(4) 有很多程
26、序不会写,所以只有通过查资料,把不会写的程序好好理解一下,然后写上去。5 程序调试记录 (1)8255A芯片初始化,B口输出,工作方式0;A口输入,工作方式0;由于硬件电路中8255的B端口和8253连接一个与门后接到蜂鸣器,所以设置只有当8255最低的两位同时输出“1”,蜂鸣器才会响,所以一开始蜂鸣器是不响的。 (2)按键按下后开始连续发声,由于我们的程序设计的是使程序一直处于查询按键状态,所以到我们检测到按键松开后需要编写一段延时函数,那么在一瞬间的按键过程中蜂鸣器可以发出一定时长的声音。采用循环函数来延时,延时时间的长短由循环次数来控制。 (3)跳转,转移指令跳出的范围太大,编译出现错误
27、。使用过程,也就是子程序设计,直接把一个要频繁要用到的函数打包成一个子过程,然后用CALL调用子过程就可以了,这样就可以避免使用过多的跳转和转移指令。在本次程序设计过程中,在界面上电子琴和班级、等信息,并在屏幕下方显示键盘形状,当安不同的音阶时,相应的乐键会显示被按下。当从键盘上敲击Q U键时,音箱发出1 7的高音阶;敲击A J键时,音箱发出1 7的中音阶; 敲击Z M键时,音箱发出1 7的低音阶,当敲击P键时,音箱会自动播放预存的音乐摇篮曲,当敲击1键时,演奏速度会加快,敲击运行程序所得到的截面图如下所示 图5-1 界面载入中 图5-2 电子琴单键按下 图5-3 电子琴演奏预存歌曲界面6 课
28、程设计收获及心得体会这次的课程设计是我做的课程设计中最难的一个,开始拿到题目时候,我毫无头绪,不知道从哪里去着手,后来我静下心来经过慢慢的分析,到处查资料,基本确定了用8255A芯片和8个常用型开关作为电子琴设计的输入部分,然后利用cpu对8253A定时器编程,利用其I/O口接收一个控制声音的16进制的频率值,然后在发声环节通过其通道工作在方式2,输出均匀的方波,来控制其音调,送到扬声器发声,基本确实了系统的大致设计方向之后,我开始考虑细节,将8255A芯片的A片作为输入端,B端口的低位作为输出口,连接到8253A的Gate门和输出口,以此来控制扬声器的发声,硬件电路确定之后,就是软件设计了,
29、其核心就是汇编程序的编写。编写程序时,我查了很多资料,编写过程中要显示很多的字符串,我就想到了用宏定义,传输参数方方便,在DOS调用那一块我也查了很多资料,查了许多中断程序,如键盘I/O中断,屏幕显示中断等等。主程序编写中,先定义了电子琴界面的载入,显示以及琴键的坐标位置,确定了高,中,低音的音调和预存的音乐,代码段中都是一系列的宏调用和子程序的调用等。难度高的就在于子程序的编写,在查了各方面的资料,终于完成了电子琴的程序,调试出了正确的结果。在这个一周的微机原理和接口技术的课程设计。我学到了很多,也在设计过程中碰到了很多的难题和障碍,开始时毫无头绪的焦躁让我更加无法下手,后来经过冷静下来,大
30、脑才能理智地思考,然后慢慢找到突破口,这让我认识到我的一个缺点,遇到难题容易急躁,以后会慢慢改正。在知识的积累上,我也学到了很多,以前只知道8255A芯片和8253A定时器的大致左右,根本不知道怎么去拓展,经过这次课程设计,我从结构上了解了这两块芯片,对芯片的应用也有了一些心得,程序的编写更是让我在平时上课没太弄懂的指令彻底弄明白了。最后软件调试的时候出现了一些问题,因为程序过长,我很担心出了问题不太好找出来,经过调试,幸好都是一些小问题,都是由于粗心,程序输入错误,然后顺利地调试出来了正确的结果。总之这次课程设计,从各方面来讲都是我收获最大的一次,不仅认识到自己在处理问题方面的缺点,也让我将
31、理论知识与实际结合到一起,对知识理解得更加透彻,经过了这么长段程序的理解和编写,我的编程技术也有所提高。要提高自己的编程能力,你必须亲自去体验、去设计、编辑、编译、调试、运行。每一个程序员都是在失败、尝试、失败、尝试与收获中成长起来的。参考文献1 龚尚福.微机原理与接口技术.西安:西安电子科技大学出版社,2003.82 周佩玲.微机原理与接口技术.北京:电子工业出版社,20053 宋杰.微机原理与接口技术课程设计.北京:机械工业出版社,20054 李长青. 微机原理与接口技术. 徐州:中国矿业大学出版社,20065 沈美明. 汇编语言程序设计实验教程. 北京:清华大学出版社,2002年 附录程
32、序data segment;-进度条字符-st_load db 10 ;起始行db 4 ;起始列db 0bh ;字体颜色db *db 00;-字符定义-start_col db ? ;存储起始行text db 14 ;起始行db 2 ;起始列db 0fh ;字体颜色db AUTOMATION 0902 hereir,0ffh,0ffh ;显示字db Happy new year!,0ffh ;以0ffh来判断是否换行db -1-2-3-4-5-6-7-,0ffhdb H q w e r t y u p: play,0ffhdb M a s d f g h j enter: stop,0ffhd
33、b L z x c v b n m Esc: exit,0ffhdb 1/2: speed down/up,0ffhdb 00;-白色琴键坐标-st_lx dw 50,61,72,83,94,105,116 ;起点横坐标dw 127,138,149,160,171,182,193dw 204,215,226,237,248,259,270st_y dw 50 ;起点纵坐标ed_lx dw 60,71,82,93,104,115,126 ;终点横坐标dw 137,148,159,170,181,192,203dw 214,225,236,247,258,269,280ed_y dw 90 ;终点
34、纵坐标;-黑色琴键坐标-bt_x dw 57,68,90,101,112 ;起点横坐标dw 134,145,167,178,189dw 211,222,244,254,265bt_y dw 50 ;起点纵坐标bd_x dw 64,75,97,108,119 ;终点横坐标dw 141,152,174,185,196dw 218,229,251,262,273bd_y dw 70 ;终点纵坐标;-音乐频率值-tune dw 220,247,278,294,330,371,416 ;低音dw 441,495,556,589,661,742,833 ;中音dw 882,990,1112,1178,13
35、22,1484,1655 ;高音soundcolor dw 0 ;音色缓存56946 .用于改变播放或弹奏时琴上音响和琴面上点阵的颜色key_tune dw 0 ;按键状态缓存56946 .用于判断是否有手动按键,1为有,0为无keynum dw 1 ;按键编号缓存,用于提取对应的按键位置delay_time dw 7000 ;延时缓存,用于播放时存入bx中来计数;-自动演奏的歌曲频率和延时-新年好mus_freq dw 441,441,441,330,556,556,556,441 dw 441,556,661,661,589,556,495 dw 495,556,589,589,556,4
36、95,556,441 dw 441,556,495,330,416,495,441 dw -1 ;以后以-1来判断是否结束;-声音节拍部分,32为一拍-mus_time dw 4,4,8,8,4,4,8,8dw 4,4,8,8,4,4,16dw 4,4,8,8,4,4,8,8dw 4,4,8,8,4,4,32data ends ;*代码段*code segmentassume ds:data,cs:code;-主程序-;-依次调用:开场效果-初始化-键盘扫描-按键处理程序-main proc farstart:call show_load ;调用进度条显示程序 ;-延时20*waitf-pus
37、h bxmov bx,20del:call waitfdec bxjnz delpop bx;-重新开始-restart: ;自动播放音乐时,按enter键或音乐完全结束后会返回这里call init ;调用初始化程序new_scan: ;键盘扫描程序没有检测到功能键被按下时,会返回这里call scan_key ;调用键盘扫描程序,扫描所按下的键;-按键处理-call do_key;-重新扫描-jmp new_scan ;重新扫描有无键按下,直到按下esc键main endp;*矩形绘制宏*draw macro start_x,start_y,end_x,end_y,colorlocal draw_next ;local 避免宏重复调用,标号的重复