基于8086的简易电子琴设计附汇编源程序.docx
- 文档编号:18106929
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:30
- 大小:5.07MB
基于8086的简易电子琴设计附汇编源程序.docx
《基于8086的简易电子琴设计附汇编源程序.docx》由会员分享,可在线阅读,更多相关《基于8086的简易电子琴设计附汇编源程序.docx(30页珍藏版)》请在冰点文库上搜索。
基于8086的简易电子琴设计附汇编源程序
《微机原理与接口技术》
综合设计实验报告
设计课题:
基于8086的简易电子琴设计
指导老师:
学生姓名:
学 号:
院 系:
专 业:
通信工程
ﻬ基于8086的简易电子琴设计
摘要
在学习《微机原理与接口设计》的基础上,针对课程设计要求,综合运用相关软件、硬件知识,设计一个简易电子琴,使之具有音区切换、数码管显示音区及当前音符、记录音符与音符持续时间、播放录制的音乐等功能。
关键词:
8086;电子琴;仿真调试;汇编
ﻩ目录
第1章 总体方案设计1
1.1系统整体架构图ﻩ1
1.2 功能介绍ﻩ1
第2章 硬件设计ﻩ2
2.1硬件资源2
2.2 硬件接线图ﻩ3
2.2.1 8254接线图3
2。
2.28255及键盘、数码管接线图3
第3章 软件设计4
3.1 程序框图ﻩ4
3。
1。
1 整体框图ﻩ4
3.1.3键盘扫描5
3。
1。
4数码管显示ﻩ6
3。
1。
5声音及时间录制ﻩ6
3。
1.6选择音区(高、中、低)ﻩ7
3。
1。
7播放音乐7
第4章实验结果及演示ﻩ8
第5章 遇到的问题及改进措施10
5.1条件转移指令报错ﻩ10
5.2无法使用8254作为录音时间计数器10
程序源码11
第1章 总体方案设计
1.1系统整体架构图
系统整体架构图如图1—1所示。
图1-1
1。
2 功能介绍
本实验设计实现了音区切换、数码管显示当前音区及音符、记录音符与音符持续时间、播放录制的音乐等功能.功能具体说明如下。
按键0—6为音符键,按下后会有对应的音符音调响起,按键弹起后音符终止,此时,按下的音符以及时间将被记录。
按键12,13,14可以选择低音,中音,高音区。
按下按键15后开始播放录制的音符(不超过16个).另外数码管0显示音符,数码管2显示音区.
第2章硬件设计
2.1硬件资源
TD—PITE实验教学系统,其主要系统构成如表2-1所示。
CPU
Intel386EX
存储器
系统程序存储器:
Flash ROM (128KB)
数据存储器:
SRAM(128KB)
信号源
单次脉冲:
消抖动脉冲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-1
2.2 硬件接线图
2。
2.18254接线图
8254芯片接线如图2-2所示。
图2-2
2.2.2 8255及键盘、数码管接线图
8255及键盘、数码管接线方法如图2-3所示。
图2—3
第3章软件设计
3.1 程序框图
3。
1.1整体框图
图3-1
3。
1.2 延时函数
图3-2
3。
1.3键盘扫描
图3-3
3。
1。
4数码管显示
图3-4
3.1.5声音及时间录制
图3-5
3.1.6选择音区(高、中、低)
图3—6
3。
1。
7 播放音乐
图3-7
第4章实验结果及演示
具体演示效果可扫描以下二维码进行观看,二维码如图4—1所示.
图4—1
以下为视频截图。
系统初始运行状体如图4—2所示。
图4-2
选择中音区,如图4-3所示。
图4—3
按下音符健,如图4—4所示。
图4-4
音乐播放,如图4-5所示。
图4—5
第5章遇到的问题及改进措施
5.1 条件转移指令报错
在编写程序时曾多次遇到使用条件转移指令时编译出错的情况。
查阅书本后发现条件转移指令只能在代码段的—128~+127字节内进行跳转.
解决办法:
使用条件转移指令转移到一个较近程序段,并在这程序段使用无条件转移指令JMP进行转移.
5。
2 无法使用8254作为录音时间计数器
在进行设计的过程中,曾多次按照使用8254作为时间计数器的方案进行编程,但经过多次尝试后均以失败告终.
解决办法:
使用软件延时进行计时,每次延时执行完毕后进行计数,该计数值就是音符的相对持续时间。
在播放时只需要调用同样时间长度的延时函数即可。
缺点:
使用软件延时与计数,占用了CPU计算资源,导致数码管扫描频率降低,亮度变暗。
同时对于录音时间的记录不精确,存在一定的误差。
ﻬ附 录
程序源码
;=======================================================
;文件名:
Hypo.asm
;功能描述:
按键0-6为音符键,按下后会有对应的音调响起,
; 按键弹起后音符终止。
; 按键12,13,14可以选择低音,中音,高音区。
; 按下按键15后开始播放之前按下的音符(不超过16个)
; 数码管0显示音符,数码管2显示音区
;=======================================================
IOY3ﻩﻩEQU06C0H
MY8254_COUNT0ﻩEQUIOY3+00H ;8254计数器0端口地址
MY8254_COUNT1ﻩEQU IOY3+02H ;8254计数器1端口地址
MY8254_COUNT2ﻩEQUIOY3+04H ;8254计数器2端口地址
MY8254_MODEﻩEQU IOY3+06H ;8254控制寄存器端口地址
MY8255_A EQU 0600H ;8255A端口地址
MY8255_BEQU 0602Hﻩ;8255B端口地址
MY8255_CEQU0604H ;8255C端口地址
MY8255_CONEQU 0606H ;8255控制端口地址
SSTACKﻩSEGMENTSTACK ;定义堆栈段
ﻩDW256DUP(?
)
SSTACKﻩENDSﻩﻩ
DATA SEGMENT
DTABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;数码管的段选数据
ﻩDB7FH,6FH,77H,7CH,39H,5EH,79H,71H
ﻩ
FREQ_LIST1DW248,278,312,330,371,416,467 ;低音频率表
FREQ_LIST2 DW495,556,624,661,742,833,935 ;中音频率表
FREQ_LIST3DW 990,1112,1248,1322,1484,1665,1869;高音频率表
REC_DATA DW000,000,000,000,000,000,000,000 ;录音储存段
DW000,000,000,000,000,000,000,000
SB DB00H,00H ;过渡段
REC_TIME DB00H,00H,00H,00H,00H,00H,00H,00H ;时间储存段
ﻩ DB00H,00H,00H,00H,00H,00H,00H,00H
SAVE_SIDW?
;录音储存地址储存
SI_FREQDW ?
;频率表地址储存
SAVE_SI_TIMEDW?
;时间储存表地址储存
SAVE_TIMEDB01H ;时间技术储存
CHOOSE_FLAGDW 01H;频率表选择标志位
DATA ﻩENDS
CODE ﻩSEGMENT
ASSUMECS:
CODE,DS:
DATA ;初始化数据段、代码段
START:
MOVAX,DATA
ﻩMOVDS,AX
ﻩMOV DX,MY8254_MODE ;初始化8254工作方式
MOVAL,36H ;定时器0、方式3
ﻩﻩOUTDX,AL
ﻩﻩ
ﻩMOVSI,OFFSETREC_DATA ;装入录音表初始地址
MOVSAVE_SI,SI
ﻩMOV CL,0EH
CLEAN_REC:
;录音表清零
ﻩﻩMOVAX,0000H
ﻩMOV[SI],AX
ﻩﻩADDSI,2
ﻩLOOPCLEAN_REC
ﻩ
ﻩ
ﻩMOVSI,OFFSETREC_TIME ;装入时间表起始地址
ﻩﻩMOV SAVE_SI_TIME,SI
MOVSI,OFFSETFREQ_LIST1 ;装入频率表默认起始地址
MOVSI_FREQ,SI
ﻩ
MOVSI,3000H
ﻩﻩMOV AL,00H
MOV[SI],ALﻩﻩ;清显示缓冲
ﻩMOV [SI+1],AL
MOV[SI+2],AL
ﻩMOV[SI+3],AL
ﻩMOV [SI+4],AL
ﻩﻩMOV [SI+5],AL
MOVDI,3005H
MOVDX,MY8255_CONﻩ;写8255控制字
MOV AL,81H
ﻩﻩOUTDX,AL
BEGIN:
CALL DISﻩﻩﻩﻩ;调用显示子程序
ﻩCALLDIS_FREQ ;调用音区显示子程序
ﻩﻩCALLCLEARﻩﻩﻩ;清屏
CALLCCSCANﻩ;键盘扫描
ﻩﻩJNZINK1
ﻩJMPBEGIN
INK1:
CALL DIS
CALLDALLY
CALLDALLY
CALL CLEAR
ﻩCALLCCSCAN
ﻩJNZ INK2ﻩﻩ;有键按下,转到INK2
ﻩJMPBEGIN
;===============蜂鸣器关闭子程序==================
SILENT:
ﻩMOV DX,MY8254_MODE ;初始化8254工作方式
ﻩﻩMOVAL,36H ;定时器0、方式3
ﻩOUT DX,AL
ﻩRET
ﻩ
;===============远程跳转过渡=================
PLAY2_JUMP:
JMP PLAY2
CHOOSE_JUMP1:
JMPCHOOSE1
CHOOSE_JUMP2:
JMP CHOOSE2
CHOOSE_JUMP3:
JMPCHOOSE3
;========================================
;确定按下键的位置
;========================================
INK2:
MOV CH,0FEH
ﻩMOVCL,00H
COLUM:
MOVAL,CH
MOVDX,MY8255_A
OUTDX,AL
MOV DX,MY8255_C
IN AL,DX
L1:
TEST AL,01H ;isL1?
JNZ L2 ;如果不是的话跳转到L2
MOVAL,00H ;L1
ﻩﻩJMP KCODE
L2:
TESTAL,02H ;isL2?
JNZL3
MOVAL,04H ;L2
JMP KCODE
L3:
TESTAL,04H;isL3?
JNZL4
MOVAL,08H ;L3
ﻩJMPKCODE
L4:
TESTAL,08H ;isL4?
JNZ NEXT
MOVAL,0CH ;L4
ﻩ
;=================================
;确认按键的值
;=================================
KCODE:
ADDAL,CL
ﻩCALLPUTBUF
ﻩPUSHAX
ﻩ;=========================
ﻩﻩ;键值存在AX中
;========================
CMPAX,12;选择音区1
JZCHOOSE_JUMP1
CMPAX,13 ;选择音区2
JZ CHOOSE_JUMP2
CMPAX,14 ;选择音区3
JZCHOOSE_JUMP3
CMP AX,15 ;播放录制的音乐
JZPLAY2_JUMP;jumptoplay2
POPAX
PUSHAX
ﻩ
ﻩCALLPLAY;播放音符
ﻩ
ﻩPOPAX
ﻩﻩPUSHAX
;=====================
;松手检测
;=====================
KON:
CALLDIS
CALLDIS_FREQ
ﻩCALLCLEAR
ﻩCALLCNT_TIME;按键没有弹起,执行时间计数
POPAX
ﻩPUSHAX
ﻩﻩCALLCCSCAN
ﻩJNZKON ;判断是否弹起,如果没有弹起,继续检测。
ﻩﻩ;按键弹起后:
ﻩﻩCALLSILENT;蜂鸣器静音
ﻩ
ﻩMOVSI,SAVE_SI_TIME
ﻩMOVAL,SAVE_TIME
ﻩMOV [SI],AX ;按下的时间进入时间表
ﻩINC SAVE_SI_TIME;时间表地址+1
ﻩMOV SAVE_TIME,00H;时间计数清零
ﻩ
ﻩINC SAVE_SI;录音表地址+1
INCSAVE_SI
ﻩﻩ
ﻩPOP AX
NEXT:
INC CL
ﻩﻩMOVAL,CH
ﻩﻩTESTAL,08H
ﻩﻩJZ KERR
ﻩROLAL,1
ﻩMOVCH,AL
ﻩJMP COLUM
KERR:
JMP BEGIN
CNT_TIME:
;时间计数
ﻩCALL DALLY3
INCSAVE_TIME
RET
ﻩ
;========================================
;键盘扫描子程序,有按键按下,返回1
;========================================
CCSCAN:
MOVAL,00H
MOV DX,MY8255_A
ﻩﻩOUT DX,AL
MOVDX,MY8255_C
INAL,DX
NOTAL
ANDAL,0FH
ﻩﻩRET
;========================================
;清屏子程序
;========================================
CLEAR:
MOV DX,MY8255_B
MOVAL,00H
OUTDX,AL
ﻩﻩRET
;========================================
;显示子程序
;========================================
DIS:
PUSH AX
ﻩﻩMOVSI,3000H;数码管地址
ﻩMOVDL,0FEH;数码管位选
ﻩMOVAL,DL
AGAIN:
PUSHDX
MOVDX,MY8255_A
OUTDX,AL ;数码管位选输出
MOV AL,[SI]
MOVBX,OFFSETDTABLE
ﻩANDAX,00FFH
ﻩADD BX,AX ;得到数码管段选数据
ﻩMOV AL,[BX]
MOVDX,MY8255_B
OUTDX,AL ;数码管段选输出
CALLDALLY
POPDX
MOV AL,DL
ﻩﻩMOV DL,AL
ﻩJMP OUT1
OUT1:
POPAX
RET
ﻩ
;====== 延时子程序======ﻩ
DALLY:
PUSH CX
MOVCX,0006H
T1:
MOVAX,009FH
T2:
DECAX
ﻩﻩJNZT2
LOOPT1
ﻩPOP CX
ﻩRET
;========================================
;存键盘值到相应位的缓冲中
;========================================
PUTBUF:
ﻩMOV[SI],AL
ﻩCMPDI,3005H
ﻩﻩJNZ GOBACK
GOBACK:
RET
CHOOSE1:
ﻩﻩMOVSI,OFFSETFREQ_LIST1 ;装入频率表1起始地址
ﻩﻩMOVSI_FREQ,SI
MOV CHOOSE_FLAG,01Hﻩ
ﻩJMPBEGIN
CHOOSE2:
ﻩﻩMOVSI,OFFSETFREQ_LIST2;装入频率表2起始地址
ﻩMOVSI_FREQ,SI
MOVCHOOSE_FLAG,02Hﻩﻩ
ﻩJMPBEGIN
CHOOSE3:
ﻩMOV SI,OFFSET FREQ_LIST3 ;装入频率表3起始地址
MOVSI_FREQ,SI
ﻩﻩMOVCHOOSE_FLAG,03Hﻩﻩ
ﻩﻩJMPBEGIN
ﻩ
;==========================
;音区数码管显示
;==========================
DIS_FREQ:
ﻩ PUSHAX
ﻩMOVSI,3003H
ﻩMOVDL,0FBH
ﻩMOVAL,DL
AGAIN1:
PUSHDX
MOVDX,MY8255_A
OUTDX,AL
MOVAL,[SI]
MOVBX,OFFSETDTABLE
ﻩANDAX,00FFH
ADDBX,CHOOSE_FLAG
ﻩﻩMOVAL,[BX]
MOVDX,MY8255_B
ﻩOUT DX,AL
CALLDALLY
POP DX
MOV AL,DL
ﻩﻩMOVDL,AL
JMP OUT2
OUT2:
POPAX
RET
ﻩ
PLAY:
ﻩMOVSI,SI_FREQ ;装入频率表起始地址
ﻩADDSI,AX
ﻩﻩADDSI,AX
MOVDX,0FH ;输入时钟为1MHz,1M=0F4240H
ﻩMOVAX,4240H
DIVWORDPTR[SI] ;取出频率值计算计数初值,0F4240H/输出频率
ﻩMOVSI,SAVE_SI;将计数初值存入录音音符段
ﻩMOV[SI],AX
MOV DX,MY8254_COUNT0 ;蜂鸣器播放音符
OUTDX,AL
ﻩﻩMOV AL,AH
ﻩOUTDX,AL
ﻩRET
ﻩ
PLAY2:
ﻩMOVSI,OFFSETREC_DATA ;装入录音表计数初值起始地址
ﻩMOVDI,OFFSETREC_TIME ;装入录音时间表起始地址
PLAY2_1:
MOVAX,[SI]
ﻩﻩMOVDX,MY8254_COUNT0
ﻩOUTDX,AL ;装入计数初值并播放
ﻩﻩMOVAL,AH
OUT DX,AL
MOVDL,[DI] ;取出演奏相对时间,调用延时子程序
CALLDALLY2
ﻩ
ADDSI,2
ﻩINCDI
ﻩCALLSILENTﻩﻩ;停止播放0.1秒
ﻩCALLDALLY3
ﻩCALLDALLY3
ﻩCALLDALLY3
CALLDALLY3
CALLDALLY3
CALLDALLY3
ﻩﻩCALLDALLY3
ﻩﻩCALLDALLY3
ﻩCALLDALLY3
ﻩﻩCALLDALLY3
ﻩCALLDALLY3
ﻩﻩCALLDALLY3
ﻩ
CMP WORDPTR [SI],0 ;判断是否到曲末?
ﻩJEXXX ;如果来到曲末跳转到开始
ﻩJMPPLAY2_1ﻩﻩﻩﻩ;否则继续播放下一个音符
ﻩﻩ
XXX:
JMP START;远程跳转过渡
DALLY2PROC ;延时子程序2
D0:
MOVCX,0015H
D1:
MOV AX,00F0H
D2:
ﻩDEC AX
JNZD2
ﻩﻩLOOPD1
ﻩﻩDEC DL
ﻩJNZ D0
ﻩRET
DALLY2ENDP
DALLY3PROC ;延时子程序3
D00:
MOVCX,0010H
D11:
MOVAX,00F0H
D22:
ﻩDECAX
ﻩJNZD22
ﻩLOOPD11
RET
DALLY3ﻩENDP
CODEﻩENDS
ﻩENDSTART
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 8086 简易 电子琴 设计 汇编 源程序
![提示](https://static.bingdoc.com/images/bang_tan.gif)