信息与电气工程学院CDIO项目设计说明书(2013 /2014学年第一学期)项目名称:电子信息工程一级项目专业班级:信息(三)班学生姓名:学号:指导教师:设计成绩:2013年12月13日音乐播放器设计报告1.设计1.1设计目的1.为了更好的学习一个系统设计,善于利用所学知识应用到实践中。
2.培养综合运用所学知识独立完成汇编程序。
3.学会分析问题,解决问题能力。
4.可以把软件设计和书本的知识详解,以及对软件设计的实践应用。
1.2设计内容1.通过proteus来设计一个音乐播放器,利用8255A,8253和实现电路的综合连接。
2.根据电路的设计,使用汇编语言来编写音乐播放器的实现代码。
然后通过按键来实现对高低电平的输入和输出,这样就可以在播放器输出音乐的功能。
2.需求分析2.1流程图1.本设计流程是,当需要播放歌曲时,先把程序装入电路中实现电路的控制。
2.当需要播放一首歌曲时,通过电路按键实现控制输入。
2.2发声功能原理本项目的音乐播放器使用8086中央处理器、74LS373地址锁存器、74LS138译码器、可编程定时器/计数器8253和可编程并行接口8255A来实现。
8086中央处理器输出地址/数据码AD0-AD7,将AD0-AD7输入74LS373地址锁存器输出A0-A7,再将A3-A7和A0通过74LS138译码器进行译码输出作为8253和8255A的片选信号,A1和A2作为控制8255A和8253的片内寻址信号;8255A用来控制按键的输入;8253产生不同频率的脉冲来模拟音符,通过时间的长短来模拟音长,从而设计出一个功能完整的音乐播放器。
2.3项目仿真图3.主要设计编程过程3.1定义过程先定义8255A控制地址,然后定义A,B,C靠的地址,再利用根据8253A计时器特点设计计数器地址。
CORT EQU 00F6H ;8255A控制口地址PB_A EQU 00F0H ;8255A的A口地址PB_B EQU 00F2H ;8255A的B口地址PB_C EQU 00F4H ;8255A的C口地址COTR EQU 00FEH ;8253A控制口地址P0 EQU 00F8H ;8253A的计数器0口地址P1 EQU 00FAH ;8253A的计数器1口地址3.1音乐发声频率装入乐曲是按照一定的高低、长短和强弱关系组成的音调,在每一首乐曲中,每个音符的音高和音长与发声系统中的频率、节拍有关。
可参考下表:音名 C D E F G A B C D E F G A B C唱名 1 2 3 4 5 6 7 1 2 3 4 5 6 7 i频率(HZ)131 147 165 175 196 220 247 262 294 330 349 392 440 492 523其中,低音阶从低音C(131HZ)到中央C(262HZ),高音阶从中央C(262HZ)到高音C(523HZ)。
组成乐曲的音符的频率值和持续时间是乐曲程序发声所必需的两组数据,频率可以查上表,音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。
在4/4拍中,四分音符为一拍,每小节四拍,全音符持续四拍,二分音符持续二拍,四分音符持续一拍,八分音符持续半拍。
如果给全音符分配1秒(100*10ms)的时间,则二分音符持续时间为0.5秒,四分音符持续时间为0.25秒,八分音符持续时间为0.125秒。
知道了音调及频率、时间的关系后,可以按照乐曲的乐谱将每个音符的频率和持续时间定义为两个数据表,然后编写程序依次取出表中的频率值和时间值。
3.3初始化8255A和8253A该发生程序是在修改BEEP发声程序的基础上,以实现为8088/86编写一个任意频率和任意持续时间的通用发声程序,然后根据程序检测按键功能和测试接口正常运行。
CODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV DX,CORTMOV AL,82H ;方式0OUT DX, AL ;A口为输出,B口为输入,C口为输出 MOV DX,COTR ;初始化8253MOV AL,36H ;定时器0、方式3OUT DX,AL3.4按键消抖LP: MOV DX, PB_C ;C口置零MOV AL,0HOUT DX,ALLOOA: MOV AL,00HOUT PB_A,AL ;A口置零LOOB: IN AL,PB_BAND AL,0FHCMP AL,0FHJNZ NEXTJZ LOOANEXT: CALL DELAYIN AL,PB_BAND AL,0FHCMP AL,0FHJZ LOOB ;没有键按下跳转RE: MOV BL,3 ;行数MOV BH,3 ;列数MOV AL,0FEHMOV CL,0FHMOV CH,0H ;起始键号03.5 按键扫描通过程序检测按键的是否正常的输入,以确定正常的输入信号,可以进行发声。
LOOP1: OUT PB_A,AL ;A行输出ROL AL,1 ;准备扫描下一行MOV AH,ALIN AL,PB_BAND AL,CLCMP AL,CLJNZ LOOP2 ;有键按下跳转ADD CH,BHMOV AL,AHDEC BLJNZ LOOP1 ;行末扫完跳转继续JMP RELOOP2: INC CHROR AL,1JC LOOP2 ;无按键按下跳转MOV AL,CH ;找到按键,比配CMP AL,1JZ KEY1CMP AL,2JZ KEY2CMP AL,3JZ KEY3CMP AL,4JZ KEY4CMP AL,5JZ KEY5CMP AL,6JZ KEY6CMP AL,7JZ KEY7CMP AL,8JZ KEY8JMP KEY93.6设置播放音乐利用8086设置程序,控制播放音乐,设置输入时钟频率,调用延迟子程序,实现判断音乐的判断以及输出。
PLAY1 PROC NEARW: MOV DX,01H ;输入时钟频率:100KHzMOV AX,86A0HDIV WORD PTR [SI] ;取出频率值计算初值MOV DX,P0OUT DX,AL ;装入初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序 CALL DALLY1ADD SI,2INC DICMP WORD PTR [SI],0 ;判断是否结束JE LP ;放音结束,停止IN AL,PB_BCMP AL,0FFHJE LPJMP WPLAY1 ENDPPLAY2 PROC NEARZ: MOV DX,01H ;输入时钟频率:100KHzMOV AX,86A0HDIV WORD PTR [SI] ;取出频率值计算初值MOV DX,P0OUT DX,AL ;装入初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序 CALL DALLYADD SI,2INC DICMP WORD PTR [SI],0 ;判断是否结束JE LP ;放音结束,停止IN AL,PB_BCMP AL,0FFHJE LPJMP ZPLAY2 ENDPPLAY3 PROC NEARK: MOV DX,01H ;输入时钟频率:100KHzMOV AX,86A0HDIV WORD PTR [SI] ;取出频率值计算初值MOV DX,P0OUT DX,AL ;装入初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序 CALL DALLY2ADD SI,2INC DICMP WORD PTR [SI],0 ;判断是否结束JE LP ;放音结束,停止IN AL,PB_BCMP AL,0FFHJE LPJMP KPLAY3 ENDP3.8调试程序执行过程程序调试步骤如下:1)建立汇编源程序.2)建立连接。
3)编译为目标文件4)调试。
5)不通过,重新修改(语句错误、音调频率不准、音调节拍不符合)6)重新修改、调试。
7)正确运行。
4.设计心得通过查找资料,利用汇编语言来设计音乐播放器过程中,我体会到了很多意想不到的过程,首先是成功的喜悦,由于刚刚才开始学习汇编言语,还不能够很熟练的编写汇编的控制语言,以及对8255A和8253A的功能了解也不是非常深入,但是在设计的过程中我从中学到了更多的知识,更加的巩固了我对课本知识的熟练掌握。
其次,我通过设计我可以把理论和实践很好的相结合,也是以一种对知识的掌握的转换目的,加深和优化系统性的学习结构。
对于Proteus、emu8086等实用软件的使用更加熟练,这会为以后的应用提供一个更好的学习机会。
这次的项目设计是设计用九个按键控制扬声器播放出音乐,这九首音乐各不相同,每次按下一个键就会有一首音乐播放。
最后就是,自己动手丰衣足食,只有通过不断的学习,不断的实践就可以更好的去掌握所需知识,才能从基础逐渐的深入,才能不断的创新。
参考文献[1]王元珍,曹忠升,韩宗芬编著.80x86 汇编语言程序设计[M].湖北:华中科技大学出版社,2005年4月.[2]王成端,李晓波编著.汇编语言程序设计[M].北京:高等教育出版社,2003年8月.[3]孙琦,郑硕编著.汇编语言程序设计复习与考试指导(第二版)[M].北京:高等教育出版社,2006年7月.[4] 沈美明,温冬婵.IBM—PC汇编语言程序设计(第2版)[M]. 北京:清华大学出版社,2001年8月.[5] 阎石 . 数字电子技术基础 .高等教育出版社 . 2006年5月[6] 王忠民. 微型计算机原理. 西安电子科技大学出版社. 2007年6月附录:CORT EQU 00F6H ;8255A控制口地址PB_A EQU 00F0H ;8255A的A口地址PB_B EQU 00F2H ;8255A的B口地址PB_C EQU 00F4H ;8255A的C口地址COTR EQU 00FEH ;8253A控制口地址P0 EQU 00F8H ;8253A的计数器0口地址P1 EQU 00FAH ;8253A的计数器1口地址STACK SEGMENT STACKDW 256 DUP(?)STACK ENDSDATA SEGMENTF1 DW 393,661,589,525,525,525,525,525,495,441,525,525,393DW 393,393,661,589,525,525,525,525,525,495,441,525,525, 589,393DW 393,393,441,441,393,393,393,525,525,589,661,525,589, 589,589DW 589,525,393,441,495,589,525,0T1 DB 4,3,1,2,2,2,2,2,2,2,1,1,4,4,4,3,1,2,2,2,2,2,2,2,1,1,4,4, DB 3,1,2,2,2,1,1,2,2,2,4,2,3,1,2,2,2,5,3,1,2,2,2,5F2 DW 371,495,495,495,624,556,495,556,624DW 495,495,624,742,833,833,833,742,624DW 624,495,556,495,556,624,495,416,416,371DW 495,833,742,624,624,495,556,495,556,833DW 742,624,624,742,833,990,742,624,624,495DW 556,495,556,624,495,416,416,371,495,0T2 DB 4,6,2,4,4,6,2,4,4DB 6,2,4,4,12,1,3,6,2DB 4,4,6,2,4,4,6,2,4,4DB 12,4,6,2,4,4,6,2,4,4DB 6,2,4,4,12,4,6,2,4,4DB 6,2,4,4,6,2,4,4,12F3 DW 2 DUP(262,294,330,262)DW 2 DUP(330,349,392)DW 2 DUP(392,440,392,349,330,262)DW 2 DUP(294,196,262)DW 10 DUP(-1),0T3 DB 8 DUP(2)DB 2 DUP(1,2,3)DB 12 DUP(1)DB 6 DUP(2)DB 10 DUP(2)F4 DW 371,330,495,416,416,371,330,312,330,278,416,278,278,330,371,330,556, DW441,441,416,441,278,312,330,371,65535,416,441,495,495,495,556,330,DW65535,495,312,371,330,65535,371,416,278,441,416,441,441,495,371,0T4 DB 2,2,4,4,2,2,2,2,2,2,4,2,4,2,2,2,2,2,2,2,2,2,2,2,6,2,2, DB 2,2,2,2,2,4,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,6F5 DW 661,742,742,833,833,833,833,742,833,833,990,990,495,495DW833,742,742,742,742,742,742,990,990,495,495,742,661,661,661,495,495,8 83,883,742,556,495DW661,742,833,833,833,833,742,833,833,990,990,495,495,883,DW742,742,742,661,742,742,990,990,495,495,742,661,661,495,495,833,833,7 42,661,661,0T5 DB 3,1,4,2,2,2,1,1,1,1,2,2,1,1DB 2,1,3,1,1,1,1,2,2,1,1,2,1,1DB 2,1,1,2,2,2,2,8,4,4,2,2,2,1DB 1,1,1,2,2,1,1,3,1,2,1,1,1,1DB 2,2,1,1,3,1,2,1,1,1,2,2,1,6F6 DW 393,525,525,525,393,589,495,525DW 393,525,700,700,661,589,525,589,525,495,525,589DW 393,525,525,525,393,589,495,525DW 393,525,661,786,661,525,441,589,661,525,0T6 DB 4,3,1,8,4,3,1,8DB 4,3,1,4,3,1,2,1,1,3,1,8DB 4,3,1,8,4,3,1,8DB 4,3,1,4,3,1,4,3,1,8F7 DW 661,589,661,589,589,525,589,589DW 525,495,525,495,441,495,330,330,65535,441DW 495,525,525,525,525,495,525,589,589,589,525,589,661DW 65535,661,589,661,589,589,525,589,589DW 589,661,700,661,589,589,661,661,661,441,65535,44DW 495,525,495,441,525,525,495,525,589,525,495,589,589DW 525,525,441,441,441,441,0T7 DB 2,2,3,1,2,1,1,4DB 2,2,2,2,2,1,1,4,2DB 1,1,2,1,1,2,1,1,2,2,1,2,1,8DB 1,2,2,3,1,2,1,1,4DB 2,2,2,1,1,2,1,1,1,3,2DB 1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,2,1,1,8F8 DW 441,441,495,441,589,556,441,441,495,441,664DW 589,441,441,882,742,589,556,495,65535,786,786,742, 589,664,589,0T8 DB 2,2,4,4,4,8,2,2,4,4,4,8,2,2,4,4,4,4,8,4,2,2,4,4,4,8 F9 DW 441,661,589,441,661,589,495,742,742,742,786,661,589,661,661,556,495,441DW 441,441,661,661,742,661,589,65535,589,495,742,661,661, 441,661,589,441,661,589,495,742DW 742,742,786,661,589,661,661,556,495,441,441,441,742, 661,742,661,589DW 65535,589,495,441,495,589,65535,661,661,742,589,661, 589,589,0T9 DB 2,2,4,2,2,4,2,2,2,1,1,2,2,2,2,2,1,1DB 3,1,2,1,1,2,5,2,2,2,2,2,2,2,2,4,2,2,4,2,2DB 2,1,1,2,2,2,2,2,1,1,3,1,2,1,1,2,5DB 2,2,2,2,2,5,3,1,2,2,1,1,5,4DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV DX,CORTMOV AL,82H ;方式0OUT DX, AL ;A口为输出,B口为输入,C口为输出 MOV DX,COTR ;初始化8253MOV AL,36H ;定时器0、方式3OUT DX,ALLP: MOV DX, PB_C ;C口置零MOV AL,0HOUT DX,ALLOOA: MOV AL,00HOUT PB_A,AL ;A口置零LOOB: IN AL,PB_BAND AL,0FHCMP AL,0FHJNZ NEXTJZ LOOANEXT: CALL DELAYIN AL,PB_BAND AL,0FHCMP AL,0FHJZ LOOB ;没有键按下跳转RE: MOV BL,3 ;行数MOV BH,3 ;列数MOV AL,0FEHMOV CL,0FHMOV CH,0H ;起始键号0LOOP1: OUT PB_A,AL ;A行输出ROL AL,1 ;准备扫描下一行MOV AH,ALIN AL,PB_BAND AL,CLCMP AL,CLJNZ LOOP2 ;有键按下跳转ADD CH,BHMOV AL,AHDEC BLJNZ LOOP1 ;行末扫完跳转继续 JMP RELOOP2: INC CHROR AL,1JC LOOP2 ;无按键按下跳转 MOV AL,CH ;找到按键,比配CMP AL,1JZ KEY1CMP AL,2JZ KEY2CMP AL,3JZ KEY3JZ KEY4CMP AL,5JZ KEY5CMP AL,6JZ KEY6CMP AL,7JZ KEY7CMP AL,8JZ KEY8JMP KEY9KEY1: MOV DX, PB_C ;C0给高电平,开始放音 MOV AL,01HOUT DX,ALMOV SI,OFFSET F1 ;装入频率表起始地址MOV DI,OFFSET T1 ;装入时间表起始地址CALL PLAY1KEY2: MOV DX, PB_C ;C0给高电平,开始放音 MOV AL,01HOUT DX,ALMOV SI,OFFSET F2MOV DI,OFFSET T2CALL PLAY1KEY3: MOV DX, PB_C ;C0给高电平,开始放音OUT DX,ALMOV SI,OFFSET F3MOV DI,OFFSET T3CALL PLAY2KEY4: MOV DX, PB_C ;C0给高电平,开始放音 MOV AL,01HOUT DX,ALMOV SI,OFFSET F4MOV DI,OFFSET T4CALL PLAY1KEY5: MOV DX, PB_C ;C0给高电平,开始放音MOV AL,01HOUT DX,ALMOV SI,OFFSET F5MOV DI,OFFSET T5CALL PLAY2KEY6: MOV DX, PB_C ;C0给高电平,开始放音 MOV AL,01HOUT DX,ALMOV SI,OFFSET F6MOV DI,OFFSET T6CALL PLAY2KEY7: MOV DX, PB_C ;C0给高电平,开始放音 MOV AL,01HOUT DX,ALMOV SI,OFFSET F7MOV DI,OFFSET T7CALL PLAY2KEY8: MOV DX, PB_C ;C0给高电平,开始放音 MOV AL,01HOUT DX,ALMOV SI,OFFSET F8 ;装入频率表起始地址MOV DI,OFFSET T8 ;装入时间表起始地址CALL PLAY1KEY9: MOV DX, PB_C ;GATE0给高电平,开始放音MOV AL,01HOUT DX,ALMOV SI,OFFSET F9 ;装入频率表起始地址MOV DI,OFFSET T9 ;装入时间表起始地址CALL PLAY3MAIN ENDPDALLY PROC NEAR ;节拍延时子程序D0:MOV CX,0010HD1:MOV AX,0300HD2:DEC AXJNZ D2LOOP D1DEC DLJNZ D0RETDALLY ENDPDALLY1 PROC NEAR ;节拍延时子程序1 D01:MOV CX,0010HD02:MOV AX,0200HD03:DEC AXJNZ D03LOOP D02DEC DLJNZ D01RETDALLY1 ENDPDALLY2 PROC NEAR ;节拍延时子程序2 D11:MOV CX,0010HD12:MOV AX,02A0HD13:DEC AXJNZ D13LOOP D12DEC DLJNZ D11RETDALLY2 ENDPDELAY PROC NEAR ;按键延时子程序PUSH BXPUSH AXPUSH CXMOV CX,0FHW1: MOV AX,00FFHW2: DEC AXJNZ W2LOOP W1POP CXPOP AXPOP BXRETDELAY ENDPPLAY1 PROC NEARW: MOV DX,01H ;输入时钟频率:100KHzMOV AX,86A0HDIV WORD PTR [SI] ;取出频率值计算初值MOV DX,P0OUT DX,AL ;装入初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序 CALL DALLY1ADD SI,2INC DICMP WORD PTR [SI],0 ;判断是否结束JE LP ;放音结束,停止IN AL,PB_BCMP AL,0FFHJE LPJMP WPLAY1 ENDPPLAY2 PROC NEARZ: MOV DX,01H ;输入时钟频率:100KHzMOV AX,86A0HDIV WORD PTR [SI] ;取出频率值计算初值MOV DX,P0OUT DX,AL ;装入初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序 CALL DALLYADD SI,2INC DICMP WORD PTR [SI],0 ;判断是否结束JE LP ;放音结束,停止IN AL,PB_BCMP AL,0FFHJE LPJMP ZPLAY2 ENDPPLAY3 PROC NEARK: MOV DX,01H ;输入时钟频率:100KHzMOV AX,86A0HDIV WORD PTR [SI] ;取出频率值计算初值MOV DX,P0OUT DX,AL ;装入初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序 CALL DALLY2ADD SI,2INC DICMP WORD PTR [SI],0 ;判断是否结束JE LP ;放音结束,停止IN AL,PB_BCMP AL,0FFHJE LPJMP KPLAY3 ENDPCODE ENDSEND START。