51单片机实现八音盒

本文详细描述了一款电子琴系统的设计,包括基础的七个按键和切换功能、自动演奏模式、乐谱显示以及拓展的歌曲切换、倍速控制和播放/暂停功能。系统采用51单片机为核心,利用矩阵键盘、定时器和数码管等组件实现,还介绍了程序流程和各功能模块的实现方法。
摘要由CSDN通过智能技术生成

第一章 设计任务

电子琴

系统设计方案

  1. 弹奏模式(基础部分)

具有七个按键,分别用于弹奏1、2、3、4、5、6、7七个音;另有一个切换按键,能够实现低音、中音和高音切换。

  1. 自动演奏模式(拔高部分)

能够自动演奏出《送别》乐谱。

  1. 乐谱显示(发挥部分)

模仿歌词动态显示,利用八个数码管显示当前演奏的乐谱片段,并高亮已演奏的音符

拓展功能

  1. 歌曲切换

自动演奏可通过矩阵键盘按键切换演奏曲目(两首《送别》、《天空之城》)。

  1. 歌曲倍速

可通过独立按键改变歌曲播放速度。

  1. 歌曲播放/暂停

可通过独立按键播放或暂停歌曲。

  1. 取消歌曲播放

可通过矩阵键盘切换歌曲按键在播放歌曲时关闭自动演奏。

第二章 系统整体设计

   一、系统方案设计

系统使用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:高音

//下划线:升半音符号

第四章 功能测试



实验源码与原理图

  • 19
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值