最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

乐曲课程设计

来源:动视网 责编:小OO 时间:2025-10-02 07:32:24
文档

乐曲课程设计

附件1:学号:0120710340419课程设计题目乐曲程序的设计和实现学院计算机科学与技术专业计算机院班级0704姓名林显超指导教师胡家宝2010年1月15日课程设计任务书学生姓名:林显超专业班级:0704指导教师:胡家宝工作单位:计算机科学与技术学院题目:乐曲程序的设计与实现初始条件:理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握
推荐度:
导读附件1:学号:0120710340419课程设计题目乐曲程序的设计和实现学院计算机科学与技术专业计算机院班级0704姓名林显超指导教师胡家宝2010年1月15日课程设计任务书学生姓名:林显超专业班级:0704指导教师:胡家宝工作单位:计算机科学与技术学院题目:乐曲程序的设计与实现初始条件:理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握

附件1:

学   号: 

0120710340419

课 程 设 计

题    目

乐曲程序的设计和实现
学    院

计算机科学与技术
专    业

计算机院
班    级

0704
姓    名

林显超
指导教师胡家宝
2010115
课程设计任务书

学生姓名:  林显超      专业班级:    0704             

指导教师:  胡家宝      工作单位:计算机科学与技术学院 

题目: 乐曲程序的设计与实现

初始条件:

理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。

实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。

要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

进一步理解和掌握程序直接控制I/O方式,掌握计算机发声程序的设计。具体的设计任务及要求:

1.采用位触发方式编写程序,使计算机发出音响并奏出《两只老虎》的乐曲。

1)通过查阅相关资料,进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。

2)一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,给出乐曲的频率表;设二分音符持续时间为0.5秒(50*10ms),50作为2拍的计数值,给出乐曲的节拍时间表;

3)编写程序并调试通过。

2.进一步学习利用定时器产生声音的方法,使计算机奏出乐曲(例如《两只老虎》等)。

在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。

阅读资料:

1)《IBM—PC汇编语言程序设计实验教程》3.1节

2)《IBM—PC汇编语言程序设计(第2版)》10.4节,10.5节

时间安排:

设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试,和验收。

周5:撰写课程设计报告。

指导教师签名:                       年    月    日

系主任(或责任教师)签名:           年    月    日

                                        目录

1)设计内容及要求;

2)设计中使用的关键技术和方法;

3)设计方案说明:包括对程序结构的描述和对各功能模块的说明(功能定义、入口参数和出口参数等),详细的算法描述(采用流程图或伪代码),主要数据结构的定义和说明,程序界面的描述;

4)测试及评估;

5)设计心得:包括设计中遇到的问题及思考,对该程序进一步改进扩展的设想;

6)致谢,参考文献(按公开发表的规范书写);

7)附录:源程序清单。

1. 设计内容及要求:

1.1采用位触发方式编写程序,使计算机发出音响并奏出《两只老虎》的乐曲。

1.1.1通过查阅相关资料,进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。

1.1.2一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,给出乐曲的频率表;设二分音符持续时间为0.5秒(50*10ms),50作为2拍的计数值,给出乐曲的节拍时间表;

1.1.3编写程序并调试通过。

1.2进一步学习利用定时器产生声音的方法,使计算机奏出乐曲(例如《两只老虎》等)。

2. 设计中使用的关键技术和方法;

  2.1使用位触发式输出:直接控制输出端口的PB1交替为1或0,以产生一个脉冲电流,经过放大器后控制扬声器交替地接通与断开,从而催动扬声器的纸盆振动,发出不通音高和音长的声音。

2.2产生的各种各样的频率的声音可以由下列公式计算出来:

   1193100%给定频率=12348cH%给定频率

2.3音符的音高和音长与频率和节拍有关,组成每个音符的频率值和持续时间是乐曲程序发声的两个数据,因此要定义两个数据表,一个是音符频率值表,一个是音符持续时间表。

音符的持续时间是根据乐曲的速度及每个音符的节拍数来确定。在4/4拍中,四分音符为1拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍,八分音符持续半拍等。如果给全音符分配1s(100*10ms)的时间,则二分音符的持续时间为0.5s(50*10ms),四分音符的持续时间为0.25s(25*10ms),八分音符的持续时间为0.125s(12.5*10ms)。

2.4定时器内部有3个工作的计数器:counter0,counter1,counter2,每个计数器都分配有一个端口地址,分别为40H,41H,42H,还有一个公共端口43H

3. 设计方案说明:包括对程序结构的描述和对各功能模块的说明(功能定义、入口参数和出口参数等),详细的算法描述(采用流程图或伪代码),主要数据结构的定义和说明,程序界面的描述;

 3.1定义段segment

      stack_segment segment

      dw 512 dup(?)

stack_segment ends

 3.2段中包含的音乐频率music_freq和时间music_time

           music_freq  dw ????

 

           music_time  dw  ?????

   3.3编写发音子程序

    gensound proc near

       push dx                     ;保存将要用到的寄存器

       mov al,0b6h                  ;向8253-5/8254-2计数器2写控制字

       out 43h,al                    ;方式3、双字节写和二进制计数方式写到控制口

       mov dx,8h                   ;设置被除数

       mov ax,3208h            

       div cx

       out 42h,al                   ;先送LSB

       mov al,ah

       out 42h,al                   ;后送MSB

       in al,61h                    ;读8255端口B(61H)原值

       mov ah,al                   ;保存端口原值

       or al,3

       out 61h,al                   ;接通扬声器

l3:    push dx

       push ax

       mov dx,8h

       mov ax,0f05h

s1:    sub ax,1

       sbb dx,0

       jnz s1

       pop ax                     ;恢复寄存器

       pop dx

       dec bx                     ;循环持续BX次

       jnz l3

  

       mov al,ah                  ;写回61H口原值,关闭扬声

       out 61h,al

       pop dx

       ret                        ;子程序结束返回

  gensound endp

;----------------------------------------------------------------------------

3.4编写主程序

 code_segment segment

    assume cs:code_segment,ds:data_segment,ss:stack_segment

main proc far

start:

       mov ax,data_segment

       mov ds,ax

       mov ax,stack_segment

       mov ss,ax

       lea dx,messg1               ;输出提示信息1

       mov ah,09h

       int 21h   ;//显示调用 

       lea dx,messg2         ;输出提示信息2

       mov ah,09h

       int 21h

       lea dx,messg3          ;输出提示信息3

       mov ah,09h

       int 21h

input: mov ah,01h   ;输入字符,比较字母Q,如果是Q,则转入 exit

       int 21h

       cmp al,'Q' 

       jz  exit                    ;若输入为q,退出

l0:     lea dx,messg4    ;输出提示信息4

       mov ah,09h

       int 21h  ;  显示调用

       lea dx,buf_substring;传送DX地址到buf_substring

       mov ah,0ah

       int 21h

       lea si, buf_substring+2  ;传送DX地址到buf_substring+2

       mov bl, [si]               ;判断次数    

       cmp bl, 30h

       jc error    比较BL,30H ,然后转向error

       cmp bl, 3ah  比较

       jnc  error

       mov flag,bl

       sub flag,30h       

str:   mov si,offset music_freq

       mov di,offset music_time       

l1:    mov cx,[si]

       cmp cx,-1

         je l2      

       mov bx,[di]

       call gensound

       add si,2

       add di,2

       jmp l1

l2:                

       dec flag

       jnz str

       jmp exit

error:  lea dx,messg5

       mov ah,09h

       int 21h

       jmp l0

exit:   mov ah,4ch                  ;返回dos

       int 21h

main endp

4测试及评估;

4.1输入歌曲《两只老虎》的乐谱

   1 2 3 1 1 2 3 1 3 4 5 – 3 4 5 –

   56 54 3 1 56 54 3 1 1 5 1 – 1 5 1 –

    music_freq  dw 262,294,330,262

          dw 262,294,330,262

          dw 330,349,392

          dw 330,349,392

          dw 392,440,392,349,330,262

          dw 392,440,392,349,330,262

          dw 294,196,262

          dw 294,196,262,-1

    music_time  dw 800,800,800,800 

          dw 800,800,800,800 

          dw 800,800,800

          dw 800,800,800

          dw 400,400,400,400,800,800

          dw 400,400,400,400,800,800

          dw 800,800,800 

          dw 800,800,800

4.2测试结果

  WELCOME COME HERE!

IT IS A MUSIC PROGRAM !

SELECT! (Q: EXIT , OTHER KEY: CONTINUE )2

PLEASE INPUT TIMES : 5

输入后,会有两只老虎的曲调出现,当修改曲谱的频率和时间,出现其他声响,列如把持续时间减半,则会出现很快速响起的两只老虎的曲调,如果输入频率改变,则会出现不是两只老虎的曲调

5. 设计心得:包括设计中遇到的问题及思考,对该程序进一步改进扩展的设想;

5.1问题

由于此程序是调用主板上的小喇叭发音的,在一些主板没有喇叭的电脑上运行则会没有声音发出。

5.2改进扩展设想

设计中是使用调用发音子程序来实现发声的,该程序只是能简单的实现乐曲的发音,并没有过多的人性化功能,希望能改进有友好界面,有更多选着调试各种音频和持续时间的功能发音程序。

  5.3小结思考

这次实验对扬声器的驱动方式有了很大的认识,也对位触发方式有更多的认识,定时器用来发出声音是我之前一直没有想到过的,经过了这次实验,让我认识到微命令在调用计算机硬件方面的快速并且直接使用方式。既然能运用来发出乐曲声响,也能运动到更多方面去,以后要多加熟悉汇编微命令的使用。

6.致谢,参考文献

6.1《IBM—PC汇编语言程序设计实验教程》实验2.4

6.2《IBM—PC汇编语言程序设计(第2版)》例6.11

6.3www.baidu.com网上资料查询

7.源程序清单

;---------------------------------------------------------------------------

stack_segment segment

      dw 512 dup(?)

stack_segment ends

;-----------------------------------------------------------------------------

data_segment segment

    string db 2,?,2 dup(?)

    messg1 db 'WELCOME COME HERE!','$'

    messg2 db 0ah,0dh,'IT IS A MUSIC PROGRAM !','$'

    messg3 db 0ah,0dh,'SELECT! (Q: EXIT , OTHER KEY: CONTINUE )','$'

    messg4 db 0ah,0dh,'PLEASE INPUT TIMES : ','$'

    messg5 db 0DH,0AH,'INPUT ERROR!$'

    buf_substring    db 10

                    db ?

                    db 10 dup(?)

                    db '$'

    music_freq  dw 262,294,330,262

          dw 262,294,330,262

          dw 330,349,392

          dw 330,349,392

          dw 392,440,392,349,330,262

          dw 392,440,392,349,330,262

          dw 294,196,262

          dw 294,196,262,-1

    music_time  dw 800,800,800,800 

          dw 800,800,800,800 

          dw 800,800,800

          dw 800,800,800

          dw 400,400,400,400,800,800

          dw 400,400,400,400,800,800

          dw 800,800,800 

          dw 800,800,800 

    flag db ?             

data_segment ends

;------------------------------------------------------------

code_segment segment

    assume cs:code_segment,ds:data_segment,ss:stack_segment

main proc far

start:

       mov ax,data_segment

       mov ds,ax

       mov ax,stack_segment

       mov ss,ax 

       lea dx,messg1               ;输出提示信息1

       mov ah,09h

       int 21h   

       lea dx,messg2        

       mov ah,09h

       int 21h

       lea dx,messg3        

       mov ah,09h

       int 21h

input: mov ah,01h   

       int 21h

       cmp al,'Q' 

       jz  exit                    ;若输入为q,退出

l0:     lea dx,messg4    

       mov ah,09h

       int 21h 

       lea dx,buf_substring

       mov ah,0ah

       int 21h

       lea si, buf_substring+2  

       mov bl, [si]               ;判断次数    

       cmp bl, 30h

       jc error    

       cmp bl, 3ah 

       jnc  error

       mov flag,bl

       sub flag,30h       

str:   mov si,offset music_freq

       mov di,offset music_time       

l1:    mov cx,[si]

       cmp cx,-1

       je l2      

       mov bx,[di]

       call gensound

       add si,2

       add di,2

       jmp l1

l2:                

       dec flag

       jnz str

       jmp exit

error:  lea dx,messg5

       mov ah,09h

       int 21h

       jmp l0

exit:   mov ah,4ch                  ;返回dos

       int 21h

main endp

;---------------------------------------------------------------------

gensound proc near

       push dx                     ;保存将要用到的寄存器

       mov al,0b6h                  ;向8253-5/8254-2计数器2写控制字

       out 43h,al                    ;方式3、双字节写和二进制计数方式写到控制口

       mov dx,8h                   ;设置被除数

       mov ax,3208h            

       div cx

       out 42h,al                   ;先送LSB

       mov al,ah

       out 42h,al                   ;后送MSB

       in al,61h                    ;读8255端口B(61H)原值

       mov ah,al                   ;保存端口原值

       or al,3

       out 61h,al                   ;接通扬声器

l3:    push dx

       push ax

       mov dx,8h

       mov ax,0f05h

s1:    dec ax

       sbb dx,0

       jnz s1

       pop ax                     ;恢复寄存器

       pop dx

       dec bx                     ;循环持续BX次

       jnz l3

  

       mov al,ah                  ;写回61H口原值,关闭扬声

       out 61h,al

       pop dx

       ret                        ;子程序结束返回

  gensound endp

;----------------------------------------------------------------------------

  code_segment ends

;-------------------------------------------------------------------------------

  end start

本科生课程设计成绩评定表

班级:0704   姓名:林显超    学号:0120710340419

序号评分项目满分实得分
1学习态度认真、遵守纪律10
2设计分析合理性10
3设计方案正确性、可行性、创造性20
4设计结果正确性40
5设计报告的规范性10
6设计验收10
总得分/等级

评语:
注:最终成绩以五级分制记。优(90-100分)、良(80-分)、中(70-79分)、

及格(60-69分)、60分以下为不及格

                      指导教师签名:

                  200  年 月 日

文档

乐曲课程设计

附件1:学号:0120710340419课程设计题目乐曲程序的设计和实现学院计算机科学与技术专业计算机院班级0704姓名林显超指导教师胡家宝2010年1月15日课程设计任务书学生姓名:林显超专业班级:0704指导教师:胡家宝工作单位:计算机科学与技术学院题目:乐曲程序的设计与实现初始条件:理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top