5.2 如何用单片机实现MIDI 键盘功能 用51 系列单片机实现MIDI 键盘功能,实际上就是要解决3 个方面的问提,那就是: 如何产生符合MIDI 协议的串行通讯数据,如何扫描键盘和实现力度响应,如何适当的进行电器连接,本节将介绍前两个问题, 最后一个问题将放在下一节介绍。 5.2.1 如何产生符合MIDI 协议的串行信号 绝大多数51系列单片机都有串行通讯控制器(UART),配合合适的晶振,正确地设置 UART 的工作参数,就能够自动产生所需的串行数据。 在51单片机做串行通讯时,可以用定时/计数器1(T/C1)作为波特率发生器。将串行口设置为方式1工作状态(10位异步收发,波特率由定时器控制),使用6MHz 晶振,T/C1 设为自动装入8位计数器状态(TMOD 置为 2xH),SMOD=1,TH=FFH,此时正好发生波特率为 31.25K 的串行通讯数据,适用于 MIDI 协议。 串口及定时/计数器初始化如下:(C 语言例程,下同) void format(); { TMOD=0x21; //T/C1 工作于8位自动装入状态// TL1=0xff; TH1=0xff ; // T/C1 常数,确定波特率// SCON=0x50 ; //设串口工作于方式1,// PCON=0x80 ; //相当于 SMOD=1;// TR1=1; //T/C1 开始计数// } 由 51 系列单片机UART 的工作方式可推知, 当外部晶振的频率为 6MHz 的倍数时,正确地设置特殊功能寄存器,可以精确的发生31.25K 的波特率,见表 5-3: 表 5-3 用不同的晶振频率产生波特率 31.25K 的寄存器值 晶振频率 TMOD SCON PCON TL1 TH1 6MHz 0x21 0x50 0x80 0xFF 0xFF 12MHz 0x21 0x50 0x80 0xFE 0xFE 0x00 0xFF 0xFF 24MHz 0x21 0x50 0x80 0xFD 0xFD 0x00 0xFE 0xFE 上一节已经介绍了 MIDI 命令的格式,发送一个音符的开关命令,可调用如下函数: void send(uchar cc,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 协议中介绍,不再重复。 对于 1 字节和 2 字节命令,只需将上述函数简化即可,由于在演奏中主要执行的都是3 字节命令,为提高运行速度,不在发送函数中判断命令长度,因为那样做的话固然可以减少一两个函数,但让单片机过多执行不必要的代码,得不偿失。 5.2.2 键盘扫描 电子乐器的键盘...