求高手指教!具体疑问在程序旁边注释上了!
#include<reg51.h>sbitspeaker=P3^6;unsignedchartimer0h,timer0l,time;//生日歌codeunsignedc...
#include <reg51.h>
sbit speaker=P3^6;
unsigned char timer0h,timer0l,time;
//生日歌
code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};
// 音阶频率表 高八位
code unsigned char 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 unsigned char 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(unsigned char t)//这个延时程序基准延时多少?
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{
;
}
}
TR0=0;
}
void t0int() interrupt 1
{
TR0=0;
speaker=!speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time); //这里为什么要延时!
}
void main(void)
{
unsigned char k,i;
TMOD=1; //置CT0定时工作方式1
EA=1;
ET0=1;//IE=0x82 //CPU开中断,CT0开中断
while(1)
{
i=0;
while(i<75){ //音乐数组长度 ,唱完从头再来
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}
最好能把整个程序怎么样执行的仔细说一遍!不胜感激!!!!!
顺便再问下第一个数组元素值怎么计算出来的? 展开
sbit speaker=P3^6;
unsigned char timer0h,timer0l,time;
//生日歌
code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};
// 音阶频率表 高八位
code unsigned char 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 unsigned char 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(unsigned char t)//这个延时程序基准延时多少?
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{
;
}
}
TR0=0;
}
void t0int() interrupt 1
{
TR0=0;
speaker=!speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time); //这里为什么要延时!
}
void main(void)
{
unsigned char k,i;
TMOD=1; //置CT0定时工作方式1
EA=1;
ET0=1;//IE=0x82 //CPU开中断,CT0开中断
while(1)
{
i=0;
while(i<75){ //音乐数组长度 ,唱完从头再来
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}
最好能把整个程序怎么样执行的仔细说一遍!不胜感激!!!!!
顺便再问下第一个数组元素值怎么计算出来的? 展开
1个回答
展开全部
//这个延时程序基准延时多少?
这个for循环内为空指令,所以具体的延时多少一般在C语言里是看不出来的,你可以在编译器里看它所对应的反汇编代码,这个代码中一个循环体内有多少条汇编指令,每条汇编指令需要多少个时钟周期(这与具体的单片机型号和指令有关,看寄存器应该是51内核的单片机),而时钟周期则与你实际连接的晶体振荡器有关,Atmel的51为晶振的十二分之一,而其它公司的产品各有不同。
这个判断方式很麻烦,所以我们一般都不这样进行判断 而是随便写一个循环,用示波器等测出实测时间,在根据实测调整则最为方便
//这里为什么要延时!
这里的延时是每个音符的延时,也就是每个音符发音的时间,定时器内设置的频率是音阶所对应的频率,连续的这种频率的喇叭的震动就能使喇叭发出相应音高的声音 而这样的声音要发多少的时间?也就是要以这样的频率震动多久?则由 delay(time); 这个函数决定。
顺便再问下第一个数组元素值怎么计算出来的?
第一个数据的元素也不是算出来的 呵呵 第一个数据存储的是乐谱 我们知道 每个发音都有两个要素 音高和音长 这第一个数据每三个连续的数据为一组
例如 第一组 5 1 1
5表示 是 sou的发音
第一个1表示 是低音sou
第二个1表示音长 是八分音符的sou (这里需要一点点乐理知识 呵呵)
生日快乐歌的 谱子是 556517 556521 5553176 443121 你看是不是就没每三个一组的第一个?
对于每一组的第二个数字 1表示低音 2表示中音 这首歌里没有高音 呵呵
对于每一组的第三个数据 1表示八分音符 2表示四分音符 4表示二分音符
一般来说 全音符的发音时间最长 二分音符的发音长度为全音符的二分之一 一次类推的意思
这个程序怎么执行的 其实我看你自己的注释已经可以了 我就不再过多的解释了
这个for循环内为空指令,所以具体的延时多少一般在C语言里是看不出来的,你可以在编译器里看它所对应的反汇编代码,这个代码中一个循环体内有多少条汇编指令,每条汇编指令需要多少个时钟周期(这与具体的单片机型号和指令有关,看寄存器应该是51内核的单片机),而时钟周期则与你实际连接的晶体振荡器有关,Atmel的51为晶振的十二分之一,而其它公司的产品各有不同。
这个判断方式很麻烦,所以我们一般都不这样进行判断 而是随便写一个循环,用示波器等测出实测时间,在根据实测调整则最为方便
//这里为什么要延时!
这里的延时是每个音符的延时,也就是每个音符发音的时间,定时器内设置的频率是音阶所对应的频率,连续的这种频率的喇叭的震动就能使喇叭发出相应音高的声音 而这样的声音要发多少的时间?也就是要以这样的频率震动多久?则由 delay(time); 这个函数决定。
顺便再问下第一个数组元素值怎么计算出来的?
第一个数据的元素也不是算出来的 呵呵 第一个数据存储的是乐谱 我们知道 每个发音都有两个要素 音高和音长 这第一个数据每三个连续的数据为一组
例如 第一组 5 1 1
5表示 是 sou的发音
第一个1表示 是低音sou
第二个1表示音长 是八分音符的sou (这里需要一点点乐理知识 呵呵)
生日快乐歌的 谱子是 556517 556521 5553176 443121 你看是不是就没每三个一组的第一个?
对于每一组的第二个数字 1表示低音 2表示中音 这首歌里没有高音 呵呵
对于每一组的第三个数据 1表示八分音符 2表示四分音符 4表示二分音符
一般来说 全音符的发音时间最长 二分音符的发音长度为全音符的二分之一 一次类推的意思
这个程序怎么执行的 其实我看你自己的注释已经可以了 我就不再过多的解释了
深圳市容大彩晶科技有限公司
2024-11-15 广告
2024-11-15 广告
广告机代理优选容大彩晶,深圳市容大彩晶科技有限公司自2007年成立伊始,一直专注于液晶商用显示产品的技术研发及产品服务。公司依托具有自主研发能力、创新高效的技术团队,打造出行业优质商用液晶显示设备。容大彩晶产品涵盖商用液晶显示、多媒体广告机...
点击进入详情页
本回答由深圳市容大彩晶科技有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询