我这有个单片机C语言程序,可以用蜂鸣器唱首歌出来,我想知道为什么像他那么写代码,就能唱出哥来?谢谢了 20
#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#defineucharunsignedchar//将unsigned...
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char //将unsigned char定义为uchar,简化输写。提高编程速度
sbit fmq=P3^4; //定义音乐输出端口
uchar timer0h,timer0l,time;
//世上只有妈妈好数据表
code uchar sszymmh[]={6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
};
// 音阶频率表 高八位
code uchar FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF};
// 音阶频率表 低八位
code uchar FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16};
/*延时子程序*/
void delay(uchar t)
{
uchar t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{;}
}
TR0=0;
}
/*定时器中断*/
void t0int() interrupt 1
{
TR0=0;
fmq=!fmq;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
/*音乐处理函数*/
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
/*主程序*/
void main(void)
{
uchar k,i;
TMOD=1; //置CT0定时工作方式1
EA=1;
ET0=1; //IE=0x82 //CPU开中断,CT0开中断
while(1)
{
i=0;
while(i<100)
{ //音乐数组长度 ,唱完从头再来
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}
还请详细点!谢谢了! 展开
#define uchar unsigned char //将unsigned char定义为uchar,简化输写。提高编程速度
sbit fmq=P3^4; //定义音乐输出端口
uchar timer0h,timer0l,time;
//世上只有妈妈好数据表
code uchar sszymmh[]={6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
};
// 音阶频率表 高八位
code uchar FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF};
// 音阶频率表 低八位
code uchar FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16};
/*延时子程序*/
void delay(uchar t)
{
uchar t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{;}
}
TR0=0;
}
/*定时器中断*/
void t0int() interrupt 1
{
TR0=0;
fmq=!fmq;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
/*音乐处理函数*/
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
/*主程序*/
void main(void)
{
uchar k,i;
TMOD=1; //置CT0定时工作方式1
EA=1;
ET0=1; //IE=0x82 //CPU开中断,CT0开中断
while(1)
{
i=0;
while(i<100)
{ //音乐数组长度 ,唱完从头再来
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}
还请详细点!谢谢了! 展开
2个回答
展开全部
啊呀,难道音乐片都是这样做出来的?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不同频率的声波会产生不同的音高,音乐中的每个音符都有其固定的频率,所以只要按照这个频率给扬声器或蜂鸣器输入电脉冲信号控制它们通电或断电,扬声器或蜂鸣器就会发出对应的不同音符(也就是将电信号转换成声波信号了)。
sszymmh数组中,以3个数为1个单位,第一个数是音节,也就是1234567(0代表无声);第二个数是高、中、低音选择,3为高音、2为中音、1为低音(比如高音DO、中音DO、低音DO);第三个数则是节拍长度。
所以整个流程就是先取出歌曲的音符,并根据其高中低音查表得到需要的频率,使用定时器中断0定时翻转输出脉冲信号,再根据节拍长度得到该脉冲信号的输出时间,通过延时函数控制输出时间。
如果你了解单片机的话,好像我就不需要再说什么了。
sszymmh数组中,以3个数为1个单位,第一个数是音节,也就是1234567(0代表无声);第二个数是高、中、低音选择,3为高音、2为中音、1为低音(比如高音DO、中音DO、低音DO);第三个数则是节拍长度。
所以整个流程就是先取出歌曲的音符,并根据其高中低音查表得到需要的频率,使用定时器中断0定时翻转输出脉冲信号,再根据节拍长度得到该脉冲信号的输出时间,通过延时函数控制输出时间。
如果你了解单片机的话,好像我就不需要再说什么了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询