微机原理课程设计报告电子琴

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要
本次专业课程设计作为前阶段学习知识的一个检验,培养了我们的动手能力以及独立思考设计的能力,也是大学培养的一个重要实践步骤。

设计初期,我们通过网络,图书馆等资源查找到利用单片机设计制作电子琴的相关信息,对不同的方案进行细致的分析比较。

并且按照题意与实际情况进行改进,使之符合要求。

尔后利用恒科HK-51仿真开发系统编译软件对设计程序进行调试,最终确定了成熟的方案。

然后按照电路图进行实物焊接,最终做出一个简单的电子琴。

制作过程中发现的一些问题通过共同的分析研究得到的解决,此次课程设计巩固了前期的理论知识,增强了动手实践能力。

程序主要是由定时子程序、发光二极管显示子程序和中断服务程序组成。

包括对
8253、8255等可编程器件的编程。

关键词:8255;8253;中断;脉冲信号
目录
1 概述 (1)
1.1 设计目的 (1)
1.2 8255和8253的工作原理 (1)
2 电子琴设计原理及流程图................... 错误!未定义书签。

2.1 设计原理.............................. 错误!未定义书签。

2.2 流程图................................ 错误!未定义书签。

3 设计思路................................. 错误!未定义书签。

4 源代码................................... 错误!未定义书签。

5调试情况及其分析 (15)
6 课程设计总结............................. 错误!未定义书签。

参考文献 (29)
1 概述
1.1 设计目的
(1)了解交通灯管理的基本工作原理;
(2)熟悉8255A并行接口的各种工作方式和应用;
(3)熟悉8253计数器/定时器的工作方式及应用编程,掌握利用软硬件相结合定时的方法;
1.2 8255和8253的工作原理
1.2.1 8255A的工作原理
⑴8255A的内部结构
①数据总线缓冲器:这是一个双向三态的8位数据缓冲器,它是8255A与微机系统数据总线的接口。

输入输出的数据、CPU输出的控制字以及CPU输入的状态信息都是通过这个缓冲器传送的。

②三个端口A,B和C: A端口包含一个8位数据输出锁存器和缓冲器,一个8位数据输入锁存器。

B端口包含一个8位数据输入/输出锁存器和缓冲器,一个8位数据输入缓冲器。

C端口包含一个8位数据输出锁存器和缓冲器,一个8位数据输入缓冲器(输入没有锁存器)。

③A组和B组控制电路:这是两组根据CPU输出的控制字控制8255工作方式的电路,它们对于CPU而言,共用一个端口地址相同的控制字寄存器,接收CPU输出的一字节方式控制字或对C口按位复位字命令。

方式控制字的高5位决定A组的工作方式,低3位决定B组的工作方式。

对C口按位复位命令字可对C口的每一位实现置位或复位。

A组控制电路控制A口和C口上半部,B组控制电路控制B口和C口下半部。

④读写控制逻辑:用来控制把CPU输出的控制字或数据送至相应端口,也由它来控制把状态信息或输入数据通过相应的端口送到CPU。

⑵8255A的工作方式
方式0——基本输入输出方式;
方式1——选通输入输出方式;
方式2——双向方式。

1.2.2 8253的工作原理
8253是可编程的计数器/定时器,其内部有三个独立的16位计数器/定时器通道,每个计数器通道均可按6种不同的方式工作,并且都可以按二进制或十进制计数。

其CLK0~CLK2是计数器0~2的时钟脉冲输入端,GATE0~GATE2是门控脉冲输入端,OUT0~OUT2是输出端。

2电子琴设计原理及流程图
2.1设计原理
(1)对于一个特定的D/A转换接口电路,CPU执行一条输出指令将数据送入D/A,即可在其输出端得到一定的电压输出。

给D/A转换器输入
按正弦规律变化的数据,在其输出端即可产生正弦波。

对于音乐,每
个音阶都有确定的频率。

各音阶标称频率值:
(2)产生一个正弦波的数据可取32个(小于亦可),不同频率的区别,可通过调节向D/A转换器输出数据的时间间隔,例如:发"1"频率为
261。

1HZ,周期为1/261.1=3.83ms,输出数据的时间间隔为3.83ms/32
=0.12ms. 定时时间可以由8253配合8255来实现。

按下某键后发音
时间的长短可以由发出的正弦波的个数多少来控制。

本程序中设置默
认长度为60个正弦波。

2.2流程图
2.2.1电路连接图如下:
(1)8253和8255连接如下
2.2.2主程序流程图
2.2.3发音子程序流程图
2.2.4键盘显示子程序流程图
2.25显示子程序流程图
3 设计思路
在本次课程设计中,根据复杂程序设计思想——模块化程序设计,分析和确定程序总体设计目标:电子琴基本功能及部分扩展功能后,将总体目标划分为若干模块(子程序,具体可见下)。

程序设计的思路按以下顺序进行:
1.分析与确定程序总体设计目标
2.将总体目标划分为若干模块
3.定义每个模块的具体任务,明确它与其他模块间的通信方式
4.编写源程序,进行调试,包括:
●简单电子琴主程序
结合实验指导书的两程序,将其分为5个子程序,实现简单的播放和显示音阶的功能。

●录音子程序
实现记录弹奏曲目并播放的功能。

首先由9触发,将输入的音阶存入缓存区song中,输入的同时可以发声和显示。

当再次按9时录制
完成。

●放音子程序
本子程序实现放音功能。

首先从8279键盘读出键码,判断,如果键码不是1-8即回到程序开始,如果是,即求出相应的时间常数
的序号,取60次32个正弦波数据,播放32个数据,组成一个正弦
波。

播放60次后,从PORT1中取出值到AL,和1相与,判断是否有
按键,如果有就进入死循环,直到下次按键为止。

●放歌子程序
调用放音子程序。

●暂停子程序
在乐曲播放过程中,每调用一次MUSIC,就从PORT1中取出AL,检测AL个数,即每次发音后按键盘的次数。

当检测到AL为1时,
即按了一次任意就使程序进入一个死循环,不发音,到此实现了暂
停,然后再次按动任意键时,AL就为2,不为1,所以程序跳出死循
环,继续从断开处调用乐曲,继续播放。

●源程序整体
程序开始,显示提示信息,对缓存区、8279初始化。

接着调用发音子程序,键盘子程序,在把AL送缓存区,实现发音和显示。


着对9键、0键、f键、r键进行逐个判断,当9按下时,调用录音
子程序。

当按下0时,播放录制的曲目。

当按下f键时,播放程序
中预设的曲目。

当检测到r时,退出到DOS状态。

当每一个都检测
不到时,退回到调用发音子程序,继续发音显示。

从而实现有扩展
功能的电子琴。

5.模块连接,形成完整的程序
6.编写程序文档
4 源代码
DATA SEGMENT
IOPORT EQU 0C400H-0280H
PORT0 EQU IOPORT+2B0H ;8279 DATA PORT
PORT1 EQU IOPORT+2B1H ;8279 CTRL PORT
SEC1 DB 0 ;HOUR HIGHT
SEC2 DB 0 ;HOUP LOW
MIN1 DB 0 ;MIN HIGHT
MIN2 DB 0 ;MIN LOW
HOUR1 DB 0 ;SEC HIGHT
HOUR2 DB 0 ;SEC LOW
LED DB
3FH,06,5BH,4FH,66H,6DH,7DH,07,7FH,6FH,77H,7CH,39H,5EH,79H, 71H ;7段管对应的显示码
DB 67H,37H,73H,31H,3EH,36H,66H
IO8253A EQU IOPORT+280H
IO8253B EQU IOPORT+283H
IO8255A EQU IOPORT+288H
IO8255B EQU IOPORT+28BH
IO0832A EQU IOPORT+290H
DATA1 DB 80H,96H,0AEH,0C5H,0D8H,0E9H,0F5H,0FDH
DB 0FFH,0FDH,0F5H,0E9H,0D8H,0C5H,0AEH,96H
DB 80H,66H,4EH,38H,25H,15H,09H,04H
DB 00H,04H,09H,15H,25H,38H,4EH,66H ;正弦波数据
TIME DB 120,106,94,89,79,70,63,59 ;发不同音时8253的计数器初值
MSG
DB’************************************************’,0DH,0 AH
DB’THIS IS OUR WORK, PLEASE SUPPORT US, THANK YOU’,0DH,0AH
DB '1.PRESS 1~8 TO PLAY',0DH,0AH,0DH,0AH
DB'2.PRESS 9 TO RECORD',0DH,0AH,0DH,0AH
DB'3.PRESS 0 TO PLAY THE RECORD',0DH,0AH,0DH,0AH DB'4.PRESS F TO PLAY THE SONG',0DH,0AH,0DH,0AH
DB'5.PRESS ANYKEY TO PAUSE/START WHEN PLAY THE RECORD',0DH,0AH,0DH,0AH
DB'6.PRESS R TO EXIT',0DH,0AH,0DH,0AH
DB’COPYRIGHT@MR.LI&MR.HUANG’,0DH,0AH
DB’**********************************’,0DH,0AH,'$'
NUM DB ? ;NUM为8253计数器初值的序号
SONG DB 50 DUP(?)
SONG1 DB 1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,-1
MSGPLAY DB 0DH,0AH,0DH,0AH,'RECORDING......PLESS 9 TO END',0DH,0AH,0DH,0AH,'$'
MSGEND DB 'RECORD
FINISHED.',0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,'$' MSGPLAY1 DB 0DH,0AH,0DH,0AH,'PLAYING......PRESS ANYKEY TO PAUSE.',0DH,0AH,0DH,0AH,'$'
MSGEND1 DB 'PLAYING FINISHED.',0DH,0AH,0DH,0AH,'$' DATA ENDS
STACK1 SEGMENT PARA STACK 'STACK'
DB 50 DUP(0)
STACK1 ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MSG
MOV AH,9
INT 21H ;显示提示信息
CLI
MOV AX,DATA
MOV DS,AX
MOV SEC1,0
MOV SEC2,0
MOV MIN1,0
MOV MIN2,0
MOV HOUR1,0
MOV HOUR2,0 ;显示缓存区初始化
MOV AX,DATA
MOV DS,AX
MOV AX,CS
MOV DS,AX
MOV DX,PORT1
MOV AL,0D3H ;11010011 清除命令特征位
OUT DX,AL ;8279 CLEAR
MOV AL,2AH ;00101010 42分频,内部使用1MHZ/42的频率OUT DX,AL ;8279 CLOCK
MOV AL,40H
OUT DX,AL ;READ FIFO RAM COMMAND
MOV AL,00H ;8个字符显示,左入口。

编码扫描键盘,双键锁定。

OUT DX,AL ;KEYBORD DISPLY MODE
MOV AL,80H ;写入的存储单元地址为0000
OUT DX,AL ;WRITE RAM COMMAND
KEY1:
CALL MUSIC ;发音
CALL KEYBORD ;CALL KEYBORD AND DISPLY
NEXT2:
MOV HOUR2,AL
MOV HOUR1,AL
MOV MIN2,AL
MOV MIN1,AL
MOV SEC2,AL
MOV SEC1,AL ;键盘码存入显示缓冲区
LP0:
CMP AL,9H
JZ RE
CMP AL,0H
JZ OUTPUT
CMP AL,15
JZ FU
CMP AL,13H ;'R' COMMAND
JNZ LP1
MOV AX,4C00H ;QUIT TO DOS
INT 21H
LP1: JMP KEY1
RE:CALL RE0 ;录音
JMP LP1
OUTPUT:CALL OUTPUT0 ;放录音JMP LP1
FU:CALL OUTPUT1
JMP LP1
MAIN ENDP
RE0 PROC NEAR ;录音子程序MOV DX,OFFSET MSGPLAY
MOV AH,9
INT 21H ;显示录音提示信息
LEA SI,SONG
R:
CALL KEYBORD
MOV HOUR2,AL
MOV HOUR1,AL
MOV MIN2,AL
MOV MIN1,AL
MOV SEC2,AL
MOV SEC1,AL ;键盘码存入显示缓冲区CALL MUSIC
CALL DISP
MOV [SI],AH
CMP AH,9
JZ QRE0
INC SI
JMP R
QRE0:
MOV DX,OFFSET MSGEND
MOV AH,9
INT 21H ;显示录音提示信息
RET
RE0 ENDP
OUTPUT0 PROC NEAR ;放录音子程序
MOV DX,OFFSET MSGPLAY1 MOV AH,9
INT 21H ;显示PLAY提示信息
LEA SI,SONG
OU:
MOV AL,[SI]
CMP AL,9
JZ QRE1
MOV HOUR2,AL
MOV HOUR1,AL
MOV MIN2,AL
MOV MIN1,AL
MOV SEC2,AL
MOV SEC1,AL ;键盘码存入显示缓冲区CALL DISP
MOV AL,AH
CALL MUSIC
NEXT:
INC SI
JMP OU
QRE1:
MOV DX,OFFSET MSGEND1
INT 21H ;显示PLAYEND提示信息RET
OUTPUT0 ENDP
OUTPUT1 PROC NEAR ;放歌子程序MOV DX,OFFSET MSGPLAY1
MOV AH,9
INT 21H ;显示PLAY提示信息
LEA SI,SONG1
OU1:
MOV AL,[SI]
CMP AL,-1
JZ QRE2
MOV HOUR2,AL
MOV HOUR1,AL
MOV MIN2,AL
MOV MIN1,AL
MOV SEC2,AL
MOV SEC1,AL ;键盘码存入显示缓冲区CALL DISP
CALL MUSIC
NEXT1:
INC SI
JMP OU1
QRE2:
MOV DX,OFFSET MSGEND1
MOV AH,9
INT 21H ;显示PLAYEND提示信息
RET
OUTPUT1 ENDP
KEYBORD PROC NEAR ;键盘子程序MOV DX,PORT1
MOV AL,0D1H
OUT DX,AL ;CLEAR DISPLAY WREP:
CALL DISP
MOV DX,PORT1
IN AL,DX ;读状态
AND AL,07H ;判断是否有按键
JZ WREP
KEYN: ;下一次的按键MOV DX,PORT0
IN AL,DX ;读数据MOV BL,AL
AND AL,07H
AND BL,38H
MOV CL,03
SHR BL,CL
CMP BL,00H
JNZ LINE1
ADD AL,08H
JMP QUIT1
LINE1:
CMP BL,01H
JNZ LINE2
JMP QUIT1
LINE2:
ADD AL,10H
QUIT1:
RET
KEYBORD ENDP
DISP PROC NEAR ;显示子程序
PUSH SI
PUSH CX
PUSH DX
MOV AX,DATA
MOV DS,AX
MOV DX,PORT1
MOV AL,90H
OUT DX,AL ;写地址为0000的显示缓存区命令,每次写入后地址自动加1指向下一次写入地址
MOV SI,OFFSET SEC1
MOV CX,0001
MOV BX,OFFSET LED
DISP1:
CLD
LODSB
MOV AH,AL
XLAT ;键盘码转显示码
MOV DX,PORT0
OUT DX,AL ;显示
LOOP DISP1
POP DX
POP CX
POP SI
Q:RET
DISP ENDP
MUSIC PROC NEAR ;发音子程序
PUSH SI
CMP AL,1
JL QUIT
CMP AL,8
JG QUIT ;若不在'1'-'8'之间转QUIT,不发音MOV NUM,AL ;求出相应的时间常数的序号MOV CX,60 ;取60次32个正弦波数据DDD:
MOV SI,0
LLL:
MOV AL,DATA1[SI] ;取正弦波数据MOV DX,IO0832A
OUT DX,AL ;放音
CALL DELAY ;调延时子程序
INC SI
CMP SI,32 ;是否取完32个数据
JL LLL ;若没有,则继续
LOOP DDD ;总循环次数60是否完,没有,则继续
D:
MOV DX,PORT1 ;扫描实现任意键暂停IN AL,DX ;读状态
AND AL,01H ;判断是否有按键
JNZ FFF; ;按键延时
JMP QUIT
FFF: MOV CX,60
JMP D
QUIT:
POP SI
RET
MUSIC ENDP
DELAY PROC NEAR ;延时子程序
CCC: MOV BX,OFFSET TIME
MOV DX,IO8253B ;置8253通道0为方式0工作MOV AL,10H
OUT DX,AL
MOV DX,IO8255B ;设8255A口输入
MOV AL,9BH
OUT DX,AL
MOV AL,NUM ;取相应的时间常数
XLAT
MOV DX,IO8253A
OUT DX,AL ;向8253通道0输出
KKK: MOV DX,IO8255A
IN AL,DX ;从8255A口读一字节
TEST AL,01 ;判PA0口是否为1
JZ KKK ;若不为1,则转KKK
RET ;子程序返回
DELAY ENDP
CODE ENDS
END START
5 调试情况及其分析
源程序完成后,进行子程序与程序的调试工作,程序调试过程、完成情况及其分析按以下顺序进行:
5.1主程序简单电子琴功能
主程序要求完成的功能有:电子琴简单功能实现以及利用由8279芯片控制的小键盘(含数码管、键盘阵列)实现控制电子琴。

主程序由电子琴实验和键盘控制实验的两个程序有机组成,两个程序简单拼凑在一齐是不能实现的。

经过实际调试和修改,将原电子琴程序改为2个子程序:music(实现播放音阶)和delay(实现播放音阶时延时);将原键盘控制程序改为1个主程序:key1、keybord(键盘扫描及输入)和disp(显示)。

各个子程序通过寄存器al通信,al存有当前输入的键盘码,同时为music、disp两子程序服务。

调试后,主程序能实现课程设计要求的功能,并且界面清晰、操作容易。

5.2子程序录音功能
这是其中一个扩展功能,实现即时播放并录音。

(具体功能可见前面的设计思路)
录音功能刚写好时,只能实现录音时播放音阶但不能实现录音时显示音阶。

程序中依次调用keybord、music、disp子程序,即在disp子程序不能实现,观察键盘控制的原始程序,发现keybord扫描键盘之后,将当前输入的键盘码存入寄存器al中,而disp显示功能是从显示缓存区中读取键盘码。

将keybord扫描存储在al中的键盘码存入显示缓冲区,使得disp显示子程序能在显示缓冲区中读取键盘码并加以显示,使得两个子程序有效通信。

5.3子程序放录音功能
这是与录音相配套的扩展功能,实现任何时候(录音的数据已存入录音缓存区song)播放录音缓存区所记录的最近一次录音。

由于录音功能成功调试,此子程序与录音功能相当类似,注意加上两子程序通信语句,调试十分顺利,成功实现放音功能。

5.4子程序放歌(已预存)功能
此功能将一首预存的歌曲播放,此功能可以调用放录音的子程序实现,唯一不同就是根据键盘的输入控制,选择播放的缓存区是录音缓存区或是预存歌缓存区。

5.5子程序暂停功能
程序中,实现的扩展功能中包括在播放录音曲目和预设曲目时,可以按任意键暂停,然后再按任意键继续从断开处播放。

按任意键后,AL置1,进入CALL MUSIC的死循环,于是我们想到了让死循环不跳转到MUSIC,只在本身程序处循环,即不发音。

当在次按下任意键时,由于AL变成2,所以跳出了循环,回到了放歌和放录音的程序中,继续播放。

从而实现了放录音和放预设歌时的暂停和重起。

5.6源程序整体功能
将各子程序调试完成后,进行最后的源程序整体功能调试。

调试过程中我们注意到:
a.程序模块化(功能分为若干子程序)能使源程序清晰,调试简单,因此在调试中我们还将源程序进一步模块化。

b.注意子程序之间的通信方式,这里基本用到的是寄存器al(内含键盘码),所以对al的使用应十分谨慎。

c.调用子程序前,使用push/pop保护了一些子程序会用到的主程序同时会用到的寄存器,保证调用之后主程序的顺利执行。

在调试过程中出现的一些小问题,我们都根据以上3点总结出的经验作为原则进行调试,调试过程十分顺利。

最后根据电子琴的实际用途加上了一些必要清晰的提示性语句,使界面更加友好。

6课程设计总结
经过这个课程设计,虽然时间比较短,完成任务的效果不是很理想,但是既然自己尝试过,就肯定学到了不少东西,也真正体会到做电子设计行业工作的辛苦,不过自己收获还是挺大的。

这次课程设计对我综合运用所学知识的能力的提高有不小的帮助,之前做的实验都是很简单的编程,跟硬件结合也没有这么复杂,实现的功能都比较简单,可是这次要实现的功能相对来说比较复杂,要求掌握的知识比较综合。

首先,要实现题目要求的功能并有所创新,我们必须全心地投入其中,养成一种敢于钻研敢于创新的习惯。

在把课程要求实现到实际中来的过程中,首先必须清楚明白地了解几个参考程序的每一行的意思,这就需要敢于静心钻研。

为了把使得程序更加完整,就必须进行创新,这就需要敢于创新。

其次,通过课程设计,让我在课本的基础上,更深入的了解了各种芯片的用法和程序的完成过程,调试方法及技巧。

为了了解键盘,查找了不少8279芯片的资料,了解了键盘的初始化,存取缓存,扫描键盘,读取键码以及键码和显示码之间的转换。

为了实现基本功能,认真研究了参考程序的意义,了解了电子琴的不同音阶放音功能的实现,长短音的实现,更深入了解了8253计时器的使用方法。

编写程序的过程中,体会最深的是子程序的调用和程序的条理问题,一个程序就算功能实现了,但是也要使主程序和子程序的条理分明,易读性高,才能算一个比较好的程序。

调试程序中,学习了DEBUG 的使用,DEBUG对检查程序的错误作用很大。

同时,也要灵活使用各种调试方法,来缩小寻找错误的范围。

检查程序过程中,在充分思考的基础上多次实验是检查改正程序的良方。

在设计扩展功能的过程中,大胆想像并且用多种思路来求解实现目标是必备的武器。

参考文献
[1]杨立邓振杰荆淑霞等.微型计算机原理与接口技术(第二版).北京:中国铁道出版社,2006.
[2]王元珍韩宗芬.IBM—PC宏汇编语言程序设计(第二版).武汉:华中科技大学出版社,1996.
[3]宋杰等.微机原理与接口技术课程设计.北京:机械工业出版社,2005.。

相关文档
最新文档