longqianh / Stringless-Piano

光电学院电子系统设计项目

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Stringless-Piano

光电学院电子系统设计项目中的代码部分。

历时两天,使用Keil C, 熟悉了8051单片机的一些编程。所用单片机型号为 STC15F2K60S2

可以说,好多功能都实现地不是很好,在PWM调制上花费了太多时间,前期的规划不是很好,后期有点赶。另外代码写得比较臃肿,最后由于时间关系也没来得及整理,重要的函数都放到了main里面,一些函数可以重复利用的也草草复制粘贴了事。(比如弹奏、录音、节奏大师都用到蜂鸣器发声,可以整合到一个函数,然后用个flag判断一下)

系统模块

  • LCD模块:write_cmd,write_data 进行命令切换和数据处理

    • 写入数据的地方:CGRAM;取出数据进行显示的地方:DDRAM;还有一个DGRAM用来显示图片
    • 可以改进的地方:竖排显示、视频显示、
  • 蜂鸣器模块:通过震动发声,事实上是蜂鸣器连接的端口不停地按照一定频率(确定了音调)进行高低电平地切换,蜂鸣器的发生频率就是这个方波的频率。

    • 可以改进的地方:使用PWM调制,用基本信号模拟出三角波和正弦波,可以改善音色。但是我研究了七八个小时,遗憾最后没有成功实现。
  • 键盘模块:scankey() 进行键盘扫描,检测按键

功能模块

  • 菜单:上下页的切换、音乐播放的暂停和继续、返回等功能

  • 弹奏:通过遮挡和移开激光管可以发声,并可以调整音调(低中高)

    • 可以改进的地方:增加黑键
  • 播放音乐:内置了小星星和Lemon,可以播放并显示音符

    • 不错的地方:可以根据一个tie_flag判断是不是需要连音
    • 可以改进的地方:音符的显示,目前没有实现下划线和点
  • 录音与播放:可以弹奏,这时会记录下来,存入一个数组里;可以播放刚刚录下来的音;可以删除录音重新进行

  • 节奏大师:目前只放了一个小星星供练习,进入以后根据弹奏情况给予得分

    • 可以改进的地方:识别效果不是很好,基本上拿不到good
  • 希望实现但是没有实现的一些功能:

    • 蓝牙模块:手机传输数据、乐谱等
    • PWM调制音色
    • 三个蜂鸣器进行和弦

需要注意的地方

  • 注意端口和数据传输的对应

  • 注意 unsigned char,unsigned intcode, xdata等关键字的使用以及他们对应的范围

  • 乐谱编码是三个三个一起,第一位是音调序号 note_idx, 第二位是节拍序号 beat_idx,第三位是连音标签 tie_flag,用于区分两个相同的音是连音还是不连。

About

光电学院电子系统设计项目


Languages

Language:C 69.5%Language:C++ 26.7%Language:Objective-C 3.8%