光电学院电子系统设计项目中的代码部分。
历时两天,使用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 int
、code, xdata
等关键字的使用以及他们对应的范围 -
乐谱编码是三个三个一起,第一位是音调序号
note_idx
, 第二位是节拍序号beat_idx
,第三位是连音标签tie_flag
,用于区分两个相同的音是连音还是不连。