版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何用单片机实现MIDI键盘功能51系列单片机实现MIDI3MIDI协议的串行通讯数据,如何扫描键盘和实现力度响应,如何适当的进展电器连接,本节将介绍前两个问题,最终一个问题将放在下一节介绍。MIDI协议的串行信号绝大多数51系列单片机都有串行通讯掌握器〔UART〕,协作适宜的晶振,正确地设UART的工作参数,就能够自动产生所需的串行数据。在51单片机做串行通讯时,可以用定时/计数器1〔T/C1〕作为波特率发生器。将串行口设置为方式1工作状态〔10位异步收发,波特率由定时器掌握MHz振,T/C1设为自动装入8位计数器状态〔TMOD置为2x,SMO=1,TH=FF31.25KMIDI协议。C语言例程,下同〕voidformat;{ TMOD=0x21; //T/C1工作于8位自动装入状态//TL1=0xff;TH1=0xff; //T/C1常数,确定波特率//SCON=0x50; //设串口工作于方式1,//PCON=0x80; //相当于SMOD=1;//TR1=1; //T/C1开头计数//}51UART的工作方式可推知,当外部晶振的频率为6MHz的倍数时,31.25K的波特率,见表5-3:表 5-3用不同的晶振频率产生波特率31.25K的存放器值晶振频率TMODSCONPCONTL1TH16MHz0x210x500x800xFF0xFF12MHz0x210x500x800xFE0xFE0x000xFF0xFF24MHz0x210x500x800xFD0xFD0x000xFE0xFE上一节已经介绍了MIDI命令的格式,发送一个音符的开关命令,可调用如下函数:voidsend(ucharcc,kk,vv){TR1=1; //开计数器//SBUF=cc; //发送cc//while(TI==0);//等待发送完毕//TI=0; //清发送标志//SBUF=kk;while(TI==0);TI=0;SBUF=vv;while(TI==0);TI=0;TR1=0;}参数cc,kk,vv的含义已在MIDI协议中介绍,不再重复。12字节命令,只需将上述函数简化即可,由于在演奏中主要执行的都是3字节命令,为提高运行速度,不在发送函数中推断命令长度,由于那样做的话固然可以削减一两个函数,但让单片机过多执行不必要的代码,得不偿失。键盘扫描电子乐器的键盘,动辄就是数十个琴键,而且常常消灭多个按键同时压下的状况,单片机系统必需能够准确推断哪个键被压下,哪个键保持,哪个键被释放,考虑到经济性,矩阵式动态扫描是乐器键盘最抱负的工作方式,图5-364键无力度感应的键盘原89c5164键的扫描工作。图5-3中,88个键通过二极管共同接在一根段选线上,按键的另外一端,分别按挨次接在各自的读入线〔51P2口〕上,段选线(P0)为单片机输出,为低电平有效,工作时,单片机向P0口某根线发出低电平,选中该段,然后读P2口,当有相应的按键被压下时,该输入线与段选线接通,通过二极管拉到低电平,单片机即可推断是该段的哪一个按键被压下。转变段选线,则推断另一段的88个键值,则可完成64如不加二极管,在有按键压下时,将发生有效的段选线〔低电平〕与无效的段选线〔其他线的高电平〕通过按键短路的状况,将产生混乱。键盘在演奏时,有三个动作,被压下、保持压下状态、被释放,在被压下并保持时,每次扫描都会推断出该键的压下状态,但在实际工作中,并不需要每次扫描到这种状态都MIDI命令,因此,要进展按键状态的存贮,每次扫描后,与存贮的状态比较,觉察有转变,再作相应的处理,并将的状态存入。图5-3 8X8键无力度键盘电路图8X8key_number[i]是全局数组,用来存贮按键状态,addition是全局变量,是设定该键盘第一个按键对应的MIDI音符的键值,全局数组和全局send(cc,kk,vv)函数,见前一节介绍,特此说明。voidscan_key{uchari,j,k,r,mmm,xu;k=0xfe; //k0for(i=0;i<8;i++){ P2=0xff;P0=k; //输出段选值k=(k<<1)+1; //段选标志左移,末位补1,为下一循环预备mmm=0x01; //设按键查询指针初值r=P2; //读入键值P0=0xff;xu=r^key_number[i]; //查询键值是否转变,xu1的位为产生变化的按键key_number[i]=r; //的键值存入数组for(j=0;j<8;j++) //8次循环,推断具体产生变化的键{if((xu&mmm)!=0) //用指针选择被测的键{ if((r&mmm)!=0) //推断最终状况,以确定是被压下还是释放{send(0x80+chnal,i*8+j+addition,40);} //关闭声音else{send(0x90+chnal,i*8+j+addition,127);} //开头发声}mmm=mmm<<1; //指针左移,推断下个键}}}力度感应的实现与力度曲线中高档的电子琴,都带有力度感应功能,什么是力度感应呢?就是音符发声的音量,与击键的力气正相关,力气越大,音量也越大。实现力度感应功能,首先要测量击键的力度,而击键力度与键盘的下沉速度正相关,测量按键的下沉速度,就可以推出力度值。力度感应键盘的按键构造如图5—4所示,每时,前排触点与后排触点先后接通,感应值。速度和存贮空间可以给我们供给帮图5-4力度键示意图 助,用一个计数器和多个存贮单元实现同样的功能。为每一个琴键安排一个存贮单元,用单片机的定时/计数器做一个时钟,当按键压下,使前排触点接通时,记录下时钟的值,在后排触点接通时用当时的时钟值,减掉记录的值,起,前排触点与后排触点共用P0口做输入,P2口做前排触点段选信号,P1口做后排触点的段选。每个按键需要一个字节的记录空间,对于6464个字节,再加128bitRAM89c51来说,就难以胜任了,故在力256bitRAM89c52。前文介绍过,MIDI0-127反比的,这就有了一个函数关系:vv,所测定的时间差为Tvv=A/TA是一个常量,用来把vv的值限制在0-127A的值,就可以做出各种不同的力度响应曲线,用于不同的场合。在实际编程工作中,由于vv与T都是字符型量,而直接用字符型量作除法运算,精度太差,用整形数或浮点数运算没有必要,用查表的方式是比较合理,速度又快的方法。力度键盘的扫描过程,与非力度键盘的过程类似,区分在于在每个扫描周期中,分别send(cc,kk,vv)5.2节中有介绍,key_number[][]是用于记录每个按键触点通断状态的全局数组,vol[][]是力度曲线存贮数组,count_begin[][]是各按键的计时存贮数组,ttt2毫秒为ttt1。voidscan_key{uchari,j,k,r,r1,mmm,xu,xd,ts,vv;k=0xfe; //段选指针初值for(i=0;i<8;i++){ P1=k; //输出后排段选P0=0xff;r1=P0; //读后排触点P1=0xff; //关后排段选P2=k; //输出前排段选ts=ttt; //读入当前时钟,插在前后排语句之间是//为确保输出电平稳定后读入的数据k=(k<<1)+1; //段选指针左移mmm=0x01; //位选指针初始化P0=0xff;r=P0; //读前排键P2=0xff; //关段选xu=r^key_number[0][i]; //检测前排键是否有变化xd=r1^key_number[1][i]; //检测后排键是否有变化key_number[0][i]=r; //存贮按键状态key_number[1][i]=r1;for(j=0;j<8;j++) //8次循环查询各键状况{ if((xu&mmm)!=0) //前排触点是否有变化{ if((r&mmm)!=0){ key_number[2][i]&=(~mmm) ; //前排触点关,存入}else{ key_number[2][i]|=mmm ; //前排触点闭合,存入count_begin[i][j]=ts; //纪录闭合时间}}else{if((ts-count_begin[i][j])>250){key_number[2][i]&=(~mmm);}
//超时将认为触点关闭}if((xd&mmm)!=0) //检测后排触点{if ((r1&mmm)!=0){if((ctk==0xf0)&((key_number[3][i]&mmm)!=0)){send(0x80+chnal,i*8+j+ada*12+addition,0x40); //后排键关闭则关音符key_number[3][i]&=(~mmm);}key_number[2][i]&=(~mmm);}else{if((key_number[2][i]&mmm)!=0) //后排触点闭合{if(ts>=count_begin[i][j]) //计算时间值{vv=ts-count_begin[i][j];}else{vv=255-count_begin[i][j]+ts;//时间计数器溢出处理send(0x90+chnal,i*8+j+ada*12+addition,vol[pp][vv]);//音符发声key_number[3][i]|=mmm;}}}}mmm=mmm<<1; //键检测指针左移}}}//========2毫秒为ttt1,============================voidtimer0interrupt1using3/*interruptsuboftime
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新版小学数学新人教版四年级上册全册教案(2026秋)合集
- 2026奥迪A6L上市 青岛巡展活动方案
- 医疗质量和安全实施方案
- 2026赛博数码广场服务策略探讨
- 2026石油开采行业市场现状供需分析及投资评估发展策略研究分析报告
- 2026中国超白压延玻璃光伏组件透光率优化实验数据报告
- 2026中国移动通信行业市场供需现状及投资评估规划发展方向研究报告
- 闻工作与著作权课件
- 2026中国新型复合材质缝合针性能测试与市场接受度报告
- 2026中国基层医疗市场对植入式设备需求特征与潜力报告
- 初中数学专项练习17-勾股定理-重难点题型
- T-CEMA 047-2025 藏医头浴疗法技术操作规范
- 医院dip工作实施方案
- 京东七鲜自有品牌运营
- 光伏电站现场工作管理流程
- 湖北省武汉市2026届高一数学第二学期期末监测试题含解析
- 2026年浙江省杭州市技能人才评价考评员考试题库及答案
- 代理记账业务内部规范
- XX镇(乡)卫生院医院感染管理责任制实施细则
- 2025中国银行社会招聘笔试历年典型考题及考点剖析附带答案详解
- 电力公司总经理面试题及答案
评论
0/150
提交评论