电子琴课程设计4.docx

上传人:b****7 文档编号:23560196 上传时间:2023-05-18 格式:DOCX 页数:16 大小:121.81KB
下载 相关 举报
电子琴课程设计4.docx_第1页
第1页 / 共16页
电子琴课程设计4.docx_第2页
第2页 / 共16页
电子琴课程设计4.docx_第3页
第3页 / 共16页
电子琴课程设计4.docx_第4页
第4页 / 共16页
电子琴课程设计4.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

电子琴课程设计4.docx

《电子琴课程设计4.docx》由会员分享,可在线阅读,更多相关《电子琴课程设计4.docx(16页珍藏版)》请在冰豆网上搜索。

电子琴课程设计4.docx

电子琴课程设计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

 

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

当前位置:首页 > 成人教育 > 电大

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

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