综合设计实验报告
设计课题:基于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.2 8255及键盘、数码管接线图 3
第3章 软件设计 4
3.1 程序框图 4
3.1.1 整体框图 4
3.1.2 延时函数 5
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
程序源码 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 | Intel 386EX | |
存储器 | 系统程序存储器: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.1 8254接线图
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-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 EQU 06C0H
MY8254_COUNT0 EQU IOY3+00H ;8254计数器0端口地址
MY8254_COUNT1 EQU IOY3+02H ;8254计数器1端口地址
MY8254_COUNT2 EQU 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 ENDS
DATA SEGMENT
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H;数码管的段选数据
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
FREQ_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,000,000,000,000,000,000,000
SB DB 00H,00H ;过渡段
REC_TIME DB 00H,00H,00H,00H,00H,00H,00H,00H ;时间储存段
DB 00H,00H,00H,00H,00H,00H,00H,00H
SAVE_SI DW ? ;录音储存地址储存
SI_FREQ DW ? ;频率表地址储存
SAVE_SI_TIME DW ? ;时间储存表地址储存
SAVE_TIME DB 01H ;时间技术储存
CHOOSE_FLAG DW 01H;频率表选择标志位
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA ;初始化数据段、代码段
START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8254_MODE ;初始化8254工作方式
MOV AL,36H ;定时器0、方式3
OUT DX,AL
MOV SI,OFFSET REC_DATA ;装入录音表初始地址
MOV SAVE_SI,SI
MOV CL,0EH
CLEAN_REC: ;录音表清零
MOV AX,0000H
MOV [SI],AX
ADD SI,2
LOOP CLEAN_REC
MOV SI,OFFSET REC_TIME ;装入时间表起始地址
MOV SAVE_SI_TIME,SI
MOV SI,OFFSET FREQ_LIST1 ;装入频率表默认起始地址
MOV SI_FREQ,SI
MOV SI,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
MOV DI,3005H
MOV DX,MY8255_CON ;写8255控制字
MOV AL,81H
OUT DX,AL
BEGIN: CALL DIS ;调用显示子程序
CALL DIS_FREQ ;调用音区显示子程序
CALL CLEAR ;清屏
CALL CCSCAN ;键盘扫描
JNZ INK1
JMP BEGIN
INK1: CALL DIS
CALL DALLY
CALL DALLY
CALL CLEAR
CALL CCSCAN
JNZ INK2 ;有键按下,转到INK2
JMP BEGIN
;===============蜂鸣器关闭子程序==================
SILENT:
MOV DX,MY8254_MODE ;初始化8254工作方式
MOV AL,36H ;定时器0、方式3
OUT DX,AL
RET
;===============远程跳转过渡=================
PLAY2_JUMP: JMP PLAY2
CHOOSE_JUMP1: JMP CHOOSE1
CHOOSE_JUMP2: JMP CHOOSE2
CHOOSE_JUMP3: JMP CHOOSE3
;========================================
;确定按下键的位置
;========================================
INK2: MOV CH,0FEH
MOV CL,00H
COLUM: MOV AL,CH
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
IN AL,DX
L1: TEST AL,01H ;is L1?
JNZ L2 ;如果不是的话跳转到L2
MOV AL,00H ;L1
JMP KCODE
L2: TEST AL,02H ;is L2?
JNZ L3
MOV AL,04H ;L2
JMP KCODE
L3: TEST AL,04H ;is L3?
JNZ L4
MOV AL,08H ;L3
JMP KCODE
L4: TEST AL,08H ;is L4?
JNZ NEXT
MOV AL,0CH ;L4
;=================================
;确认按键的值
;=================================
KCODE: ADD AL,CL
CALL PUTBUF
PUSH 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 AX
PUSH AX
CALL PLAY ; 播放音符
POP AX
PUSH AX
;=====================
;松手检测
;=====================
KON: CALL DIS
CALL DIS_FREQ
CALL CLEAR
CALL CNT_TIME ;按键没有弹起,执行时间计数
POP AX
PUSH AX
CALL CCSCAN
JNZ KON ;判断是否弹起,如果没有弹起,继续检测。
;按键弹起后:
CALL SILENT ;蜂鸣器静音
MOV SI,SAVE_SI_TIME
MOV AL,SAVE_TIME
MOV [SI],AX ;按下的时间进入时间表
INC SAVE_SI_TIME;时间表地址+1
MOV SAVE_TIME,00H;时间计数清零
INC SAVE_SI ;录音表地址+1
INC SAVE_SI
POP AX
NEXT: INC CL
MOV AL,CH
TEST AL,08H
JZ KERR
ROL AL,1
MOV CH,AL
JMP COLUM
KERR: JMP BEGIN
CNT_TIME: ;时间计数
CALL DALLY3
INC SAVE_TIME
RET
;========================================
;键盘扫描子程序,有按键按下,返回1
;========================================
CCSCAN: MOV AL,00H
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
IN AL,DX
NOT AL
AND AL,0FH
RET
;========================================
;清屏子程序
;========================================
CLEAR: MOV DX,MY8255_B
MOV AL,00H
OUT DX,AL
RET
;========================================
;显示子程序
;========================================
DIS: PUSH AX
MOV SI,3000H;数码管地址
MOV DL,0FEH ;数码管位选
MOV AL,DL
AGAIN: PUSH DX
MOV DX,MY8255_A
OUT DX,AL ;数码管位选输出
MOV AL,[SI]
MOV BX,OFFSET DTABLE
AND AX,00FFH
ADD BX,AX ;得到数码管段选数据
MOV AL,[BX]
MOV DX,MY8255_B
OUT DX,AL ;数码管段选输出
CALL DALLY
POP DX
MOV AL,DL
MOV DL,AL
JMP OUT1
OUT1: POP AX
RET
;====== 延时子程序 ======
DALLY: PUSH CX
MOV CX,0006H
T1: MOV AX,009FH
T2: DEC AX
JNZ T2
LOOP T1
POP CX
RET
;========================================
;存键盘值到相应位的缓冲中
;========================================
PUTBUF:
MOV [SI],AL
CMP DI,3005H
JNZ GOBACK
GOBACK: RET
CHOOSE1:
MOV SI,OFFSET FREQ_LIST1 ;装入频率表1起始地址
MOV SI_FREQ,SI
MOV CHOOSE_FLAG,01H
JMP BEGIN
CHOOSE2:
MOV SI,OFFSET FREQ_LIST2 ;装入频率表2起始地址
MOV SI_FREQ,SI
MOV CHOOSE_FLAG,02H
JMP BEGIN
CHOOSE3:
MOV SI,OFFSET FREQ_LIST3 ;装入频率表3起始地址
MOV SI_FREQ,SI
MOV CHOOSE_FLAG,03H
JMP BEGIN
;==========================
;音区数码管显示
;==========================
DIS_FREQ:
PUSH AX
MOV SI,3003H
MOV DL,0FBH
MOV AL,DL
AGAIN1: PUSH DX
MOV DX,MY8255_A
OUT DX,AL
MOV AL,[SI]
MOV BX,OFFSET DTABLE
AND AX,00FFH
ADD BX,CHOOSE_FLAG
MOV AL,[BX]
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
POP DX
MOV AL,DL
MOV DL,AL
JMP OUT2
OUT2: POP AX
RET
PLAY:
MOV SI,SI_FREQ ;装入频率表起始地址
ADD SI,AX
ADD SI,AX
MOV DX,0FH ;输入时钟为1MHz,1M = 0F4240H
MOV AX,4240H
DIV WORD PTR [SI] ;取出频率值计算计数初值,0F4240H / 输出频率
MOV SI,SAVE_SI ;将计数初值存入录音音符段
MOV [SI],AX
MOV DX,MY8254_COUNT0 ;蜂鸣器播放音符
OUT DX,AL
MOV AL,AH
OUT DX,AL
RET
PLAY2:
MOV SI,OFFSET REC_DATA ;装入录音表计数初值起始地址
MOV DI,OFFSET REC_TIME ;装入录音时间表起始地址
PLAY2_1:
MOV AX,[SI]
MOV DX,MY8254_COUNT0
OUT DX,AL ;装入计数初值并播放
MOV AL,AH
OUT DX,AL
MOV DL,[DI] ;取出演奏相对时间,调用延时子程序
CALL DALLY2
ADD SI,2
INC DI
CALL SILENT ;停止播放0.1秒
CALL DALLY3
CALL DALLY3
CALL DALLY3
CALL DALLY3
CALL DALLY3
CALL DALLY3
CALL DALLY3
CALL DALLY3
CALL DALLY3
CALL DALLY3
CALL DALLY3
CALL DALLY3
CMP WORD PTR [SI],0 ;判断是否到曲末?
JE XXX ;如果来到曲末跳转到开始
JMP PLAY2_1 ;否则继续播放下一个音符
XXX: JMP START ;远程跳转过渡
DALLY2 PROC ;延时子程序2
D0: MOV CX,0015H
D1: MOV AX,00F0H
D2: DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET
DALLY2 ENDP
DALLY3 PROC ;延时子程序3
D00: MOV CX,0010H
D11: MOV AX,00F0H
D22: DEC AX
JNZ D22
LOOP D11
RET
DALLY3 ENDP
CODE ENDS
END START
前往百度app查看全文,
体验更佳
取消
立即查看
点击加载更多
加载失败,请重试
小米和华为哪个质量好,「京东手机」高清质感大屏,无限视界。内存大充电快,超长待机享乐不停!
开通VIP,免费获得本文
本文立即免费保存
赠百度阅读VIP精品版
100W文档免费下载
5100W文档VIP专享
分享
收藏
下载
转存
打开文库App,查看更多同类文档
立即领取
VIP教育大礼包
热门小说免费读
相关推荐文档
- 8086简易电子琴设计程序清单
用App查看
- 汇编语言课程设计之电子琴源代码
用App查看
- 基于8086的电子时钟设计(汇编语音)
好评
- 汇编课设 简易电子琴
- 电子琴汇编源码
- 汇编语言,单片机设计简易电子琴
推荐
- 汇编语言(简易电子琴)
- 基于FPGA的电子琴设计(源程序)
- 基于单片机和汇编语言的简易电子琴
热门
- 电子琴设计论文(汇编)123
为你推荐
太不可思议了!她没节食没运动,用了这个方法,瘦出迷人S型身材!
伊美 广告
下载文档
加入VIP免券下载 低至0.30元/天
发送至邮箱
收件人:
输入的邮箱格式错误
取消
发送
已发送
已发送至邮箱
*若未收到邮件,请查看您的广告/垃圾邮件
知道了