1、微机原理与汇编语言课程设计电子琴学 院: 计算机科学技术 专 业: 计算机科学与技术(工) 班 级: 计 13-1 班 姓 名: 肖林英 学 号: 2013170101 25 指导教师: 陈微 2016 年 6 月 10 日A微机原理与汇编语言课程设计任务书一、题目:电子琴二、设计的目的1. 掌握利用PC机扬声器发出不同频率声音的方法;2. 学习利用系统功能调用从键盘上读取字符的方法;3. 掌握定时器/计数器8253的工作原理;三、设计要求编写程序,程序运行时使PC 机成为一架可演奏的“钢琴”。当按下数字键1-8时,依次发出1,2,3,4,5,6,7,七个高音和低音,Esc 则退出演奏状态。独
2、立完成课程设计。四、设计内容及步骤1PC 机扬声器电路电路图如图1所示:图1 PC 机扬声器控制电路通过给8253定时器装入不同的计数值,可以使其输出不同频率的波形。当与门打开后,经过放大器的放大作用,便可驱动扬声器发出不同频率的音调。为使该音调的声音持续一段时间,要插入一段延时程序,之后再将扬声器关闭(关闭与门)。2建立音频表要使计算机成为可弹奏的简易电子琴,需要使用系统调用的01H 功能以接收键入字符,并且要建立一张音频表。五、课程设计工作量每人的程序量应在 100 行有效程序行以上,不得抄袭,否则给不及格成绩。六、课程设计工作计划2016 年 6 月 6 日 指导教师讲课,学生准备文献资
3、料;2016 年 6 月 6 日2016 年 6 月 10 日 每人完成自己程序并能独立演示;2016 年 6 月 10 日下午 验收,学生撰写课程设计报告。指导教师签字: 专业主任签章: B微机原理与汇编语言课程设计指导教师评语与成绩指导教师评语:课程设计表现成绩: 课程设计验收成绩: 课程设计报告成绩: 课程设计 总成绩: 指导教师签字: 2016 年 月 日C目 录一、概述 11.课题描述 .12.程序设计目的 .1二、 需求分析 .1三、总体设计 21.电子琴程序 .22.单音调子程序 SOUND .3四、详细设计 31.扬声器 .32.界面设计 .4五、调试与运行结果说明 51.主界
4、面 .52.退出界面 .6六、课程设计总结 6七、结束语 7八、程序清单 7参考文献 .14第 0 页 共 18 页一、概述1.课题描述随着社会发展,计算机硬件技术越来越多的应用到生活中的各个领域,人们对软硬件技术结合开发出来的产品的要求越来越迫切,需求日益增加,如今用软硬件结合设计电子产品已经成为了一大时尚。本设计编写的一个用 PC 机模拟电子琴的程序,利用 PC 机中的 8253 和键盘的按键模拟电子琴 8 个音节的发声。编程使计算机的数字键 1、2、3、4、5、6、7、8 作为电子琴按键,按下即发出相应的音阶。在本次课程设计中,考察了我们编程的技巧、运用 Debug 动态调试工具进行程序
5、的调试的能力。同时,本道设计题目还检查了我们对汇编语言这门课程的基本知识的掌握程度。只有掌握汇编语言基本编程方法,掌握程序各部分功能及其相互联系、相互作用,并要熟悉基本的音乐知识,才能独立的把程序写出来,才能把程序写好。开发工具:汇编语言 MASM FOR WINDOWS2.程序设计目的课程设计是培养学生运用有关课程的基础理论和技能解决实际问题,进一步提高学生本专业必要的基本技能、方法和创新能力的重要环节之一。通过课程设计使学生受到设计方法的初步训练,能用文字、图形和现代设计方法简要、系统、正确地表达设计成果。微机原理与汇编语言课程设计 主要是训练学生综合运用学过的微机原理的软件和硬件知识,独
6、立完成一个实际的微机应用设计系统,并在实验室实现。此次课设是对个人的程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,为学习后继的基础课和专业课打下坚实的基础。课设所用的是汇编语言,它是一种机器语言,是计算机能提供的最快最有效的语言,也是能够利用计算机所有硬件性能并能直接控制硬件的语言。实验不仅培养了实际动手能力,也进一步学习了汇编语言的结构和使用方法,提高了汇编语言的水平。2、需求分析本实验是利用微机原理试验箱、8255 芯片、8253 芯片、键盘、扬声器等硬件设备,设计简易电子琴。首先利用了编程程序,编辑了 8255 芯片控制字, 对其进行初始化,使其工作在
7、方式 0,即基本输入输出状态,将 8255 的 A 端口设置为输出,C 端口进行,经 CPU 运算后, 输出到 8253 芯片的 A端口中,由此实现对其的初始化。第 1 页 共 18 页将 8253 芯片设置为工作在方式 3,即输出对称方波状态。A 端口为输入, “OUT”指令可将输出对应一定频率的方波送到扬声器中,由此实现发声。本实验通过频率大小控制发出声音的高低,通过对延时程序的调用控制发出声音的长短。并通过所编程序实现对键盘的重复扫描,重而可以弹奏多个音符的试验目的。三、总体设计1.电子琴程序由于是用键盘的数字键 1-8,要先读取键盘的输入,判断输入是否在 1-8 之间,不在就退到主菜单
8、,若是就根据键值查表找出相应的频率,计算初值,调用发音子程序即可,此时的音长固定。初值的计算方法是用输入的 clk 频率除以音符的频率。程序流程图如图 1 所示。YNYN显示提示信息等待键盘按键放入 ALAL30AL查表 FREQ 得频率计算初值,置音长返回主菜单调用 8253 初始化程序AL 小于1AL 大于8图 1.1 电子琴程序流程图第 2 页 共 18 页2.单音调子程序 SOUND单音调子程序的调用前需要进行以下几个方面工作:(1)确定相应的音调所对应的频率,查表可以得到,再由频率得到对应的8253计数初值。(2)确定音长,即一个音符所持续的时间。在单音调子程序中实现发出一个音符的声
9、音,持续所需的时间,流程图如图2所示:读取 8253 计数初值和音长8253 置初值开启与门和 8253GATE延时关闭与门和 8253GATE返回图 2.1 单音调子程序流程图四、详细设计1.扬声器在 PC/XT 机中,扬声器接口电路由 8255A-5、8253-5、驱动器和低通滤波器等构成,其中8253-5 是音频信号源,8255A-5 作控制器,驱动器用来增大 8253-5 输出的 TTL 电平信号的驱动能力,低通滤波器将脉冲信号转换成接近滤波的音频信号,去驱动扬声器发声。8253-5 的计数器 2 的 CLK2 端所加的时钟脉冲频率为 1.19318MHZ。可根据这个频率和所要产生的声
10、音频率,计算出定时常数,经编程让计数器 2 输出指定频率的波形。8255A-5 的 PB0 接 8253-5第 3 页 共 18 页的 GATE2,作为计数器的门控信号,允许或禁止 8253-5 计数。8255A-5 的 PB1 接与门 U87 的一个输入端,用来对计数器 2 的 OUT2 端输出的波形作进一步的控制,当 PB1=1 时,8253-5 从 OUT2 输出的波形才能通过与门 U87 送到驱动器 75477 的 A 端,送到扬声器插座使之发声。当 PB1=0 时,OUT2输出的波形不能通过与门,扬声器不会发声。当 PB1PB0=11 时扬声器能连续发声。2.界面设计主界面为一架电子
11、琴,并采用漂亮的字体作为提示语。利用 int 10h 实现,利用宏定义画线和矩形。DRAWSQRE MACRO START_X,START_Y,END_X,END_Y,COLORLOCAL ROW_UP,ROW_DOWN,RANK_LEFT,RANK_RIGHTPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIMOV AH,0CHMOV AL,COLORMOV BH,0MOV CX,START_XMOV DX,START_YROW_UP: ;画上边INT 10HINC CXCMP CX,END_XJNE ROW_UPRANK_RIGHT: ;画右边INT 10HINC DX
12、CMP DX,END_YJNE RANK_RIGHTMOV CX, START_X ;下边起始点MOV SI,END_XINC SIROW_DOWN: ;画下边INT 10HINC CXCMP CX,SIJNE ROW_DOWNMOV DX,START_Y ;右边起始点第 4 页 共 18 页MOV CX,START_XRANK_LEFT: ;画右边INT 10HINC DXCMP DX, END_YJNE RANK_LEFTPOP SIPOP DXPOP CXPOP BXPOP AXENDM五、调试与运行结果说明1.主界面图 5.1 主界面第 5 页 共 18 页2.退出界面图 5.2 退出
13、界面六、课程设计总结本次课程设计由我、邓云杰、刘萌萌三个同学协作共同完成。通过这次的课程设计,让我对微机原理与汇编语言这门课有了更深的认识,系统的掌握了微机原理与汇编语言的应用知识。这次课程设计我们做的是用 PC 机模拟电子琴发声,通过老师的提示及相关实验指导书的资料我们找到了入手点,在已有基础题目的基础上加入创新内容。在基础功能的实现上并没有遇到问题,主要也是有参考内容的指导,同时通过参考内容更好的把握了设计的整体思路及各个模块的细节。但是在拓展功能上就有不少的问题。对于在程序设计中出现的一些问题,我们通过翻阅相关资料和请教老师,最终都得到了解决。 虽然此次课程设计的过程是艰辛的,但结果还是
14、令我们比较欣慰的。提高了自己的分析解决问题的能力,并且使自己所学的知识与实践相结合,应用到实践当中。遇到问题时,应该对自己有信心,但也要知道自己的不足,认真去查阅资料和学习不懂的知识。另外在本次课程设计中,培养了同学之间协作精神,有问题时一起讨论共同解决问题,提高了自己的合作能力。第 6 页 共 18 页七、结束语汇编语言作为一种低级程序设计语言,既然是低级所以应该是最底层的,与我们计算机内部的结构联系应该联系很密切,而且在我们学习中也深刻的了解到了这一点 。比如说后来学到的寄存器、 中断、 还要各种寻址方式以及进栈出栈, 好多的就是设计到计算机硬件 。 学完汇编这门课我也对之前的高级语言中的
15、一些知识有了更新的认识, 能够让我们更好的理解高级语言,尤其是高级语言中的 C 语言。汇编语言对于内存的操作都是基于内存地址的 ,而 C 语言中最令人头疼的指针概念,说白了就是内存的地址指针的学习和应用中最头疼的就是在指针这个抽象的概念和实际的内存单元之问建立思维映射, 而这些恰恰是我们在汇编语言学习中频繁做的一件平常事另外,对于 c 语言中的数据类型形参实参函数调用全局变量局部变量等概念及操作 , 我们都可以用汇编语言中的一些操作相关联, 把这些抽象的概念和过程 , 通过汇编语言形成一个具体的映像, 深度割析,这样我们才能真正的学会学好 C 语言计算机科学的各个方面是一个统一的整体, 只有多
16、方面穿插, 交互才能更好的搭建计算机知识体系。 我想如果想学好计算机编程技能, 如果想做一名合格的编程人员, 如果想在计算机编程之路走的更远, 我们也必须从汇编语言开始, 才能完整、完善的建立计算机编程知识体系! 所以对于我自己来说, 要以今天的学习为跳板, 为今后的汇编语言的继续学习打好基础。愿自己在计算机这条道路上越走越远。本次设计得到了老师的大力支持和帮助,其中老师对此次设计的题目的主要难度以及一些要求和目的给出了详细的解释。同学对设计中遇到的汇编语言方面的知识给予了很大的帮助。 感谢陈微老师这学期对我们的谆谆教导、对微机原理课程的认真讲解以及对课程设计的细心指导。您的认真负责让我感觉到
17、了一个电脑工作者所要具备的素质,您的讲课风格让我对微机原理这门课产生了浓厚兴趣,并会更努力的去学习它!八、程序清单DRAW MACRO START_X,START_Y,END_X,END_Y,COLORLOCAL DRAW_NEXT;local:避免宏重复调用时,标号的重复;功能:画填充的矩形;使用条件:START_XEND_X,START_YEND_YPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,0CH ;写像素点MOV AL,COLOR ;设置颜色MOV BH,0 ;选用页号 0MOV CX,START_X ;列起始点第 7 页 共 18 页MOV DX,START
18、_Y ;行起始点DRAW_NEXT:INT 10H ;画点INC CX ;画横线CMP CX,END_X ;比较行是否画完JNE DRAW_NEXT ;画另一行MOV CX, START_X ;另一行的起始点INC DXCMP DX,END_Y ;比较列是否画完JNE DRAW_NEXT ;未完继续画POP DXPOP CXPOP BXPOP AXENDMDRAWSQRE MACRO START_X,START_Y,END_X,END_Y,COLORLOCAL ROW_UP,ROW_DOWN,RANK_LEFT,RANK_RIGHT;功能:画不填充的矩形PUSH AXPUSH BXPUSH C
19、XPUSH DXPUSH SIMOV AH,0CHMOV AL,COLORMOV BH,0MOV CX,START_XMOV DX,START_YROW_UP: ;画上边INT 10HINC CXCMP CX,END_XJNE ROW_UPRANK_RIGHT: ;画右边INT 10HINC DXCMP DX,END_YJNE RANK_RIGHTMOV CX, START_X ;下边起始点MOV SI,END_X第 8 页 共 18 页INC SIROW_DOWN: ;画下边INT 10HINC CXCMP CX,SIJNE ROW_DOWNMOV DX,START_Y ;右边起始点MOV
20、CX,START_XRANK_LEFT: ;画右边INT 10HINC DXCMP DX, END_YJNE RANK_LEFTPOP SIPOP DXPOP CXPOP BXPOP AXENDMDATAS SEGMENT;此处输入数据段代码 DATA1 DB 49h,56h,62h,66h,74h,83h,94h,10h ;音频表NUM DB ? ;NUM 为 8253 计数器初值的序号;白色琴键坐标ST_LX DW 50,61,72,83,94,105,116ST_MX DW 127,138,149,160,171,182,193ST_HX DW 204,215,226,237,248,2
21、59,270ST_Y DW 50ED_LX DW 60,71,82,93,104,115,126ED_MX DW 137,148,159,170,181,192,203ED_HX DW 214,225,236,247,258,269,280ED_Y DW 90;黑色琴键坐标BT_X DW 57,68,90,101,112DW 134,145,167,178,189 DW 211,222,244,254,265BT_Y DW 50BD_X DW 64,75,97,108,119DW 141,152,174,185,196DW 218,229,251,262,273第 9 页 共 18 页BD_Y
22、 DW 70;定义在屏幕绘制字START_COL DB ? ;存储起始行TEXT DB 16 ;起始行DB 2 ;起始列DB 31H ;字体颜色DB This Is My Curriculum Design,0FFHDB Thank You For Your Support,0FFHDB 1.PRESS 18 TO PLAY,0FFH DB 2.PRESS ESC TO EXIT,0FFH,0FFH ;显示字DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSMA
23、IN PROC NEARSTART: ;此处输入代码段代码CALL INIT ;调用初始化程序MOV BX,OFFSET DATA1 ;获取音频表SKY:MOV AH,07H ;无回显过滤的字符输入 AL=8 位数据INT 21HCMP AL,27 ;如果按 CTRL+C,退出JE EXIT1CMP AL,31H ;若 AL 小于 1,循环,否则继续执行程序,31H 是 ASKII 码1JL SKYCMP AL,38H ;若 AL 大于 8,循环,否则继续执行程序,38H 是 ASKII 码8JG SKYSUB AL,31H MOV AH,00HMOV DI,BX+SIMOV SI,AXMOV
24、 NUM,AL ;将所获取的键值赋给 8253 计数器第 10 页 共 18 页MOV AL,BXSI ;寄存器基址加变址寻址方式PUSH BX CALL INIT1CALL WAITFIN AL,61HAND AL,0FCHOUT 61H,AL ; 关闭扬声器 JMP SKYMAIN ENDP ;8253 初始化子程序INIT1 PROC NEAR ;选择方式三通道二 MOV DL,0AH ;控制扬声器声音MUL DL MOV DI,AXMOV AL,0B6H OUT 43H,ALMOV DX,0012H MOV AX,34DEHDIV DI OUT 42H,ALMOV AL,AHOUT 4
25、2H,ALIN AL,61H ;声音开始MOV AH,AL OR AL,03HOUT 61H,AL RETINIT1 ENDP;延时子程序WAITF PROC NEAR PUSH AX ;保护寄存器WAITF1: IN AL,61H ;读取 PB 端口值AND AL,10H ;低四位清零CMP AL,AH JE WAITF1 MOV AH,AL LOOP WAITF1 POP AX RET 第 11 页 共 18 页WAITF ENDP INIT PROC NEAR;初始化屏幕:画琴键MOV AX,DATASMOV DS,AXMOV AH,0 ;设置屏幕MOV AL,0DHINT 10H ;B
26、IOS 对屏幕及显示器所提供的服务程序MOV AH,0BHMOV BH,0MOV BL,09H ;背景色INT 10HCALL SHOW_TEXTDRAW 45,30,285,94,05H DRAWSQRE 45,30,285,94,0DHDRAWSQRE 49,48,280,49,00H LEA SI,ST_LX ;画 21 个白色键LEA DI,ED_LXMOV CX,21INIT_DRAW:DRAW SI,ST_Y,DI,ED_Y,0FHDRAW SI,90,DI,93,07H ;阴影ADD SI,2ADD DI,2LOOP INIT_DRAW LEA SI,BT_X ;画 15 个黑色
27、键LEA DI,BD_XMOV CX,15INIT_BLOCK:DRAW SI,BT_Y,DI,BD_Y,00HADD SI,2ADD DI,2LOOP INIT_BLOCK RET INIT ENDPSHOW_TEXT PROC NEAR;在屏幕上显示字符LEA DI,TEXT ;载入字符串首地址MOV DH,DI ;赋行值INC DI ;取得列第 12 页 共 18 页MOV DL,DI ;赋列值MOV START_COL,DL ;保存开始列MOV AH,2 ;设置光标位置MOV BH,0 ;0 页INT 10HINC DI ;取得颜色值MOV BL,DI ;赋颜色值CHAR_WRITE:
28、INC DI ;取得要显示的字符MOV AL,DICMP AL,0FFH ;行结束否JE BUMP_ROW ;下一行CMP AL,0 ;结束否JZ END_TEXTCALL SHOW_CHAR ;显示字符JMP CHAR_WRITE ;下一个字符END_TEXT:RETBUMP_ROW:INC DH ;下一行MOV DL,START_COL ;赋开始列值MOV AH,2 ;设光标位置MOV BH,0INT 10HJMP CHAR_WRITESHOW_TEXT ENDPSHOW_CHAR PROC NEAR;显示字符MOV AH,9 ;显示字符MOV BH,0 ;0 页MOV CX,1INT 10HINC DL MOV AH,2 ;设置光标位置MOV BH,0 ;0 页INT 10HRETSHOW_CHAR ENDP;退出 EXIT1: 第 13 页 共 18 页MOV AH,4CHINT 21HCODES ENDSEND MAIN参考文献1 戴梅萼,史嘉权.微型计算机技术与运用.清华大学出版社 2003.2 沈美明,温冬蝉.IBM-PC 汇编语言程序设计.清华大学出版社.2003.3 董方武.微机接口技术.中国水利水电出版社.2001.4 宋锦河.汇编语言程序设计.中国水利水电出版社.2001.