简单的电子琴设计
哈 尔 滨 理 工 大 学
课 程 设 计
题
目:
简易电子琴
院、 系:
荣成学院 电气系
姓
名:
魏 星
指导教师:
刘 菲 菲
系 主 任:
王 哈 力
2012 年 7 月 4 日
1
简单的电子琴设计
目录
一、设计题目......................................................................................................................1
二、设计内容......................................................................................................................1
三、设计目的......................................................................................................................1
四、设计要求.............................................................................................................................1
五、设计原理......................................................................................................................1
六、元器件功能简介.......................................................................................................1
七、设计原程序及注解................................................................................................. 6
八、程序流程图..................................................................................................................... 10
九、程序接线图...............................................................................................................11
2
简单的电子琴设计
一、设计题目:
简易电子琴设计
二、设计内容:
利用微机原理试验箱,设计简易电子琴。
三、设计目的:
通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应
用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识
进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后
学生结合专业从事微机应用设计奠定基础。
四、设计要求:
1.可以弹出 7 个音阶。
2.弹奏简短音乐。
3.通过改变键盘输入来改变 8254 输出频率,实现扬声器发音
五、设计原理:
音符与频率的关系如表所示,而持续时间则取决于乐曲的速度和每个音符持
续的长短。在拍号为 4/4 的乐曲中,每小节包含4拍,全音符持续4拍,二分音
符持续2拍,四分音符持续1拍,八分音符持续半拍等等。根据乐曲进行速度,
假设一个全音符分配1S 时间,则每拍持续时间为250MS。如果持续时间的最
小单位是10MS,则相应的拍长时间数据为25,该数据存放在 BX 寄存器中,
从而可以确定每个音符的持续时间。
音
符
频
率
1
2
3
4
5
6
7
1
2
3
4
5
6
7
1
131
147
165
175
196
220
247
262
294
330
349
392
440
494
523
六、元器件功能简介:
1.8255 引脚功能
RESET:复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制
寄存器)均被清除,所有 I/O 口均被置成输入方式。
CS:片选信号线,当这个输入引脚为低电平时,表示芯片被选中,允许 8255
与 CPU 进行通讯。
3
简单的电子琴设计
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 输入地址信号来寻址。
本实验用到的引脚有 PA0-PA3、PC0-PC3、D0-D7、A0、A1、WR、RD、CS 、
和 GND 。
4
简单的电子琴设计
A组控制
B组控制
7 6 5 4 3 2 1 0
控制C口低4位
1:输入
0:输出
控制B口8位
1:输入
0:输出
方式选择
0:方式0
1:方式1
控制C口高4位
0:输出
1:输入
控制A口8位
0:输出
1:输入
方式选择
00:方式0
01:方式1
11:方式2
功能控制
0:位操作
1:方式选择
图 1.
8255 的控制字格式
2.8254 可编程计数/定时器
芯片完成对外部脉冲信号的各种处理。8254 芯片内部具有三个独立的 16 位
计数器,它可用程序设置成多种工作方式,按十进制计数或二进制计数,最高计
数速率可达 10MHz。
8254 的全部功能是由 CPU 编程设定的。CPU 通过输出指令给 8254 装入控制字,
从而设定其功能。8254 控制字格式如下:
D7
D6
D5
D4
SC1
SC0
RL1
RL0
D3
M2
D2
M1
D1
M0
D0
BCD
各位的功能见表 1~表 4:
表 1
SC1、SC0 - 计数器选择
SC1
SC0
选择计数器
0
0
1
1
0
1
0
1
选择 0#
选择 1#
选择 2#
使用方法参见 8254 使用说明
5
简单的电子琴设计
表 2
RL1、RL0-CPU 读/写操作
RL1
RL0
0
0
1
1
0
1
0
1
操作类型
计数器封锁操作
读/写计数器低 8 位
读/写计数器高 8 位
先读/写低 8 位,后读/写高 8 位
表 3
M2、M1、M0 -工作方式选择
M3
M2
M1
计 数 工 作 方 式
0
0
0
0
1
1
0
0
1
1
0
0
BCD
0
1
0
1
0
1
0
1
方 式 0
方 式 1
方 式 2
方 式 3
方 式 4
方 式 5
表 4
BCD-计数方式选择
数 码 形 式
十六位二进制计数
四位十进制 ( BCD ) 码计数
6
简单的电子琴设计
七、设计原程序及注解
程序代码:
MY8255_A
EQU
0600H
MY8255_B
EQU
0602H
MY8255_C
EQU
0604H
MY8255_MODE EQU
0606H
MY8254_MODE EQU
06C6H
MY8254_A
EQU
06C0H
DATA
SEGMENT
;进行宏定义
FREQ_LIST DW 441D,495D,556D,589D,661D,742D,833D,882D,
262D,294D,330D,373D,402D,450D,494D,-1D
DATA
ENDS
;建立数据段
CODE
SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE
MOV AL,81H
OUT DX,AL
MOV DX,MY8254_MODE
MOV AL,36H
OUT DX,AL
;实现段寄存器 DS 的初始化
;写 8255 芯片的控制字,实
现工作在方式 0,A 端口和
B 端口输出,C 端口输入
;使 8254 工作在方式 3,A
口输入,运用计数器 0,二
进制方式
7
简单的电子琴设计
BEGIN: CALL CCSCAN
;扫描
JNZ INK1
JMP BEGIN
;有键按下时跳到 INK1
;没见按下时循环执行
BEGIN
;确定按下键的位置
INK1:
MOV CH,0FEH
;确定按下键在第一列
MOV CL,00H
;将 CL 清零
COLUM:
MOV AL,CH
MOV DX,MY8255_A
;将 8255 的 A 口地址赋给 DX
OUT DX,AL
;将 CPU 中的 AL 值送到 8255
的 A 口中,即送到 x1、x2、
x3、x4 中
MOV DX,MY8255_C
; 将 8255 的 C 口地址赋给 DX
IN AL,DX
;将 C 口的值送到 AL 中
L1:
TEST AL,01H
JNZ L2
MOV AL,00H
;检验按下键是否在 L1
;不是 L1 则跳到 L2
;为了后面用来与 FREQ_LIST
数据段中数对应
JMP KCODE
;强制跳转到 KCODE
L2:
TEST AL,02H
;检验按下键是否在 L2
JNZ L3
MOV AL,04H
;不是 L2 则跳到 L3
;为了后面用来与 FREQ_LIST
数据段中数对应。
JMP KCODE
;强制跳转到 KCODE
8