1、微机原理与接口技术综合设计实验报告设计课题:基于 8086 的简易电子琴设计 指导老师:学生姓名:学 号:院 系:专 业:通信工程 基于 8086 的简易电子琴设计摘 要在学习微机原理与接口设计的基础上,针对课程设计要求,综合运用相关软件、硬件知识,设计一个简易电子琴,使之具有音区切换、数码管显示音区及当前音符、记录音符与音符持续时间、播放录制的音乐等功能。关键词:8086;电子琴;仿真调试;汇编目 录第 1 章 总体方案设计 11.1 系统整体架构图 .11.2 功能介绍 .1第 2 章 硬件设计 22.1 硬件资源 .22.2 硬件接线图 .32.2.1 8254 接线图 32.2.2 8
2、255 及键盘、数码管接线图 3第 3 章 软件设计 43.1 程序框图 .43.1.1 整体框图 .43.1.2 延时函数 .53.1.3 键盘扫描 .53.1.4 数码管显示 .63.1.5 声音及时间录制 .63.1.6 选择音区(高、中、低) .73.1.7 播放音乐 .7第 4 章 实验结果及演示 8第 5 章 遇到的问题及改进措施 .105.1 条件转移指令报错 105.2 无法使用 8254 作为录音时间计数器 .10附 录 .11程 序源码 111第 1 章 总体方案设计1.1 系统整体架构图系统整体架构图如图 1-1 所示。图 1-11.2 功能介绍本实验设计实现了音区切换、
3、数码管显示当前音区及音符、记录音符与音符持续时间、播放录制的音乐等功能。功能具体说明如下。按键 0-6 为音符键,按下后会有对应的音符音调响起,按键弹起后音符终止,此时,按下的音符以及时间将被记录。按键 12,13,14 可以选择低音,中音,高音区。按下按键 15 后开始播放录制的音符(不超过 16 个) 。另外数码管 0 显示音符,数码管 2 显示音区。2第 2 章 硬件设计2.1 硬件资源TD-PITE 实验教学系统,其主要系统构成如表 2-1 所示。CPU Intel 386EX系统程序存储器:Flash ROM (128KB)存储器 数据存储器:SRAM (128KB)信号源 单次脉冲
4、:消抖动脉冲 2 组逻辑电平开关与显示 16 组电平开关,16 组电平显示 LED 灯(正逻辑)8259、8237、8254、8255、8251、DAC0832、ADC0809、SRAM 、键盘扫描及数接口实验单元 码管显示、电子发声、点阵 LED、液晶 LCD(可选) 、步进电机(可选) 、直流电机、温度控制实验扩展单元 2 组 40 线通用集成电路扩展单元、扩展模块总线单元系统电源 5V/2A,12V/0.2A表 2-1 TD-PITE 系统构成系统硬件结构如图 2-1 所示。图 2-132.2 硬件接线图2.2.1 8254 接线图8254 芯片接线如图 2-2 所示。图 2-22.2.
5、2 8255 及键盘、数码管接线图8255 及键盘、数码管接线方法如图 2-3 所示。图 2-34第 3 章 软件设计3.1 程序框图3.1.1 整体框图图 3-153.1.2 延时函数图 3-23.1.3 键盘扫描图 3-363.1.4 数码管显示图 3-43.1.5 声音及时间录制图 3-573.1.6 选择音区(高、中、低)图 3-63.1.7 播放音乐图 3-78第 4 章 实验结果及演示具体演示效果可扫描以下二维码进行观看,二维码如图 4-1 所示。图 4-1以下为视频截图。系统初始运行状体如图 4-2 所示。图 4-29选择中音区,如图 4-3 所示。图 4-3按下音符健,如图 4
6、-4 所示。图 4-410音乐播放,如图 4-5 所示。图 4-5第 5 章 遇到的问题及改进措施5.1 条件转移指令报错在编写程序时曾多次遇到使用条件转移指令时编译出错的情况。查阅书本后发现条件转移指令只能在代码段的-128+127 字节内进行跳转。解决办法:使用条件转移指令转移到一个较近程序段,并在这程序段使用无条件转移指令 JMP 进行转移。5.2 无法使用 8254 作为录音时间计数器在进行设计的过程中,曾多次按照使用 8254 作为时间计数器的方案进行编程,但经过多次尝试后均以失败告终。解决办法:使用软件延时进行计时,每次延时执行完毕后进行计数,该计数值就是音符的相对持续时间。在播放
7、时只需要调用同样时间长度的延时函数即可。缺点:使用软件延时与计数,占用了 CPU 计算资源,导致数码管扫描频率降低,亮度变暗。同时对于录音时间的记录不精确,存在一定的误差。11附 录程序源码;=; 文件名: Hypo.asm; 功能描述: 按键 0-6 为音符键,按下后会有对应的音调响起,; 按键弹起后音符终止。; 按键 12,13,14 可以选择低音,中音,高音区。; 按下按键 15 后开始播放之前按下的音符(不超过 16 个); 数码管 0 显示音符,数码管 2 显示音区;=IOY3 EQU 06C0HMY8254_COUNT0EQU IOY3+00H ;8254 计数器 0 端口地址MY
8、8254_COUNT1EQU IOY3+02H ;8254 计数器 1 端口地址MY8254_COUNT2EQU IOY3+04H ;8254 计数器 2 端口地址MY8254_MODE EQU IOY3+06H ;8254 控制寄存器端口地址MY8255_A EQU 0600H ;8255A 端口地址MY8255_B EQU 0602H ;8255B 端口地址MY8255_C EQU 0604H ;8255C 端口地址MY8255_CON EQU 0606H ;8255 控制端口地址SSTACK SEGMENT STACK ;定义堆栈段DW 256 DUP(?)SSTACK ENDSDATA
9、 SEGMENTDTABLEDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H;数码管的段选数据DB 7FH,6FH,77H,7CH,39H,5EH,79H,71HFREQ_LIST1 DW 248,278,312,330,371,416,467 ;低音频率表FREQ_LIST2 DW 495,556,624,661,742,833,935 ;中音频率表FREQ_LIST3 DW 990,1112,1248,1322,1484,1665,1869 ;高音频率表REC_DATA DW 000,000,000,000,000,000,000,000 ;录音储存段DW 000,00
10、0,000,000,000,000,000,000SB DB 00H,00H ;过渡段REC_TIME DB 00H,00H,00H,00H,00H,00H,00H,00H ;时间储存段DB 00H,00H,00H,00H,00H,00H,00H,00HSAVE_SI DW ? ;录音储存地址储存SI_FREQ DW ? ;频率表地址储存SAVE_SI_TIME DW ? ;时间储存表地址储存12SAVE_TIME DB 01H ;时间技术储存CHOOSE_FLAG DW 01H;频率表选择标志位DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA ;初始化数
11、据段、代码段START: MOV AX,DATAMOV DS,AXMOV DX,MY8254_MODE ;初始化 8254 工作方式MOV AL,36H ;定时器 0、方式 3OUT DX,ALMOV SI,OFFSET REC_DATA ;装入录音表初始地址MOV SAVE_SI,SIMOV CL,0EHCLEAN_REC: ;录音表清零MOV AX,0000HMOV SI,AXADD SI,2LOOP CLEAN_RECMOV SI,OFFSET REC_TIME ;装入时间表起始地址MOV SAVE_SI_TIME,SIMOV SI,OFFSET FREQ_LIST1 ;装入频率表默认起
12、始地址MOV SI_FREQ,SIMOV SI,3000HMOV AL,00HMOV SI,AL ;清显示缓冲MOV SI+1,ALMOV SI+2,ALMOV SI+3,ALMOV SI+4,ALMOV SI+5,ALMOV DI,3005HMOV DX,MY8255_CON ;写 8255 控制字MOV AL,81HOUT DX,ALBEGIN: CALL DIS ;调用显示子程序13CALL DIS_FREQ ;调用音区显示子程序CALL CLEAR ;清屏CALL CCSCAN ;键盘扫描JNZ INK1JMP BEGININK1: CALL DISCALL DALLYCALL DAL
13、LYCALL CLEARCALL CCSCANJNZ INK2 ;有键按下,转到 INK2JMP BEGIN;=蜂鸣器关闭子程序=SILENT:MOV DX,MY8254_MODE ;初始化 8254 工作方式MOV AL,36H ;定时器 0、方式 3OUT DX,ALRET;=远程跳转过渡=PLAY2_JUMP: JMP PLAY2CHOOSE_JUMP1: JMP CHOOSE1CHOOSE_JUMP2: JMP CHOOSE2CHOOSE_JUMP3: JMP CHOOSE3;=;确定按下键的位置;=INK2: MOV CH,0FEHMOV CL,00HCOLUM: MOV AL,CH
14、MOV DX,MY8255_A OUT DX,ALMOV DX,MY8255_C IN AL,DXL1: TEST AL,01H ;is L1?JNZ L2 ;如果不是的话跳转到 L2MOV AL,00H ;L114JMP KCODEL2: TEST AL,02H ;is L2?JNZ L3MOV AL,04H ;L2JMP KCODEL3: TEST AL,04H ;is L3?JNZ L4MOV AL,08H ;L3JMP KCODEL4: TEST AL,08H ;is L4?JNZ NEXTMOV AL,0CH ;L4;=;确认按键的值;=KCODE: ADD AL,CLCALL PU
15、TBUFPUSH AX;=;键值存在 AX 中;=CMP AX,12 ;选择音区 1JZ CHOOSE_JUMP1CMP AX,13 ;选择音区 2JZ CHOOSE_JUMP2CMP AX,14 ;选择音区 3JZ CHOOSE_JUMP3CMP AX,15 ;播放录制的音乐JZ PLAY2_JUMP ;jump to play2POP AXPUSH AX15CALL PLAY ; 播放音符POP AXPUSH AX;=;松手检测;=KON: CALL DIS CALL DIS_FREQCALL CLEARCALL CNT_TIME ;按键没有弹起,执行时间计数POP AXPUSH AXCA
16、LL CCSCANJNZ KON ;判断是否弹起,如果没有弹起,继续检测。;按键弹起后:CALL SILENT ;蜂鸣器静音MOV SI,SAVE_SI_TIME MOV AL,SAVE_TIMEMOV SI,AX ;按下的时间进入时间表INC SAVE_SI_TIME;时间表地址+1MOV SAVE_TIME,00H;时间计数清零INC SAVE_SI ;录音表地址+1INC SAVE_SIPOP AXNEXT: INC CLMOV AL,CHTEST AL,08HJZ KERRROL AL,1MOV CH,ALJMP COLUMKERR: JMP BEGINCNT_TIME: ;时间计数C
17、ALL DALLY3INC SAVE_TIME16RET;=;键盘扫描子程序,有按键按下,返回 1;=CCSCAN: MOV AL,00HMOV DX,MY8255_A OUT DX,ALMOV DX,MY8255_C IN AL,DXNOT ALAND AL,0FHRET;=;清屏子程序;=CLEAR: MOV DX,MY8255_B MOV AL,00HOUT DX,ALRET;=;显示子程序;=DIS: PUSH AXMOV SI,3000H;数码管地址MOV DL,0FEH ;数码管位选MOV AL,DLAGAIN: PUSH DXMOV DX,MY8255_A OUT DX,AL ;
18、数码管位选输出MOV AL,SIMOV BX,OFFSET DTABLEAND AX,00FFHADD BX,AX ;得到数码管段选数据MOV AL,BXMOV DX,MY8255_B OUT DX,AL ;数码管段选输出CALL DALLYPOP DXMOV AL,DLMOV DL,ALJMP OUT1OUT1: POP AX17RET;= 延时子程序 =DALLY: PUSH CXMOV CX,0006HT1: MOV AX,009FHT2: DEC AXJNZ T2LOOP T1POP CXRET;=;存键盘值到相应位的缓冲中;=PUTBUF: MOV SI,ALCMP DI,3005H
19、JNZ GOBACKGOBACK: RETCHOOSE1:MOV SI,OFFSET FREQ_LIST1 ;装入频率表 1 起始地址MOV SI_FREQ,SIMOV CHOOSE_FLAG,01HJMP BEGINCHOOSE2:MOV SI,OFFSET FREQ_LIST2 ;装入频率表 2 起始地址MOV SI_FREQ,SIMOV CHOOSE_FLAG,02HJMP BEGINCHOOSE3:MOV SI,OFFSET FREQ_LIST3 ;装入频率表 3 起始地址MOV SI_FREQ,SIMOV CHOOSE_FLAG,03HJMP BEGIN;=;音区数码管显示;=DIS
20、_FREQ:PUSH AXMOV SI,3003H18MOV DL,0FBHMOV AL,DLAGAIN1: PUSH DXMOV DX,MY8255_A OUT DX,ALMOV AL,SIMOV BX,OFFSET DTABLEAND AX,00FFHADD BX,CHOOSE_FLAGMOV AL,BXMOV DX,MY8255_B OUT DX,ALCALL DALLYPOP DXMOV AL,DLMOV DL,ALJMP OUT2OUT2: POP AXRETPLAY: MOV SI,SI_FREQ ;装入频率表起始地址ADD SI,AXADD SI,AXMOV DX,0FH ;输入
21、时钟为 1MHz,1M = 0F4240H MOV AX,4240H DIV WORD PTR SI ;取出频率值计算计数初值, 0F4240H / 输出频率 MOV SI,SAVE_SI ;将计数初值存入录音音符段MOV SI,AXMOV DX,MY8254_COUNT0 ;蜂鸣器播放音符OUT DX,AL MOV AL,AHOUT DX,ALRETPLAY2: MOV SI,OFFSET REC_DATA ;装入录音表计数初值起始地址MOV DI,OFFSET REC_TIME ;装入录音时间表起始地址PLAY2_1:19MOV AX,SIMOV DX,MY8254_COUNT0OUT D
22、X,AL ;装入计数初值并播放MOV AL,AHOUT DX,ALMOV DL,DI ;取出演奏相对时间,调用延时子程序 CALL DALLY2ADD SI,2INC DICALL SILENT ;停止播放 0.1 秒CALL DALLY3CALL DALLY3CALL DALLY3CALL DALLY3CALL DALLY3CALL DALLY3CALL DALLY3CALL DALLY3CALL DALLY3CALL DALLY3CALL DALLY3CALL DALLY3CMP WORD PTR SI,0 ;判断是否到曲末?JE XXX ;如果来到曲末跳转到开始JMP PLAY2_1 ;否则继续播放下一个音符XXX: JMP START ;远程跳转过渡DALLY2 PROC ;延时子程序 2D0: MOV CX,0015HD1: MOV AX,00F0HD2: DEC AXJNZ D2 LOOP D1DEC DLJNZ D0RETDALLY2 ENDPDALLY3 PROC ;延时子程序 320D00:MOV CX,0010HD11:MOV AX,00F0HD22:DEC AXJNZ D22LOOP D11RETDALLY3 ENDPCODE ENDSEND START