音乐喷泉Word格式文档下载.docx
- 文档编号:7296752
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:21
- 大小:195.93KB
音乐喷泉Word格式文档下载.docx
《音乐喷泉Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《音乐喷泉Word格式文档下载.docx(21页珍藏版)》请在冰点文库上搜索。
音符:
1234567
(重低音)
对应频率(Hz):
131147165175196220247
(低音)
262294330349392440494
(中音)
523587659698784880988
(高音)
1046117513181397156817601975
3设计原理流程图
无按键
4实际硬件接线图
5程序清单及注释
5.1音乐喷泉程序编写
MY8255_AEQU0640H
MY8255_BEQU0642H
MY8255_CEQU0644H
MY8255_MODEEQU0646H
MY8254_MODEEQU0686H
MY8254_AEQU0680H;
进行宏定义
DATASEGMENT
FREQ_LISTDW441D,495D,556D,589D,661D,742D,833D,882D
DW262D,294D,330D,373D,402D,450D,494D,-1D;
建立数据段
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA;
实现段寄存器DS的初始化
MOVDS,AX
MOVDX,MY8255_MODE;
写8255芯片的控制字,实
现工作在方式0,B端口输出,A端口输入
MOVAL,90H
OUTDX,AL
MOVDX,MY8254_MODE;
使8254工作在方式3,A
口输入,运用计数器1,二进制方式
MOVAL,76H
BEGIN:
CALLSCAN;
键盘扫描
JNZINK1
JMPBEGIN
;
========================================
确定按下键的位置
INK1:
CALLSCAN
JNZINK2;
有键按下时跳到INK1
;
没见按下时循环执行BEGIN
JMPBEGIN
INK2:
MOVCH,0FEH
MOVCL,00H
COOL:
MOVAL,CH
MOVDX,MY8255_B;
将8255的B口地址赋给DX
;
将CPU中的AL值送到8255
的B口中,即送到X1、X2、X3、X4中
MOVDX,MY8255_A;
将8255的A口地址赋给DX
将A口的值送到AL中
INAL,DX
L1:
TESTAL,01H;
检验按下键是否在L1
不是L1则跳到L2
;
为了后面用来与FREQ_LIST
JNZL2数据段中数对应
MOVAL,00H
JMPCODE;
强制跳转到CODE
L2:
TESTAL,02H;
检验按下键是否在L2
不是L2则跳到L3
JNZL3;
数据段中数对应。
MOVAL,04H
JMPCODE;
L3:
TESTAL,04H;
检验按下键是否在L3
JNZL4;
不是L3则跳到L4
MOVAL,08H;
数据段中数对应。
JMPCODE;
L4:
TESTAL,08H;
检验按下键是否在L4
JNZNEXT;
不是L4则跳到NEXT
MOVAL,0CH;
数据段中数对应。
CODE:
ADDAL,CL;
键盘的行值加列值得到键位数0—F
MOVBL,AL;
把AL里的值先存入BL中
MOVDL,2D;
乘2得双字节DW音频表中的偏移地址
MULDL
JMPAA1
PLAY:
MOVSI,OFFSETFREQ_LIST;
使SI指向FREQ_LIST的首地址取音频表数据
ADDSI,AX;
通过SI加AX实现指针SI的移动
MOVDX,0FH;
把1MHZ的时钟频率换成16进制
MOVAX,4240H;
被除数为0F4240H
DIVWORDPTR[SI];
除数为SI所指的数据
MOVDX,MY8254_B;
时钟频率除以音符频率得到计数器初值
OUTDX,AL;
把计数器初值给8254A口输出,先低后高双字节输出
MOVAL,AH
OUTDX,AL
MOVAL,BL;
把刚才存入BL中的数存入AL中
CMPAL,08H;
用键盘的按键值与8比较,使高音发短音,低音发长音
JGCY
MOVCX,32H
JMPNEXT3
CY:
MOVCX,5FH
NEXT3:
CALLDELAY;
调用延时子程序DELAY
LOOPNEXT3;
CX不为0重复执行NEXT3
JMPBEGIN;
跳转到BEGIN,重复扫描
NEXT:
INCCL
MOVAL,CH;
使CL加1,为了后面用来与
FREQ_LIST数据段中数对应
TESTAL,08H
JZKEPP;
无键按下时跳转到KEPP
ROLAL,1D;
向左移位,准备测试第二列
MOVCH,AL
JMPCOLL;
强制跳转到COLL
AA1:
MOVDX,MY8255_C;
将8255C端口地址送到DX
CMPBL,00H;
比较送到BL端口的值与键盘的第一个数比较
JZA1;
结果为0是跳到A1
JNZA2;
不为0则跳到A2,继续比较
A1:
MOVAL,01H;
控制端口C的输出值,使一盏灯亮
OUTDX,AL
MOVAL,00H
JMPPLAY
A2:
CMPBL,01H;
与键盘的第二个数比较
JZB1;
结果为0跳到B1
JNZB2;
不为0则跳到B2,继续比较
B1:
MOVAL,03H;
控制端口C的输出值,使两盏灯亮
OUTDX,AL
MOVAL,02H
JMPPLAY
B2:
CMPBL,02H;
与键盘的第三个数比较
JZC1;
结果为0跳到C1
JNZC2;
不为0则跳到C2,继续比较
C1:
MOVAL,07H;
控制端口C的输出值,使三盏灯亮
MOVAL,04H
C2:
CMPBL,03H;
与键盘的第四个数比较
JZD1;
结果为0跳到D1
JNZD2;
不为0则跳到D2,继续比较
D1:
MOVAL,0FH;
控制端口C的输出值,使四盏灯亮
OUTDX,AL
MOVAL,06H
D2:
CMPBL,04H;
与键盘的第五个数比较
JZE1;
结果为0跳到E1
JNZE2;
不为0则跳到E2,继续比较
E1:
MOVAL,1FH;
控制端口C的输出值,使五盏灯亮
MOVAL,08H
E2:
CMPBL,05H;
与键盘的第六个数比较
JZF1;
结果为0跳到F1
JNZH2;
不为0则跳到F2,继续比较
F1:
MOVAL,3FH;
控制端口C的输出值,使六盏灯亮
MOVAL,0AH
F2:
CMPBL,06H;
与键盘的第七个数比较
JZH1;
结果为0跳到H1
不为0则跳到H2
H1:
MOVAL,0FFH
MOVAL,0CH
H2:
MOVAL,0FFH
OUTDX,AL
MOVAL,0EH
JMPPLAY
KEPP:
JMPBEGIN
键盘扫描子程序
SCAN:
MOVAL,00H;
使8255芯片B端口输出
为0,使X1、X2、X3、X4为0
MOVDX,MY8255_B
MOVDX,MY8255_A
INAL,DX;
由A口接收响应电平信号
NOTAL;
将AL取反
ANDAL,0FH;
与0FH与,结果不为零则继续
RET;
回到子程序
=====================================
延时子程序
DELAY:
PUSHCX;
使CX进栈
MOVCX,000FH
T1:
MOVAX,009FH
T2:
DECAX;
使AX减1
JNZT2;
AX不为0重复T2
LOOPT1;
CX不为0重复T1
POPCX;
使CX出栈
RET
CODEENDS
ENDSTART;
代码段定义结束
6主要元器件介绍
6.18255主要功能
8255可编程外围接口芯片是Intel公司生产的通用并行I/O接口芯片,它具有A、B、C三个并行接口,并行接口是以数据的字节为单位与I/O设备或被控制对象之间传递信息。
CPU和接口之间的数据传送总是并行的,即可以同时传递8位、16位、32位等。
用+5V单电源供电,能在以下三种方式下工作:
方式0—基本输入/出方式,方式1—选通输入/出方式,方式2—双向选通工作方式。
8255的内部结构及引脚如图5.1所示:
图6.1内部结构及引脚
如图5.1所示
D0~D7为双向数据信号线,用来传送数据和控制字。
RD为读信号线,与其他信号线一起实现对8255接口的读操作。
通常接系统总线的IOR信号。
WR为写信号线,与其他信号一起实现对8255的写操作,通常接系统总线的IOW。
CS为片选信号线,当它为低电平时,才能选中该8255芯片,也才能对8255进行操作。
A0、A1为口地址选择信号线。
模拟音乐喷泉的设计使其分别与系统总线的XA1、XA2相连。
它们的不同编码可分别寻址3个口和一个控制寄存器,具体规定如下:
A1
A0
选择
A口
1
B口
C口
控制寄存器
RESET:
复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
CS:
片选信号线,当这个输入引脚为低电平时,表示芯片被选中,允许8255与CPU进行通讯。
RD:
读信号线,当这个输入引脚为低电平时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。
WR:
写入信号,当这个输入引脚为低电平时,允许CPU将数据或控制字写8255。
D0~D7:
三态双向数据总线,8255与CPU数据传送的通道,当CPU执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。
PA0~PA7:
端口A输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入锁存器。
PB0~PB7:
端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。
PC0~PC7:
端口C输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入缓冲器。
端口C可以通过工作方式设定而分成2个4位的端口,每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。
这里的8255接口所占地址范围为0640H~0646H。
当对8255接口进行写操作时,各信号线的状态如表所示:
CS
IOR
IOW
操作
写A口
写B口
写C口
写控制寄存器
8255在应用过程中,将设置不同的控制字初始化来控制寄存器,即可确定8255的工作方式。
8255的控制字由8位二进制数构成,各位的控制功能如下图:
图6.2置位/复位控制字格式
6.28254主要功能
8254具有3个独立的16位计数器,6种不同的工作方式。
计数寄存器用来寄存计数初值,计数工作单元为16位减1计数器,它的初值便是计数寄存器内容,计数单元对CLK脉冲计数,每出现一个CLK脉冲,计数器减1,当减为零时,通过OUT输出指示信号表明计数单元已为零。
当作为定时器工作时,每当计数单元为零时,计数寄存器内容会自动重新装入计数单元,而且CLK输入是均匀的脉冲序列,于是OUT输出频率是降低了的(相对于CLK信号频率)脉冲序列。
当作为计数器工作时,表明只关心在CLK端出现(代表事件)的脉冲个数,当CLK端出现了规定个数的脉冲时,OUT输出一个脉冲信号。
图6.3内部结构框图和引脚图
8254的工作方式如下述:
(1)方式0:
计数到0结束输出正跃变信号方式;
(2)方式1:
硬件可重触发单稳方式;
(3)方式2:
频率发生器方式;
(4)方式3:
方波发生器;
(5)方式4:
软件触发选通方式;
(6)方式5:
硬件触发选通方式;
8254的控制字有两个:
一个用来设置计数器的工作方式,称为方式控制字;
另一个用来设置读回命令,称为读回控制字。
这两个控制字共用一个地址,由标识位来区分。
当读回控制字的D4位为0时,由该读回控制字D1~D2位指定的计数器的状态寄存器内容将被锁存到状态寄存器中。
状态字格式如图5.4所示:
图6.48254状态字格式
6.3键盘的功能
行扫描法识别闭合键的原理是:
先通过行端口输出数据,使第0号行接低电平,其余行为高电平。
然后从列端口读入列线状态,检查是否有列线为低电平。
如果有某条列线变为低电平,则表示第0行和此列线相交的位置上的键被按下。
如果没有任何一条列线为低电平,则说明第0行上没有键被按下。
13
14
15
16
9
10
11
12
5
6
7
8
2
3
4
Y4
Y3
Y2
Y1
X1X2X3X4
7源程序中关键程序
7.1延时子程序:
PUSHCX;
JNZT2;
LOOPT1;
POPCX;
RET
延时子程序运用的是循环程序,微机运行一条语句仅需要几微秒的时间,让语句多次的循环就实现延功能时,就可以让语句执行的时间延长。
7.2扫描键盘步骤:
1.检查是否有键被按下;
2.确定按键的位置;
3.求按下键的键码值;
设计总结
短暂的课程设计在一周之后结束了,虽然时间有些短暂,但我在这次课设中却受益匪浅。
学校希望我们能够更好的掌握微机原理,让我们进行课设,将所学用于实际。
刚开始设计的时候,我真的是一点头绪都没有,所以我就去图书馆查找相关的资料、上网查找类似程序。
我的这次课设用到了键盘,我不是很了解,于是更加关注这方面的知识。
因为在设计的过程中遇到很多困难,我就耐心的阅读一些有关微机原理及接口技术的书籍。
在设计的过程中我遇到了一些不明白的问题,于是我就询问同组的同学,她们细心的讲解让我明白了很多,还有老师的帮之,我的程序终于写出来了。
接下来我就将自己的程序上机调试,遇到的错误很多,有一些是因为粗心大意,我用半天时间全部修改成功,调试的错误有一些也正是自己编程时容易出现的错误。
终于可以将自己的程序运行了,看到彩灯的亮灭别提多高兴了。
经过这一周的课程设计,我了解到课程设计能真正让人学到实际东西的一门课程,收获真的很多。
首先,我得先知道这次课程设计的内容,知道程序运行之后彩灯随音乐的变化不同的亮灭盏数,知道基本的原理。
其次,了解课设的内容之后,我就需要去知道所用芯片的知识,去查找资料了解程序所用8255、8254这些芯片,并熟悉各个端口的作用,知道信号的来源、如何让键盘与扬声器连接以及控制灯的亮灭。
编写程序的过程中,体会最深的是子程序的调用和程序的条理问题,一个程序就算功能实现了,但是也要使主程序和子程序的条理分明,易读性高,才能算一个比较好的程序。
这一周的课设虽然有些辛苦,但过的相当充实。
课设学到的东西不仅对期末复习有帮助,也可以对我以后的生活有一些帮助。
这次课设让我充分的了解到互相帮助的重要性,不懂的知识经过我们的讨论又掌握了不少。
这次设计让我更好的掌握和了解微机原理的有关知识,了解芯片的功能,煅炼我的耐心和毅力,真的让我受益匪浅。
致谢
在课程设计即将完成之际,我要特别感谢我的指导老师曲乐声和王健老师,他们在课程设计这一周的细心指导,使我通过这次课程设计对微机原理的基础知识产生了浓厚的兴趣,也对我进一步掌握其他的微机原理的知识提供了帮助。
在设计的过程中,我遇到了很多的困难,并且对很多的指令和用法上都很模糊,有时对端口地址也有些不清楚,幸好有老师耐心讲解,使我解决了这些问题,由存在疑问到渐渐熟悉了这些用法。
此外,我还要感谢我同组的同学,在我遇到问题的时候他们能够细心的给我讲解,让我知道了很多我存在模糊的地方,我们也互相讨论,互相帮助,这样我们大家的能力都在这次的课设中有所提高。
看到自己的所设计出来的程序能够控制灯的亮灭,心里真的很高兴。
最后,谢谢大家的帮助!
参考文献
[1]王庆利、李珍.微机计算机原理及应用.西安电子科技大学出版社,2009.9
[2]杨素行.微型计算机系统原理与应用.清华大学出版社,2001
[3]尹建华.微机原理与接口技术.高等教育出版社,2008
[4]范会敏.李晋惠.微型计算机原理与接口技术应用.科学出版社,2000.5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 音乐喷泉