微机原理 音乐播放程序设计
微机原理与汇编实验-音乐程序
微机原理与汇编作业音乐程序实验目的: 了解 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)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线,随后修改了程序。
微机原理音乐程序设计
2.5.6 8254
图2.5 8254控制字
说明:
⑴8254每个通道对输入CLK按二进制或二十进制从预置值开始减1计数,减到0时从OUT输出一个信号。
⑵8254编程时先写控制字,再写时间常数。
2.5.7
⑴方式0:计数结束产生中断方式
对8255芯片PA0和PA6口的置0和1来选择歌曲。其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。
第二章
2.1
我们在这次课设选择了音乐程序设计,音乐程序设计可以实现至少两首歌的可选择播放。对于歌曲的播放我们采用的是计数器/定时器8254芯片,而对于选择哪首歌播放则是利用可编程并行接口8255A芯片来实现的。
基于8254定时计数接口芯片的工作原理,本次课设实现了音乐演奏系统程序设计。当运行程序时,扬声器便发出优美的音乐。首先要解决发声并发出相应音符声音的问题,由8254计数器0在初始化时用来产生一定频率的方波来使扬声器发声,再根据不同音符对应的频率写入计数初值发出相应的音符声。对8255芯片PA0和PA1口的置0和1来控制扬声器的开关。其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。
0.3
5
4
3
2
评阅教师评审成绩
(加权分合计乘以8)
分
加权分合计
评 阅 教 师 签 名:
年月日
课程 设 计 总评成 绩
微机原理课程设计 音乐播放器
微机原理课程设计音乐播放器微机原理课程设计-音乐播放器一.课程设计目的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高1do2621908#4fa#7400676#1do#2771805中5so7840638高2re2941700#5so#8310602#2re#3111608中6la8800568高3m3301516#6la#9320536高4fa3491433中7si9880506#4fa#3701350低1do10460478高5so3921276#do#11090451#5so#4151205低2re11750426高6la4401136#2re#12450402#6la#4661072低3m13180372高7si4941012低4fa13970358中1do5230956#4fa#14800338#1do#5540903低5so15680319中2re5780842#5s0#16610292#2re#6220804低6la17600284中3m6590759#6la#18650268中4fa6980716低7si19760253四.部分电路设计及功能解说1、频率出现电路使用8253产生音符频率。
微机原理课程设计
音乐演奏程序设计1设计任务使用汇编语言设计一个在计算机上运行的音乐演奏程序,屏幕显示钢琴图像,按“A”键唱乐曲,按“X”鍵退出。
2任务扩展实现以下附加功能之一:(1)按“B”键,播放暂停;(2)按“C”键,实现重复播放;(3)按“D”键,加快播放速度;(4)按“E”键,降低播放速度;(5)按“F”键,直接跳转到下首歌。
我选择的附加功能是按“F”键,直接跳转到下一首歌。
3程序设计3.1程序设计思路画钢琴界面时,先画出一个钢琴键,然后再用循环画出其余的钢琴键。
画单个钢琴键时,先画出下面的长方形,然后画出上面的平行四边形,然后画出右边的短横线,短横线也是用循环的方法画出那么多来的。
画完所有的钢琴键后,再单独画出最后一个键右边的平行四边形阴影。
实现下一首功能是通过改变FLAG的值,让FLAG自动加一,然后比较FLAG 里面的值,按顺序跳到相应的地址,播放相应的音乐。
当FLAG的值为3后,自动将FLAG值改为零,此时再按下“F”,FLAG的值就会加一,变为“1”,然后又开始播放第一首歌。
任何时刻按下“X”,就会退出程序。
3.2程序流程图单个钢琴键的绘制程序的流程图如下:图 3.1:单键绘制流程图整个钢琴键盘绘制程序的流程图如下:图3-2:钢琴键盘绘制流程图音乐播放程序的流程图如下:图3-3:音乐播放程序的流程图3.3程序清单汇编程序的所有源代码如下:;画横线DRAW_LINEX MACRO START_X,START_Y,END_X,COLOR LOCAL PAINTPUSH AXPUSH BXPUSH CXPUSH DXMOV CX,START_XMOV DX,START_Y ;设置起始坐标MOV AH,0CH ;写像素MOV AL,COLOR ;颜色设置MOV BX,0 ;在当前页操作PAINT:INT 10H ;调用中断进行画一个像素点INC CX ;每画一个像素点,横坐标加一CMP CX,END_X ;判断是否画完JNZ PAINT ;未画完,就继续画下一个像素POP DXPOP CXPOP BXPOP AXENDM; 画竖线DRAW_LINEY MACRO START_X,START_Y,END_Y,COLORLOCAL PAINT1PUSH AXPUSH BXPUSH CXPUSH DXMOV CX,START_XMOV DX,START_YMOV AH,0CHMOV AL,COLORMOV BX,0PAINT1:INT 10HDEC DX ;没画完一个像素点,纵坐标减一CMP DX,END_Y ;判断是否画完JNE PAINT1 ;未画完,继续画下一个像素点POP DXPOP CXPOP BXPOP AXENDM;画矩形DRAW_REGTANGLE MACRO START_X,START_Y,END_X,END_Y,COLOR LOCAL DRAW_NEXTPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,0CHMOV AL,COLORMOV BH,0MOV CX,START_XMOV DX,START_YDRAW_NEXT:INT 10HINC CXCMP CX,END_X ;判断一行是否画完JNE DRAW_NEXT ;未画完继续MOV CX,START_X ;回到起始横坐标DEC DX ;每画完一行,列坐标减一CMP DX,END_Y ;判断矩形是否画完JNE DRAW_NEXT ;未完继续画下一行POP DXPOP CXPOP BXPOP AXENDM;画右斜平行四边形DRAW_PARALLELOGRAMX MACRO START_X,START_Y,END_X,END_Y,COLOR LOCAL DRAWPXPUSH DSPUSH SSMOV SI,START_XMOV DI,START_Y ;设置起始坐标MOV BP,END_XDRAWPX:DRAW_LINEX SI,DI,BP,COLOR ;调用画横线宏INC SI ;每画完一行,横坐标起始点加一INC BP ;横坐标终点加一DEC DI ;纵坐标起始点减一CMP DI,END_Y ;判断是否画完JNE DRAWPX ;未画完,继续画下一行POP DSPOP SSENDM; 画阴影四边形DRAW_PARALLELOGRAMY MACRO START_X,START_Y,END_X,END_Y,COLOR LOCAL DRAWPYPUSH DSPUSH SSMOV SI,START_XMOV DI,START_YMOV BP,END_YDRAWPY:DRAW_LINEY SI,DI,BP,COLOR ;调用画竖线宏INC SI ;每画完一列,横坐标起始点加一 DEC BP ;纵坐标终点减一DEC DI ;纵坐标起始点减一CMP SI,END_X ;判断是否画完JNE DRAWPY ;未画完,继续画下一列POP SSPOP DSENDM;画间隙中的横线(侧边部分)DRAW_PARALINE1 MACRO START_X,START_Y,END_Y1,COLOR LOCAL NEXT_LINE1PUSH AXPUSH BXPUSH CXPUSH DXPUSHFPUSH DSMOV CX,START_XMOV DX,START_YMOV SI,START_XADD SI,2 ;横线长度为2MOV AH,0CHMOV AL,COLORMOV BX,0NEXT_LINE1:INT 10HINC CXCMP CX,SIJNE NEXT_LINE1MOV CX,START_XSUB DX,2 ;横线间间隙为2CMP DX,END_Y1JAE NEXT_LINE1POP DSPOPFPOP DXPOP CXPOP BXPOP AXENDM;画间键身间隙间的横线(键体部分)DRAW_PARALINE2 MACRO START_X,START_Y,END_Y2,COLOR LOCAL NEXT_LINE2,GO_ONPUSH AXPUSH BXPUSH CXPUSH DXPUSHFPUSH DSPUSH SSMOV SI,START_XMOV DI,START_YMOV BP,START_XADD BP,2 ;横线长度为2MOV AH,0CHMOV AL,COLORMOV BX,0GO_ON:ADD SI,2 ;每画完一条,起始横坐标加2 SUB DI,2 ;纵坐标减2ADD BP,2 ;终点横坐标加2MOV CX,SIMOV DX,DI ;重新设置起始点坐标NEXT_LINE2:INT 10HINC CX ;画完一个像素点,横坐标加一CMP CX,BP ;判断一条横线是否画完JNE NEXT_LINE2 ;未画完,继续画CMP DX,END_Y2 ;判断是否全部画完JA GO_ON ;未完,继续POP DSPOP SSPOPFPOP DXPOP CXPOP BXPOP AXENDMDATA SEGMENTWHITE DB 0FFHBLACK DB 0YELLOW DB 88HGRAY DB 8 ;键盘颜色定义STARTX DW 100 ;起始横坐标STARTY DW 300 ;起始纵坐标ENDX DW 130ENDY DW 280LASTX DW ?LASTY DW 200FLAG DB 1RATE DW ? ;播放速度变量INFO1 DB 0DH,0AH,'Welcome to this interface!$' INFO2 DB 0DH,0AH,'Please enter A to start!$'INFO3 DB 0DH,0AH,'OPTIONS:$'INFO4 DB 0DH,0AH,'WRONG ORDER!$'INFO5 DB 0DH,0AH,'INPUT AGAIN!$'INFO6 DB 0DH,0AH,'GO TO NEXT MUSIC!$'MUSLIST DB 0DH,0AH,'A: START'DB 0DH,0AH,'F: NEXT MUSIC'DB 0DH,0AH,'X: ESC'DB 0DH,0AH,'$' ;提示语;音乐一------------------------------------------------------------ MUS_FREG1 DW 330,294,262,294,3 DUP (330)DW 3 DUP (294),330,392,392DW 330,294,262,294,4 DUP (330)DW 294,294,330,294,262,-1MUS_TIME1 DW 6 DUP (25),50DW 2 DUP (25,25,50)DW 12 DUP (25),100;音乐二----------------------------------------------------------- MUS_FREG2 DW 330,392,330,294,330,392,330,294,330DW 330,392,330,294,262,294,330,392,294DW 262,262,220,196,196,220,262,294,332,262,-1MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100DW 2 DUP(50,50,25,25),100DW 3 DUP(50,25,25),100;音乐三----------------------------------------------------------- MUS_FREG3 DW 262,262,294,262,349DW 330,262,262,294,262DW 392,349,262,262,523DW 440,349,262,262,466DW 466,440,262,392,349,-1MUS_TIME3 DW 50,50,100,100,100DW 100,100,50,50,100,100DW 100,100,100,50,50,100DW 100,100,100,100,100,50DW 50,100,100,100,100,100 ;音乐段DATA ENDSSTACK SEGMENTDB 400 DUP ('STACK')STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: ;主程序MOV AX,DATAMOV DS,AXCALL PIANOCALL MUSIC_PLAY; 音乐播放子程序MUSIC_PLAY PROCSHOW MACRO b ;定义一个宏显示字符串LEA DX,bMOV AH,9INT 21HENDMADDRESS MACRO A,B ;音乐地址宏LEA SI,ALEA BP,DS:BENDMSHOW INFO1SHOW INFO2SHOW INFO3SHOW MUSLIST ;提示语INPUT:MOV AH,01HINT 21HCMP AL,'X'JZ RETU ;按下为‘X’则退出dosCMP AL,'A' ;按下为‘A’则播放音乐JZ A0 ;是则跳到A0SHOW INFO4SHOW INFO5JMP INPUT ;否则提示输入错误,重新开始A0:ADDRESS MUS_FREG1,MUS_TIME1MOV RATE,7500 ;设置正常播放速度CALL MUSICJMP AGAINF0:CMP AL,'F'JNZ EXITNEXT:SHOW INFO6ADD FLAG,1NUM1:CMP FLAG,1JNZ NUM2ADDRESS MUS_FREG1,MUS_TIME1CALL MUSICJMP AGAINNUM2:CMP FLAG,2JNZ NUM3ADDRESS MUS_FREG2,MUS_TIME2CALL MUSICJMP AGAINNUM3:MOV FLAG,0ADDRESS MUS_FREG3,MUS_TIME3CALL MUSICJMP AGAINRETU:MOV AH,4CHINT 21HAGAIN:SHOW INFO5JMP INPUTEXIT:SHOW INFO4 ;按键错误,重新选择 SHOW INFO5JMP INPUTRETMUSIC_PLAY ENDP;发声GENSOUND PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH DIMOV AL,0B6H ;开扬声器OUT 43H,ALMOV DX,12HMOV AX,348CHDIV DIOUT 42H,ALMOV AL,AHOUT 42H,ALIN AL,61HMOV AH,ALOR AL,3OUT 61H,ALWAIT1:MOV CX,RATE ;设置播放速度 CALL WAITFDELAY1:DEC BXJNZ WAIT1MOV AL,AHOUT 61H,ALPOP DIPOP DXPOP CXPOP BXPOP AXRETGENSOUND ENDPWAITF PROC NEARPUSH AXWAITF1:IN AL,61HAND AL,10HCMP AL,AHJE WAITF1MOV AH,ALLOOP WAITF1POP AXRETWAITF ENDPMUSIC PROC NEARPUSH DSSUB AX,AXPUSH AXFREG:MOV DI,[SI] ;获取频率值CMP DI,-1 ;音乐播放结束判断JE END_MUSMOV BX,DS:[BP]CALL GENSOUND ;播放一个频率ADD SI,2ADD BP,2 ;获取下一频率值,及其播放时间MOV AH,0BH ;判断键盘是否有键按下INT 21HCMP AL,0FFHJE INT9 ;有键按下则转去执行该指令JMP FREG ;无键按下则继续读取下一个频率值END_MUS:RETINT9:PUSHFPUSH AXPUSH DSPUSH ESPUSH CSPOP DSPUSH CSPOP ESIN AL,60H ;从键盘获取该键值ASCII码MOV AH,0INT 16H ;读取并保存到AL中CMP AL,'X' ;若为‘X’则退出dos操作界面JZ X0CMP AL,'F' ;若为‘F'则跳到下一首JZ NEXT1INT9_QUIT:POP ESPOP DSPOP AXPOPFJMP FREGX0:POP ESPOP DSPOP AXPOPFJMP RETUNEXT1:POP ESPOP DSPOP AXPOPFJMP NEXTMUSIC ENDP; 键盘绘图PIANO PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,0 ; 设置屏幕显示图形方式:每屏幕字符数80×25, 16色MOV AL,12HINT 10H ; 调用10H的0号功能中断; 键盘绘制主程序MOV CX,12DRAWING:CALL PIANO_DRAWCALL LINE_DRAWLOOP DRAWINGCALL PIANO_DRAWADD STARTX,30PUSH DXMOV DX,STARTXMOV LASTX,DXADD LASTX,80POP DXADD ENDX,30DRAW_PARALLELOGRAMY STARTX,STARTY,LASTX,ENDY,GRAY DRAW_LINEX 100,300,STARTX,GRAYPOP DXPOP CXPOP BXPOP AXRETPIANO ENDPPIANO_DRAW PROCDRAW_REGTANGLE STARTX,STARTY,ENDX,ENDY,WHITEDRAW_LINEX STARTX,ENDY,ENDX,GRAYDRAW_PARALLELOGRAMX STARTX,ENDY,ENDX,LASTY,WHITE RETPIANO_DRAW ENDPLINE_DRAW PROCDRAW_PARALINE1 ENDX,STARTY,ENDY,YELLOWDRAW_PARALINE2 ENDX,ENDY,LASTY,YELLOWADD STARTX,32ADD ENDX,32RETLINE_DRAW ENDPCODE ENDSEND START4程序运行与调试4.1运行程序把编好的源程序命名保存为YINYUE.asm,在MF2KP集成环境中进行调试,首先点运行选项中的调试,如果编译成功,就选择运行选项中的生成exe文件,这样就产生了一个可运行程序,然后点击运行,就会看到与题目要求相符的界面.程序运行截图:开始界面:图4-1:开始界面运行开始后显示钢琴界面,并显示提示语言。
《微机原理与应用》课程设计-电子音乐播放器模板
电子音乐播放器一、课程设计的目的和意义学习和掌握计算机中常用接口电路的应用和设计技术,学会针对不同的要求设计汇编程序代码,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。
通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学知识的应用能力以及分析问题解决问题的能力得到全面提高。
二、设计要求利用8254作为音阶频率发生器,应先对至少两段音乐进行编码后存入音符表,并建立好音阶表,每段音符长度不能少于60个,每首连续播放3遍后,自动播放下一段音乐,几段音乐播完后,循环播放,直到有键盘输入任意字符时停止,并且使用8255作为控制开关的并行输入接口,输入开关选择的音乐控制信号。
三、设计总框图四、设计设计思路说明:电子音乐播放器属于接口电路的连接使用,本设计是以8254芯片为核心的发生系统。
8086CPU 在形成系统总线后,通过和8254及8255的连接使用可以很好的驱动扬声器发音。
系统初始化后,8255通过B 通道,从控制开关读取所需的控制字,并送入8086CPU 中进行判断,选择不同的播放音乐。
使8254的通过0号计数器工作在“频率发生器”方式3,向发生器发出不同频率的方波。
当给定不同的计数初值时可以使扬声器发出不同频率的音响。
五、程序流程图开始 读取音符频率是1H 吗? N 是2H 吗? N 是4H 吗? Y Y N 键盘是否输入? 结束播放song1 播放song2 播放song3 Y N Y播放音乐 读取选择信号 CX=0 N Y六、接口电路原理图1、8254的基本知识8254占用4个端口,3个定时器各占1个,控制端口占1 个。
8254的内部结构如图所示,它主要包括以下几个主要部分:8254的内部结构(1).数据总线缓冲器实现8254与CPU数据总线连接的8位双向三态缓冲器,用以传送CPU向8254的控制信息、数据信息以及CPU从8254读取的状态信息,包括某时刻的实时计数值。
微机原理电子音乐课程设计
成绩:课程设计报告学院:题目:电子音乐专业:---------------班级:姓名:学号:指导教师:实验时间:电子音乐1.设计题目分析8254和8255是计算机中经常使用的两块芯片,在计算机中担负着相当重要的作用,8254 用作计数器,8255 可作为接口芯片。
这两块芯片可以通过汇编语言编程写入,改变它们的工作状态,实现某些特别的功能。
本课题是作为扬声器发声基准时钟,8254计数器0设置为工作方式3,用信号源1MHZ驱动扬声器产生音乐。
2.总体方案设计分析1、8254和 8255的连接。
(1)8254:计数器,用于产生一定频率的波形,是音频信号的来源。
其中芯片是否工作取决于其片选信号GATE0,输出的频率大小受控于编程时写入的计数器初值。
(2)8255:通用可编程并口芯片,这里用来做两个开关:一是用于控制与门,二是控制8254 的GATE0 引脚从而控制它的输出。
只有两个开关同时打开,扬声器才有可能发声。
(3)扬声器的驱动。
从结构图上可以看出,要使扬声器发出声音,需要满足以下几个条件:一是 8255 的 D0 和D1位必须置1,从而打开开关二是8254必须输出满足音频频率的波形。
只要通过对这两个芯片编程,控制其状态,使它们满足了这两个条件,扬声器就可以发声了。
2、系统中几个关键部分的实现。
(1)声音频率的变化。
声音频率的变化主要利用8254实现。
8254是在 PC/AT 以及以后系统中使用的一块可编程计数器。
该芯片包含3个独立但结构相同的计数电路,分别被称为0#、1#、2#计数器。
8254 占用 4 个地址,在 PC 机中的地址为40H~43H,其中 43H 对应 8254 的控制字,40H~42H 分别对应0#~3#计数器。
在 PC 机中,主要利用8254的2#计数器功能。
2#计数器是产生音频信号的关键器件,它的CLK0端为时钟输入信号,接入了 1MHz 的固定重复频率脉冲,在GATE0 端加入高电平且将 0#计数器设置为工作方式3,在 OUT0端口即可输出一定频率的方波,其频率为1MHz除以置入的计数分频初值。
微机原理课程设计-音乐播放器
WAIT1: MOV CX,6 DELAY1:LOOP DELAY1
DEC BX JNZ WAIT1
;设循环次数 6 ;循环 BX 次,即传进来的节拍时间
POP POP POP POP POP RET SPEAKER
DI DX CX BX AX
ENDP
;恢复堆栈
;_______歌曲乐谱_____________
回顾起此次微机原理课程设计,至今我组成员仍感慨颇多。从理论到实践, 在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西, 同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过 的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论
知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结 论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在 设计的过程中遇到问题,可以说得是困难重重,这毕竟是我们第一次做硬件设计, 难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对 以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说 8255A 芯片的使用, PROTUES 软件的应用技巧,对汇编语言掌握得不好……通过这次课程设计之后, 我们把以前所学过的知识又重新温故了一遍,起到了课程设计的预期效果。
MOV AL,10110110B OUT 46H,AL
;对计数器写控制字
MOV DX,00H MOV AX,5000 DIV DI OUT 44H,AL 8253 的通道 2 端口 MOV AL,AH OUT 44H,AL
;设置被除数 ;(DI)=频率,商→AL,余数→AH ;先送 LSB 最低有效位,44H 为
- 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芯片有了进一步的认识和理解,并能编写程序控制这两种芯片,实现简单的音乐播放程序。
在这次实验中,发现了拥有扎实基础功的重要性,以及在实验过程中发现了自己的不足之处,深刻理解了实践与理论相结合的重要性。
附件(乐曲简谱)。