音乐喷泉.docx
- 文档编号:11161831
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:21
- 大小:195.93KB
音乐喷泉.docx
《音乐喷泉.docx》由会员分享,可在线阅读,更多相关《音乐喷泉.docx(21页珍藏版)》请在冰豆网上搜索。
音乐喷泉
1设计任务描述
1.1设计题目:
模拟音乐喷泉设计
1.2设计要求
1.2.1设计目的
通过本学期对微机原理及其应用的学习,使学生们进一步掌握及熟练不同体系程序的应用。
因为微机原理单存停留在书本上是远远不够的,所以我们需要课程设计来使我们将所学用于应用。
此外需要结合所学知识并结合生活实际来设计所需的程序,使学生初步掌握应用微机解决问题的步骤及方法,以此提高学生分析和解决实际问题的能力。
通过设计不但可以培养学生查阅专业资料、寻求知识的能力,还可以了解有关工业标准,掌握现代设计手段和软件工具,可以进行简单的调试工作。
本次课设还可以增加学生的小组配合能力及团队意识。
虽然我们每一个人的程序都有所不一样,但学生可以进行小组讨论,从而更加了解程序的基本原理,发现问题并解决问题。
1.2.2基本要求:
1)根据音高音低的变化控制小灯亮的数量不同。
2)音高小灯亮的多。
3)音低小灯亮的少。
1.3设计要求
1、总体内容:
利用微机原理实验箱,采用一组发光二极管来模拟彩灯喷泉;2、接口设计:
根据题目和所用的接口电路芯片设计出完整的接口电路,并在实验系统上完成电路的连接和调试通过;
3、程序设计:
要求画出程序框图,设计出全部程序并给出程序设计说明和程序注释;
2设计思路和原理
2.1设计思路
通过8255和8254接口芯片来完成音乐喷泉的模拟,该设计主要是由三部分组成:
第一部分为键盘扫描,用来确定按键位置,并给8254计数器赋初值;第二部分为发声部分,是由8254计数器1#的输出端产生一定频率的方波信号从而使扬声器发声;第三部分为LED彩灯部分,通过8255端口C控制彩灯亮的个数。
第一部分键盘扫描由8255芯片的PA0—PA4,PB0—PB4分别与键盘单元的Y1—Y4,X1—X4相连,其中B口低4位为输出端,A口低4位为输入端,由它们对键盘单元进行扫描,其确定键值的过程为:
先给所有列线输入低电平,然后读取行线,检测行线是否为低电平,如果有某条行线输出低电平,则说明该键盘有按键被按下,否则,说明无按键被按下。
采用这种方法就可以快速判断键盘是否有键被按下。
在检查到有键按下后,再通过行扫描法判断按下的位置,从而确定按下的是什么键,后经过计算得出计数器1的初值。
第二部分主要用到了8254芯片中的计数器1,其CLK1端在微机内部已接好频率为1MHZ的方波信号(由系统自动提供),计数控制端GATE1接至+5V,计数器输出端OUT1接至发声单元,可以经过键盘的控制来发出声音。
第三部分主要由8255端口C控制,端口C与发光二极管相连,当键盘判断出所按位置的时候,根据所发音的不同亮不同盏数的灯,例:
哆—一盏,唻—两盏,咪—三盏以此类推,以上三部分即可完成音乐喷泉的模拟。
2.2设计原理
通过让8254的OUT1输出不同的频率信号,就可以使扬声器发出不同音调的声音,8254内部的计数器有6种不同的工作方式,其中工作方式3输出的波形为方波。
因此,通过对8254初始化把计数器1设定为工作方式3。
它的工作过程是:
写入计数器初值后,在CLK端计数脉冲的作用下,计数值不断减1,从初值减到一半这段时间内,OUT端输出高电平,再由一半减到0这段时间内,OUT端输出低电平,高低电平长度相等。
然后计数初值自动重装,开始新一轮的计数。
由于系统中8254的CLK端已固定接好频率为1MHZ的方波信号,所以要控制其输出端OUT1输出不同的频率是通过写入不同的计数初值,从而实现扬声器不同的发音。
此外需要用8255控制发光二极管,配合键盘不同按键值来控制使小灯亮灭的个数不同。
各音阶标称频率值:
/*-------------------------------------------------------------*/
音符:
1234567
(重低音)
对应频率(Hz):
131147165175196220247
(低音)
对应频率(Hz):
262294330349392440494
(中音)
对应频率(Hz):
523587659698784880988
(高音)
对应频率(Hz):
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
OUTDX,AL
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中
OUTDX,AL
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;为了后面用来与FREQ_LIST
数据段中数对应。
MOVAL,04H
JMPCODE;强制跳转到CODE
L3:
TESTAL,04H;检验按下键是否在L3
JNZL4;不是L3则跳到L4
MOVAL,08H;为了后面用来与FREQ_LIST
数据段中数对应。
JMPCODE;强制跳转到CODE
L4:
TESTAL,08H;检验按下键是否在L4
JNZNEXT;不是L4则跳到NEXT
MOVAL,0CH;为了后面用来与FREQ_LIST
数据段中数对应。
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的输出值,使三盏灯亮
OUTDX,AL
MOVAL,04H
JMPPLAY
C2:
CMPBL,03H;与键盘的第四个数比较
JZD1;结果为0跳到D1
JNZD2;不为0则跳到D2,继续比较
D1:
MOVAL,0FH;控制端口C的输出值,使四盏灯亮
OUTDX,AL
MOVAL,06H
JMPPLAY
D2:
CMPBL,04H;与键盘的第五个数比较
JZE1;结果为0跳到E1
JNZE2;不为0则跳到E2,继续比较
E1:
MOVAL,1FH;控制端口C的输出值,使五盏灯亮
OUTDX,AL
MOVAL,08H
JMPPLAY
E2:
CMPBL,05H;与键盘的第六个数比较
JZF1;结果为0跳到F1
JNZH2;不为0则跳到F2,继续比较
F1:
MOVAL,3FH;控制端口C的输出值,使六盏灯亮
OUTDX,AL
MOVAL,0AH
JMPPLAY
F2:
CMPBL,06H;与键盘的第七个数比较
JZH1;结果为0跳到H1
JNZH2;不为0则跳到H2
H1:
MOVAL,0FFH
OUTDX,AL
MOVAL,0CH
JMPPLAY
H2:
MOVAL,0FFH
OUTDX,AL
MOVAL,0EH
JMPPLAY
KEPP:
JMPBEGIN
;========================================
;键盘扫描子程序
;========================================
SCAN:
MOVAL,00H;使8255芯片B端口输出
为0,使X1、X2、X3、X4为0
MOVDX,MY8255_B
OUTDX,AL
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
选择
0
0
A口
0
1
B口
1
0
C口
1
1
控制寄存器
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
A1
A0
IOR
IOW
操作
0
0
0
1
0
写A口
0
0
1
1
0
写B口
0
1
0
1
0
写C口
0
1
1
1
0
写控制寄存器
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
1
2
3
4
Y4
Y3
Y2
Y1
X1X2X3X4
7源程序中关键程序
7.1延时子程序:
DELAY:
PUSHCX;使CX进栈
MOVCX,000FH
T1:
MOVAX,009FH
T2:
DECAX;使AX减1
JNZT2;AX不为0重复T2
LOOPT1;CX不为0重复T1
POPCX;使CX出栈
RET
延时子程序运用的是循环程序,微机运行一条语句仅需要几微秒的时间,让语句多次的循环就实现延功能时,就可以让语句执行的时间延长。
7.2扫描键盘步骤:
1.检查是否有键被按下;
2.确定按键的位置;
3.求按下键的键码值;
设计总结
短暂的课程设计在一周之后结束了,虽然时间有些短暂,但我在这次课设中却受益匪浅。
学校希望我们能够更好的掌握微机原理,让我们进行课设,将所学用于实际。
刚开始设计的时候,我真的是一点头绪都没有,所以我就去图书馆查找相关的资料、上网查找类似程序。
我的这次课设用到了键盘,我不是很了解,于是更加关注这方面的知识。
因为在设计的过程中遇到很多困难,我就耐心的阅读一些有关微机原理及接口技术的书籍。
在设计的过程中我遇到了一些不明白的问题,于是我就询问同组的同学,她们细心的讲解让我明白了很多,还有老师的帮之,我的程序终于写出来了。
接下来我就将自己的程序上机调试,遇到的错误很多,有一些是因为粗心大意,我用半天时间全部修改成功,调试的错误有一些也正是自己编程时容易出现的错误。
终于可以将自己的程序运行了,看到彩灯的亮灭别提多高兴了。
经过这一周的课程设计,我了解到课程设计能真正让人学到实际东西的一门课程,收获真的很多。
首先,我得先知道这次课程设计的内容,知道程序运行之后彩灯随音乐的变化不同的亮灭盏数,知道基本的原理。
其次,了解课设的内容之后,我就需要去知道所用芯片的知识,去查找资料了解程序所用8255、8254这些芯片,并熟悉各个端口的作用,知道信号的来源、如何让键盘与扬声器连接以及控制灯的亮灭。
编写程序的过程中,体会最深的是子程序的调用和程序的条理问题,一个程序就算功能实现了,但是也要使主程序和子程序的条理分明,易读性高,才能算一个比较好的程序。
这一周的课设虽然有些辛苦,但过的相当充实。
课设学到的东西不仅对期末复习有帮助,也可以对我以后的生活有一些帮助。
这次课设让我充分的了解到互相帮助的重要性,不懂的知识经过我们的讨论又掌握了不少。
这次设计让我更好的掌握和了解微机原理的有关知识,了解芯片的功能,煅炼我的耐心和毅力,真的让我受益匪浅。
致谢
在课程设计即将完成之际,我要特别感谢我的指导老师曲乐声和王健老师,他们在课程设计这一周的细心指导,使我通过这次课程设计对微机原理的基础知识产生了浓厚的兴趣,也对我进一步掌握其他的微机原理的知识提供了帮助。
在设计的过程中,我遇到了很多的困难,并且对很多的指令和用法上都很模糊,有时对端口地址也有些不清楚,幸好有老师耐心讲解,使我解决了这些问题,由存在疑问到渐渐熟悉了这些用法。
此外,我还要感谢我同组的同学,在我遇到问题的时候他们能够细心的给我讲解,让我知道了很多我存在模糊的地方,我们也互相讨论,互相帮助,这样我们大家的能力都在这次的课设中有所提高。
看到自己的所设计出来的程序能够控制灯的亮灭,心里真的很高兴。
最后,谢谢大家的帮助!
参考文献
[1]王庆利、李珍.微机计算机原理及应用.西安电子科技大学出版社,2009.9
[2]杨素行.微型计算机系统原理与应用.清华大学出版社,2001
[3]尹建华.微机原理与接口技术.高等教育出版社,2008
[4]范会敏.李晋惠.微型计算机原理与接口技术应用.科学出版社,2000.5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 音乐喷泉
![提示](https://static.bdocx.com/images/bang_tan.gif)