⑴ 单片机播放音乐里的音乐代码是怎么得到的有什么软件能将歌曲直接转换成16进制代码
把简谱中每个唱名对应的频率找出来,比如C调的1对应264Hz左右。
然后把这些频率通过公式转换成初值再换算成十六进制。
比如你用的是定时的工作方式1,则可以这位算:(假设晶振是12MHz)
X=2^16-10^6/(264*2)=63642因为要计算的是半周期对应的初值,所以频率就是2倍。
十六进制就是:F89A
好像没有什么软件吧,有的话告诉我一声哦。
⑵ 51music 单片机音乐代码生成器 1.0绿色版怎么用
根据简谱点击音符和时长,也就是点一个间符,再点这个音符的时长,完成一个音符的输入,输完全部音符后点生成代码,把代码复制到程序中编译就行
⑶ 单片机c语言音乐简谱代码
代码的格式,是由编程者设计的,并没有统一的规范。
下面的链接可供参考。
http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/88bfff323ec42ef21b4cff09.html
⑷ 51单片机简谱编码
// 8键电子琴C程序 自己根据音节做个与简谱对应的表就可以了。
#include <AT89X51.H>
sbit SPEAKER = P3^7;
#define KEY P1
unsigned char MUSIC;
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]={
64021,64103,64260,64400,//低音3开始
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178
};
void main(void){
TMOD=0x01;
ET0=1;
EA=1;
KEY = 0xff;
while(1){
if(KEY != 0xff){
switch (~KEY){//显示的列位置
case 0x01://
MUSIC = 7;
break;//
case 0x02://
MUSIC = 6;
break;//
case 0x04://
MUSIC = 5;
break;//
case 0x08://
MUSIC = 4;
break;//
case 0x10://
MUSIC = 3;
break;//
case 0x20://
MUSIC = 2;
break;//
case 0x40://
MUSIC = 1;
break;//
case 0x80://
MUSIC = 0;
break;//
}
STH0=tab[MUSIC]/256;
STL0=tab[MUSIC]%256;
TR0=1;
}else{
SPEAKER = 1;
TR0=0;
}
}
}
void t0(void) interrupt 1 using 0{
TH0=STH0;
TL0=STL0;
SPEAKER=~SPEAKER;
}
⑸ 在51单片机上用C语言实现电子琴功能,但同时数码管可以显示简谱,怎么编程序
1,数据管显示就没什么了,找几个简单的数码管驱动程序改改就可以了,一般都是先选中数码管,然后设置值,就可以显示了,不过需要注意刷新,10ms刷新一个应该就可以了,刷新频率比较低的话会闪闪的,这个你应该明白。
2,蜂鸣器发do音,这个硬件实现我就不知道了,也许有硬件可以 编码控制自动生成对应频率的值。我想如果通过软件实现的话,不妨考虑一下定时器。假设do音是1000Hz的频率(没有查,不清楚,假设的),那么你可以控制定时器的触发频率为1000hz,触发一次,对应的输出到蜂鸣器的口的电平跳变一下,如果定时器的频率为1000hz的话,那么应该有500hz的频率,一个周期需要一高一低嘛!中断读取按键信号,分析按键,然后设定定时器的频率,启动定时器,设置一个响的时间,然后到时间关闭定时器,这样你按下k1就会发出一声do的声音,然后停了。
3,按键读取程序,中断或者查询方式,自己选择吧,别忘了延迟5ms左右再次读取按键,这个是消抖的。
4,建议模块化编程,先搞定按键的,然后搞定数码管的,然后搞定定时器的,然后再考虑如何把它们组合起来。好了不说了,说得有点多了,再说会我都回到大学时代了,哈哈。总之自己一点一点的做,应该不难,51熟练,c语言熟练,板子焊接的结构比较清晰的话,很快就可以搞定的。
5,还是建议你自己写一份各个模块的驱动的代码,例如按键的,数码管的,led的,温度传感器的,光敏的,蜂鸣器的,遥控器的,定时器的,中断的,等等等等模块(可以借鉴别人写的,自己一定要会),然后需要的时候,过来,改改就行,快而且bug少。建议keil c语言编程,用汇编编码太耗时了。
⑹ 单片机音乐的简谱怎么写的代码数据
首先你要知道你定时器的工作方式,单片机的晶振,这样你才能计算出具体的需要频率,因为音乐代码的话主要还是通过定时器改变蜂鸣器的频率,使得发出音乐。
你这个18H,30H应该是通过那个定时器频率计算方法计算出来的。
⑺ 怎样把歌谱翻译成51单片机C程序代码
用定时器T0的中断实现"渴望"主题曲的播放
```c
#include // 包含51单片机寄存器定义的头文件
sbit sound = P3^7; // 将sound位定义为P3.7
unsigned int C; // 储存定时器的定时常数
// 以下是C调低音的音频宏定义
#define l_ 262 // 低音“1”的频率262Hz
#define l_re 286 // 低音“2”的频率286Hz
#define l_mi 311 // 低音“3”的频率311Hz
#define l_fa 349 // 低音“4”的频率349Hz
#define l_sao 392 // 低音“5”的频率392Hz
#define l_la 440 // 低音“6”的频率440Hz
#define l_xi 494 // 低音“7”的频率494Hz
// 以下是C调中音的音频宏定义
#define 523 // 中音“1”的频率523Hz
#define re 587 // 中音“2”的频率587Hz
#define mi 659 // 中音“3”的频率659Hz
#define fa 698 // 中音“4”的频率698Hz
#define sao 784 // 中音“5”的频率784Hz
#define la 880 // 中音“6”的频率880Hz
#define xi 987 // 中音“7”的频率523Hz
// 以下是C调高音的音频宏定义
#define h_ 1046 // 高音“1”的频率1046Hz
#define h_re 1174 // 高音“2”的频率1174Hz
#define h_mi 1318 // 高音“3”的频率1318Hz
#define h_fa 1396 // 高音“4”的频率1396Hz
#define h_sao 1567 // 高音“5”的频率1567Hz
#define h_la 1760 // 高音“6”的频率1760Hz
#define h_xi 1975 // 高音“7”的频率1975Hz
/*******************************************
函数功能:1个延时单位,延时200ms
******************************************/
void delay() {
unsigned char i, j;
for (i = 0; i < 250; i++)
for (j = 0; j < 250; j++)
;
}
/*******************************************
函数功能:主函数败散启
******************************************/
void main(void) {
unsigned char i, j;
// 以下是《渴望》片头曲的一段简谱
unsigned int code f[] = {
re, mi, re, , l_la, , l_la,
l_sao, l_mi, l_sao, l_la, ,
l_la, , sao, la, mi, sao,
re,
mi, re, mi, sao, mi,
l_sao, l_mi, l_sao, l_la, ,
l_la, l_la, , l_la, l_sao, l_re, l_mi,
l_sao,
re, re, sao, la, sao,
fa, mi, sao, mi,
la, sao, mi, re, mi, l_la, ,
re,
mi, re, mi, sao, mi,
l_sao, l_mi, l_sao, l_la, ,
l_la, , re, l_la, , re, mi,
re,
l_la, , re, l_la, , re, mi,
re,
0xff}; // 以0xff作为音符的结束标志
// 以下是简谱中每个音符的节拍
// "4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位
unsigned char code JP[] = {
4, 1, 1, 4, 1, 1, 2,
2, 2, 2, 2, 8,
4, 2, 3, 1, 2, 2,
10,
4, 2, 2, 4, 4,
2, 2, 2, 2, 4,
2, 2, 2, 2, 2, 2, 2,
10,
4, 4, 4, 2, 2,
4, 2, 4, 4,
4, 2, 2, 2, 2, 2, 2,
10,
4, 2, 2, 4, 4,
2, 2, 2, 2, 6,
4, 2, 2, 4, 1, 1, 4,
10,
4, 2, 2, 4, 1, 1, 4,
10};
EA = 1; // 开总中断
ET0 = 1; // 定时器T0中断允许
TMOD = 0x00; // 使用定时器T0的模式1(13位计数器)
while (1) { // 无限循环
i = 0; // 从第1个音符f[0]开始播放
while (f[i] != 0xff) { // 只要没有读到结束标志就继续播放
C = 460830 / f[i];
TH0 = (8192 - C) / 32; // 可证明这是13位计数器TH0高8位的赋初值方法
TL0 = (8192 - C) % 32; // 可证明这是13位计数器TL0低5位的赋初值方法
TR0 = 1; // 启动定时器T0
for (j = 0; j < JP[i]; j++) { // 控制节拍数
delay(); // 延时1个节拍单位
}
TR0 = 0; // 关闭定时器T0
i++; // 播放下一个音符
}
}
}
/***********************************************************
函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波
************************************************************/
void Time0(void) interrupt 1 using 1 {
sound = !sound; // 将P3.7引脚输出电平取反,形成方波
TH0 = (8192 - C) / 32; // 可证明这是13位计数器TH0高8位的赋初值方法
TL0 = (8192 - C) % 32; // 可证明这是13位计数器TL0低5位的赋初值方法
}
```
⑻ 简谱的数据怎么转化为单片机代码(节拍和频率)最主要是节拍,频率已明白
其实就是时间,也就是定时器定时的时间,需要根据节拍计算定时器定时的时间常数。
你需要知道节拍的时间长短,然后转换为定时常数,然后做成一个表格就可以了。