单片机C语言音乐简谱代码
编程师设计的代码格式没有统一的规范。
以下链接可供参考。
http://hi.baidu.com/???/blog/item/88bfff323ec42ef21b4cff09.html
求助:如何将简谱编成单片机代码?
声音是由振动引起的,不同频率的振动形成不同的声音。
根据音符的声音频率,从SPK引脚输出音符的频率。
在51单片机上用C语言实现电子琴功能,但同时数码管可以显示简谱,怎么编程序?
1.数据管显示没什么。只需找一些简单的数字管驱动程序进行更改。一般来说,您可以先选择数字管,然后设置值显示,但您需要注意刷新,10ms刷新一个应该就够了,刷新频率低的话会闪闪发光,这个你应该明白。
2,蜂鸣器发do我不知道这个硬件是否实现了。也许有硬件 编码控制自动生成相应频率的值。我想如果是通过软件实现的,不妨考虑一下定时器。假设do音是1000Hz如果频率(不检查,不清楚,假设),可以控制定时器的触发频率1万hz,触发一次,如果定时器的频率为10000,则将相应的输出电平跳到蜂鸣器口hz如果应该有500hz频率,一个周期需要一高一低!中断读取按钮信号,分析按钮,然后设置定时器频率,启动定时器,设置响时间,然后关闭定时器,按下k会发出一声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; // 全局变量指向歌谱第一
switch(t0 )
{
case 0 : TABLE=SONG;break; //选第一首
case 1 : TABLE=SONG1;break;//选第二首
case 2 : TABLE=SONG2;break;//选第三首
case 3 : TABLE=SONG3;break;//选第四首
case 4 : TABLE=SONG4;break;//选第五首
case 5 : TABLE=SONG5;break;//选第六首
case 6 : TABLE=SONG6;break;//选第七首
case 7 : TABLE=SONG7;break;//选第八首
case 8 : TABLE=SONG8;break;//选第九首
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;//外部中断INT下降沿触发
IE =0x83.//开中断(INT0,TIMER0)
IP =0x00;//设置中断优先级
TABLE=SONG0;
while(1)
{
Lignt( );
songsing()//调用发音程序
TR0 = 0;//停止TIMER0
Delay2(1);
TABLE=SONG0;// 更改歌曲0
songsing();
}
}