这是利用蜂鸣器和定时器唱梁祝,我想在音乐响起时刚好显示其音符,编好程序,可是只唱歌,数码管就显示一个数字,我不知道哪里错了,秋大神指导。我是初学者,请大家多多关照。下面时我的程序。
#include //包含51单片机寄存器定义的头文件
#define uint unsigned int
#define uchar unsigned char
***it dula=P2^6;
***it wela=P2^7;
uchar num;
uchar code table[]={0x4f,0x6d,0x7d,0x06,0x5b,
0x7d,0x06,0x6d,0x6d,0x06,
0x7d,0x6d,0x4f,0x6d,0x5b,
0x5b,0x4f,0x07,0x7d,0x6d,
0x7d,0x06,0x5b,0x4f,0x06,
0x7d,0x6d,0x7d,0x06,0x6d,
0x4f,0x6d,0x07,0x5b,0x7d,0x06,0x6d,};
***it sound=P2^3;
unsigned int C;//储存定时器的定时常数
//以下是C调低音的音频宏定义
#define l_do 262//将“l_do”宏定义为低音“1”的频率262Hz
#define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz
#define l_mi 311//将“l_mi”宏定义为低音“3”的频率311Hz
#define l_fa 349 //将“l_fa”宏定义为低音“4”的频率349Hz
#define l_suo 392 //将“l_suo”宏定义为低音“5”的频率392Hz
#define l_la 440//将“l_a”宏定义为低音“6”的频率440Hz
#define l_si 494 //将“l_si”宏定义为低音“7”的频率494Hz
//以下是C调中音的音频宏定义
#define do 523//将“do”宏定义为中音“1”的频率523Hz
#define re 587 //将“re”宏定义为中音“2”的频率587Hz
#define mi 659 //将“mi”宏定义为中音“3”的频率659Hz
#define fa 698 //将“fa”宏定义为中音“4”的频率698Hz
#define suo 784 //将“suo”宏定义为中音“5”的频率784Hz
#define la 880 //将“la”宏定义为中音“6”的频率880Hz
#define si 987 //将“si”宏定义为中音“7”的频率523H??????
//以下是C调高音的音频宏定义
#define h_do 1046//将“h_do”宏定义为高音“1”的频率1046Hz
#define h_re 1174//将“h_re”宏定义为高音“2”的频率1174Hz
#define h_mi 1318//将“h_mi”宏定义为高音“3”的频率1318Hz
#define h_fa 1396 //将“h_fa”宏定义为高音“4”的频率1396Hz
#define h_suo 1567 //将“h_suo”宏定义为高音“5”的频率1567Hz
#define h_la 1760 //将“h_la”宏定义为高音“6”的频率1760Hz
#define h_si 1975 //将“h_si”宏定义为高音“7”的频率1975Hz
/*******************************************
函数功能:1个延时单位,延时200ms,此曲目可适当加长延时时间
******************************************/
void delay()
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
; }
void main()
{
//×××××××××××××××《梁祝》简谱××××××××××××××××
unsigned int code f[]={l_mi,l_suo,l_la,do,re,l_la,do,l_suo,
suo,h_do,la,suo,mi,suo,re,
re,mi,l_si,l_la,l_suo,l_la,do,re,
l_mi,do,l_la,l_suo,l_la,do,l_suo,
mi,suo,l_si,re,l_la,do,l_suo,
l_mi,l_suo,l_mi,l_suo,l_la,l_si,re,l_la,
l_suo,l_la,do,re,suo,mi,re,mi,re,do,l_la,l_suo,l_mi,do,
l_la,do,l_la,l_suo,l_mi,l_suo,l_la,do,l_suo,0xff};
//-------节拍----------
unsigned int code JP[]={4,2,1,2,1,1,1,2,
2,1,1,1,1,1,8,
2,1,2,2,2,1,2,2,
2,2,1,1,1,1,8,
2,1,2,2,1,1,4,
1,2,1,1,1,1,1,6,
1,1,2,1,2,2,2,1,1,2,1,1,4,4,
1,1,1,1,1,1,1,1,8};
unsigned char i,j;EA=1;ET0=1;
TMOD=0x00;
wela=1;
P0=0xfe;
wela=0;
while(1)
{
for(num=0;num<35;num++)
{
dula=1;
P0=table[num];
dula=0;
}
i=0;
while(f!=0xff)
{C=500000/f; //12M晶振,C为定时常数
TH0=(8192-C)/32; //这是可以证明的。。。?TL0=(8192-C)%32;
TR0=1;
for(j=0;j;j++)
delay();
TR0=0;
i++;
}
}
}
void time0(void) interrupt 1 using 1
{
sound=!sound;
TH0=(8192-C)/32;//
TL0=(8192-C)%32;//低5位的值
}
|