admin 管理员组文章数量: 1086019
我和我的祖国
我和我的祖国
一、背景、目的、意义
随着计算机的不断更新发展,计算机在各个领域的应用越来越多,更多的软件开发人员和相关技术人员在程序设计的过程中应用汇编程序或编制汇编语言。而汇编语言作为计算机专业大学生必修课,每个作为本专业的学生对汇编的理解和学习就显得尤为重要。汇编语言是计算机能够提供用户使用的最快而又最好最有效的与言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。因而,对程序的空间和时间要求很高的场合,汇编语言的应用就显得必不可少了,一些直接控制硬件的应用场合,则更是非用汇编语言不可了。
《我和我的祖国程序设计》是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。因此,要求我们能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。通过具体的问题分析、设计、调试、运行程序。在实际问题中锻炼提高自己,增加了对本门课程内容的理解,锻炼了动手能力。
二、 需求分析
频率表
利用计算机控制发声的原理,可以编写演奏乐曲的程序。乐曲是按照一定的高低、长短和强弱关系组成的音调。在一首乐曲中,每个音符的音高和音长与频率和节拍有关。低音阶从低C(130.8Hz)到中C(261. 7Hz),高音阶从中C到高C(523.3Hz)。组成乐曲的每个音符的频率值和持续时间是乐曲程序发声所需要的两个数据。音符的频率可以从图表中查到,但实际上送人计数器2的是输人频率1. 1931MHz与音符频率相除的值,通用发声程序SOUNDF的前半部分就是完成这个计算,并将计数值送人计数器2的功能。
我和我的祖国乐谱
音符的持续时间是根据乐曲的速度及每个音符的节拍数来确定的。在4/4(四四拍)中,四分音符为1拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍,八分音符持续半拍等。如果给全音符分配1s(100×10ms)的时间,则二分音符的持续时间为0.5s(50×10ms),四分音符的持续时间为0.25s(25×10ms),八分音符的持续时间为0.125s(12.5×10ms)。
三、 源代码
STACK SEGMENT PARA STACK 'STACK'DB 1000 DUP('STACK...')
STACK ENDS
DSEG SEGMENT PARA 'DATA'
;******************我和我的祖国********************
MUS_FREQ DW 392,440,392,349,330,294,262,196
DW 262,330,524,494,440,330,392,392
DW 440,494,440,392,349,330,294,220
DW 247,220,196,392,262,294,330,330
DW 392,440,392,349,330,294,262,196
DW 262,330,524,494,587,524,440,440
DW 524,494,440,392
DW 440,392,349,330
DW 247,220,196,294,262,262
DW 524,587,659,587,524,440,494,440,330,392,392
DW 524,587,659,587,524,440,494,392,330,440,440
DW 392,349,330,294,247,220,196,330,349,294,262,262,262,-1
MUS_TIME DW 6 DUP (16),50,50
DW 7 DUP (16),45
DW 6 DUP (16),45,45
DW 4 DUP (16),30,16,25,25
DW 6 DUP (16),45,45
DW 4 DUP (16),30,16,25,25
DW 3 DUP (16),45
DW 3 DUP (16),45
DW 30,16,30,16,30,30
DW 6 DUP (16),30,30
DW 5 DUP (16),16,3 DUP (16),25,30
DW 16,16,16,45,16,16,16,45,45,16,16,45,16,16,16,16
;-------------------------------------------
CSEG SEGMENT PARA 'CODE'ASSUME CS:CSEG,DS:DSEG,SS:STACK
MUSIC PROC FAR ;主函数MOV AX,DSEGMOV DS,AXLEA SI,MUS_FREQ ;分别将两个表的偏移地址放入SI,BPLEA BP,DS:MUS_TIME
FREQ:MOV DI,[SI] ;从表中取出音符的频率放入DI,读下一个频率CMP DI,-1 ;音调结束时退出JE END_MUSMOV BX,DS:[BP] ;取出音符的持续时间放入BXCALL SOUNDF ;调用发声子程序ADD SI,2 ;更新指针ADD BP,2JMP FREQ
END_MUS:MOV AX,4C00H ;返回DOSINT 21H
MUSIC ENDP
;------------------------------------------------------
SOUNDF PROC NEAR ;发声子程序PUSH AX ;保存寄存器PUSH BXPUSH CXPUSH DXPUSH DI ;指定频率MOV AL,0B6H ;计数器二控制扬声器发声,控制字0B6H(二进制格式,高低字都写)OUT 43H,AL ;公用控制寄存器端口地址43HMOV DX,12H ;1193100Hz/给定频率MOV AX,384CHDIV DI OUT 42H,AL ;写timer2到低字节MOV AL,AHOUT 42H,AL ;写timer2到高字节IN AL,61H ;获得当前端口设置MOV AH,AL ;保存到AHOR AL,3 ;打开扬声器OUT 61H,AL
WAIT1: MOV CX,65534 ;等待指定时间间隔
DELAY: LOOP DELAYDEC BXJNZ WAIT1MOV AL,AH ;恢复端口值OUT 61H,ALPOP DI ;恢复寄存器POP DXPOP CXPOP BXPOP AXRET ;退出
SOUNDF ENDP
CSEG ENDSEND MUSIC
本文标签: 我和我的祖国
版权声明:本文标题:我和我的祖国 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1693413383a220504.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论