微机原理实验8254计算机钢琴,GitHub - SincereXIA/PianoMFC: 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC...
PianoMFC
西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC
需要连接西电微机原理实验室提供的 QTH9054 微机试验箱,使用其蜂鸣器发声,若不连接,程序会直接播放 mp3 文件模拟钢琴声。
请在 release 处下载编译好的 exe 文件运行,如需计算机喇叭发声,请选择声卡输出,并保证 sound 文件夹与 piano.exe 在同一目录下。
功能设计
基础功能
能够演奏 C 调包含高、中、低音的不同节拍的乐曲,音调与频率的对应关系如下:
微机键盘与电子琴键盘的对应关系为:高音依次为 Q,W,E,R,T,Y,U,中音依次为A,S,D,F,G,H,J,低音依次为 Z,X,C,V,B,N,M。
附加功能
增加自动演奏乐曲功能。当按下 P 键后,自动播放一首乐曲,曲长大于 20 秒。
增加琴键图形显示功能。屏幕上显示 21 个琴键(高中低音),当按下某键后屏幕上的对应琴键有所反映。
增加一个音调 D,当从 C 调改为 D 调后,演奏音按照 D 调(比 C 高一个调)发音。
进阶功能
实现键位切换功能:除了基础功能要求的按键映射关系外,额外增加可以选择 按键A~Z 对应于音调的最低音到最高音
实现声卡输出功能:在脱离了微机实验箱的情况下,程序仍然能够使用计算机内置的声卡,通过计算机喇叭或者耳机进行声音的输出
环境要求
开发环境:
开发工具:实验室给定的 Visual C++ 6.0
操作系统:实验室给定的 Windows XP
软件执行环境
执行程序需要在 WIndows 平台上运行,在 Windows10、Windows 7 、Windows XP 上通过兼容性测试
QTH9054 微机试验箱 (可选)
为什么用 vc6.0
因为实验室的电脑上面只有 vc6.0
硬件设计方案及硬件连线图
硬件部分使用8254定时器,控制音调的高低,为了使蜂鸣器发出声音,使用高频时钟脉冲信号(32.768KHz),向8254写入方式三控制字,之后通过改变计数值值来获得期望得到的脉冲信号,将可听频率内的脉冲信号直接接入蜂鸣喇叭,获得声音输出。
硬件连线:
总线 LD0-LD7 接8254的 D0-D7 ,
LA0和LA1接8254的A0和A1,
IOWR和IORD接8254的WR和RD,
地址0000H接8254的CS
8254的GATE0接VCC
CLK0接初始的时钟频率32.768KHZ
OUT0接蜂鸣器输入
硬件驱动部分设计
使蜂鸣喇叭发出声音的核心是 set_freq_dividing_ratio() 函数,其参数 ratio 设定了计数值,time 定义了声音发出的时长。
开始时,先写入 8254 的方式控制字,使其工作在方式 3,之后写入计数值。该方式输出的是方波。如果初始计数值是N, 那么方波的频率是输入时钟的N分之一。该方式的特点是方波占空比约为1比1
void set_freq_dividing_ratio(int ratio,int time)
{
if(ratio!=0){
IO8bWrite(P8254MODE,0x14);//0x03
char input = (char)(ratio);
IO8bWrite(P8254A,input);
}
Sleep(time);
IO8bWrite(P8254MODE,0x10);
}
而计数值则由play_one_tone() 函数通过查表并计算得出
void play_one_tone(int freqnum,float flag)
{
//printf("\b%c%c\n",tone_list[freqnum-1][0],tone_list[freqnum-1][1]);
int div_ratio = get_div_ratio(freqnum, flag);
if (isLocalSound){
if(flag < 1) flag = 0;
play_one_toneL('a'+freqnum-1 + flag*7);
}else{
set_freq_dividing_ratio(div_ratio,beat);
}
}
测试结果与功能展示
执行编译好的 Piano.exe 文件,完成硬件驱动检测后,即会弹出电子乐器演奏程序的主界面
界面中部为模拟的电子琴界面,界面下部为设置界面。
单击右下角的帮助按钮,弹出帮助窗口,对程序功能进行说明
按下键盘按键,微机试验箱上的蜂鸣器就会发出指定音调的声音。
可以通过点击按钮来设定 C/D 调 以及声音长度(节拍)。如果选择声卡输出,则会使用计算机的内置声卡进行钢琴音的模拟
点击右下角的歌曲按钮,会自动播放内置的音频
工作中的微机试验箱:
微机原理实验8254计算机钢琴,GitHub - SincereXIA/PianoMFC: 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC...相关推荐
- 西电微机系统课程设计——步进电机开环控制系统设计
西电微机系统课程设计--步进电机开环控制系统设计 一.课程设计目的 1.掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力. 2.加深对 A/D 和并行接口芯片的工作方式和编程方法的 ...
- 计算机原理实验存储器,计算机组成原理实验存储器.pptx
计算机组成原理实验存储器 计算机组成原理实验课注意事项 实验箱电源由桌上的电源插板供电,可能会有相邻的两个实验箱共用电源插板的情况.请勿乱拔电源插板上的电源线.为了安全起见,实验完成后需关闭电源插板. ...
- 计算机组成运算器原理实验报告,计算机组成原理运算器实验报告
计算机组成原理运算器实验报告 计算机组成原理实验一 运算器实验 一.实验目的:1.掌握简单运算器的数据传输方式.2.验证运算功能发生器(74LS181)及进位控制的组合功能. 二.实验要求: 完成不带 ...
- 计算机学院优研计划,西电计算机考研总结 优研计划夏令营
考研历程 2019年7月参加西安电子科技大学计算机学院"优研计划"夏令营,得到优研计划. 12月份参加考研统考(政治68,英一53,数一90,专业课128,总分339). 2020 ...
- 双非计算机专业排名,计算机专业最新排名:西电第11,北邮第15,双非深大、杭电排前2...
计算机专业是目前被大家最看好的工科专业,每年报考计算机科学与技术的考生可以说是工科里面最多的,当然,计算机专业也差不多是每所高校都要开设的专业,学计算机专业就业面广,而且不需要做实验,也不用进车间,是 ...
- 湖南大学计算机系统原理实验,湖南大学-计算机组成原理实验-实验3-bomblab_图文.pdf...
课程实验报告 课 程 名 称: 计算机组成与结构 实验项目名称: bomblab 专 业 班 级: 姓 名: 学 号: 指 导 教 师: 完 成 时 间: 2016 年 4 月 20 日 信息科学与工 ...
- 微型计算机原理辅导西电,微机原理与系统设计-西安电子科技大学.pdf
微机原理与系统设计-西安电子科技大学 2017版 微机原理与系统设计 第10章并行接口芯片8255A应用设计 董明皓,博士 西安电子科技大学 dminghao@xidian.edu.cn 目录 1 8 ...
- 西电微机原理期末考试复习重点
以下手写笔记并不包含整门课的所有细节,只是列出考试题目必考到的非常重要的知识点,适合考前大体浏览一遍.
- 西电微机系统课程设计步进电机开环控制系统
** 微机系统与应用课程设计 课题二 步进电机开环控制系统设计** 一.程设计目的 掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力. 加深对 A/D 和并行接口芯片的工作方式和编 ...
最新文章
- CISCO专用协议CDP
- 梦之队奥运30人大名单:詹皇库里甜瓜双少领衔
- Android App的架构设计:从VM、MVC、MVP到MVVM
- 基于Nexys4DDR的UART实验
- 骆驼路线的主/从故障转移
- https open api_Web上的分享(Share)API
- python3 dict 排序_Python 3.9 新增功能展望
- 被问到TCP的可靠传输和提高网络利用率?
- HTTP请求方式中GET和POST的区别?
- 小程序和H5 之间的通信
- Scratch(四十三):赛龙舟
- 2.1 软件开发生命周期模型
- JRebel: ERROR Failed to obtain seat. Unable to connect to license server. Check
- 免费老牌php空间,Alwaysdata.com老牌稳定法国PHP免费空间
- openldap范例数据库mysql_用mysql作openldap的后台数据库
- [异常]kvm虚拟机卡顿连接不稳定
- 华硕笔记本系统重装之后需要输入用户名和计算机名称是怎么回事,华硕笔记本电脑重装系统【方法详解】...
- 腾讯云IM集成(so easy)
- [并发并行]_[线程池]_[Programming With POSIX Threads的线程池实现分析1]
- 服务器多出mysql帐户_在一台服务器构建多mysql 服务
热门文章
- gdal 压缩tif_Python | GDAL处理影像
- linux apr文件解压失败,Apache编译安装提示configure: error: APR not found错误解决方法...
- unit类型是什么?_项目中有用过锁吗?能解释一下什么是AQS(AbstractQueuedSynchronizer)吗?...
- kafka分区与分组原理_kafka 基本原理和概念
- 1476D. Journey
- linux 文件按时间 函数,[Linux文件属性]使用utime函数操作文件的时间参数
- vue如何split_vue代码分割的实现(codesplit)
- python ckeditor上传图片400错误_又一款python开发神器
- java解析dxf文件_浅析JVM方法解析、创建和链接
- 硬件服务器采购指南,硬件组装_服务器采购指南_太平洋电脑网PConline