第一章 设计任务
电子琴
系统设计方案
- 弹奏模式(基础部分)
具有七个按键,分别用于弹奏1、2、3、4、5、6、7七个音;另有一个切换按键,能够实现低音、中音和高音切换。
- 自动演奏模式(拔高部分)
能够自动演奏出《送别》乐谱。
- 乐谱显示(发挥部分)
模仿歌词动态显示,利用八个数码管显示当前演奏的乐谱片段,并高亮已演奏的音符
拓展功能
- 歌曲切换
自动演奏可通过矩阵键盘按键切换演奏曲目(两首《送别》、《天空之城》)。
- 歌曲倍速
可通过独立按键改变歌曲播放速度。
- 歌曲播放/暂停
可通过独立按键播放或暂停歌曲。
- 取消歌曲播放
可通过矩阵键盘切换歌曲按键在播放歌曲时关闭自动演奏。
第二章 系统整体设计
一、系统方案设计
系统使用51单片机设计,矩阵键盘作为按键输入;定时器0控制无源蜂鸣器鸣叫;定时器1控制数码管动态显示;外部中断0控制音乐开启暂停;外部中断1控制音乐播放速度;数码管显示歌词。
接线图 | |
74HC245 | P0^1~P0^7 |
数码管 | P0^1~P0^7 |
74HC138译码器A0~A2 | P2^2~P2^4 |
无源蜂鸣器 | P1^5 |
音乐播放/暂停键 | P3^2 |
音乐播放倍速 | P3^3 |
8×8矩阵键盘 | P1^0~P1^7 |
二、程序流程图
第三章 各功能模块划分
代码模块简介 | |||
main.c | 主函数 | music.h | 歌曲简表 |
keyboard.c | 矩阵键盘输入检测 | Delay,c | 延时函数 |
LED.C | 数码管显示 | Timer0.c | 中断初始化 |
一、数码管动态显示中断Timer1_Routine()
Music[changemusic][a][b] //音乐简表(三维数组) //changemusic 歌曲选择0/1 //a 第几个音符 //b 为0频率 为1时值 为2字形码 //[MusicSelect][0]音符选择 //[LEDMusicSelect][2]数码管字形码 | |
led_display(a,b)//数码管显示 | |
//location数码管位选码 | |
原理: 动态显示每1ms刷新一次数码管 通过判断现在播放的音符是否为最后一个,控制数码管是否继续显示歌词; 通过比较数码管显示数码管位数a与播放音符的位数b,若a>b则关闭数码管显示,即减小该位数码管的占空比,从而实现当前播放音符高亮效果; 歌词显示LEDMusicSelect与数码管位选码location同增,每次显示8个则减8,若音符选择码MusicSelect播放完8个则同步LEDMusicSelect与MusicSelect,从而实现歌词刷新。 |
二、矩阵键盘输入判断input(void)
button//键值 | |
FreqSelect//频率选择 | |
mode//高中低音选择 | |
原理: 在没有自动演奏时显示频率模式 使用行列法取得键值 1~7键按下蜂鸣器鸣叫对应音符 8键改变音高并将频率选择重置 9键翻转changemusic改变演奏歌曲 |
三、数码管显示led_display(unsigned char Location,Number)
Location | //位选 | 原理: 判断输入的Location,向138译码器输入相应字形码,向字形码表取第Number个字形码向P0输出 |
Number | //字形码 | |
ledcodeTable[] | //数码管断码表 |
四、音乐简表music.h
noteSPEED | //四分音符时长 | 原理: noteSPEED用来控制乐谱中音符对应的时值 FreqTable[]频率表用来控制蜂鸣器翻转频率从而控制音高 Music[2][121][3]为乐谱使用了三维数组,2表示2层,121表示121层,3表示3列。 |
FreqTable[] | //频率表 | |
Music[2][121][3] | //乐谱 //0层送别1层天空之城//0列频率 //1列时值 //2列字形码 | |
#define P #define L1~7 #define M1~7 #define H1~7 | //P:休止符 //L:低音 //M:中音 //H:高音 //下划线:升半音符号 |