单片机c语言曲普两只蝴蝶,51曲谱网_51单片机简谱编码

单片机c语言音乐简谱代码

代码的格式,是由编程者设计的,并没有统一的规范。

下面的链接可供参考。

http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/88bfff323ec42ef21b4cff09.html

求助:如何将简谱编成单片机代码?

声音是振动引起的,不同频率振动形成不同的声音。

根据音符的声音频率算,定时器0定时成相应频率的周期/2,从SPK引脚输出音符的频率。

在51单片机上用C语言实现电子琴功能,但同时数码管可以显示简谱,怎么编程序?

1,数据管显示就没什么了,找几个简单的数码管驱动程序改改就可以了,一般都是先选中数码管,然后设置值,就可以显示了,不过需要注意刷新,10ms刷新一个应该就可以了,刷新频率比较低的话会闪闪的,这个你应该明白。

2,蜂鸣器发do音,这个硬件实现我就不知道了,也许有硬件可以 编码控制自动生成对应频率的值。我想如果通过软件实现的话,不妨考虑一下定时器。假设do音是1000Hz的频率(没有查,不清楚,假设的),那么你可以控制定时器的触发频率为1000hz,触发一次,对应的输出到蜂鸣器的口的电平跳变一下,如果定时器的频率为1000hz的话,那么应该有500hz的频率,一个周期需要一高一低嘛!中断读取按键信号,分析按键,然后设定定时器的频率,启动定时器,设置一个响的时间,然后到时间关闭定时器,这样你按下k1就会发出一声do的声音,然后停了。

3,按键读取程序,中断或者查询方式,自己选择吧,别忘了延迟5ms左右再次读取按键,这个是消抖的。

4,建议模块化编程,先搞定按键的,然后搞定数码管的,然后搞定定时器的,然后再考虑如何把它们组合起来。好了不说了,说得有点多了,再说会我都回到大学时代了,哈哈。总之自己一点一点的做,应该不难,51熟练,c语言熟练,板子焊接的结构比较清晰的话,很快就可以搞定的。

5,还是建议你自己写一份各个模块的驱动的代码,例如按键的,数码管的,led的,温度传感器的,光敏的,蜂鸣器的,遥控器的,定时器的,中断的,等等等等模块(可以借鉴别人写的,自己一定要会),然后需要的时候,copy过来,改改就行,快而且bug少。建议keil c语言编程,用汇编编码太耗时了。

谁能讲解一下用51单片机写音乐乐谱

用51单片机写音乐乐谱 的 单片机音乐代码生成器,可以参考一下,下载附件 有 仿真实例可以仿真试试。

单片机音乐代码

#include "reg51.h"

#define uint unsigned int

#define uchar unsigned char

uchar * TABLE ;

code uint TABLE1 [15]={64260,64400,64524,64580,

64684,64777,64820,64898,

64968,65030,65058,65110,

65157,65178,65217};

code uchar SONG [ ]={

//1. 迟来的爱

};

code uchar SONG1 [ ]={

//2.两只蝴蝶

};

code uchar SONG3 [ ]={

//4.一个师傅三个徒弟

};

uchar hjsz;

uchar ljsz;

uchar jpm;

uchar yfm;

uchar t0 =0;

uint i=0;

sbit Speaker =P1^0;

uint k;

void Delay1()

{

for ( k=0;k<20000;k++);

}

void Lignt( )

{ uchar t;

for(t=0;t<10;t++)

{

P2=0xff;

Delay1();

P2=0x00;

Delay1();

}

}

void Lignt1( )

{

P2=0xaa;

Delay1();

P2=0x55;

Delay1();

}

void Delay(uchar t0)//延时

{

while(t0--) //决定节拍

Lignt1();

}

void Delay2(uchar w0)//延时

{

while(w0--) //决定节拍

Lignt();

}

void T0Int() interrupt 1//TIMER0

{

TL0 = ljsz;

TH0 = hjsz;

Speaker=!Speaker;

}

void ExtInt0() interrupt 0//INT0

{

if(t0>10)

t0=0;

i=0; // 全局变量,指向歌谱的第1个

switch(t0++)

{

case 0 : TABLE=SONG;break; //选择第1首

case 1 : TABLE=SONG1;break;//选择第2首

case 2 : TABLE=SONG2;break;//选择第3首

case 3 : TABLE=SONG3;break;//选择第4首

case 4 : TABLE=SONG4;break;//选择第5首

case 5 : TABLE=SONG5;break;//选择第6首

case 6 : TABLE=SONG6;break;//选择第7首

case 7 : TABLE=SONG7;break;//选择第8首

case 8 : TABLE=SONG8;break;//选择第9首

case 9 : TABLE=SONG9;break;//选择第10首

}

}

void songsing()//发音程序

{

i=0;

while(TABLE[i])

{

jpm=TABLE[i]&0x0f; //节拍值

yfm=(TABLE[i]>>0x04)&0x0f;//简谱值

if(yfm) //简谱为1,取计数值

{

yfm=yfm-1;

hjsz=(uchar)(TABLE1[yfm]>>0x08);//取计数值高字节

TH0 = hjsz;

ljsz=(uchar)(TABLE1[yfm]); //取计数值低字节

TL0 = ljsz;

TR0 = 1; //启动TIMER0

}

else TR0 = 0; //简谱为0,不发音

Delay(jpm); //节拍延时

i++;

}

}

void main(void)

{

TMOD =0X01;//设TIMER0在MODE1

TCON =0X01;//外部中断INT0,下降沿触发

IE =0x83;//开中断(INT0,TIMER0)

IP =0x00;//设置中断优先级

TABLE=SONG0;

while(1)

{

Lignt( );

songsing();//调用发音程序

TR0 = 0;//停止TIMER0

Delay2(1);

TABLE=SONG0;// 更改歌曲0

songsing();

}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值