湖南铁路科技职业技术学院单片机课程设计说明书
样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
表4.5节拍与节拍码对照
节拍码 1 2 3 4 5 6 8 A C F
节拍数 1/4拍 2/4拍 3/4拍 1拍 1又1/4拍 1又1/2拍
2拍 2又1/2拍
3拍 3又3/4拍
节拍码 1 2 3 4 5 6 8 A C
节拍数 1/8拍 1/4拍 3/8拍 2/1拍 5/8拍 3/4拍 1拍 1又1/4拍 1又1/2拍
每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,图4.5为节拍码的对照。如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如表4.5为1/4和1/8节拍的时间设定。
表4.5 1/4和1/8节拍的时间设定
曲调值 调4/4 调3/4 调2/4
DELAY 125毫秒 187毫秒 250毫秒
曲调值 调4/4 调3/4 调2/4
DELAY 62毫秒 94毫秒 125毫秒
- - 30
湖南铁路科技职业技术学院单片机课程设计说明书
4.5.3 编码
do re mi fa so la si分别编码为1~7,重音do编为8,重音re编为9,停顿编为0。播放长度以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。以0xff作为曲谱的结束标志。
举例1:音调do,发音长度为两拍,即二分音符,将其编码为0x18。 举例2:音调re,发音长度为半拍,即八分音符,将其编码为0x22 歌曲播放的设计。先将歌曲的简谱进行编码,储存在一个数据类型为unsigned char 的数组中。程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,接着调用软件延时。
表4.6 简谱对应的简谱码、T值、节拍数
简谱 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 发音 低音SO 低音LA 低音TI 中音DO 中音RE 中音MI 中音FA 中音SO 中音LA 中音TI 高音DO 高音RE 高音MI 高音FA 高音SO 简谱码 1 2 3 4 5 6 7 8 9 A B C D E F T值 64260 64400 64524 64580 64684 64777 64820 64898 64968 65030 65058 65110 65157 65178 65217 节拍码 1 2 3 4 5 6 8 A C F 节拍数 1/4拍 2/4拍 3/4拍 1拍 1又1/4拍 1又1/2拍 2拍 2又1/2拍 3拍 3又3/4拍 - - 31
湖南铁路科技职业技术学院单片机课程设计说明书
4.6程序流程图
本设计的程序流程如下:
先从主程序开始,接着初始化变量及 LCD 接口,然后初始化方波发生器、晶振管,使 LCD 显示信息,就进入了开机状态,等待动作——选择按键,包括播放键,暂停键,停止键,当然也可以选择返回;加入选择的是播放键,LCD 上就会 -7-现实歌曲编号,与此同时演奏相应的乐曲,此时,你可以按上一曲或下一曲键,使其演奏上一个或者先一个乐曲。 其流程图如下:
- - 32
湖南铁路科技职业技术学院单片机课程设计说明书
主程序流程图
33
- - LCD显示流程图
湖南铁路科技职业技术学院单片机课程设计说明书
4.7 文档顶端程序清单
RS BIT P2.0 端口标号 RW BIT P2.1 E BIT P2.2
L50MS EQU 60H ;工作内存定义 L1MS EQU 61H L250MS EQU 62H SEC EQU 65H MIN EQU 64H HOU EQU 63H 址 址 LJMP
T1INT
ORG 1000H
MAIN: ;液晶初始化
MOV SP,#70H MOV P0,#01H ;清屏 CALL DISPLAY
MOV P0,#38H ;8位,2行显示 LCALL 闪烁on LCALL 幕on
LCALL LCALL
DISPLAY
INITIL ;内存初始化
DISPLAY
MOV P0,#06H ;计数地址加1,显示
DISPLAY
MOV P0,#0FH ;屏显on,光标on,
LJMP
TT0
ORG 001BH ; 定时器T1溢出中断入口地ORG 0000H
ORG 000BH ;定时器T0溢出中断入口地 LJMP MAIN
;引脚定义,定义液晶显示
下,否则等待 LCALL KEY: XN: K1: K2: K3: 按键 L1: L2: L3: LK: K4:
MOV A,#00H LJMP
LK
JB ACC.5,L2 MOV A,#04H LJMP
LK
JB ACC.6,L3 MOV A,#08H LJMP
LK
JB ACC.7,NEXT1 MOV A,#0CH ADD A,R4 PUSH LCALL
ACC
DELAY1 ;若同时有其他
MODD LJMP NOP NOP LCALL LCALL LCALL LJMP LCALL LCALL LCALL JNZ K2 LJMP
KEY
MOV R2,#0FEH ;读键盘 MOV R4,#00H MOV A,R2 MOV P1,A MOV A,P1
KS KAIJI SOP KEY MODD MODD KS
JNZ K1 ;有按键转到K1
WAIT
JB ACC.4,L1 ;为1跳转,第一行无
WAIT: LCALL KEY ;键盘扫描,是否有键按
按键,则等待 - - 34