当前位置:首页 > 郑通强—单片机课程设计报告
8 9 A B C D E F 4 5 6 7 高音1 高音2 高音3 高音4 64820 64900 64968 65029 65058 65110 65157 65178 9 A B C D E F 9/4拍 10/4拍 11/4拍 3拍 13/4拍 14/4拍 15/4拍 简谱码对应的定时初值与前面存放定时初值的表(或者键值)相对应,故可以根据简谱码到相应的表中查询定时初值。以《小星星》为例作为说明:
第一个音符“1”为一个四分音符,需调用四次延时即节拍码为4,由上面的表知其简谱码为5,简谱码存到字节高四位,节拍码存到低四位,得到54H,同样的原理,可得到一整首曲子的数据,存到表里备用:
DB 54H,54H,94H,94H,0A4H,0A4H,98H ;高四位存简谱码,低四位存节拍码(循环次数)
DB 84H,84H,74H,74H,64H,64H,58H ;小星星,亮晶晶,42音符 (29H) DB 94H,94H,84H,84H,74H,74H,68H DB 94H,94H,84H,84H,74H,74H,68H
DB 54H,54H,94H,94H,0A4H,0A4H,98H DB 84H,84H,74H,74H,64H,64H,58H
依次查询表中数据,并按高四位查询定时初值,按低四位设定延时程序循环次数,即可播放《小星星》。
4、 利用点阵进行显示的原理
实验箱上有四块8*8的点阵,通过控制点阵上不同LED的亮暗组合,可以形成不同的图案。实验箱通用板上有四块8×8 点阵LED,共有5 片74HC595 控制,其中4 片用于控制各块点阵LED每行的列数据,1 片用于控制四块点阵LED 的行选择数据。控制点阵LED 的74HC595 与控制数码管的74HC595 是级联的,因此移位数据时,先移入的4个字节,用于控制数码管,后移入5 个字节用于控制点阵LED。74HC595 的数据传输引脚是可以自行连接的,将其连接到单片机的P1口有关引脚,由此形成的控制电路原理如下页图所示。
- 3 -
每次必须移入9 个字节数据才能实现对数码管和点阵LED 的控制,其中前5 个字节用于控制点阵LED,后4 个字节用于控制数码管。如果只需操作数码管,不用操作点阵LED,可以每次只移入4 个字节数据;如果只需要操作点阵LED,不需要操作数码管,每次必须移入9 个字节数据,后四个字节可以是任意数据。
根据实验参考程序,在四块8*8点阵组成的16*16点阵上显示图形时,需要预先制表存放相关的数据。数表里面一共三十二个数,前十六数个控制上面两个8*8点阵(第一、三、五……第十五个数分别控制左上角点阵的八行,第二、四、六……第十六个数分别控制右上角点阵的八行,例如第三个数据为23H,则左上角点阵的第三行,从右到左的第一、第二、第六个LED灯亮),后面后十六个数控制下面两个8*8点阵(具体与前十六个相同)。根据此方法,得到十六个按键对应音调对应的十六个数表。如当按下按键4时,在16*16的点阵的从左往右第五列,从下往上亮五个LED灯,制表为:
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,10H,00H,10H,00H,10H,00H,10H,00H,10H,00H
按下按键或者播放音乐时,按音调查询显示所需要的表并进行显示,即可实现用点阵显示音调。
PART TWO方案设计及框图
一、 方案设计
要实现地功能主要有三方面:通过按键进行弹奏、自动播放音乐、通过点阵对音调进行显示。 总体设计为:利用一个开关,进行弹奏模式和自动播放模式的控制,并用一个发光二极管进行指示。开关处为低电平时,进入弹奏模式,发光二极管不亮;开关处为高电平时,进入自动播放模式,发光二极管发光。在两种模式下,均在播放每一个音符时,通过对键值或简谱码的查询,控制点阵显示的图案从而实现点阵对音调的显示和模拟;而对音调的控制则是通过对定时器赋不同的定时初值,产生不同频率的方波信号,对蜂鸣器进行驱动来实现。 二、 框图
1、 总体硬件框图
- 4 -
说明:硬件部分主要由开关、键盘、单片机、二极管、蜂鸣器、点阵组成。开关通过P0.0与单片机相连,用于选择弹奏模式或者自动播放模式;键盘通过P2口与单片机相连,其中P2.0-P2.3控制键盘的列,P2.4-P2.7控制键盘的行。发光二极管通过P0.1控制;蜂鸣器通过P3.2控制;点阵通过P1的相关端口进行控制。
2、 软件框图
- 5 -
说明:程序主体分为两大模块,第一个模块是弹奏模式,第二个模块是自动播放模式。弹奏模式下主要有按键按下及释放的判断、键值计算、查表、中断及显示等部分,自动播放模式下主要有查表、判断、延时、中断、显示等部分组成。两个部分均有较多判断、分支、循环,需理清思路。
PART THREE调试过程及结果
一、 调试过程
由于电子琴要求的功能主要分为弹奏、播放及显示三部分。调试的过程中,也是逐步实现这三方面功能的。首先是实现弹奏部分的功能,先将显示部分和自动播放部分用NOP代替,构成主架,然后对按键按下、释放、键值计算以及查表几方面分别进行调试;然后是自动播放功能的实现,查阅资料后,制作出数表,依次进行查询,对定时器赋值并循环播放音符,从而实现功能;最后是显示功能的实现,由于对点阵显示的不熟悉,一开始感到无从下手,后查阅资料并研究了实验指导书上参考程序,弄清点阵显示的原理并不断进行实际尝试,实现了功能。调试的过程中遇到了不少困难,但好在经过几天的努力,不断调试,最终得到了理想的结果。
调试时遇到的几个主要问题有:按键释放的准确判断、自动播放的数表制作与使用、显示问题。现具体介绍这几个问题:
1、 按键释放的判断
查阅资料得知:按键的按下和释放是通过判断按键按下和释放后的状态得以实现的。比如一开始给P2口赋值0FH,按下键盘上的按键后,P2口的值会发生变化,再松开按键后,P2口又恢复为0FH一开始。按照这个思想,利用如下程序语句,很容易就实现了对按键是否按下的判断。
MOV P2,#0F0H
MOV A,P2 CJNE A,#0F0H,L1 ;判断是否有按键按下 SJMP JUDGEMOOD
后来想尝试记录下按键按下时P2口的值,存到VAL2,利用VAL2进行比较,来判断按键的状态,发现
这样也能进行判断,但是无论是判断按下还是判断释放,只要记录下P2按下时的值存到VAL2进行比较时,蜂鸣器的发声都会变得不正常。
关键是判断按键释放,一开始只进行弹奏部分功能的调试时,下面一段程序可以很好地判断按键的释
放: W0: MOV A,P2 CJNE A,#0FH,W1 CLR TR0 LJMP LSCAN W1: MOV A,P2 CJNE A,#0F0H,W2 CLR TR0 LJMP LSCAN W2: SJMP W0
但是后来加上自动播放部分程序后,按下按键,松开后,程序一直运行在未松开时的循环,无法跳出
循环。思考了很久,没想出症结所在,又写了如下程序: W0: MOV A,P2
- 6 -
共分享92篇相关文档