1、微机原理与接口技术综合设计实验报告设计课题:基于8086的简易电子琴设计指导老师:学生姓名:学 号:院 系:专 业:通信工程基于8086的简易电子琴设计摘要在学习微机原理与接口设计的基础上,针对课程设计要求,综合运用相关软件、硬件知识,设计一个简易电子琴,使之具有音区切换、数码管显示音区及当前音符、记录音符与音符持续时间、播放录制的音乐等功能。关键词:8086;电子琴;仿真调试;汇编目录第1章 总体方案设计11.1 系统整体架构图11。2 功能介绍1第2章 硬件设计22。1 硬件资源22.2 硬件接线图32。2。1 8254接线图32。2。2 8255及键盘、数码管接线图3第3章 软件设计43
2、。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程序源码11第1章 总体方案设计1。1系统整体架构图系统整体架构图如图1-1所示.图111。2功能介绍本实验设计实现了音区切换、数码管显示当前音区及音符、记录音符与音符持续时间、播放录制的音乐等功能。功能具体说明如下.按键06为音符键,按下后会有对应的音符音调响起,按
3、键弹起后音符终止,此时,按下的音符以及时间将被记录。按键12,13,14可以选择低音,中音,高音区。按下按键15后开始播放录制的音符(不超过16个).另外数码管0显示音符,数码管2显示音区.第2章 硬件设计2.1 硬件资源TDPITE 实验教学系统,其主要系统构成如表21 所示.CPUIntel 386EX存储器系统程序存储器:Flash ROM (128KB)数据存储器:SRAM (128KB)信号源单次脉冲:消抖动脉冲 2 组逻辑电平开关与显示16 组电平开关,16 组电平显示 LED 灯(正逻辑)8259、8237、8254、8255、8251、DAC0832、ADC0809、SRAM
4、、键盘扫描及数接口实验单元码管显示、电子发声、点阵 LED、液晶 LCD(可选)、步进电机(可选)、直流电机、温度控制实验扩展单元2 组 40 线通用集成电路扩展单元、扩展模块总线单元系统电源5V/2A,12V/0.2A表 21 TD-PITE 系统构成系统硬件结构如图 21 所示。图212。2 硬件接线图2。2.18254接线图8254芯片接线如图22所示.图222。2。28255及键盘、数码管接线图8255及键盘、数码管接线方法如图23所示。图23第3章 软件设计3。1 程序框图3。1.1整体框图图313.1.2延时函数图323。1.3键盘扫描图333。1。4数码管显示图343。1.5声音
5、及时间录制图353。1。6选择音区(高、中、低)图3-63.1。7播放音乐图37第4章 实验结果及演示具体演示效果可扫描以下二维码进行观看,二维码如图41所示。图41以下为视频截图。系统初始运行状体如图42所示。图42选择中音区,如图4-3所示。图43按下音符健,如图4-4所示。图44音乐播放,如图4-5所示.图45第5章遇到的问题及改进措施5。1 条件转移指令报错在编写程序时曾多次遇到使用条件转移指令时编译出错的情况.查阅书本后发现条件转移指令只能在代码段的128+127字节内进行跳转.解决办法:使用条件转移指令转移到一个较近程序段,并在这程序段使用无条件转移指令JMP进行转移.5。2无法使
6、用8254作为录音时间计数器在进行设计的过程中,曾多次按照使用8254作为时间计数器的方案进行编程,但经过多次尝试后均以失败告终。解决办法:使用软件延时进行计时,每次延时执行完毕后进行计数,该计数值就是音符的相对持续时间。在播放时只需要调用同样时间长度的延时函数即可。缺点:使用软件延时与计数,占用了CPU计算资源,导致数码管扫描频率降低,亮度变暗。同时对于录音时间的记录不精确,存在一定的误差。附 录程序源码;=; 文件名: Hypo.asm; 功能描述: 按键06为音符键,按下后会有对应的音调响起,; 按键弹起后音符终止。; 按键12,13,14可以选择低音,中音,高音区。; 按下按键15后开
7、始播放之前按下的音符(不超过16个); 数码管0显示音符,数码管2显示音区;=IOY3EQU 06C0HMY8254_COUNT0EQU IOY3+00H ;8254计数器0端口地址MY8254_COUNT1EQU IOY3+02H ;8254计数器1端口地址MY8254_COUNT2EQU IOY3+04H ;8254计数器2端口地址MY8254_MODEEQU IOY3+06H ;8254控制寄存器端口地址MY8255_A EQU 0600H ;8255A端口地址MY8255_B EQU 0602H ;8255B端口地址MY8255_C EQU 0604H ;8255C端口地址MY8255
8、_CONEQU 0606H ;8255控制端口地址SSTACKSEGMENT STACK ;定义堆栈段DW 256 DUP(?)SSTACKENDSDATA 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,14
9、84,1665,1869 ;高音频率表REC_DATA DW 000,000,000,000,000,000,000,000 ;录音储存段 DW 000,000,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 ? ;时间储存表地址储存SAVE_TIME DB 01H ;时间技术
10、储存CHOOSE_FLAG DW 01H;频率表选择标志位DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA ;初始化数据段、代码段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,OFFS
11、ET REC_TIME ;装入时间表起始地址MOV SAVE_SI_TIME,SIMOV SI,OFFSET FREQ_LIST1 ;装入频率表默认起始地址MOV SI_FREQ,SI MOV SI,3000HMOV AL,00HMOV SI,AL;清显示缓冲MOV SI+1,ALMOV SI+2,ALMOV SI+3,ALMOV SI+4,ALMOV SI+5,ALMOV DI,3005H MOV DX,MY8255_CON;写8255控制字 MOV AL,81HOUT DX,ALBEGIN: CALL DIS;调用显示子程序CALL DIS_FREQ ;调用音区显示子程序CALL CLEA
12、R;清屏CALL CCSCAN;键盘扫描JNZ INK1JMP BEGININK1: CALL DIS CALL DALLY CALL DALLY CALL 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: J
13、MP CHOOSE3;=;确定按下键的位置;=INK2: MOV CH,0FEHMOV CL,00HCOLUM: MOV AL,CH MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C IN AL,DXL1: TEST AL,01H ;is L1? JNZ L2 ;如果不是的话跳转到L2 MOV AL,00H ;L1JMP KCODEL2: TEST AL,02H ;is L2? JNZ L3 MOV AL,04H ;L2 JMP KCODEL3: TEST AL,04H ;is L3? JNZ L4 MOV AL,08H ;L3JMP KCODEL4: TES
14、T AL,08H ;is L4? JNZ NEXT MOV AL,0CH ;L4;=;确认按键的值;=KCODE: ADD AL,CLCALL PUTBUFPUSH AX;=;键值存在AX中 ;= CMP AX,12 ;选择音区1 JZ CHOOSE_JUMP1 CMP AX,13 ;选择音区2 JZ CHOOSE_JUMP2 CMP AX,14 ;选择音区3 JZ CHOOSE_JUMP3 CMP AX,15 ;播放录制的音乐 JZ PLAY2_JUMP ;jump to play2 POP AXPUSH AXCALL PLAY ; 播放音符POP AXPUSH AX;=;松手检测;=KON
15、: CALL DIS CALL DIS_FREQCALL CLEARCALL CNT_TIME ;按键没有弹起,执行时间计数POP AXPUSH AXCALL 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,
16、CHTEST AL,08HJZ KERRROL AL,1MOV CH,ALJMP COLUMKERR: JMP BEGINCNT_TIME: ;时间计数CALL DALLY3INC SAVE_TIMERET;=;键盘扫描子程序,有按键按下,返回1;=CCSCAN: MOV AL,00H MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C IN AL,DXNOT AL AND AL,0FHRET;=;清屏子程序;=CLEAR: MOV DX,MY8255_B MOV AL,00H OUT DX,ALRET;=;显示子程序;=DIS: PUSH AXMOV SI,3
17、000H;数码管地址MOV DL,0FEH ;数码管位选MOV AL,DLAGAIN: PUSH DX MOV DX,MY8255_A OUT DX,AL ;数码管位选输出 MOV AL,SI MOV BX,OFFSET DTABLEAND AX,00FFHADD BX,AX ;得到数码管段选数据MOV AL,BX MOV DX,MY8255_B OUT DX,AL ;数码管段选输出CALL DALLY POP DX MOV AL,DLMOV DL,ALJMP OUT1OUT1: POP AXRET;= 延时子程序 =DALLY: PUSH CX MOV CX,0006HT1: MOV AX,
18、009FHT2: DEC AXJNZ T2LOOP T1POP CXRET;=;存键盘值到相应位的缓冲中;=PUTBUF: MOV SI,ALCMP DI,3005HJNZ 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 FR
19、EQ_LIST3 ;装入频率表3起始地址MOV SI_FREQ,SIMOV CHOOSE_FLAG,03HJMP BEGIN;=;音区数码管显示;=DIS_FREQ: PUSH AXMOV SI,3003HMOV DL,0FBHMOV AL,DLAGAIN1: PUSH DX MOV DX,MY8255_A OUT DX,AL MOV AL,SI MOV BX,OFFSET DTABLEAND AX,00FFHADD BX,CHOOSE_FLAGMOV AL,BX MOV DX,MY8255_B OUT DX,ALCALL DALLY POP DX MOV AL,DLMOV DL,ALJMP
20、OUT2OUT2: POP AXRETPLAY: MOV SI,SI_FREQ ;装入频率表起始地址ADD SI,AXADD SI,AXMOV DX,0FH ;输入时钟为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 ;装入录音表计数初值起始地
21、址MOV DI,OFFSET REC_TIME ;装入录音时间表起始地址PLAY2_1: MOV AX,SIMOV DX,MY8254_COUNT0OUT DX,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
22、DALLY3CALL DALLY3CMP WORD PTR SI,0 ;判断是否到曲末?JE XXX ;如果来到曲末跳转到开始JMP PLAY2_1;否则继续播放下一个音符XXX: JMP START ;远程跳转过渡DALLY2PROC ;延时子程序2D0:MOV CX,0015HD1:MOV AX,00F0HD2:DEC AXJNZ D2 LOOP D1DEC DLJNZ D0RETDALLY2ENDPDALLY3PROC ;延时子程序3D00:MOV CX,0010HD11:MOV AX,00F0HD22:DEC AXJNZ D22LOOP D11RETDALLY3ENDPCODEENDSEND START11