电子琴课程设计4.docx
《电子琴课程设计4.docx》由会员分享,可在线阅读,更多相关《电子琴课程设计4.docx(16页珍藏版)》请在冰豆网上搜索。
电子琴课程设计4
1.设计任务描述
1.1设计题目:
简易电子琴
1.2设计要求:
1.2.1设计目的:
通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。
通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。
为以后学生结合专业从事微机应用设计奠定基础。
1.2.2基本要求:
利用微机原理试验箱,设计简易电子琴,要求至少可以弹出7个音阶。
2设计思路和原理
2.1设计思路
通过8255和8254来实现电子琴模拟,主要由两部分组成:
第一部分为键盘扫描,用来确定按键位置,并给计数器赋初值。
第二部分为发声部分,由计数器1#的输出端产生一定频率的方波驱动扬声器发声。
第一部分主要用到了8255芯片的PB0—PB4,PA0—PA4它们分别与键盘单元的X1—X4,Y1—Y4相连,其中B口低4位为输出端,B口低4位1为输入端。
由它们对键盘单元进行扫描,并确定键值工作过程为:
先给所有列线输入低电平,然后读取行线,检测行线是否为低电平,如果有某条行线输出低电平,则说明该键盘有按键被按下,否则,说明无按键被按下.采用这种方法可以快速判断键盘是否有键按下。
在检查到有键按下后,再通过行扫描法判断按下的位置,从而确定按下的是什么键,经过计算得出计数器1#的初值。
第二部分主要用到了8254芯片中的定时器/计数器1#,其CLK1端在微机内部已接好频率为1MHZ的方波信号(由系统自动提供),计数控制端GATE1接至+5V,计数器输出端OUT1接至发声单元。
至此,实验电路连接并描述完毕。
2.2设计原理
因为音调的大小是由声源的震动频率决定的,频率越大音调越高,频率越小音调越低。
由于OUT1接至发声单元,其输出信号直接驱动喇叭发声,所以OUT1的输出频率就是喇叭的发声频率。
通过让OUT1输出不同的频率信号,就可以使喇叭发出不同音调的声音。
下一步就是如何让OUT1输出这些频率了。
这涉及到8254自身的工作方式。
而8254内部的计数器都有6种不同工作方式,其中的方式3输出的波形为方波。
因此,把计数器1#设定为工作方式3(通过控制字设定)。
它的工作过程是:
写入计数器初值后,在CLK端计数脉冲的作用下,计数值不断减1,从初值减到一半这段时间内,OUT端输出高电平,再由一半减到0这段时间内,OUT端输出低电平,高低电平长度相等。
然后计数初值自动重装,开始新一轮的计数。
由于系统中8254的CLK端已固定接好频率为1MHZ的方波信号,所以要控制其输出端OUT1输出不同的频率只能通过写入不同的计数初值来实现。
关系为:
CLK1端的输入频率/OUT1端的输出频率=计数初值N。
只要对8254进行编程,将对应频率的计数初值送入计数器1#的初值寄存器中,就可以使OUT1端输出不同的频率信号了。
3设计原理流程图
4实际硬件电路接线图
5程序清单及注释:
MY8255_AEQU0600H
MY8255_BEQU0602H
MY8255_CEQU0604H
MY8255_MODEEQU0606H
MY8254_MODEEQU06C6H
MY8254_BEQU06C2H;进行宏定义
DATASEGMENT
FREQ_LISTDW441D,495D,556D,589D,661D,742D,833D,882D,
262D,294D,330D,373D,402D,450D,494D,-1D
DATAENDS;建立数据段
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX;实现段寄存器DS的初始化
MOVDX,MY8255_MODE
MOVAL,90H
OUTDX,AL;写8255芯片的控制字,实
现工作在方式0,B端口输出,A端口输入
MOVDX,MY8254_MODE
MOVAL,76H
OUTDX,AL;使8254工作在方式3,A
口输入,运用计数器1,二进制方式
BEGIN:
CALLCCSCAN;键盘扫描
JNZINK1;有键按下时跳到INK1
JMPBEGIN;没见按下时循环执行
BEGIN
;========================================
;确定按下键的位置
;========================================
INK1:
CALLCCSCAN
JNZINK2;有键按下时跳到INK2
JMPBEGIN;没见按下时循环执行BEGIN
INK2:
MOVCH,0FEH;确定按下键在第一列
MOVCL,00H;从第一列开始测试,CL设初
;值为零
COLUM:
MOVAL,CH
MOVDX,MY8255_B;将8255的B口地址赋给DX
OUTDX,AL;将CPU中的AL值送到8255
的B口中,即送到X1、X2、
X3、X4中
MOVDX,MY8255_A;将8255的A口地址赋给DX
INAL,DX;将A口的值送到AL中
L1:
TESTAL,01H;检验按下键是否在L1
JNZL2;不是L1则跳到L2
MOVAL,00H;为了后面用来与FREQ_LIST
数据段中数对应
JMPKCODE;强制跳转到KCODE
L2:
TESTAL,02H;检验按下键是否在L2
JNZL3;不是L2则跳到L3
MOVAL,04H;为了后面用来与FREQ_LIST
数据段中数对应。
JMPKCODE;强制跳转到KCODE
L3:
TESTAL,04H;检验按下键是否在L23
JNZL4;不是L3则跳到L4
MOVAL,08H;为了后面用来与FREQ_LIST
数据段中数对应。
JMPKCODE;强制跳转到KCODE
L4:
TESTAL,08H;检验按下键是否在L4
JNZNEXT;不是L4则跳到NEXT
MOVAL,0CH;为了后面用来与FREQ_LIST
数据段中数对应。
KCODE:
ADDAL,CL;键盘的行值加列值得到键位数0~~F
MOVBL,AL;把AL里的值先存入BL中
MOVDL,2D;乘2得双字节DW音频表中的
MULDL;偏移地址
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:
CALLDALLY;调用延时子程序DALLY
LOOPNEXT3;CX不为0重复执行NEXT3
MOVDX,0FH
MOVAX,4240H;被除数为0F4240H
MOVSI,30D
DIVWORDPTR[SI];除数为SI=30所指的数据
MOVDX,MY8254_B;用时钟频率除以-1得到极大的初
OUTDX,AL;值通过A口发出超高频率的方波,
MOVAL,AH;扬声器发出人耳听不到的声音
OUTDX,AL;实现静音,结束一个音符的发音
JMPBEGIN;跳转到BEGIN,重复扫描
NEXT:
INCCL;使CL加1,为了后面用来与
FREQ_LIST数据段中数对应
MOVAL,CH
TESTAL,08H
JZKERR;无键按下时跳转到KERR
ROLAL,1D;向左移位,准备测试第二列
MOVCH,AL
JMPCOLUM;强制跳转到COLUM
KERR:
JMPBEGIN;跳到BEGIN重新开始扫描
;========================================
;键盘扫描子程序
;========================================
CCSCAN:
MOVAL,00H
MOVDX,MY8255_B
OUTDX,AL;使8255芯片B端口输出
为0,既使X1、X2、X3、X4为0
MOVDX,MY8255_A
INAL,DX;由A口接收响应电平信号
NOTAL;将AL取反
ANDAL,0FH;与0FH与,结果不为零则继续
RET
;=====================================
;延时子程序
;=====================================
DALLY:
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.1可编程并行输入输出芯片8255
6.1.18255引脚介绍:
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配合使用,可作为控制信号输出或状态信号输入端口。
A1、A0:
端口地址总线,8255中有端口A、B、C和一个内部控制字寄存器,共4个端口,由A0、A1输入地址信号来寻址。
6.1.28255的工作方式及端口寻址方式:
方式0---基本输入输出方式;方式1---选通输入输出方式;
方式2---双向选通输入输出方式。
8255内部有3个口:
A口、B口、C口,还有一个控制寄存器,它们由程序寻址。
具体的寻址方式如下:
A1A0选择
00A口
01B口
10C口
11控制寄存器
6.1.38255的控制字:
7
6
5
4
3
2
1
0
6.1.4可编程控制器8255的功能及其部分相关程序:
(1)端口地址的定义:
MY8255_AEQU0600H
MY8255_BEQU0602H
MY8255_CEQU0604H
MY8255_MODEEQU0606H
本次设计我们选择的是IOY1的系统端口地址,具体地址为0600H----0606H.为了程序的编写方便利用伪指令EQU将四个端口地址定义为MY8255_A,MY8255_B,MY8255_C,MY8255_MODE。
这一过程会使此后的程序清晰明了,同时很醒目。
(2)8255初始化程序:
MOVDX,MY8255_MODE
MOVAL,90H
OUTDX,AL
6.2定时芯片8254
6.1.18254简介
8254具有3个独立的16位计数器,6种不同的工作方式。
计数寄存器用来寄存计数初值,计数工作单元为16位减1计数器,它的初值便是计数寄存器内容,计数单元对CLK脉冲计数,每出现一个CLK脉冲,计数器减1,当减为零时,通过OUT输出指示信号表明计数单元已为零。
当作为定时器工作时,每当计数单元为零时,计数寄存器内容会自动重新装入计数单元,而且CLK输入是均匀的脉冲序列,于是OUT输出频率是降低了的(相对于CLK信号频率)脉冲序列。
当作为计数器工作时,表明只关心在CLK端出现(代表事件)的脉冲个数,当CLK端出现了规定个数的脉冲时,OUT输出一个脉冲信号。
6.2.28254的工作方式及端口寻址方式:
方式0---计数结束产生中断;方式1---可编程单稳;
方式2---频率发生器;方式3---方波发生器;
方式4---软件触发选通;方式5---硬件触发选通。
8254内部有3个计数器:
可选择计数器0、可选择计数器1、可选择计数器2,还有一个控制寄存器,它们由程序寻址。
具体的寻址方式如下:
A1A0选择
00可选择计数器0
01可选择计数器1
10可选择计数器2
11控制寄存器
6.2.38254的控制字
7
6
5
4
3
2
1
0
6.2.4可编程控制器8254的功能及其部分相关程序:
(1)端口地址的定义:
MY8254_MODEEQU06C6H、
MY8254_AEQU06C0H
MY8254_BEQU06C2H
本次设计我们选择的是IOY3的系统端口地址,具体地址为06C0H----06C6H.为了程序的编写方便利用伪指令EQU将四个端口地址定义为MY8254_MODE,MY8254_A,MY8254_B,这一过程会使此后的程序清晰明了,同时很醒目。
(2)8254初始化程序:
MOVDX,MY8254_MODE
MOVAL,76H
OUTDX,AL
7程序中的关键技术
7.1延时子程序:
DALLY:
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)确定物理位置;
(4)求按下键的键码值;
(5)等待键被释放。
课设总结
短短的一周课设时间过去了,时间虽然很短,但我在这次课设中受益匪浅。
微机原理的确是一门很难很复杂的学科。
刚开始设计的时候,我对本题目的设计一点思路都没有。
我去图书馆查资料,上网找程序,回来仔细的对程序进行研究。
不管在软件还是硬件上还是遇到了很多困难,我就耐心的阅读一些有关微机原理的书籍。
终于慢慢的找到了一点头绪,对下载回来的程序基本上看懂了。
可还有一些语句不够明白,我就询问老师,在老师细心的讲解下,我对程序全部理解了。
我就开始上机调试,刚开始调试竟有四十七个错误,我用半天时间全部修改成功,调试的错误有一些也正是自己编程时容易出现的错误。
调试成功后,我就开始进行修改程序,只有修改之后的程序才能真正的变成自己的程序。
开始修改时,即使语句没错误也总是运行不了,自己就得对改后的程序前后仔细的研究,在这过程才知道自己的的经验尚浅呀!
在自己不断的研究努力下和老师细心的帮助下终于修改成功了,心里无比的兴奋和高兴,这就是享受到自己成果的心情吧!
经过这一周的课程设计,我认识到,课程设计能真正让人学到实际应用的东西的一门课程,收获比上几星期课还多。
首先,要实现题目要求的功能并有所创新,我们必须全心地投入其中,养成一种敢于钻研敢于创新的习惯。
在把课程要求实现到实际中来的过程中,首先必须清楚明白地了解几个参考程序的每一行的意思,这就需要敢于静心钻研。
为了把使得程序更加完整,就必须进行创新,这就需要敢于创新。
其次,通过课程设计,让我在课本的基础上,更深入的了解了各种芯片的用法和程序的完成过程,调试方法及技巧。
为了了解键盘,查找了不少资料,了解了键盘的初始化,存取缓存,扫描键盘,读取键码。
为了实现基本功能,认真研究了参考程序的意义,了解了电子琴的不同音阶放音功能的实现,更深入了解了8254计时器的使用方法。
编写程序的过程中,体会最深的是子程序的调用和程序的条理问题,一个程序就算功能实现了,但是也要使主程序和子程序的条理分明,易读性高,才能算一个比较好的程序。
检查程序过程中,在充分思考的基础上多次实验是检查改正程序的良方。
在设计扩展功能的过程中,大胆想像并且用多种思路来求解实现目标是必备的武器。
这一周课设过的很累很辛苦,但过的的也很充实。
学到的东西不仅对期末考试有帮助,为以后在生活中的实际应用也会有一些帮助。
在这里我还要感谢两位老师在这次课设中耐心的指导,细心的帮助!
参考文献
[1]周明德、蒋本珊.微机原理与接口技术.人民邮电出版社,2002.4
[2]吴产乐.微机系统与接口技术.华中科技大学出版社,2004.4
[3]雷晓平、屈莉莉、罗海天.微机原理与接口技术.人民邮电出版社,2006.5
[4]范会敏.李晋惠.微型计算机原理与接口技术应用.科学出版社,2000.5
[5]董少明、冯萍.微机系统与接口技术.西安交通大学出版社,2003.2
[6]沈鑫剡.微机原理与应用学习辅导.清华大学出版社,2005.2
[7]王庆.汇编语言程序设计.合肥工业大学出版社,2006.1
[8]王士元.微机汇编语言与外设编程.南开大学出版社,1993.2
[9]王海萍.汇编语言与微机接口实验教程.国防工业出版社,2007.1