微机原理电子琴设计.docx
《微机原理电子琴设计.docx》由会员分享,可在线阅读,更多相关《微机原理电子琴设计.docx(14页珍藏版)》请在冰豆网上搜索。
微机原理电子琴设计
目录
一.设计要求-2-
1.1设计题目-2-
1.2设计内容-2-
二系统接线图及流程图-3-
2.1设计系统框图-3-
2.2接线图-4-
2.3流程图-5-
三芯片功能介绍-6-
3.1芯片8255功能介绍-6-
3.2芯片8254功能介绍-9-
四设计原理及程序代码-10-
4.1设计原理-10-
4.2模块设计-10-
4.3程序代码-10-
五设计总结-16-
六参考文献-17-
一.设计要求
1.1设计题目
简易电子琴设计
1.2设计内容
通过改变键盘输入来改变8254输出频率,实现扬声器发音。
1.2.1设计目的
通过课程设计使学生更进一步掌握微机原理与应用课程的有关知识,提高用汇编语言编程的能力,加深对汇编语言的理解。
通过查阅资料,阅读程序,提高设计程序的能力及动手能力,使编程水平有一定的提高,同时也使学生通过动手进行硬件设计及程序设计从而提高解决实际问题的能力。
1.2.2设计要求
利用微机原理试验箱,设计简易电子琴,要求至少可以弹出7个音阶。
二系统接线图及流程图
2.1设计系统框图
图2.1设计系统框图
2.2接线图
图2.2接线图
右图Y组对应8255芯片的C口(Y值为1)与+5V连L1L2L3L4
13
14
15
16
9
10
11
12
5
6
7
8
1
2
3
4
Y4
Y3
X组对应8255芯片的A口(X值为0)
Y2
当有键按下时如5键,其对应的Y值
Y2为0,则8255芯片由B口输入的数Y1
值为1101给AL。
X1X2X3X4
图2.3键盘等效图
2.3流程图
图2.4流程图
三芯片功能介绍
3.1芯片8255功能介绍
8255特性
(1)一个并行输入/输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口.
(2)具有24个可编程设置的I/O口,即使3组8位的I/O口为PA口,PB口和PC口.它们又可分为两组12位的I/O口,A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3).A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O3种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定.
8255引脚功能
RESET:
复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
CS:
芯片选择信号线,当这个输入引脚为低电平时,即/CS=0时,表示芯片被选中,允许8255与CPU进行通讯;/CS=1时,8255无法与CPU做数据传输.
RD:
读信号线,当这个输入引脚为低电平时,即/RD=0且/CS=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。
WR:
写入信号,当这个输入引脚为低电平时,即/WR=0且/CS=0时,允许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配合使用,可作为控制信号输出或状态信号输入端口。
'
A0,A1:
地址选择线,用来选择8255的PA口,PB口,PC口和控制寄存器.
当A0=0,A1=0时,PA口被选择;
当A0=0,A1=1时,PB口被选择;
当A0=1,A1=0时,PC口被选择;
当A0=1.A1=1时,控制寄存器被选择.
3.1.18255工作方式表
这些工作方式分别为工作方式0,工作方式1和工作方式2。
1:
工作方式0,又称为基本工作方式。
在此方式下,可分别将A口的8条线,B口的8条线,C口高4位对应的4条线和C口的低四位对应的四条线定义为输入或输出。
故它们的输入输出共有16种不同的组合,如表3-1所示。
表3-1工作方式表
A组
B组
A口(PA0---PA7)
C口(PC4---PC7)
B口(PB0---PB7)
C口(PC0---PC3)
入
入
入
入
入
入
入
出
入
入
出
入
入
入
出
出
入
出
入
入
入
出
入
出
入
出
出
入
入
出
出
出
出
入
入
入
出
入
入
出
出
入
出
入
出
入
出
出
出
出
入
入
出
出
入
出
出
出
出
入
出
出
出
出
图3.18255工作方式表
2:
工作方式1,既选通输入输出方式。
在这种方式下,A口和B口仍作为数据的输出口和输入口,同时还要利用C口的某些位作为控制和状态信号。
3:
工作方式2,又称双向输入输出方式。
这种方式只有8255的口A才有。
在A口工作于双向输入输出方式时,要利用C口的5条线才能实现。
因此,B口只能工作在工作方式0或工作方式1,而C口剩下的3条线可以作为输入输出线使用或B口方式1下的控制线。
3.1.28255的控制字
8255的控制字格式,如图3.2所示。
7
6
5
4
3
2
1
0
图3.28255的控制字格式图
说明:
当控制字bit7=1时,控制字的bit6~bit3这4位用来控制A组,即A口的8位和C口的高4位,而控制字的低3位bit2~bit0用来控制B组,包括B口的8位和C口的低4位。
3.2芯片8254功能介绍
8254特性
intel8254是NMOS工艺制成的可编程计数器/定时器,有几种芯片型号,外形引脚及功能都是兼容的,只是工作的最高计数速率有所差异。
8254内部有三个计数器,分别成为计数器0、计数器1和计数器2,他们的机构完全相同。
每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。
每个计数器通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。
每个计数器内部有一个8位的控制寄存器,还有一个16位的计数初值寄存器CR、一个计数执行部件CE和一个输出锁存器OL。
执行部件实际上是一个16位的减法计数器,它的起始值就是初值寄存器的值,而初始值寄存器的值是通过程序设置的。
输出锁存器的值是通过程序设置的。
输出锁存器OL用来锁存计数执行部件CE的内容,从而使CPU可以对此进行读操作。
顺便提一下,CR、CE和OL都是16位寄存器,但是也可以作8位寄存器来用。
计数寄存器用来寄存计数初值,计数工作单元为16位减1计数器,它的初值便是计数寄存器内容,计数单元对CLK脉冲计数,每出现一个CLK脉冲,计数器减1,当减为零时,通过OUT输出指示信号表明计数单元已为零。
当作为定时器工作时,每当计数单元为零时,计数寄存器内容会自动重新装入计数单元,而且CLK输入是均匀的脉冲序列,于是OUT输出频率是降低了的(相对于CLK信号频率)脉冲序列。
当作为计数器工作时,表明只关心在CLK端出现(代表事件)的脉冲个数,当CLK端出现了规定个数的脉冲时,OUT输出一个脉冲信号。
四设计原理及程序代码
4.1设计原理
本实验是利用微机原理试验箱、8255芯片、8254芯片、键盘、扬声器等硬件设备,设计简易电子琴。
首先利用了编程程序,编辑了8255芯片控制字,对其进行初始化,使其工作在方式0,即基本输入输出状态,将8255的A端口设置为输出,经CPU运算后,由B端口输出到8254芯片的A端口中,由此实现对其的初始化。
将8254芯片设置为工作在方式3,即输出对称方波状态。
A端口为输入,“OUT”指令可将输出对应一定频率的方波送到扬声器中,由此实现发声。
本实验通过频率大小控制发出声音的高低,通过对延时程序的调用控制发出声音的长短。
并通过所编程序实现对键盘的重复扫描,从而可以弹奏多个音符的试验目的。
4.2模块设计
主程序键盘扫描子程序按键延时子程序
4.3程序代码
程序代码:
MY8255_AEQU06C0H
MY8255_BEQU06C2H
MY8255_CEQU06C4H
MY8255_MODEEQU06C6H
MY8254_MODEEQU0686H
MY8254_BEQU0682H;进行宏定义
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,82H
OUTDX,AL;写8255芯片的控制字,实
现工作在方式0,A端口和C端口输出,B端口输入
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_A;将8255的A口地址赋给DX
OUTDX,AL;将CPU中的AL值送到8255
的A口中,即送到x1、x2、
x3、x4中
MOVDX,MY8255_B;将8255的B口地址赋给DX
INAL,DX;将B口的值送到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;实现AL与CL的无进位加法
MOVDL,2D
MULDL;将AL乘以2结果保存到AX中
PLAY:
MOVSI,OFFSETFREQ_LIST;使SI指向FREQ_LIST的首地址
ADDSI,AX;通过SI加AX实现指针SI的移动
MOVDX,0FH
MOVAX,4240H;被除数为0F4240H
DIVWORDPTR[SI];除数为SI所指的数据
MOVDX,MY8254_B;将8255的B口地址赋给DX
OUTDX,AL;输出商的低4位
MOVAL,AH
OUTDX,AL;输出商的高4位
MOVCX,8D;输入计数值CX
NEXT3:
CALLDALLY;调用延时子程序DALLY
CALLDALLY
CALLDALLY
CALLDALLY
CALLDALLY
LOOPNEXT3;CX不为0重复执行NEXT3
MOVDX,0FH
MOVAX,4240H;被除数为0F4240H
MOVSI,30D
DIVWORDPTR[SI];除数为SI=30所指的数据
MOVDX,MY8254_B;将8255的B口地址赋给DX
OUTDX,AL
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_A
OUTDX,AL;使8255芯片A端口输出
为0,既使x1、x2、x3、
X4为0
MOVDX,MY8255_B
INAL,DX;将从B端口输入的y1、y2、y3、y4送到AL中
NOTAL;将AL取反
ANDAL,0FH;将AL前4位清零
RET
;========================================
;延时子程序
;========================================
DALLY:
PUSHCX;将CX压栈
MOVCX,000FH
T1:
MOVAX,0009FH
T2:
DECAX;使AX减1
JNZT2;AX不为0重复T2
LOOPT1;CX不为0重复T1
POPCX;将CX出栈
RET
CODEENDS;代码段定义结束
ENDSTART;程序结束
五设计总结
一周的课程设计过去了,使我感受颇深。
在整个过程中,我真正的感受到了集体的力量。
刚开始做一个题目时,我感到很困难,但是在王老师,踪老师以及同学们的帮助下,每次的任务都能按照老师的要求完成。
在这里向老师及同学表示感谢。
在这期间,通过实践使我对微机这门课有了新的认识,感受到了微机这门课对我们的重要性。
所以自己也下决心要通过这次实训掌握更多的微机知识。
我们小组在设计中,针对实训题目、设计的具体情况进行了细致的分工。
每个人负责一块任务,其他人协助设计。
设计的每个阶段都是紧密相连的,所以需要大家互相协调工作。
然而在实验中我们组也遇到了不少的问题,但是我们并没有放弃,通过大家一起讨论,以及老师和同学们的热心帮助,才使我们最后完成了老师交给的任务。
在这次的实验中使我了解到了微机实践的重要性。
这使我在以后的学习工作中能更好更快的去了解理论知识,做一个理论和实践相结合的人才。
这次实训给还未走出校园的我们提供了一个很好的实践平台,在学习理论的同时,通过实践使我们更好地理解课堂上所学到的知识,也为今后走到工作岗位奠定了很好的基础。
使我在以后在找工作的竞争中多了一个制胜的筹码。
总而言之,这次课程设计不仅使我们巩固了所学的理论知识、锻炼了大家动手能,更重要的是通过设计使我们认识了自己在实践设计方面的缺点与不足,在以后的学习中有针对性地加强自己的设计能力,打下良好、扎实的基础,给将来的工作与学习带来更多的帮助。
六参考文献
王 萍编 微机原理应用实践 机械工业出版社,2001
周明德编 微机原理与接口技术实验指导与习题集 人民邮电出版社,2002
周明德编 微型计算机系统原理及应用 清华大学出版社,1998
周 斌编 微机计算原理及应用(第三版) 清华大学出版社,2001
王 颐编 微机原理及应用实验教程 重庆大学出版社,1998
潘 峰编 微型计算机原理与汇编语言 电子工业出版社,1997
李伯成编微型计算机原理及应用西安电子科技大学出版社,2006
李兰友编微型计算机原理与接口技术清华大学出版社,2003
郑学坚编微型计算机原理及应用实验指导清华大学出版社,2002
朱玉春编微机原理与接口技术大连理工大学出版社,2004
仇玉章编微型计算机技术实验及指导教程清华大学出版社,2003
戴梅萼编微型计算机技术及应用清华大学出版社,2003