微机原理 音乐播放程序设计
微机原理与汇编实验-音乐程序

微机原理与汇编作业音乐程序实验目的: 了解 IBM PC/XT 机内发音电路原理及发音电路中各接口芯片的作用。
掌握8253定时/记数器芯片和8255并行接口芯片的编程方法。
掌握音乐程序的设计、编程方法。
实验内容: 编程, 使计算机扬声器演奏乐曲《新年好》。
计算机发音的软、硬件基础:计算机扬声器控制电路如下图8253时钟频率1.19318Mhz扬声器控制电路由上图可见, 计算机扬声器的发音由机内 8253 芯片(定时/计数器)和8255 芯片 (并行接口) 共同控制。
当 8255 PB0 端(B 口 0 端•)•为•1 •时,8253 通道 2 的输出端 (OUT2)便输出一定频率的方波信号; 当 8255 PB1 端(B 口 1 端) 也为 1 时, 此信号就可经驱动、低通后送往扬声器发音。
8253 OUT2 端输出方波的频率取决于通道2设置的分频值, 频率值与分频值的关系为:1.19318MHz/频率值=1234dch/频率值=分频值(其中 1.19318MHz 是 8253 的时钟频率)设置 8253 芯片, 使扬声器发音的程序段为:mov al,0b6h (8253 初始化: 选通道 2, •输出方波信号。
•out 43h,al 43H 是 8253 芯片控制口的口地址)mov dx,12hmov ax,34dchdiv di (计算分频值, 赋给 ax。
di 中存放声音的频率值。
)out 42h,almov al,ah (向通道 2 写入分频值, 先写低字节, 后写高字节。
out 42h,al 42H 是 8253 芯片通道 2 的口地址). . . (软件延时)设置 8255 芯片, 扬声器进行开/关操作的程序段为:in al,61hmov ah,al (读取 8255 B口的八位数据。
61H 是 8255 B口的口地址)or al,3 (所读数据和 3 相或, 使低两位置 1)out 61h,al (将相或后的数据再写入 8255 B口, 开扬声器)......mov al,ahout 61h,al (将读取的原数据再写入 8255 B口, 关扬声器)需编程演奏的乐曲如下:C 调音符和发音频率(Hz)的对应关系如下表:音符频率音符频率音符频率1 138 1 262 1 5242 147 2 294 2 5873 165 3 330 3 6594 175 4 349 4 6985 196 5 392 5 7846 220 6 440 6 8807 247 7 494 7 988其中,每个音符的音长由软件延时实现。
简易电子音乐播放程序设计

简易电子音乐播放程序设计西南科技大学通信工程微机原理课程设计软件运行环境:Masm for Windows源程序清单STACK SEGMENTDB 64 DUP(' ')STACK ENDS;***************************************************DATA SEGMENT;*************************文件定义***************************FILE DB'C:\001.txt' , 0 ;文件名BUF DW256 DUP(0) ;文件内容暂存区ERROR_MESSAGE DB0AH , 'ERROR !' , '$';出错时的提示HANDLE DW?;保存文件号;*************************提示信息*************************** MSG1 DB45 DUP(' '),'Now the music is <<Do Rai mi fa suo la xi>> ',13,10,'$';define 13--回车,10--换行,$--字符串结束符MSG2 DB45 DUP(' '),'Now the music is <<Mary had a little lamb>>',13,10,'$'MSG3 DB 45 DUP(' '),'Now read the music data in the file is: ',13,10,'$'MSG4 DB 45 DUP(' '),'error! please change anther NO.: ','$';报错提示;*************************菜单列表*************************** MENU DB 5 DUP(' '),'****************************************',13,10 DB 5 DUP(' '),' welcome to music player ',13,10DB 5 DUP(' '),'****************************************',13,10DB 5 DUP(' '),' ~~~~~~~~~~~ ~~~~~~~~~~~~ ',13,10DB 5 DUP(' '),' ~ ~~~~ ~~~~ ~~~ ~~~ ~~~ ',13,10DB 5 DUP(' '),' ,%%%%%%%%, ',13,10DB 5 DUP(' '),' ,%%/\%%%%/\%% * ',13,10DB 5 DUP(' '),' ,%%%\c "" J/%%% *** ',13,10DB 5 DUP(' '),' %. %%%%/ o o \%%% ***** ',13,10DB 5 DUP(' '),' `%%. %%%% _ |%%% ******** ',13,10DB 5 DUP(' '),' `%% `%%%%(__Y__)%%% | | ',13,10DB 5 DUP(' '),' // ;%%%%`\-/%%%’ | | ',13,10DB 5 DUP(' '),' (( / `%%%%%%% ~~ play ~~ ',13,10DB 5 DUP(' '),' \\ . | 4~ ',13,10DB 5 DUP(' '),' \\ / \ | | 3~ ',13,10DB 5 DUP(' '),' \\/ ) | | 2~ ',13,10DB 5 DUP(' '),' \ /_ | |__ ==>1~ ',13,10DB 5 DUP(' '),' (___________)))))))~~~~ ~ ~~~~ ',13,10DB 5 DUP(' '),'~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ ~~~~~~~ ',13,10DB 5 DUP(' '),'~~~~~~ The list of songs ~~~~~~~~~~~ ',13,10DB 5 DUP(' '),'~~~~~~ 1:Do Rai mi fa suo la xi; ~~~~ ',13,10DB 5 DUP(' '),'~~~~~~ 2:Mary had a little lamb; ~~~~ ',13,10DB 5 DUP(' '),'~~~~~~ 3:MusicData in file 4:Exit ~~~~ ',13,10DB 5 DUP(' '),'please choose the number of music:','$',13,10;***************************内存音乐****************************** MUS_FREG1 DW 221,248,278,294,330,371,416 ;内存音乐1DW 441,495,556,589,661,742,833DW 882,990,1112,1178,1322,1484,1665 ;频率表DW-1 ;-1作为结尾标志 MUS_TIME1 DW 7 DUP(25) ;节拍表DW 7 DUP(50)DW 7 DUP(75)MUS_FREG2 DW 330,294,262,294,330,330,330 内存音乐2DW 294,294,294,330,392,392DW 330,294,262,294,330,330,330,330DW 294,294,330,294,262DW-1MUS_TIME2 DW 6 DUP(25),50 ;DUP是重复定义指令,DW 2 DUP(25,25,50)DW 12 DUP(25),100DATA ENDS;***************************************************CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK ;段说明MAIN PROC FAR ;主程序开始MOV AX,DATA ;初始化,将段基址装入寄存器MOV DS,AXDISPLAY:CALL CLEARSCREENMOV AH,0MOV AL,0EHINT 10H ;设置为彩色图形模式MOV AH,0BHMOV BH,0MOV BL,1 ;设置彩色显示时的颜色INT 10HLEA DX,MENU ;取菜单有效地址MOV AH, 9 ;DOS功能调用,显示字符串INT 21HINPUT:MOV AH,01H ;DOS功能调用,从键盘输入INT 21HCMP AL,'1'JE ONECMP AL,'2'JE TWOCMP AL,'3'JE THREECMP AL,'4'JE QUITLEA DX,MSG4MOV AH, 9INT 21HJMP INPUTONE:LEA DX, MSG1 ;取得内存音乐1正在播放信息有效地址MOV AH, 9INT 21HLEA SI,MUS_FREG1 ;取得音乐1频率有效地址LEA BP,DS:MUS_TIME1 ;取得音乐1持续时间有效地址JMP PLAY ;跳转进行音乐播放TWO:LEA DX, MSG2MOV AH, 9INT 21HLEA SI,MUS_FREG2LEA BP,DS:MUS_TIME2JMP PLAYTHREE:LEA DX,MSG3MOV AH, 9INT 21HCALL READFILELEA SI,MUS_FREG1LEA BP,DS:BUFPLAY:MOV DI,[SI] ;将频率值一一赋给DICMP DI,-1 ;检测是否音乐结束JE DISPLAYMOV BX,DS:[BP] ;音乐未结束则送去去相应的持续时间值CALL SOUNDADD SI,2 ;取下一个频率值ADD BP,2 ;取下一个时间值JMP PLAY ;继续循环JMP DISPLAYQUIT:MOV AH,4CH ;退出INT 21HMAIN ENDP;***************************************************SOUND PROC NEAR ;发声子过程PUSH AX ;保护现场PUSH BXPUSH CXPUSH DXPUSH DIMOV AL,10110110B ;8253控制字,2号定时器,方式3,2进制码OUT 43H,AL ;调用43H端口MOV DX,12H ;1193100/频率=12348CH/频率主频约为1.193MHZMOV AX,348CHDIV DI ;(DX,AX)/DIOUT 42H,AL ;写入低字节MOV AL,AH ;再写高字节OUT 42H,ALIN AL,61H ;读取8255状态MOV AH,AL ;保存端口原来的值OR AL,3 ;将8255 PB1与PB2的值置1OUT 61H,AL ;接通扬声器;PB1和PB0分别接通扬声器和门控信号WAIT10ms: ;使用硬件延时法CX寄存器必须装入15.08微秒的倍数N MOV CX,663 ;663*15.08US约为10MSCALL WAITFDELAY:LOOP DELAYDEC BX ;BX为每个音符的持续时间10ms的倍数,即延时的初值JNZ WAIT10msMOV AL,AHOUT 61H,AL ;还原8255 PB0与PB1的值POP DIPOP DX ;恢复现场POP CXPOP BXPOP AXRETSOUND ENDP;***************************************************CLEARSCREEN PROC NEAR ; 清屏子程序MOV AH,6 ;调用BIOS功能,实现清屏MOV AL,0MOV BH,7MOV CH,0 ;从左起0行0列到右起40行80列全部清屏MOV CL,0MOV DH,40MOV DL,80INT 10HMOV DX,0MOV AH,2INT 10HRETCLEARSCREEN ENDP;***************************************************WAITF PROC NEAR ;硬件延时子程序PUSH AXWAITF1:IN AL,61H ;通过监控端口61H和PB4,使PB4每15.08微秒触发一次,产生一个固定不变的时间基准AND AL,10HCMP AL,AHJE WAITF1MOV AH,ALLOOP WAITF1POP AXRETWAITF ENDP;***************************************************READFILE PROC NEARPUSH AX ;保护现场PUSH BXPUSH CXPUSH DXSTART1:MOV DX , OFFSET FILEMOV AL , 0MOV AH , 3DHINT 21H ;打开文件JC ERROR ;若打开出错,转ERRORMOV HANDLE , AX ;保存文件号MOV BX , AXMOV CX , 255MOV DX , OFFSET BUFMOV AH , 3FHINT 21H ;从文件中读255字节→BUFJC ERROR ;若读出错,转ERRORMOV BX , AX ;实际读到的字符数送入BXMOV BUF[BX] , '$';在文件结束处放置一“$”符MOV DX , OFFSET BUFMOV AH , 9INT 21H ;显示文件内容MOV BX , HANDLEMOV AH , 3EHINT 21H ;关闭文件JNC END1 ;若关闭过程无错,转到END1处返回DOSERROR:MOV DX , OFFSET ERROR_MESSAGEMOV AH , 9INT 21H ;显示错误提示END1:POP DX ;恢复现场POP CXPOP BXPOP AXRETREADFILE ENDP;***************************************************CODE ENDSEND MAIN。
(完整word版)微机原理课程设计音乐播放器

一、课程设计的任务和目的课程设计题目:音乐播放器课程设计的实现目的:本课程设计主要是通过汇编语言用软件编程的方法实现简单的音乐播放功能。
通过在《微机原理与接口技术》课程上所学的汇编知识和8253/8254芯片相关知识,来完成本课程设计;用汇编程序完成键控音乐播放器的,用8253/8254定时器来产生声音。
该播放器有若干首歌曲可以选择,开始时输出说明,要用户选择要播放的歌曲,然后根据用户按键进行播放、退出或出错提示。
通过课程设计环节来加强对所学知识的理解和应用。
二、课程设计相关知识2.1 定时/计数器8253/58254在微机及控制系统中,经常要用到定时信号。
如系统的日历时钟,动态存储器刷新。
对外部执行机构控制时也需要定时中断、定时检测、定时查询等。
定时的方法主要是两种:软件定时:利用指令的执行时间设计循环程序,使CPU 执行延迟子程序的时间就是定时时间。
缺点:执行延迟时,CPU 一直被占用,降低了CPU 的效率。
硬件定时:用计数器/定时器作为主要硬件,在软件简单指令的控制下产生精确的时间延迟。
突出优点为计数时不占用CPU 时间,如利用定时器/计数器产生中断信号,可建立多作业环境,提高了CPU 效率。
作为定时器可用8253或者8254,二者功能基本相同,知识工作的最高频率不一样。
本实验就采用了8254,其主要功能为:(1)每片上有3 个独立的16 位的减计数器通道。
(2)对于每个计数器,都可以单独作为定时器或计数器使用,并且都可以按照二进制或十进制来计数。
(3)每个通道都有6 种工作方式,都可以通过程序设置或改变。
(4)每个计数器的速率可高达10MHz。
主要部分有:数据总线缓冲器、读/写控制逻辑、控制字寄存器、计数通道0#、1#、2#:内部结构如下图:8254内部结构2.2 8254外部引脚8254芯片是具有24个引脚的双列直插式集成电路芯片,其引脚分布如图所示。
8254芯片的24个引脚分为两组,一组面向CPU,另一组面向外部设备,各个引脚及其所传送信号的情况,介绍如下:8254的引脚(1)D7~D0:双向、三态数据线引脚,与系统的数据线连接,传送控制、数据及状态信息。
微机原理课程设计乐曲演奏程序设计与实现

1乐曲演奏程序设计与实现1.1设计目的1.掌握可编程计数器/定时器8253的工作原理及应用。
2.掌握并行接口芯片8255的工作原理及应用。
1.2设计内容1.确定每个音符的发声频率,以确定乐曲演奏的音调。
2.确定每个音符的节拍长度,以确定乐曲演奏的节奏。
3.完成乐曲演奏程序的编写与调试。
1.3设计要求1.基本要求:用软件定时方法控制乐曲的演奏节奏。
2.提高要求:用PC机内部定时器0控制乐曲的演奏节奏。
3.更高要求:由键盘输入的值决定乐曲演奏的节奏。
1.4设计原理与硬件电路(一)发声原理PC系统板上8253的接口电路如上图所示,8253包括3个独立的16位计数器和1个控制字寄存器,系统分配给8253的端口地址为40H~43H。
PC机上的大多数输入/输出(I/O)都是由系统插件板上的8255(或8255A)可编程外围接口芯片(PPI)管理的。
8255包括3个数据端口和1个控制端口,系统分配给8255的端口地址为60H~63H。
当8255的PB端口(61H)的第0位为1时,控制8253定时器来驱动扬声器,当第1位为1时,扬声器的门电路接通,并一直保持到位1变为0时关闭。
即控制电路能以位触发和定时器控制两种不同的方式驱动扬声器发声。
下面主要介绍利用定时器产生声音的原理。
利用机器硬件8253定时器可以产生声音。
CPU通过对定时器2(端口地址为42H)进行编程,使其寄存器接收一控制声音频率的16位计数值,8255端口B的PB0 和PB1均为1时扬声器才可以发声,发声得频率由OUT2决定,以产生特殊的音响。
当定时器2工作在方式3下接收的计数值为533H时,能产生896Hz的声音,因此产生其它频率(Freq)的计数值就可由下式计算出来:533H×896÷Freq=1234DCH÷Freq当定时器2用于发声时,一般采用模式3,在模式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。
微机原理课程设计——音乐播放器

一.课程设计目的1.通过D/A装换器产生模拟信号,使PC机作为简易音乐播放器。
2.了解利用数模转换器产生音乐的基本方法。
二.课程设计任务设计并实现一个键控音乐播放器。
要求:(1)自己选用合适的芯片,不少于两种。
(2)自行设计电路并使用汇编语言编写程序完成键控音乐播放器功能。
(3)该播放器有若干首歌曲可以选择,开始时输出说明,要用户选择要播放的歌曲,然后根据用户按键进行播放、退出或出错提示。
三、总体设计方案1、总体设计方案一所有音乐都是由各个不同频率的音阶和其延续时间的长短来实现的。
不同的音乐是由各个音阶按某种排列各自播放一定时间形成的,将各音乐音阶和其延续时间存在数据段中,然后根据不同按键值选择不同的音阶和时间表,再使用计数器产生该音阶频率。
而我们学过的有计数器可以产生各种频率,所以我们主要采用计数器8253产生各音符,用8255并行接口来控制扬声器的开关,达到播放音乐的功能。
2、总体设计方案二可以使用0832(数模转换器)来产生频率,原理图:提出这个方案是因为我想产生模拟信号,来驱动扬声器,这样产生的声音更加圆润感觉更连续,效果更好点。
我们想把一个周期的波形分成32份,然后每份给8253一个值让他转换成模拟信号,不同的频率可以用8253计数器控制,比如要产生261Hz的频率,使用1MHz的话,周期就为1/261=3.83ms,分成32份,每份间隔时间就是3.83ms/32=0.12ms,换句话说就是送计数器0的初值为1M/261/32=120次。
3、各个音符的对应频率表:音符频率/HZ 半周期/us 音符频率/HZ 半周期/us低1DO 262 1908 #4FA# 740 0676#1DO# 277 1805 中5SO 784 0638低2RE 294 1700 #5SO# 831 0602#2RE# 311 1608 中6LA 880 0568低3M 330 1516 #6LA# 932 0536低4FA 349 1433 中7SI 988 0506#4FA# 370 1350 高1DO 1046 0478低5SO 392 1276 #DO# 1109 0451#5SO# 415 1205 高2RE 1175 0426低6LA 440 1136 #2RE# 1245 0402#6LA# 466 1072 高3M 1318 0372低7SI 494 1012 高4FA 1397 0358中1DO 523 0956 #4FA# 1480 0338#1DO# 554 0903 高5SO 1568 0319中2RE 578 0842 #5S0# 1661 0292#2RE# 622 0804 高6LA 1760 0284中3M 659 0759 #6LA# 1865 0268中4FA 698 0716 高7SI 1976 0253四.部分电路设计及功能解说1、频率发生电路使用8253产生音符频率。
音乐播放器的实现及LCD显示微机原理课程设计

微机原理与接口技术课程设计报告题目:音乐播放器的实现及LCD显示学院:信息学院专业:物联网班级:2012240901学号:201224090105姓名:章杭目录一、课程设计任务及要求...............................1.1 课程设计题目.........................................................................1.2 课程设计任务及要求.............................................................二、课程设计相关知识...................................2.1 8254芯片.................................................................................2.2 8255芯片..................................................................................2.3 12864液晶................................................................................三、程序设计思路...........................................3.1 设计思路说明.......................................................................3.2 电路图连接...........................................................................四、代码程序说明...........................................五、调试结果及分析.......................................六、总结与体会...............................................一、课程设计任务及要求1.1 课程设计题目音乐播放器的实现1.2 课程设计任务及要求要求用TCP-ZK实验箱及PC机的连接实现音乐播放功能,并在12864液晶屏上显示所放音乐的歌名。
微机基本原理与接口技术音乐演奏程序设计
微机基本原理与接口技术音乐演奏程序设计目录一概述 (2)二设计过程 (3)三程序设计 (8)四运行结果 (13)五课设总结 (13)参考文献 (14)一、概述汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。
借助于汇编程序,计算机本身可以自动地把汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。
1.1课程设计的目的掌握一些程序设计的基本方法,要指导主程序,子程序以及推栈段的使用,.了解通用发声程序.了解与掌握定时.计数.音乐.频率.时间之间的关系,学会用发声程序的设计方法,学会用汇编语言编辑音乐程序.1.2课程设计的要求1.2.1 基本原理基于8253定时计数接口芯片的工作原理,本次课设实现了音乐演奏系统程序设计。
当运行程序时,扬声器便发出优美的音乐,当唱完一首歌曲时,程序运行自动结束。
首先要解决发声并发出相应音符声音的问题,由8253计数器2在初始化时用来产生一定频率的方波来使扬声器发声,再根据不同音符对应的频率写入计数初值发出相应的音符声。
对8255芯片pc0和pc6口的置0和1来控制扬声器的开关。
其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把BX是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。
1.2.2 要求(1)熟悉电路,理解各个元件之间的控制流程,了解PC机扬声系统的电路结构,学习扬声系统发声的编程方法。
(2)熟悉MFID平台的运行环境,利用MFID实验平台和音乐发生器模块进行硬件连接,理解乐谱知识,熟悉音频转换表和节拍的延长时间,使PC机扬声系统按节拍演奏连续的音乐。
(3)熟练掌握汇编语言,调用中断子程序和端口函数对端口进行读写数据的操作,写出设计分析过程。
1.2.3 任务(1)曲谱转换(2)分析电路图(3)画出程序流程图(4)编写代码(5)程序分析与调试1.2.4 运行环境(1)WINDOWS2000/XP系统(2)MFDI实验平台(3)VC编译环境二、设计过程2.1、硬件连线图1 硬件连接图2、主程序流程图:图2 主程序流程图3、控制音符的演奏时间控制音符的演奏时间,是设计音乐程序的关键问题。
微机原理 电子音乐播放器报告
《微机原理》课程设计报告评阅成绩评阅教师评阅时间题目:电子音乐播放器专业班级:电子信息科学与技术0810 班设计学生:完成时间:2010年12月15 日湖南文理学院物理与电子科学学院设计题目电子音乐播放器设计要求利用8253作为音阶频率发生器,应先对一段音乐进行编码后存入音符表,并建好音阶表(只建一个八度即可),音符长度不能少于60个,连续播放三遍即可停止。
设计思路用频率发生器74LS393给定时/计数器8253提供一个固定频率的时钟信号,通过给8253输入计数值,以输出对应C调DOU、RUAI、MI、FA、SOU、LA、XI 、DOU(高)的不同频率。
在通过延时下一计数值的输入,控制节拍时间。
最后输入扬声器就会有对应音乐播放。
硬件设计:⑴、频率发生器74LS393的T7端输入到8253的CLOCK0端,提供15.625kHz的时钟信号,⑵、定时/计数器8253的GATE0接﹢5V,提供高电平;⑶、定时/计数器8253的OUT0接扬声器驱动模块的SIN端口;⑷、扬声器驱动模块的J5端口接扬声器的J5端口。
连接图如下框中的系统设计原理图。
程序设计:见下程序流程图。
8253的计数值N=;fifcTcTi=15625;其中=fc现。
延时下一音符的读取实而每个音符的节拍通过表中读取由其中;frequencyfi对应的C调的DOU、RUAI、MI、FA、SOU、LA、XI 、DOU(高)频率为264、297、330、352、396、440、495、528;8253的控制字端口为43H,0、1、2计时器输入端口地址分别为40H、41H、42H 。
系统设计原理图程序流程图源程序:写入8253,计时赋值延时开始三次播放结束74LS393T7YCLOCK0GATE0扬声器驱动SIN J5扬声器8253OUT0+5V定义端口号NCODE SEGMENTASSUME CS:CODEorg 1000hSTART: JMP TCONTTCONTRO EQU 0043H ;8253控制口地址0043H TCON0 EQU 0040H ;定时计数器0地址0040H TCONT: mov cx,64 ;写入计数值jixu: mov ax,64sub ax,cxmov bx,axmov al, cs:[bx+offset data1] ;查音阶表mov cs:[4000h],alcall set8253 ;调用8253设置call delay ;调用延时程序loop jixujmp tcont ;循环delay: push cx ;延时mov cx,01ffhdelay1: call delay2loop delay1pop cxretdelay2: push cxmov cx,0ffhdelay3: loop delay3pop cxretset8253: MOV DX,TCONTRO ;8253写控制字MOV AL,36HOUT DX,ALMOV DX,TCON0 ;8253定时计数器0工作在方式3MOV AL,byte ptr ds:[4000h]OUT DX,ALMOV AL,00HOUT DX,ALretdata1: db24,20,30,30,27,24,40,40,30,27,24,20,27,27,27,27,24,20,30,30,27,24,36,36,27,40,27,24,30,3 0,30,30,18,18,20,20,18,18,30,30,24,18,24,20,27,27,27,27,24,20,30,30,27,24,36,36,27,40,27 ,24,30,30,30,30CODE ENDSEND START设计总结:经过1个星期的课程设计,完成任务的效果和预想中有很大的出入,以为是一个简单的实验,也没有查阅资料,直到调试的时候,来编程,才发现有困难!即时大框架做好了,也很可能失败,很多小细节时我们不容忽视的。
微机原理课程设计 音乐演奏
摘要 (1)音乐演奏 (2)1 设计任务及要求分析 (2)1.1设计任务 (2)1.2要求分析 (2)2 方案比较与选择 (3)2.1方案一 (3)2.2方案二 (3)2.3方案选择 (3)3 系统原理说明 (3)4 硬件电路与原理 (4)5 软件设计 (5)5.1屏幕显示程序设计 (5)5.2发声的原理与控制程序 (7)5.3音乐编程 (8)5.3.1音乐节拍时间 (9)5.3.2音乐的音符频率 (10)5.4 程序流程图 (12)5.5 源程序 (14)6调试记录及结果分析 (20)结束语 (22)参考文献 (23)附录 (24)随着科学技术的迅猛发展,计算机在各个领域的应用越来越广泛。
计算机已成为人们生活、学习、工作中必备的工具。
其中,汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。
借助于汇编程序,计算机本身可以自动地把汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。
音乐演奏实现的一个主要步骤是乐谱编程。
通过相应的频率表将乐谱中对应的音符转化为计数器的计数初值,节奏通过延时程序利用硬件实现频率计数和延时时间的控制,利用8253-5定时/计数器芯片和8255A并行I/O接口芯片。
使8253的一个通道工作在“方波发生器”模式,实现对频率的计数;利用8255A的PB3端口实现发声时间的计数控制。
转化为对喇叭发音时间的控制,从而实现音符和节拍的数字化。
知道了音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表;然后编写程序一次取出表中的频率和时间值,调用程序发出各种声音。
这个程序最终通过菜单所提示的信息选取音乐。
以80X86未处理器为对象,以8253为计数器的核心,通过宏指令和BOIS系统功能的调用,以及运用MASM软件在PC机上来进行调试和运行,从而模拟地来实现“音乐演奏”的目的。
微机原理音乐播放程序设计
实验报告(2016 / 2017 学年第二学期)课程名称微机原理与接口技术实验名称音乐播放程序设计实验时间2017 年 6 月13 日学院电子信息学院指导教师严华学生学号学院(系) 电子信息学院专业光电信息科学与工程1、实验目的通过编写程序控制8253和8255A芯片,实现一个简单的音乐播放程序。
2、实验原理我们在这次课设选择了音乐程序设计,音乐程序设计可以实现至少两首歌的可选择播放。
对于歌曲的播放我们采用的是计数器/定时器8253芯片,而对于选择哪首歌播放则是利用可编程并行接口8255A芯片来实现的。
基于8253定时计数接口芯片的工作原理,本次课设实现了音乐演奏系统程序设计。
当运行程序时,扬声器便发出优美的音乐。
首先要解决发声并发出相应音符声音的问题,由8253计数器0在初始化时用来产生一定频率的方波来使扬声器发声,再根据不同音符对应的频率写入计数初值发出相应的音符声。
对8255芯片PA0和PA1口的置0和1来控制扬声器的开关。
其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。
3、实验容A.实验环境搭建B. 编程由于选取的乐曲音符音调幅度较大,故利用表格,算出其初值计数初值= 1193180 (8253输入频率)/ 音符频率以下为程序代码#include <dos.h>#include <stdio.h>#define INIT_T2 0xb6#define PORT_T2 0x42#define CTRL_T 0x43#define PORT_PB 0x61#define DDO 4554#define DRUI 4058#define DMI 3616#define DFA 3419#define DSO 3044#define DLA 2712#define DXI 2415#define DO 2281#define RUI 2033#define MI 1811#define FA 1709#define SO 1522#define LA 1356#define XI 1208#define GDO 1140#define GRUI 1015#define GMI 905#define GFA 854#define GSO 761#define GLA 678#define GXI 604void sing(unsigned int frq,unsigned int ms) {unsigned char value;union{unsigned int divisor;unsigned char d[2];}tone;if (frq!=0){tone.divisor=frq;outportb(CTRL_T,INIT_T2); outportb(PORT_T2,tone.d[0]); outportb(PORT_T2,tone.d[1]);value=inportb(PORT_PB); outportb(PORT_PB,(value|0x03));}delay(ms);outportb(PORT_PB,(value|0xfc)); }void main(){sing(DSO,400);sing(DLA,400);sing(DO,400);sing(RUI,400);sing(MI,600);sing(RUI,200);sing(RUI,400);sing(DO,400);sing(DLA,1600);sing(0,1600);sing(DSO,400);sing(DLA,400);sing(DO,400);sing(RUI,400);sing(MI,400);sing(SO,800);sing(RUI,2000);sing(0,2000);sing(RUI,800);sing(DSO,400);sing(RUI,400);sing(RUI,400);sing(MI,400);sing(RUI,400);sing(DO,1600);sing(0,2000);sing(RUI,400);sing(RUI,400);sing(RUI,400);sing(DSO,400);sing(DLA,400);sing(DO,400);sing(DLA,2000);sing(0,2000);sing(FA,800);sing(FA,400);sing(MI,400);sing(RUI,400);sing(DO,400);sing(0,2000); sing(RUI,400); sing(RUI,400); sing(RUI,400); sing(RUI,400); sing(DSO,400); sing(DLA,400); sing(DO,400); sing(DLA,2000); sing(0,2000); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(LA,2000); sing(0,2000); sing(LA,400); sing(LA,400); sing(LA,400); sing(GDO,400); sing(LA,400); sing(LA,400); sing(SO,2000); sing(0,2000); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(LA,400); sing(GDO,400); sing(LA,2000); sing(0,800); sing(SO,400); sing(LA,400); sing(GRUI,400); sing(GMI,2800); sing(GRUI,3200); sing(0,1600); sing(SO,400); sing(LA,400); sing(GDO,400); sing(GRUI,400); sing(GMI,600); sing(GRUI,200); sing(GRUI,400); sing(GDO,400); sing(LA,3200); sing(SO,400); sing(LA,400);sing(GRUI,400); sing(GMI,600); sing(GSO,600); sing(GRUI,3600); sing(0,400); sing(GRUI,400); sing(GRUI,400); sing(SO,400); sing(GRUI,400); sing(GRUI,400); sing(GMI,400); sing(GRUI,400); sing(GDO,3200); sing(0,400); sing(GRUI,400); sing(GRUI,400); sing(GRUI,400); sing(SO,400); sing(LA,400); sing(GDO,400); sing(LA,3600); sing(0,1600); sing(LA,3200); sing(0,400); sing(GFA,400); sing(GFA,400); sing(GFA,400); sing(GMI,400); sing(GRUI,400); sing(GDO,400); sing(GMI,400); sing(GRUI,1600); sing(0,1600); sing(0,400); sing(GFA,400); sing(GFA,400); sing(GLA,400); sing(GSO,400); sing(GFA,400); sing(GMI,400); sing(GRUI,2000); sing(0,2000); sing(GRUI,400); sing(GRUI,400); sing(SO,400); sing(GRUI,400); sing(GRUI,400); sing(GMI,400); sing(GRUI,400); sing(GDO,1600); sing(0,2000);sing(GRUI,400);sing(GRUI,400);sing(SO,400);sing(LA,400);sing(GDO,400);sing(LA,3600);}运行结果如下4、实验中遇到的问题一开始程序中的#define DDO 4554语句为#define 1DO 4554,程序运行时显示编译出错,我意识到1DO有可能不符合宏名定义要求,通过查阅有关资料后发现,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线,随后修改了程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告( 2016 / 2017 学年第二学期)课程名称微机原理与接口技术实验名称音乐播放程序设计实验时间2017 年 6 月13 日学院电子信息学院指导教师严华学生姓名学号学院(系) 电子信息学院专业光电信息科学与工程1、实验目的通过编写程序控制8253和8255A芯片,实现一个简单的音乐播放程序。
2、实验原理我们在这次课设选择了音乐程序设计,音乐程序设计可以实现至少两首歌的可选择播放。
对于歌曲的播放我们采用的是计数器/定时器8253芯片,而对于选择哪首歌播放则是利用可编程并行接口8255A芯片来实现的。
基于8253定时计数接口芯片的工作原理,本次课设实现了音乐演奏系统程序设计。
当运行程序时,扬声器便发出优美的音乐。
首先要解决发声并发出相应音符声音的问题,由8253计数器0在初始化时用来产生一定频率的方波来使扬声器发声,再根据不同音符对应的频率写入计数初值发出相应的音符声。
对8255芯片PA0和PA1口的置0和1来控制扬声器的开关。
其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。
3、实验内容A.实验环境搭建B. 编程由于选取的乐曲音符音调幅度较大,故利用表格,算出其初值计数初值= 1193180 (8253输入频率)/ 音符频率以下为程序代码#include <dos.h>#include <stdio.h>#define INIT_T2 0xb6#define PORT_T2 0x42#define CTRL_T 0x43#define PORT_PB 0x61#define DDO 4554#define DRUI 4058#define DMI 3616#define DFA 3419#define DSO 3044#define DLA 2712#define DXI 2415#define DO 2281#define RUI 2033#define MI 1811#define FA 1709#define SO 1522#define LA 1356#define XI 1208#define GDO 1140#define GRUI 1015#define GMI 905#define GFA 854#define GSO 761#define GLA 678#define GXI 604void sing(unsigned int frq,unsigned int ms) {unsigned char value;union{unsigned int divisor;unsigned char d[2];}tone;if (frq!=0){tone.divisor=frq;outportb(CTRL_T,INIT_T2);outportb(PORT_T2,tone.d[0]);outportb(PORT_T2,tone.d[1]);value=inportb(PORT_PB);outportb(PORT_PB,(value|0x03));}delay(ms);outportb(PORT_PB,(value|0xfc));}void main(){sing(DSO,400);sing(DLA,400);sing(DO,400);sing(RUI,400);sing(MI,600);sing(RUI,200);sing(RUI,400);sing(DO,400);sing(DLA,1600);sing(0,1600);sing(DSO,400);sing(DLA,400);sing(DO,400);sing(RUI,400);sing(MI,400);sing(SO,800);sing(RUI,2000);sing(0,2000);sing(RUI,800);sing(DSO,400);sing(RUI,400);sing(RUI,400);sing(MI,400);sing(RUI,400);sing(DO,1600);sing(0,2000);sing(RUI,400);sing(RUI,400);sing(RUI,400);sing(DSO,400);sing(DLA,400);sing(0,2000); sing(FA,800); sing(FA,400); sing(MI,400); sing(RUI,400); sing(DO,400); sing(RUI,2000); sing(0,2000); sing(RUI,400); sing(RUI,400); sing(RUI,400); sing(RUI,400); sing(DSO,400); sing(DLA,400); sing(DO,400); sing(DLA,2000); sing(0,2000); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(LA,2000); sing(0,2000); sing(LA,400); sing(LA,400); sing(LA,400); sing(GDO,400); sing(LA,400); sing(LA,400); sing(SO,2000); sing(0,2000); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(LA,400); sing(GDO,400); sing(LA,2000); sing(0,800);sing(SO,400); sing(LA,400); sing(GRUI,400); sing(GMI,2800); sing(GRUI,3200); sing(0,1600); sing(SO,400); sing(LA,400); sing(GDO,400); sing(GRUI,400); sing(GMI,600); sing(GRUI,200); sing(GRUI,400); sing(GDO,400); sing(LA,3200); sing(SO,400); sing(LA,400); sing(GDO,400); sing(GRUI,400); sing(GMI,600); sing(GSO,600); sing(GRUI,3600); sing(0,400);sing(GRUI,400);sing(GRUI,400);sing(GRUI,400);sing(GMI,400);sing(GRUI,400);sing(GDO,3200);sing(0,400);sing(GRUI,400);sing(GRUI,400);sing(GRUI,400);sing(SO,400);sing(LA,400);sing(GDO,400);sing(LA,3600);sing(0,1600);sing(LA,3200);sing(0,400);sing(GFA,400);sing(GFA,400);sing(GFA,400);sing(GMI,400);sing(GRUI,400);sing(GDO,400);sing(GMI,400);sing(GRUI,1600);sing(0,1600);sing(0,400);sing(GFA,400);sing(GFA,400);sing(GLA,400);sing(GSO,400);sing(GFA,400);sing(GMI,400);sing(GRUI,2000);sing(0,2000);sing(GRUI,400);sing(GRUI,400);sing(SO,400);sing(GRUI,400);sing(GRUI,400);sing(GMI,400);sing(GRUI,400);sing(GDO,1600);sing(0,2000);sing(GRUI,400);sing(GRUI,400);sing(GRUI,400);sing(SO,400);sing(LA,400);sing(GDO,400);sing(LA,3600); }运行结果如下4、实验中遇到的问题一开始程序中的#define DDO 4554语句为#define 1DO 4554,程序运行时显示编译出错,我意识到1DO有可能不符合宏名定义要求,通过查阅有关资料后发现,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线,随后修改了程序。
5、总结体会通过本实验的学习,我对8253和8255A芯片有了进一步的认识和理解,并能编写程序控制这两种芯片,实现简单的音乐播放程序。
在这次实验中,发现了拥有扎实基础功的重要性,以及在实验过程中发现了自己的不足之处,深刻理解了实践与理论相结合的重要性。
附件(乐曲简谱)。