汇编接口综合实验 简易电子琴实验.docx

上传人:b****7 文档编号:10550607 上传时间:2023-02-21 格式:DOCX 页数:24 大小:369.57KB
下载 相关 举报
汇编接口综合实验 简易电子琴实验.docx_第1页
第1页 / 共24页
汇编接口综合实验 简易电子琴实验.docx_第2页
第2页 / 共24页
汇编接口综合实验 简易电子琴实验.docx_第3页
第3页 / 共24页
汇编接口综合实验 简易电子琴实验.docx_第4页
第4页 / 共24页
汇编接口综合实验 简易电子琴实验.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

汇编接口综合实验 简易电子琴实验.docx

《汇编接口综合实验 简易电子琴实验.docx》由会员分享,可在线阅读,更多相关《汇编接口综合实验 简易电子琴实验.docx(24页珍藏版)》请在冰豆网上搜索。

汇编接口综合实验 简易电子琴实验.docx

汇编接口综合实验简易电子琴实验

简易电子琴

——键盘控制电子音响发声、8x8点阵LED灯显示

实验报告

12281166崔雪莹12281161安容巧12281183张佳悦

一、实验目的

1.了解小键盘的工作原理,学会如何使用小键盘进行控制,熟悉流程和代码编程;

2.了解电子音响的发声原理,会利用8253A级联方式控制其发出不同频率的声音;

3.了解8X8点阵LED灯的工作原理,学会显示想要显示的文字和图形;

4.实验结合8253,8259,8255和小键盘,8*8点阵的应用共同实现。

5.实验目的效果:

小键盘触发按键,控制电子音响发出相应频率的声音,8X8点阵LED灯显示相应的内容。

二、实验内容

实验主要概述:

键盘控制实现两个音部(高音部、低音部)的发声,即:

当在键盘上按下‘0’、‘1’、‘2’、‘3’、‘4’、‘5’、‘6’、‘7’时,电子音响发出不同频率的低音调,当在键盘上按下‘8’、‘9’、‘A’、‘B’、‘C’、‘D’、‘E’、‘F’时,电子音响发出不同频率的高音调。

同时,在8x8LED灯上显示相应音调对应的‘1’、‘2’、‘3’、‘4’、‘5’、‘6’、‘7’、‘8’、‘9’、‘A’、‘B’、‘C’、‘D’、‘E’、‘F’。

1.小键盘按键的获取:

图1小键盘原理图

小键盘按键获取原理:

(1)判断是否有按键按下:

若某行为低电平,此时该行某按键对应某列也为低电平,则说明该按键此时被按下。

将8255A的A口PA0-PA3接行0到行3,B口的PB0-PB3接列0到列3。

A口做输出,B口做输入。

将A口输出设置为0000读取B口的此时的值,若不是全为1则说明有按键按下。

无按键按下则等待。

(2)去抖动:

延时,等待按键通断引起的抖动消失。

延时后再读B端口,若还有按键闭合,则认为按键已确定。

(3)找到被按下的按键:

用逐行扫描的方法读出此时按键相应的值。

从第0行开始,输出0,顺序逐行扫描。

每扫描一行,读入列线值,从0列开始,逐列检查是否为0。

若为0,则表示该列有键按下;若为1,则表示无键按下。

这样按顺序扫描每一行及其列值,直到找到为0列值,则该键就是被按下的键。

计算按键编号。

(4)根据找到的键号,执行键号对应的程序。

2.电子音响发声

电子音响发声基本原理:

8253A的1工作方式和3方式配合可以产生占空比不同的输出方波,用这种波形可控制电子音响发出不同的音调。

使用通道0和通道2,通道0的输出OUT0作为通道2的GATE2的门控信号;通道0工作在3方式,产生一定周期的方波信号,通道2工作在1方式;1方式虽然不是周期输出,但是在GATE2信号上升沿周期出现时,1方式可以重新计数。

通过对这两种工作方式的计数初值的合理设置,通道2可以产生不同频率的周期性信号,来控制扬声器的发声。

当3方式的方波周期大于1方式定时长度时,可通过改变1方式定时时间常数就可以改变方波的占空比(如下图2示);当3方式的方波周期小于1方式定时长度时,1方式总处于定时期间(发声停止)。

图2波形图

3.8x8点阵LED灯显示

8x8LED灯的工作原理:

只要在行线R1-R8加上高电平,在列线C1-C8加上低电平,则两线交叉点的LED就会发光。

通过此原理我们计算出了‘1’、‘2’、‘3’、‘4’、‘5’、‘6’、‘7’、‘8’、‘9’、‘A’、‘B’、‘C’、‘D’、‘E’、‘F’所对应的编码方案。

并通过逐列扫描并延迟的方法实现字母的显示。

图3-18x8点阵内部结构图

图3-28x8点阵外部图

举一个很简单的例子,将8X8点阵简化为1个平面有64个点图像,来确定其显示的编码形式,如代码中DATA部分的那个大的显示矩阵

以“0”来举例说明显示8X8点阵显示过程:

图3-28x8点阵‘0’显示

8X8点阵显示“0”是因为,我们将所有的列都置高电平,然后让需要显示的发光二极管对应的点的行置低电平,其他行的则置高电平,然后把置低电平的行码记为1其他的记0,再从左向右读,则可以得到一个8位的2进制数。

如上图所示,第1行和第8行是00H,第2行和第7行是18H,第3、4、5行都是24H

则“0”显示的编码是:

00H,18H,24H,24H,24H,18H,00H

三、实验分析与设计

1.硬件思路

小键盘部分:

因为小键盘的读入用的扫描法,4行必须使用输入,4列必须输出,所以我们用到8255的PA0-PA3作为输出,PB0-PB3作为输入。

8255片选接200H。

扬声器发声部分:

8253使用级联方式,OUT0接GATE2,OUT2接扬声器,片选接210H。

点阵显示部分:

8X8阵列行接A口,列接B口。

中断部分:

PC6接MIR5中断。

2.软件分析

查询流程图如下:

图4-1主程序图4-2小键盘子程序

图4-3发声子程序图4-48x8LED灯子程序

四、实验硬件连线图

根据以上描述的硬件设计思路,电路连接线应如下图所示。

图5-1发声子程序实验连线图

图5-2小键盘子程序(含数码管)实验连接图

图5-38X8LED灯子程序实验连接图

五、实验创意

我们应用了小键盘模块、扬声器和8x8点阵LED模块,同时结合8253A定时计数模块,8255并行接口模块,8299中断模块将整个实验联系起来,实现了一个简易电子琴的装置。

同时在8x8点阵显示了按键对应的字符显示,让这个电子琴看起来更加炫!

8*8点阵我们最初想随着音调的高低变化亮度和点的多少,在实现的时候发现效果并不明显,所以我们改成随着按键发声来显示对应的字符,效果比之前好得多。

另外,发声频率由8253A写入计数控制,基本音有7个,加上一个高一调,而键盘可控制16个,所以我们分为高音部和低音部,实现了一个转换音的效果,更加人性化。

其实,我们有更高的愿望,比如,我们希望可以小键盘弹奏一首歌后按键实现自动播放整首歌曲的功能,这样就更加完整了,但是因时间和能力关系没能实现。

我们还想用128x64LCD实现一个音阶才的实时变化,希望我们在今后的学习之余回顾这个实验时可以补上这些功能。

六、实验结果演示

1.实际实验连线图

黄线8255的A口连8*8点阵的行1~8,小键盘的行0~3,红线B口连点阵的列1~8,小键盘的列0~3。

绿线表示8253的级联和cs接法,黑线连接扬声器SIN和out2,中断MIR5接PC6。

2.8x8点阵各字母显示图(部分举例,未全部贴图)(‘2’‘5’‘8’‘9’‘A’‘B’‘D’‘E’)

3.声音视频见文件“实验效果视频”。

七、实验体会

崔雪莹:

本次实验我主要负责程序代码的编写和整个实验的设计,通过此次实验,我对于硬件编程有了更为深入的了解,懂得了怎样编写硬件的较大一点的程序,尤其是写代码的时候一定要思路清晰,明确的知道自己到底想要做些什么,怎么去设计这个实验,通过此次试验对于今后的硬件学习打下了很好的基础。

经过这次试验,我对8255等芯片以及小键盘、8X8LED灯、电子音响的工作原理有了更为全面、更为深刻的理解,锻炼自己独立的利用手上芯片进行独立编程的能力。

实验还有继续改进的地方,我会继续学习,更加深入的去学习和研究。

安容巧:

本次试验是接口课中最复杂的一次实验,第一次实验课之前我们小组就去实验室讨论试验内容,确定了试验内容之后开始代码的初步编写。

经过实验课和老师的指导,我们完善了设计方案,经过多次课下小组自己找时间自己做实验,最终完成了试验。

经过这次试验,我们队8255等芯片以及小键盘、8X8LED灯、电子音响的工作原理有了更为全面、更为深刻的理解。

小组一起做实验,一起讨论,让我们学会了团队合作,对以后的学习工作很有帮助。

张佳悦:

本实验考查的内容很多,不仅有课堂上所学习的汇编与接口的知识,还对我们团队小组的分工协作提出了很高的要求。

我们小组成员分工明确、各尽所能,为整个设计性实验的完成作出了贡献。

同时,在和小组成员的交流中,我也强化了自己对汇编程序的理解以及对接口知识的巩固。

最后的成果,我个人感到非常满意,达到了预期的效果。

汇编与接口方面还有很多我们不太会用但的确重要的东西需要我们在接下来的学习中深入研究和探索。

 

_______________________________________________________________________________

 

附件:

程序清单(加注释)

.modelsmall

.386

DATASEGMENT

KEY_NODB?

;用来存储按键编号

;8*8点阵显示时字符

D0DB00H,18H,24H,24H,24H,24H,18H,00H;‘0’

D1DB00H,18H,18H,18H,18H,18H,18H,00H;‘1’

D2DB00H,3CH,20H,20H,3CH,04H,04H,3CH;‘2’

D3DB00H,3CH,20H,20H,3CH,20H,20H,3CH;‘3’

D4DB00H,24H,24H,24H,3CH,20H,20H,20H;‘4’

D5DB00H,3CH,04H,04H,3CH,20H,20H,3CH;‘5’

D6DB00H,3CH,04H,04H,3CH,24H,24H,3CH;‘6’

D7DB00H,3CH,20H,20H,20H,20H,20H,20H;‘7’

D8DB00H,3CH,24H,24H,3CH,24H,24H,3CH;‘8’

D9DB00H,3CH,24H,24H,3CH,20H,20H,3CH;‘9’

DADB18H,3CH,66H,66H,7EH,66H,66H,66H;‘A’

DB1DB00H,1CH,24H,24H,14H,24H,24H,14H;‘B’

DCDB00H,18H,24H,04H,04H,24H,18H,00H;‘C’

DD1DB00H,1CH,24H,24H,24H,24H,1CH,00H;‘D’

DEDB00H,3CH,04H,04H,3CH,04H,04H,3CH;‘E’

DFDB00H,3CH,04H,04H,3CH,04H,04H,04H;‘F’

NUMERDB7FH,5BH,6DH,6FH,40H,77H

DIPINDW0EE8H,0D49H,0BD6H,0B41H,9F7H,8E1H,7E8H,778H,7A6H,700H,66BH,600H,55BH,500H,454H,400H;频率表即计数器计数初值

DATAENDS;前8个低音,后8个高音

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

CLI

MOVDX,21H;设置主片中断屏蔽字

INAL,DX

ANDAL,11011111B;使用MIR5

OUTDX,AL

CALLPREPARE;调用PREPARE子程序,写入中断向量表

LOP:

CALLINKEY;调用INKEY子程序,检测按键

CALLSHOWALPHA;调用SHOWALPHA子程序,8X8点阵显示字母

JMPLOP;循环

MOVAX,4CH;程序结束

INT21H

;中断服务程序

INTERPROC;中断服务程序,进中断发声

PUSHDX;保护寄存器

PUSHAX

CLI;关中断

CALLLOUD;调用发声子程序

MOVDX,20H;发EOI中断结束命令

MOVAL,20H;OCW2,非自动结束

OUTDX,AL

STI;开中断

POPAX

POPDX

IRET

INTERENDP

;发声子程序

LOUDPROC

PUSHAX

PUSHDX

MOVDX,213H;初始化8253通道0

MOVAL,00110110B;命令字,通道0,3方式

OUTDX,AL

MOVDX,210H

MOVAX,0FF40H;通道0,赋初值8000

OUTDX,AL;先写低字节

MOVAL,AH

OUTDX,AL;再写高字节

MOVDX,213H;初始化8253通道2

MOVAL,10110010B;命令字,1方式,方波

OUTDX,AL

MOVDX,212H;通道2

MOVSI,OFFSETDIPIN;频率表首地址送SI

MOVAL,KEY_NO;取键盘编号

MOVAH,0

ADDSI,AX;相加得到键盘编号对应的计数初值

MOVAX,[SI];取得对应的计数初值,送扬声器发声

OUTDX,AL

MOVAL,AH

OUTDX,AL

CALLDELAY;调用延时子程序

MOVDX,213H;将通道0的周期改成小于通道二让发声停止

MOVAL,00110110B;通道03方式

OUTDX,AL

MOVDX,210H

MOVAX,00F4H;通道0赋初值500

OUTDX,AL;先写低字节

MOVAL,AH

OUTDX,AL;再写高字节

POPDX

POPAX

RET

LOUDENDP

;检测键盘子程序

INKEYPROC

MOVDX,213H;按键之前不发声

MOVAL,00110110B;通道0,3方式

OUTDX,AL

MOVDX,210H

MOVAX,01F4H;通道0赋初值500

OUTDX,AL;先写低字节

MOVAL,AH

OUTDX,AL;再写高字节

CLI

MOVDX,203H;初始化8255

MOVAL,10000010B;A输出,B读入

OUTDX,AL

MOVDX,200H;输出PA为0以便下面获得是否有按键按下

MOVAL,0

OUTDX,AL

WAIT1:

MOVDX,201H;读入PB的值

INAL,DX

ANDAL,0FH;屏蔽无关位

CMPAL,0FH;检测是否有列线为0

JZWAIT1;没有按键输入就退出函数

CALLDELAY;调用延时子程序

BEGIN2:

;检测按下的是哪一个按键

MOVCH,04H;循环检测4行

MOVCL,0FFH;-1,保存按键编码

MOVBL,0EH;行屏蔽码

LOP2:

MOVAL,BL;从第0行开始扫描

MOVDX,200H;把AL指示的行线置零

OUTDX,AL

MOVDX,201H

INAL,DX;读入列线状态

ANDAL,0FH;屏蔽无关位

CMPAL,0FH;若某位为0,则表明检测到按键

JNZSAVE

ADDCL,4;无按键,跳过一行键盘编号

SHLBL,1;移动到下一行

DECCH;行数减一

JNZLOP2;继续扫描

JMPBEGIN2;检测完4行,无按键按下,跳转到等待按键

SAVE:

;保存按键号

INCCL

SHRAL,1

JCSAVE;得到键盘编号

ADDCL,CL

MOVKEY_NO,CL;保存键盘编号

STI

MOVDX,203H;PC6按位置位触发中断

MOVAL,00001101B

OUTDX,AL;发高电平

NOP

NOP

MOVAL,00001100B;发低电平

OUTDX,AL

RET

INKEYENDP

;写中断向量表子程序

PREPAREPROCNEAR

PUSHAX

CLI

CLD

MOVAX,0

MOVES,AX

MOVDI,4*35H

MOVAX,OFFSETINTER

STOSW

MOVAX,SEGINTER

STOSW

STI

POPAX

RET

PREPAREENDP

;8x8点阵显示子程序

SHOWALPHAPROC

PUSHAX

PUSHBX

PUSHCX

PUSHDX

MOVBL,KEY_NO;判断是否有按键按下

CMPBL,-1;寄存器BL中数据与-1比较

;大于1则证明有按键,反之则无按键

MOVBH,3FH;将3FH送到BH中,代表了8X8点阵有64个

JZEND1

;初始化8255

MOVDX,203H

MOVAL,10000000B;A输出,B输出

OUTDX,AL

NEXT1:

MOVBL,00000001B

MOVSI,OFFSETA;得到偏移量

MOVAL,8

MULLED_NO

ADDSI,AX

MOVCL,8

NEXT:

MOVDX,201H

MOVAL,BL

OUTDX,AL

MOVDX,200H

MOVAL,[SI]

OUTDX,AL

CALLDELAY1

CALLDELAY1

CALLDELAY1

CALLDELAY1

INCSI

SHLBL,1

DECCL

;刷完8列后就跳出

JNZNEXT

DECBH

JNZNEXT1

END1:

POPDX

POPCX

POPBX

POPAX

RET

SHOWALPHAENDP

;延时子程序

DELAY1PROC

PUSHAX

MOVAX,0FFH

L:

DECAX

JNZL

POPAX

RET

DELAY1ENDP

;延时子程序

DELAYPROCNEAR

PUSHAX

MOVAX,0FFFFH

W:

DECAX

JNZW

MOVAX,0FFFFH

W2:

DECAX

JNZW2

POPAX

RET

DELAYENDP

CODEENDS

ENDSTART

八、成员分工

崔雪莹(第一完成人):

整体代码框架,小键盘、中断、8255、显示8x8点阵等代码,撰写的实验报告包括实验目的,实验原理小键盘部分和电子琴发声部分,绘制全部实验原理图、实验流程图和实验连接图,实验分析,实验结果分析和图片,实验的全部代码及注释,实验报告的排版等。

安容巧(第二完成人):

8x8点阵字符代码部分,字母常数值计算,8x8字母显示调试,实验连线,撰写的实验报告部分:

8x8点阵流程图设计,8x8点阵代码注释,拍照及录制实验视频。

张佳悦(第三完成人):

8253代码,8x8点阵字符代码部分,字母常数值计算,8x8字母显示调试,实验连线,撰写的实验报告部分:

8x8部分代码注释,实验感想。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1