汇编语言课程设计.doc_第1页
汇编语言课程设计.doc_第2页
汇编语言课程设计.doc_第3页
汇编语言课程设计.doc_第4页
汇编语言课程设计.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

燕山大学本科生课程设计报告 课程设计报告 设计题目:课设1.光标轨迹程序 课设2.利用定时器编写两只老虎乐曲 学 院 信息科学与工程学院 年级专业 学生姓名 学 号 指导教师 张忠平 何海涛 邹晓红 课程名称 汇编语言与接口技术 提交日期 2014年7月11日 21 摘 要 课程设计一在TDDEBUG上,利用0B800H 设置彩色适配器的单色显示缓冲区,在黑色的屏幕上显示光标轨迹,画城墙、水平线等图,光标的移动受键盘上光标键的控制,如果键入ESCape键,则程序结束,返回DOS,其中UP DOWN RIGHT LEFT ESC 的运动受ASCII码控制目 录 课设一第 1章 绪论41. 课题背景.4第2章课程设计4 2.1、课题设计目的.4 2.2、课题设计内容.4 2.3、课题中使用的关键技术及方法.4 2.3.1、位触发.4. 2.3.2、扬声器驱动.5 2.3.3、乐曲构成.6第3章、设计步骤63.1、设计思路63.2程序流程图63.3、关键代码段实现与分析7第4章、设计测试与结果94.1测试94.2.结果9附件.10. 课设二第1章、 绪论14 1.课题背景14. 第2章、课程设计142.1、课题设计目的.14.2.2、课题设计内容.142.3、课题中使用的关键技术及方法.14 2.3.1、定时器.14第3章、设计步骤153.1、设计思路153.2程序电路图15附件(程序段).16参考文献.22 第1章 绪论1.1、课题背景 完成了汇编语言程序设计的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。 第2章2.1、课程设计目的利用汇编学到的语言与接口知识,外加对计算机内部芯片的了解及音乐的一些知识完成用位触发编写两只老虎的乐曲。2.2、课程设计要求 程序能在屏幕上画出光标移动的轨迹,画城墙、水平线等图。光标的移动受键盘上光标键的控制,如果键入ESCape键,则程序结束,返回DOS2.3、课题中使用的关键技术及方法 ROM BIOS中有个BEEP子程序,这能根据BL种组出的时间计数值控制8253定时器,我们可以通过修改BEEP,使其产生任一声音,并且可以调整声音的持续时间。 发声程序包括3个步骤:1)在8253中的42端口送入一个控制字0B6,该控制字对定时器2进行初始化,使定时器2准备接收计数值。2)在8253中的端口42h装入一个16位的计数值(533H*895/频率),以建立将要产生的声音频率。3)把输出端口61H的PB0、PB1置1,发出声音。2.3.1、位触发程序直接控制PPI(8255)的输出控制器(61H)的第一位,使该位频率按照1和0交替变化,从而控制开关电路产生一串波形,这些波形放大后驱动扬声器发声,控制波形的脉宽和长度就可以产生不用频率不同时间的声音。扬声器发声通用子程序CFSOUND(网上查阅):Cfsound proc near Push dx Push ax 保存将要用到的寄存器 In al,61h Mov ah,al And al,11111100h 关断定时器2的门控 Sound:xor al,2 触发61h端口第1位 Out 61h,al Mov ax,2801Mov bx,50Mul bxDiv cx (cx)=freqMov dx,ax (dx)=控制脉宽的计数值Wait: loop waitMov ax,8Mu bxMov bx,ax (bx)=扩大8倍的节拍计时器Dec bx (bx)=脉冲持续的时间Jnz soundPop axPop dx 恢复寄存器MOV al,ahOut 61h,al 写回61h口的庋,关闭扬声器RetCfsound endp2.3.2、扬声器驱动 Pc机上的大多数I/O都是由主办上的8255可编程接口芯片PPI管理的。PPI包括8个寄存器,2个输入,1个输出。输入寄存器分配的I/O为60H和62H,输出为61H。由PPI输出寄存器中的0和1两位来控制扬声器的驱动方式。连接到扬声器的是定时器2.GATE2与端口61H的PB0,当PB0=1时,定时器2可以在模式3下工作。定时器2的OUT2与端口61H的PBI与扬声器驱动电路相连。当PBI=1时,允许OUT2输出信号到达扬声器。控制扬声器的代码:In al,16hMov ah,alOr al,03Out 61h,alMov al,ahOut 61h,al2.3.3、乐曲构成 乐曲是按照一定的高低、长短和强弱关系组成的已调,每个音符的音高和音长与频率和节拍有关。中高与频率如下表1 2 3 4 5 6 7262 294 330 349 392 220 494 第3章3.1、设计思路 编写这个乐曲程序可分为四个步骤 1)定义频率表和时间表 根据音阶表和简谱为演奏的乐曲定义了一个频率表FREQ和一个节拍时间表TIME。 2)将两个表的偏移地址放入SI和DI LEA SI,MUS_FREQ LEA BP,DS:MUS_TIME 3)取频率和时间 MOV di,si 4)调用SOUND子程序发出音调3.2、程序流程图 3.3、关键代码段实现与分析1.程序段说明1)datas为数据段,其中存放在程序中的所要显示的选择信息,还有乐曲的频率表和节拍表和键盘控制发声对应的音符表。2)CODES代码段,由于在整个程序中各个子程序都定义为NEAR,所以只需要一个代码段,各个子程序的定义及实现都放在其中。2.乐曲演奏程序的实现及分析 播放音乐的子程序完成的功能是通过SI(频率表的偏移地址)BP(节拍表的偏移地址)(通过主程序传来的参数)找到对应的频率(DI)、节拍(BX)外加DI,BX为参数调用SOUNDF子程序发声。 关键代码: FREQ: Mov di,si Cmp di,-1 Je end_music Call sound ;以DI(频率)、BX(节拍)为参数, add si,2 调用sound add bp,2 jmp freqsi,bp是频率表和节拍表的偏移地址,通过寄存器间接寻址方式找到数据段中定义数据,传递给BX、DI,然后调用SOUND发出一个频率为DI,节拍为BX的声音注意:在频率表中应该设置一个结束标志,“CMP DI,-1”,这里以-1为结束标志。2.SOUNDF通用程序的实现与分析 SOUNDF为传递过来的频率和节拍数,发出一个音符的频率的子程序。 关键代码分析: Mov al,0b6h Out 43h,al置43H为0B6H,选择计数器2,读/写LSB,MSB,模式3,计数值为2进制Mov dx,12hMov ax,348chDiv di按照公式计数值=12348Cf,商存在ax中 Out 42h,al Mov al,ah Out 42h,al8253的数据总线为8位,而计数值为16位,所以分两次传递计数值。 In al,61h Mov ah,al Or al,3 Out 61h,al用WAITF产生一个10MS的延时,BX是节拍(10ms的倍数)Mov al,ahOut 61h,al恢复寄存器状态4.WAITF延迟程序的实现与分析WAITF为通过监控口61H的PB4固定不变的触发时间来产生延迟时间的子程序。关键代码分析: Mov cx,663Waitf1:In al,61hAnd al,10h ;查看61h寄存器的第四位(PB4)Cmp al,ahJe waitf ;PB4每15.8秒发声一次Mov ah,alMOV ah,alLoop waitf1 第4章、设计测试与结果4.1、测试在TDDEBUG中进行了调试并改正了其中的错误。4.2、结果附件:datas segmentmessg1 dbWELCOME COME HERE!,$messg2 dbplay the two tigers?y/n,$messg3 db two tigers,$messg4 db the rythm is like this:,$messg5 db 1 2 3 1|1 2 3 1|3 4 5 -|,$messg6 db 3 4 5 -|56 54 3 1|56 54 3 1|,$messg7 db 2 5 1 -|2 5 1 -|,$ ;显示字符messg1-7定义 musfreq dw 2 dup (262,294,330,262) dw 2 dup (330,349,392) dw 2 dup (392,440,392,349,330,262) dw 2 dup (294,196,262),-1 ;musfreq是音符频率表的首地址,-1用来做结束标志 mustime dw 8 dup (100)dw 2 dup (100,100,200)dw 2 dup (4 dup (50),100,100)dw 2 dup (100,100,200) ;mustime是音符的持续时长表首地址 datas endsstacks segment para stack stackdb 64 dup (stack.)stacks endscodes segmentassume cs:codes,ds:datasmain proc farstart:push ds ;保存将要用到的寄存器ds sub ax,ax push ax ; 保存将要用到的寄存器axmov ax,datasmov ds,axlea dx,messg1mov ah,09hint 21hcall crlfcall crlf ;2号输出子程序crlf lea dx,messg2mov ah,09hint 21h ;输出字符串messg1、messg2 mov ah,1int 21h ;1号单字符输入 cmp al,4eh jz end_muscall instruction ;instruction是输出messg3-7的子程序lea si,musfreqlea bp,ds:mustimefreq:mov di,sicmp di,-1je end_musmov bx,ds:bpcall soundfadd si,2add bp,2jmp freqend_mus:mov al,48hout 61h,alret ;调用音频的子程序块main endpsoundf proc near ;发声程序块mov al,0b6h ;在8253的42端口送入0b6对计时器2进行初始化 out 43h,almov dx,12hmov ax,348chdiv di ;用端口号*896/freq产生任一频率 out 42h,almov al,ahout 42h,alin al,61h mov ah,alor al,3out 61h,al ;打开扬声器 wait1:mov cx,663*5call waitf ;dec bxjnz wait1mov al,ahout 61h,al ;关闭扬声器 retsoundf endpwaitf proc nearpush axwaitf1:in al,61hand al,10hcmp al,ahje waitf1mov ah,alloop waitf1 ;检测音频变化pop axwaitf endpinstruction proc nearlea dx,messg3mov ah,09hint 21h call crlf lea dx,messg4mov ah,09hint 21hcall crlflea dx,messg5mov ah,09hint 21hcall crlflea dx,messg6mov ah,09hint 21hcall crlflea dx,messg7mov ah,09hint 21hcall crlfinstruction endp ;边唱边显示messg3-7子程序块crlf proc nearmov dl,13 ;13:DC3(设备控制3)mov ah,2int 21hmov dl,10 ;10:DLE(数据链换码)mov ah,2int 21hretcrlf endp ;codes endsend start 第1章1.课题背景在汇编接口实验的基础上,利用定时器产生声音的方法编写程序,使PC机奏出两只老虎的乐曲。 第2章2.1、课题设计目的利用汇编学到的语言与接口知识,外加对试验箱里内部芯片的了解及音乐的一些知识完成用定时器编写两只老虎的乐曲。2.2、课题设计内容利用定时器产生声音的方法编写程序,使PC机奏出两只老虎的乐曲。提示: (1)乐谱中的每个音符具有音高和音长两种属性,按照乐谱将每个音符的频率和节拍定义成两个数据表,程序从频率表中取出一个音符的频率值以产生一定音高的声音,同时取出相应的节拍计数值以控制这一频率的声音延长的时间。 (2)每个音符的频率值Freq经过转换后送入定时器的42H端口,以产生相应频率的脉冲。转换的公式为:533H896Freq123280HFreq(或是12348CHFreq) (3)节拍时间表中存放的计数值是音长的110,如2拍的音长定为0.5秒,对应的计数值应为50,l拍的音长是0.25秒,对应的计数值应为25。然后控制LOOP指令反复执行2800n次来取得音符的延长时间(n为音长所对应的计数值)。(4)乐曲演奏完后,同样要完成对6lH端口的复位操作以避免死机。10ms延迟时间指令:WAIT: MOV CX, 2800DELAY: LOOP DELAY2.3、课题中使用的关键技术及方法 2.3.1、定时器(书上查阅) 利用机器硬件即INTEL8253/8254定时器产生声音的一种方法。 CPU通过对定时器的通道2(端口地址42H)进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。当定时器接收的计数值为533H时,能产生896Hz的声音,因此产生其他频率(freq)的计数值就可以由: 533H896/freq=1234dc/freq在送出频率计数值之前,还要给方式寄存器(端口其值为43H)送一个方式值,也称为幻数。这个幻数由8为组成即D7,D6,D5,D4,D3,D2,D1,D0选选择计数值的格式,1为BCD码格式,0为二进制格式。D3,D2D1选择操作模式,它决定了输出脉冲的形状。D5,D4读写指示位。D7,D6选择计数器,确定控制字是对哪一个计数器进行初始化。利用定时器产生声音的程序段: Mov al,10110110b 为组合格式:通道2,2字节技术,模式3,2进制码 Out 43h,al 幻数送方式寄存器 Mov dx,12h Mov ax,34dch Div di (di)=freq Out 42h,al 频率计数值送通道2 Mov al,ah Out 42h,al控制音长的时间可以简单的通过反复循环指令来实现。我们已经执行了2800次LOOP指令约需要10ms的倍数值来控制扬声器开关的时间间隔,就可以控制音长。具体的指令如下:10ms延迟时间指令:WAIT: MOV CX, 2800DELAY: LOOP DELAY 第3章、设计步骤3.1、设计思路1. 查阅定时器方法所使用的硬件的性能及使用方法2. 编写代码3. 纠错处理4. 运行3.2程序电路图附件:IOY3EQU 06C0HMY8254_COUNT0EQU IOY3+00H ;8254计数器0端口地址MY8254_MODEEQU IOY3+06H ;8254控制寄存器端口地址DATA SEGMENT DATA1 DB 0DH,0AH,please select ONE music!$DATA2 DB 0DH,0AH,input error,repeat!$DATA3 DB 0DH,0AH,ok,listen!$DATA4 DB 0DH,0AH,press c to continue! DB 0DH,0AH,$PLAYLIST DB 0DH,0AH,1 two tigers, DB 0DH,0AH,2 fenshuajiang, DB 0DH,0AH,K kuaifang DB 0DH,0AH,M manfang DB 0DH,0AH,Z zheng_chang DB 0DH,0AH,Q EXIT DB 0DH,0AH,$MUS_FREG1 DW 2 dup(262,294,330,262) ;两只老虎频率表 DW 2 dup(330,349,392) DW 2 dup(392,440,392,349,330,262) DW 2 dup(294,196,262),-1MUS_TIME1 DW 8 dup(8) ;两只老虎时间表 DW 2 dup(8,8,16) DW 2 dup(4,4,4,4,8,8) DW 2 dup(8,8,16) MUS_FREG2 DW 392,330,392,330,392,330,262,294,349,330,294,392 DW 392,330,392,330,392,330,262,294,349,330,294,262 DW 294,294,349,349,330,262,392 DW 294,349,330,294,392 DW 392,330,392,330,392,330,262 DW 294,349,330,294,262,-1 ;粉刷匠频率表MUS_TIME2 DW 2 dup(4,4,4,4,4,4,8,4,4,4,4,16) DW 4,4,4,4,4,4,8 DW 4,4,4,4,16 DW 4,4,4,4,16 ;粉刷匠时间表DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART: MOV AX,DATA ;数据段装入段寄存器DS MOV DS,AX MOV BX,0 TOOUT macro a LEA DX,a MOV AH,09h INT 21H endm ;显示字符串的宏if_error: TOOUT DATA1 TOOUT PLAYLIST INPUT: MOV AL,11H ;控制字 选择计数器0,读取低八位,方式0,二-十进制 MOV DX,MY8254_MODE OUT DX,AL MOV AL,1 ;输入一个电平 MOV DX,MY8254_COUNT0 OUT DX,AL MOV AH,01H ;键盘输入字符并回显 INT 21H CMP AL,Q JZ exit ;退出 CMP AL,p JZ pause ;暂停 CMP AL,K JZ kuai_fang ;快放 CMP AL,M JZ man_fang ;慢放 CMP AL,Z JZ zheng_chang ;正常放 CMP AL,1 JZ again1 CMP AL,2 JZ again2error: TOOUT DATA2 ;宏调用,输入错误,重新输入 JMP if_error kuai_fang:MOV BX,1 JMP SOUNDman_fang: MOV BX,-1 JMP SOUNDzheng_chang: MOV BX,0 JMP SOUND pause: TOOUT DATA3 TOOUT DATA4 MOV AH,01H ;键盘输入字符并回显 INT 21H CMP AL,C ;继续 JZ continue JMP INPUTcontinue: MOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,36H ;定时器0、方式3(方波发生器/分频器)、二进制OUT DX,AL JMP SOUNDagain1: MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,36H ;定时器0、方式3(方波发生器/分频器)、二进制 OUT DX,AL CALL MUSIC1again2: MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,36H ;定时器0、方式3(方波发生器/分频器)、二进制 OUT DX,AL CALL MUSIC2exit: MOV AH,4CH INT 21HMUSIC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论