微机原理自设计电子琴
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理及接口技术自设计多芯片实验报告
实验题目:电子琴——按键弹琴
学院系别:信息学院电子信息工程系
1 / 15
目录
(1)实验题目和要求 (3)
(2)实验目的 (3)
(3)实验仪器和环境 (3)
(4)程序原理和设计过程 (3)
(5)流程图 (8)
(6)源程序代码 (9)
(7)实验结果 (14)
(8)实验总结 (14)
2 / 15
3 / 15
一、 实验题目:自设计多芯片实验
要求:
用两到三片芯片(8255,8259,8254,8251四种芯片任选)编程实现一种特定的功能。
二、 实验目的:
学习并掌握8255 的工作方式及其应用。
掌握8255 典型应用电路的接法。
了解键盘扫描的基本原理,熟悉8255 的编程。
掌握8254 的工作方式及应用编程。
学习用8254 定时/计数器使扬声器发声的编程方法。
三、 实验仪器和环境
IA-32 架构的微机系统及应用教学平台一套。
四、 程序原理和设计过程
8255具有A 、B 、C 三个并行接口,用+5V 单电源供电,能在以下三种方式下工作:方式0--基本输入/输出方式、方式1--选通输入/输出方式、方式2--双向选通工作方式。8255 工作方式控制字和C 口按位置位/复位控制字格式如图一所示。
图一
8254 是Intel 公司生产的可编程间隔定时器,是8253 的改进型,比8253 具有更优良的性能。8254 具有以下基本功能:
(1)有3 个独立的16 位计数器。
(2)每个计数器可按二进制或十进制(BCD)计数。
(3)每个计数器可编程工作于6 种不同工作方式。
(4)8254 每个计数器允许的最高计数频率为10MHz(8253 为2MHz)。
(5)8254 有读回命令(8253 没有),除了可以读出当前计数单元的内容外,还可以读出状态寄存器的内容。
(6)计数脉冲可以是有规律的时钟信号,也可以是随机信号。计数初值公式为:
n=fCLKi÷fOUTi、其中fCLKi是输入时钟脉冲的频率,fOUTi是输出波形的频率。图二是8254 的内部结构框图和引脚图,它是由与CPU 的接口、内部控制电路和三个计数器组成。
8254 的工作方式如下述:
(1)方式0:计数到0 结束输出正跃变信号方式。
(2)方式1:硬件可重触发单稳方式。
(3)方式2:频率发生器方式。
(4)方式3:方波发生器。
(5)方式4:软件触发选通方式。
4 / 15
5 / 15
(6)方式5:硬件触发选通方式。
图二
8254 的控制字有两个:一个用来设置计数器的工作方式,称为方式控制字;另一个用来设置读回命令,称为读回控制字。这两个控制字共用一个地址,由标识位来区分。控制字格式如表一所示。
表一 8254的方式控制字格式
本次实验将键盘扫描和计数器使扬声器发声结合起来,实现每按下一个键,扬声器便可输出该键对应的音符。
其中8255芯片负责扫描键盘,就是将键盘按下的键(从上到下,从左到右依次为0~15号)的编号扫描到电脑中,其中A 口输出,C 口低四位输入。
由图三可知:在按键未按下的时候Y1,Y2,Y3,Y4均为高电平,即为逻辑1;当某一个按键被按下,并且恰好那列的X输出为低电平,则该行的输出为低电平即为逻辑0。通过将C口X1~X4均置为低电平并读取Y1~Y4检查是否有低电平,若有低电平则说明键盘上有按键按下。之后每列分别扫描,检查到底是哪一行哪一列的键按下,记住相应的编号。图四为8255部分的电路接线图。
图三
6 / 15
图四7 / 15
表2音符与频率对照表
在数据缓存区已经存好了每个按键所对应的音符的频率(见表二),并记住该缓存区的起始偏移地址,所按键对应音符的频率所在缓存区的偏移地址为起始偏移地址加上该按键的编号。经计算后通过8254输出对应频率的方波,并将该方波输出连接到扬声器,便可以发出该音符。图五为8254部分的电路接线图。
图五
8 / 15
五、流程图
图六实验编程总框图
9 / 15
图六按键扫描部分框图
六、源程序代码
data segment ;数据段
CSO EQU 3000H ;8255端口地址
MY8255_A EQU CSO+00H ;8255A口地址
MY8255_B EQU CSO+01H ;8255B口地址
MY8255_C EQU CSO+02H ;8255C口地址
MY8255_MODE EQU CSO+03H ;8255控制口地址
CS2 EQU 3040H ;片选CS2 对应的端口始地址MY8254_COUNTO EQU CS2+00H ;8254 计数器0 端口地址
MY8254_MODE EQU CS2+03H ;8254 控制寄存器端口地址
HZ DW 18432 ;输入CLK频率
STABLE DW 131,147,165,175 ;对应音符频率
10 / 15
DW 196,221,248,262
DW 294,330,350,393
DW441,495,525,589
data ends
satck1 segmentstack ;堆栈段
DW 256 dup(?)
Stack1 ends
code segment ;代码段
assume cs:code,ds:data,ss:stack1
start:movax,data
movds,ax
mov dx,my8255_mode ;初始化8255A:A口方式0输出mov al,81h ;C口低4位输入
outdx,al
begin: call ccscan ;扫描键盘,看是否有键按下
jz begin ;若没有,继续等待
getkey1:call dally ;延时
call ccscan ;再次扫描,消除干扰
jzbegin
getkey2:mov ch,0feh ;最低位为0,其余为1 mov cl,00h ;存下对应行第一个按键的编码
;逐行逐列进行检验,确定是哪个键被按下
colum: moval,ch ;对应列输出0
mov dx,my8255_a
11 / 15