《微型计算机原理与接口技术》课程设计音乐播放器课程设计.doc
学号0000000 微型计算机原理与接口技术课 程 设 计( 2008级本科)题 目:音乐播放器课程设计系(部)院: XXXXXX学院 专 业: 电气工程及其自动化 作者姓名: X X X 指导教师: XX 职称: 教授 完成日期: 20XX 年 X 月 XX 日微机原理与接口技术课程设计成绩评定表姓 名XXX学 号0000000专业班级电气工程及其自动化课程设计题目:音乐播放器课程设计课程设计答辩或质疑记录:成绩评定依据:评 定 项 目评 分 成 绩1.选题合理、目的明确(10分)2.设计方案可行性、创新性(20分)3.设计结果(系统原理图、源程序、调试运行结果)(30分)4.平时成绩(态度认真、遵守纪律)(10分)5.设计报告的规范性、参考文献充分(不少于5篇)(10分)6.答辩(20分)总 分最终评定成绩(以优、良、中、及格、不及格评定) 指导教师签字: 年 月 日课程设计任务书学生姓名XXX学号0000000专业方向电气工程及其自动化班级08(X)班题目名称音乐播放器设计一、 设计内容及技术要求:1、 将各音乐音阶和其延续时间存在数据段中,然后根据不同按键值选择不同的音阶和时间表,再使用计数器产生该音阶频率。2、 CPU通过对定时器的通道进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值。3、 当定时器接收的计数值为533H时,能产生896Hz的声音,因此产生其他频率的计数值就可算出来。4、 在送出频率计数值之前,还要给方式寄存器送一个方式值,该数决定对哪一个通道编程,采用什么模式,送入通道的计数值是一字节还是两字节,是二进制码还是BCD码。5、 从定时器输出的方波信号,经功率放大和滤波后驱动扬声器。送到扬声器的信号还受到了从并行接口芯片8255(端口地址为61H)来的双重控制,端口61H的最低位控制通道2的门控开断,以产生特殊的音频信号。6、 控制扬声器开关的时间间隔,来控制发声的音长了。二、课程设计总结报告要求:1、选用8086/8088CPU和适当的吃存储器芯片、接口芯片完成相应的功能。2、设计键盘和LED完成输入和显示功能。3、画出详细的硬件连接图。4、给出程序设计思路、画出各程序适当的流程图。5、给出RAM地址分配图。6、给出所有程序清单并加上必要注释。7、完成设计说明书(包括封面、目录、设计任务书、硬件设计思路、硬件原理图、软件设计思路、程序流程框图、程序清单、所用器件型号、总结体会、参考文献等)。三、设计进度:第一周星期一上午 讨论论文题目星期一下午 查资料星期二至星期五 完成硬件电路的基本设计第二周星期一至星期二 完成软件流程图及软件设计星期三至星期四 软硬件统调,写说明书,画图星期五 答辩目 录第一章课程设计的任务和目的41.1 课程设计任务41.2 课程设计目的4第二章课程设计基础知识52.1 定时/计数器8253A52.2 8253A内部结构52.3 8253A外部引脚62.4 计数器内部结构72.5 8253A端口地址72.6 8253A功能82.7 8253A控制字92.8 8253A工作方式9第三章详细设计113.1 硬件设计113.2 软件设计13第四章程序调试14第五章试验结果截屏14第六章总结15第七章参考文献16第八章附录178.1 源代码178.2 各个音符的对应频率26第一章 课程设计的任务和目的1.1 课程设计任务本课程设计题目是:设计并实现一个音乐播放器。1. 自己选用芯片和其它的硬件。2. 自行设计电路并使用汇编语言编写程序完成音乐播放器功能。3. 利用8253作为音阶频率发生器,对一段音乐进行编码后存入音符表,程序中可调用音符表自动播放音乐,从中了解音乐播放的原理。4. 利用8253A和PC机,设计并实现简易音乐播放器5. 使用汇编语言编写音乐播放程序。6. 上机调试程序并联机,利用试验箱提供的扬声器发声。7. 完成实验报告。1.2课程设计目的本课程设计注重提高学生应用能力、创新能力。在掌握了基本的实验方法和实验技能且理论教学完成的基础上,要求学生通过两周的集中工作,初步锻炼综合运用所学知识的能力,通过讨论与合作,完成一项完整的设计工作。更深入的了解微机芯片的用法和程序的完成过程,调试方法及技巧。通过这个环节来加深对微机原理与接口技术所学内容的理解和融会贯通。设计音乐播放器主要目的:Ø 通过D/A装换器产生模拟信号,在实验平台上实现简易音乐播放器。Ø 了解利用数模转换器产生音乐的基本方法。Ø 掌握定时/计数器8253A 的使用。第二章 课程设计基础知识 2.1 定时/计数器8253A 在微机及控制系统中,经常要用到定时信号。如系统的日历时钟,动态存储器刷新。对外部执行机构控制时也需要定时中断、定时检测、定时查询等。定时的方法主要是两种:软件定时:利用指令的执行时间设计循环程序,使CPU 执行延迟子程 序的时间就是定时时间。缺点:执行延迟时,CPU 一直被占用,降低了CPU 的效率。硬件定时:用计数器/定时器作为主要硬件,在软件简单指令的控制下产生精确的时间延迟。突出优点为计数时不占用CPU 时间,如利用定时器/计数器产生中断信号,可建立多作业环境,提高了CPU 效率。主要功能:(1)每片上有3 个独立的16 位的减计数器通道。(2)对于每个计数器,都可以单独作为定时器或计数器使用,并且都可以按照二进制或十进制来计数。(3)每个通道都有6 种工作方式,都可以通过程序设置或改变。(4)每个计数器的速率可高达2MHz。最高的计数时钟频率为26MHz。2.2 8253A内部结构8253的内部结构如图所示,它主要包括以下几个主要部分:图21 8253的内部结构(1)数据总线缓冲器实现8253与CPU数据总线连接的8位双向三态缓冲器,用以传送CPU向8253的控制信息、数据信息以及CPU从8253读取的状态信息,包括某时刻的实时计数值。(2)读/写控制逻辑控制8253的片选及对内部相关寄存器的读/写操作,它接收CPU发来的地址信号以实现片选、内部通道选择以及对读/写操作进行控制。(3)控制字寄存器在8253的初始化编程时,由CPU写入控制字,以决定通道的工作方式,此寄存器只能写入,不能读出。(4)计数通道0#、1#、2#:这是三个独立的,结构相同的计数器/定时器通道,每一个通道包含一个16位的计数寄存器,用以存放计数初始值,一个16位的减法计数器和一个16位的锁存器,锁存器在计数器工作的过程中,跟随计数值的变化,在接收到CPU发来的读计数值命令时,用以锁存计数值,供CPU读取,读取完毕之后,输出锁存器又跟随减1计数器变化。2.3 8253A外部引脚8253芯片是具有24个引脚的双列直插式集成电路芯片,其引脚分布如图所示。8253芯片的24个引脚分为两组,一组面向CPU,另一组面向外部设备,各个引脚及其所传送信号的情况,介绍如下:(1)D7D0:双向、三态数据线引脚,与系统的数据线连接,传送控制、数据及状态信息。(2):来自于CPU的读控制信号输入引脚,低电平有效。(3):来自于CPU的写控制信号输入引脚,低电平有效。(4):芯片选择信号输入引脚,低电平有效。图21 8253的引脚(5)A1、A0:地址信号输入引脚,用以选择8253芯片的通道及控制字寄存器。(6)VCC及GND:+5V电源及接地引脚(7)CLKi:i=0,1,2,第i个通道的计数脉冲输入引脚,8253规定,加在CLK引脚的输入时钟信号的频率不得高于2.6MHZ,即时钟周期不能小于380ns。(8)GATEi:i=0,1,2,第i个通道的门控信号输入引脚,门控信号的作用与通道的工作方式有关。(9)OUTi:i=0,1,2,第i个通道的定时/计数到信号输出引脚,输出信号的形式由通道的工作方式确定,此输出信号可用于触发其它电路工作,或作为向CPU发出的中断请求信号。2.4 计数器内部结构每个计数器由一个16位可预置的减1计数器组成,计数初值可保存在16位的锁存器中,该锁存器只写不能读。在计数器工作时,初值不受影响,以便进行重复计数。图中每个计数器有一个时钟输入端CLK作为计数脉冲源, 计数方式可以是二进制,计数范围110000H,也可以是十进制,计数范围165536。门控端GATE用于控制计数开始和停止。输出OUT端当计数器计数值减到零时,该端输出标志信号 。图22 计数器内部结构2.5 8253A端口地址图23 8253A端口地址2.6 8253A功能 8253 A既可作定时器又可作计数器: (1) 计数: 计数器装入初值后,当GATE为高电平时,可用外部事件作为CLK 脉冲对计数值进行减1 计数,每来一个脉冲减1,当计数值减至0时,由OUT 端输出一个标志信号。(2) 定时: 计数器装入初值后,当GATE为高电平时,由CLK 脉冲触发开始自动计数,当计数到零时,发计数结束定时信号。除上述典型应用外,8253A还可作频率发生器、分频器、实时钟、单脉冲发生器等。2.7 8253A控制字图24 8253A控制字说明 : (1) 8253 A每个通道对输入CLK按二进制或二十进制从预置值开始减1计数,减到0时从OUT输出一个信号。 (2) 8253 A编程时先写控制字,再写时间常数。2.8 8253A工作方式 (1) 方式0:计数结束产生中断方式 当写入控制字后,OUT变为低电平,当写入初值后立即开始计数,当计数结束时,变成高电平。 (2) 方式1:可编程单次脉冲方式 当初值装入后且GATE由低变高时,OUT变为低电平,计数结束变为高电平。 (3) 方式2:频率发生器方式 当初值装入时,OUT变为高;计数结束,OUT变为低。该方式下如果计数未结束,但GATE为低时,立即停止计数,强制OUT变高,当GATE再变高时,便启动一次新的计数周期。 (4) 方式3:方波发生器当装入初值后,在GATE上升沿启动计数,OUT 输出高电平; 当计数完成一半时,OUT输出低电平。图25 方波图方式3与方式2的工作方式类似,也是在初始化完成后能重复循环计数,只是输出的波形不同。<1> 计数过程 当把方式3的控制字写入控制字寄存器后,输出端OUT变成高电平,作为初始电平。再将计数初值写入计数初值寄存器CR中,再经过一个时钟周期,计数初值被移入计数执行单元CE中,从下一个时钟脉冲开始作减1 计数,方式3的计数过程分为两种情况:第一种情况:计数初值为偶数,当作减1计数减到N/2时,输出端OUT端变成低电平,减到0时,输出端OUT变成高电平,并重新从初值开始新的计数过程。若GATE为高电平,则一直重复同样的计数过程。可见,输出端OUT输出连续的方波,故称方波发生器。第二种情况:计数初值为奇数,当作减1计数减到(N+1)/2以后,输出端OUT变成低电平,减到0时,输出端OUT又变成高电平。并重新从初值开始新的计数过程。这时输出端的波形为连续的近似方波。<2>门控信号的影响工作在方式3时,门控信号GATE的功能与工作方式2一样,即GATE 为高电平时,允许计数;GATE为低电平时停止计数。GATE引脚上的信号从低电平跳到高电平时,将会重新把计数初值寄存器CR中的内容移入计数执行单元CE中,并以新装入的值重新开始计数。<3>新的计数初值对计数过程的影响如果在计数过程中写入新的初值,而GATE信号一直维持高电平,则新的初值不会影响当前的计数过程,只有在计数结束后的下一个计数周期,才按新的初值计数。若写入新的初值后,遇到门控信号的上升沿,则结束现行的计数过程,从下一个时钟脉冲下降沿开始按新的计数初值进行计数。可见,工作在方式3时,当计数初值为偶数,OUT端输出连续的标准方波;当计数初值为奇数,在每个计数周期内,有(N+1)/2个周期输出高电平,(N-1)/2个时钟周期输出低电平,OUT端输出连续的近似的方波。 第三章 详细设计3.1硬件设计音乐播放器用到相关硬件:1. 定时/计数器8253A2. 模块扬声器和喇叭驱动3. 频率发生芯片74LS393硬件连接: 定时/计数器8253A芯片模块的CLK2接时钟频率选择模块74LS393的T7端口,分频器的频率源为5000HZ。 定时/计数器8253A芯片模块的GATE2接5V,提供高电平。 定时/计数器8253A芯片模块的OUT2 接喇叭驱动驱动模块的SIN 端口。 喇叭驱动驱动模块的J5插座接扬声器的J5插座。8253A的CLK2接分频器74LS393(右上方)的T7插孔,分频器的频率源为5000。图31 硬件连接框架图图32 扬声器电路图33 扬声器J5插口如图32为音响电路的控制输入插口SIN,控制输入信号经放大后接喇叭。图34 74LS393引脚图3.2 软件设计图37 软件流程图music子程序是音乐子程序,SI指向曲中的频率,BP指向曲中的时间节拍。从SI的指向的音节表中取一个频率,只要不是0,即有效就再读取时间,然后调用speaker子程序,计算计数初值送入计数器,产生各种频率信号,再送至扬声器,根据所取的时间调用若干次延时子程序。这段时间扬声器就发出该频率的声音,延时结束,再修改SI和BP,指向下一个频率,重复上面的工作。播放两首音乐后自动停止。第四章 程序调试把程序输入PC机后,保存为.asm文件。启用DVCC系统: 建立汇编源程序. 建立连接。 编译为目标文件 调试。 不通过,重新修改(语句错误、音调频率不准、音调节拍不符合) 重新修改、调试。 正确运行。第五章 试验结果截屏:第六章 总结经过这次的课程设计,再一次的印证了理论来源于实践,而实践又能升华理论这一个观点。 首先,要实现题目要求的功能并有所创新,我们必须全心地投入其中,养成一种敢于钻研敢于创新的习惯。在把课程要求实现到实际中来的过程中,参考了一些程序,在研究参考程序的编写思路的同时也从中获得不少的启发。为了把使得程序更加完整,在了解其他人在相同课题上的思路后,更加加入自己的一些思路,进行创一定的创新。 其次,通过课程设计,让我在掌握课本的基础上,更深入的了解了各种芯片的用法和程序的完成过程,调试方法及技巧。尤其是对各种芯片在硬件与软件相互作用下工作的状况有了更深入的认识。总之,在这次的课程设计在很大程度上提升了我的动手能力了,培养了自己独立编写汇编语言程序的能力,加深了我对理论知识的理解。虽然这两个星期的课程设计中,完成任务的效果和预期有的出入,虽然中间遇到了一些问题,但经过我们的努力,还是把问题给解决了。这次课程设计对我综合运用所学知识的能力的提高有不小的帮助,之前做的实验都是很简单的编程,跟硬件结合也没有这么复杂,实现的功能都比较简单,可是这次要实现的功能相对来说比较复杂,要求掌握的知识比较全面。第七章 参考文献1.微机原理与接口技术(第二版) 人民邮电出版社 周明德主编2汇编语言程序设计 中国水利水电出版社 相伟主编3DVCC系列单片机微机仿真实验指导书 启东计算机厂有限公司著4.单片机接口技术 复旦大学出版社 王修才编著5单片机原理及其接口技术(第二版) 清华大学出版社 胡汉才编著6单片微机原理及应用 机械工业出版社 丁元杰主编7单片机原理及接口技术(修订版) 北京航空航天大学出版社 李朝青编著8单片机原理及应用 北京希望电子出版社 成都木马科技编著9单片机原理及接口技术学习辅导 电子工业出版社 朱定华编著10单片微机接口与系统设计 哈工大出版社 高明编著11.微型计算机原理及应用学习知道 化学工业出版社 赵邦信编著11网上资料第八章 附录8.1 源代码data segmentassumeds:datamsg_1 db'<<-Welcome you to this OS.->> $',0dh,0ahmsg_2db0dh,0ah,'In this OS. you can press below keys to enjoy:$'msg_3db0dh,0ah,'Super Low:q-w-e-r-t-y-u$'msg_4db0dh,0ah,' Low:a-s-d-f-g-h-j$'msg_5db0dh,0ah,' Mid:z-x-c-v-b-n-m$'msg_6db0dh,0ah,' Hig:1-2-3-4-5-6-7$'msg_7 db0dh,0ah,'Anytime you can press ''Esc'' or ''Enter'' to exit.$'msg_8db0dh,0ah,'What''s more, you can press ''p'' to play music!$'msg_9db0dh,0ah,'Please select the music(press ''q'' to exit the main menu):$'msg_10db0dh,0ah,'1. Huaxin$'msg_11db0dh,0ah,'2. Jingle bells$'msg_12db0dh,0ah,'3. Happy birthday to you$'msg_13db0dh,0ah,'4. Happy new year$'msg_21db0dh,0ah,' $'note_tdw 131,147,165,175,196,220,247;重低音dw 262,294,330,349,392,440,494;低音 dw 523,587,659,698,784,880,988;中音 dw 1046,1175,1318,1397,1568,1760,1975;高音dw0;休止符0;'1','2','3','4','5','6','7'从低到高key_tdb'q','w','e','r','t','y','u'重低音db'a','s','d','f','g','h','j'低音db'z','x','c','v','b','n','m'中音db'1','2','3','4','5','6','7'高音db'0'休止符0;玛丽有只小羊羔music_n1 db 'c','x','z','x','c','c','c' db 'x','x','x','c','c','c' db 'c','x','z,'x','c','c','z' db 'x','x','c','x','z','0' music_d1 db 4, 4, 4, 4, 4, 4, 8 db 4, 4, 8, 4, 4, 8 db 16, 8, 4, 4, 8, 4, 4, 8, 4, 4 db 4, 4, 4, 4, 4, 4, 4, 2 db 4, 4, 4, 4, 16 ;铃儿响叮当+生日快乐+新年好music_n2 db 'g','c','x','z','g','0','g','h','g','c','x','z'铃儿响叮当 db 'h','0','h','a','h','v','c','x','j','g','b','b','v','x','c','z' db 'g','c','x','z','g','0','g','h','g','c','x','z','h','v','c','x' db 'b','b','b','b','n','b','v','x','z' db 'c','c','c','c','c','c','c','b','z','x','c' db 'v','v','v','v','c','c','c','x','x','z','x','b' db 'c','c','c','c','c','c','c','b','z','x','c' db 'v','v','v','v','c','c','b','b','v','x','z','0' db 'g','g','h','g','z','j'生日快乐 db 'g','g','h','g','x','z' db 'g','g','b','c','z','j','h' db 'v','v','c','z','x','z','0' db 'z','z','z','g','c','c','c','z','z','c','b','b','v','c','x','x','c'新年好 db 'v','v','c','x','c','z','z','c','x','g','j','x','z',0music_d2 db 4, 4, 4, 4, 8, 4, 2, 2, 4, 4, 4, 4 db 8, 4, 2, 2, 4, 4, 4, 4, 8, 8, 4, 4, 4, 4, 8, 4 db 4, 4, 4, 4, 8, 4, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4 db 4, 4, 4, 4, 4, 4, 4, 4, 16 db 4, 4, 8, 4, 4, 8, 4, 4, 4, 2, 16 db 4, 4, 8, 4, 4, 8, 4, 4, 4, 4, 8, 8 db 4, 4, 8, 4, 4, 8, 4, 4, 4, 2, 16 db 4, 4, 8, 4, 4, 8, 4, 4, 4, 4, 16,32 db 4, 4, 8, 8, 8, 16 db 4, 4, 8, 8, 8, 16 db 4, 4, 8, 8, 8, 8, 8 db 4, 4, 8, 8, 8, 16, 32 db 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 16, 4, 4 db 8, 8, 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 32jiepai db ?;节拍变量定义speeddb2;播放速度控制jiangedb1;音符间隔停顿时间dataends;数据定义段结束;/*-*/;/*-*/;代码段定义code segment;代码定义段 assumecs:code;建立代码段寄存器寻址;/*-*/;/*-*/;字符显示show macro str;宏定义,输入参数:字符串str leadx,str;装入str的有效地址 mov ah,09h;调用中断21,09h显示字符串 int 21h endm;宏定义结束;/*-*/;/*-*/;主函数mainprocfar;主函数过程定义mov ax,data;取数据段地址mov ds,ax;装载数据段寄存器ds,使之指向当前数据段showmsg_21showmsg_1;调用宏,显示字符串showmsg_2showmsg_3showmsg_4showmsg_5showmsg_6showmsg_7showmsg_8showmsg_21movbx,0;设定查表数组下标初值;/*-*/;/*-*/;按键扫描key_scan:moval,6mov jiepai,al ;初始化节拍movbx,0000h;初始化指针movah, 00h;利用bios的16号中断,扫描键盘按键int16h;AL中返回按键的ASCII码cmpal, 0dh;判断是否为Enter键jzexit;是回车键就退出cmpal, 1bh;判断是否为Esc键jzexit;是退出键就退出cmpal, 'p'判断是否为p键jzplay;是p键就play musiclookup:cmpkey_tbx,al;取出对应频率值jenextincbx;指针+1jmplookupnext:shlbx,1;指针×2,计算频率表指针movcx,note_tbx;取得对应数组下标值的频率值callbeep;调用固定频率子程序jmpkey_scan;否则继续扫描;/*-*/;/*-*/exit:;退出 mov ah,4ch;调用中断21,4ch退出系统 int 21h;/*-*/;/*-*/;音乐播放菜单play:showmsg_9showmsg_10showmsg_11showmsg_12showmsg_13showmsg_21input:movah, 00h;利用bios的16号中断,扫描键盘按键int16h;AL中返回按键的ASCII码cmpal, 'q'判断是否为Enter键jzstart;是'q'键就退到主菜单cmpal, '1'判断是否为数字1jznext6;是'1'键就播放相对应的歌曲cmpal, '2'判断是否为数字2jznext7;是'2'键就播放相对应的歌曲jmpinput;否则继续扫描按键next6:callplay_m1next7: callplay_m2start:callmain;/*-*/;/*-*/;音乐播放程序1play_m1procnearnext5:movbx,0next3:moval,music_n1bx;取出music频率值 push ax moval,music_d1bx;取出music节拍 mov jiepai,al pop axcmpal, 0;是否为音乐结束标志符jeinput;是则退出playpushbx;保存bx,bx为music频率指针movbx,0look1:cmpkey_tbx,al;查表取出对应频率值的指针bxjenext1;找到就beepincbx;指针+1andbx,0ffhjmplook1;未找到则继续查找next1:shlbx,1;指针×2,计算频率表指针movcx,note_tbx;取得对应数组下标值的频率值cmpcx,0jenext4callbeep;调用固定频率子程序callpause;调用停顿时间popbx;获得music指针incbx;继续取得下一个音符jmpnext3next4:callnobeepcallpause;调用停顿时间popbx;获得music指针incbx;继续取得下一个音符jmpnext3play_m1 endp;/*-